From 388c31e4a51eb5e8f2233cbc74679ea9a3369620 Mon Sep 17 00:00:00 2001 From: twosee Date: Tue, 25 Dec 2018 23:03:48 +0800 Subject: [PATCH 1/2] Use EG(vm_stack_page_size). --- Zend/zend_execute.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b6a759b470f89..b2321f427bf34 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -168,11 +168,9 @@ ZEND_API const zend_internal_function zend_pass_function = { #define ZEND_VM_STACK_PAGE_SLOTS (16 * 1024) /* should be a power of 2 */ -#define ZEND_VM_STACK_PAGE_SIZE (ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval)) - #define ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size) \ (((size) + ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval) \ - + (ZEND_VM_STACK_PAGE_SIZE - 1)) & ~(ZEND_VM_STACK_PAGE_SIZE - 1)) + + (EG(vm_stack_page_size) - 1)) & ~(EG(vm_stack_page_size) - 1)) static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend_vm_stack prev) { zend_vm_stack page = (zend_vm_stack)emalloc(size); @@ -185,8 +183,8 @@ static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend ZEND_API void zend_vm_stack_init(void) { - EG(vm_stack_page_size) = ZEND_VM_STACK_PAGE_SIZE; - EG(vm_stack) = zend_vm_stack_new_page(ZEND_VM_STACK_PAGE_SIZE, NULL); + EG(vm_stack_page_size) = ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval); + EG(vm_stack) = zend_vm_stack_new_page(EG(vm_stack_page_size), NULL); EG(vm_stack_top) = EG(vm_stack)->top; EG(vm_stack_end) = EG(vm_stack)->end; } From 3fe9fdb3bc77521cac45da107f1a90fefbfd20ee Mon Sep 17 00:00:00 2001 From: twosee Date: Wed, 26 Dec 2018 16:44:13 +0800 Subject: [PATCH 2/2] Add zend_vm_stack_init_ex, add the page_size arg to ZEND_VM_STACK_PAGE_ALIGNED_SIZE. --- Zend/zend_execute.c | 17 ++++++++++++----- Zend/zend_execute.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b2321f427bf34..558ebd78e8945 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -168,9 +168,9 @@ ZEND_API const zend_internal_function zend_pass_function = { #define ZEND_VM_STACK_PAGE_SLOTS (16 * 1024) /* should be a power of 2 */ -#define ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size) \ +#define ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size, page_size) \ (((size) + ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval) \ - + (EG(vm_stack_page_size) - 1)) & ~(EG(vm_stack_page_size) - 1)) + + ((page_size) - 1)) & ~((page_size) - 1)) static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend_vm_stack prev) { zend_vm_stack page = (zend_vm_stack)emalloc(size); @@ -183,8 +183,15 @@ static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend ZEND_API void zend_vm_stack_init(void) { - EG(vm_stack_page_size) = ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval); - EG(vm_stack) = zend_vm_stack_new_page(EG(vm_stack_page_size), NULL); + zend_vm_stack_init_ex(ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval)); +} + +ZEND_API void zend_vm_stack_init_ex(size_t page_size) +{ + /* page_size must be a power of 2 */ + ZEND_ASSERT(page_size > 0 && (page_size & (page_size - 1)) == 0); + EG(vm_stack_page_size) = page_size; + EG(vm_stack) = zend_vm_stack_new_page(page_size, NULL); EG(vm_stack_top) = EG(vm_stack)->top; EG(vm_stack_end) = EG(vm_stack)->end; } @@ -209,7 +216,7 @@ ZEND_API void* zend_vm_stack_extend(size_t size) stack->top = EG(vm_stack_top); EG(vm_stack) = stack = zend_vm_stack_new_page( EXPECTED(size < EG(vm_stack_page_size) - (ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval))) ? - EG(vm_stack_page_size) : ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size), + EG(vm_stack_page_size) : ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size, EG(vm_stack_page_size)), stack); ptr = stack->top; EG(vm_stack_top) = (void*)(((char*)ptr) + size); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 2ac0ecf998d0a..72113e8fe72d4 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -168,6 +168,7 @@ struct _zend_vm_stack { #endif ZEND_API void zend_vm_stack_init(void); +ZEND_API void zend_vm_stack_init_ex(size_t page_size); ZEND_API void zend_vm_stack_destroy(void); ZEND_API void* zend_vm_stack_extend(size_t size);