@@ -322,15 +322,31 @@ ZEND_STATIC_ASSERT(ZEND_MM_ALIGNED_SIZE(sizeof(zval)) == sizeof(zval),
322322ZEND_API void zend_vm_stack_init (void );
323323ZEND_API void zend_vm_stack_init_ex (size_t page_size );
324324ZEND_API void zend_vm_stack_destroy (void );
325+ ZEND_API void zend_vm_stack_destroy_caches (void );
325326ZEND_API void * zend_vm_stack_extend (size_t size );
326327
328+ #define ZEND_FIBER_VM_STACK_SIZE (1024 * sizeof(zval))
329+
327330static zend_always_inline zend_vm_stack zend_vm_stack_new_page (size_t size , zend_vm_stack prev ) {
328331 zend_vm_stack page = EG (vm_stack_page_cache );
329332
330- if (page != NULL && EXPECTED ((size_t )((char * )page -> end - (char * )page ) == size )) {
331- EG (vm_stack_page_cache ) = page -> prev ;
332- EG (vm_stack_page_cache_count )-- ;
333+ if (size == ZEND_FIBER_VM_STACK_SIZE ) {
334+ page = EG (fiber_vm_stack_page_cache );
335+ if (page ) {
336+ ZEND_ASSERT ((size_t )((char * )page -> end - (char * )page ) == size );
337+ EG (fiber_vm_stack_page_cache ) = page -> prev ;
338+ EG (fiber_vm_stack_page_cache_count )-- ;
339+ }
333340 } else {
341+ page = EG (vm_stack_page_cache );
342+ ZEND_ASSERT (!page || ((size_t )((char * )page -> end - (char * )page ) == size ) || size != EG (vm_stack_page_size ));
343+ if (page && EXPECTED ((size_t )((char * )page -> end - (char * )page ) == size )) {
344+ EG (vm_stack_page_cache ) = page -> prev ;
345+ EG (vm_stack_page_cache_count )-- ;
346+ }
347+ }
348+
349+ if (!page ) {
334350 page = (zend_vm_stack )emalloc (size );
335351 }
336352
@@ -428,13 +444,23 @@ static zend_always_inline void zend_vm_stack_free_call_frame_ex(uint32_t call_in
428444 EG (vm_stack_top ) = prev -> top ;
429445 EG (vm_stack_end ) = prev -> end ;
430446 EG (vm_stack ) = prev ;
431- if (EG (vm_stack_page_cache_count ) < 32
432- && (size_t )((char * )p -> end - (char * )p ) == EG (vm_stack_page_size )) {
433- p -> prev = EG (vm_stack_page_cache );
434- EG (vm_stack_page_cache ) = p ;
435- EG (vm_stack_page_cache_count )++ ;
447+ if ((size_t )((char * )p -> end - (char * )p ) == ZEND_FIBER_VM_STACK_SIZE ) {
448+ if (EG (fiber_vm_stack_page_cache_count ) < 32 ) {
449+ p -> prev = EG (fiber_vm_stack_page_cache );
450+ EG (fiber_vm_stack_page_cache ) = p ;
451+ EG (fiber_vm_stack_page_cache_count )++ ;
452+ } else {
453+ efree (p );
454+ }
436455 } else {
437- efree (p );
456+ if (EG (vm_stack_page_cache_count ) < 32
457+ && (size_t )((char * )p -> end - (char * )p ) == EG (vm_stack_page_size )) {
458+ p -> prev = EG (vm_stack_page_cache );
459+ EG (vm_stack_page_cache ) = p ;
460+ EG (vm_stack_page_cache_count )++ ;
461+ } else {
462+ efree (p );
463+ }
438464 }
439465 } else {
440466 EG (vm_stack_top ) = (zval * )call ;
0 commit comments