diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-12-26 13:09:32 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-12-26 13:09:32 +0300 |
commit | b45774eed047dad63bb3959df1e38de866346b78 (patch) | |
tree | 28c65dfac580db9813509fa9d4f56f040d3d4d2f | |
parent | 1ce7cbe590b37ee5144867f28fe573de16631f54 (diff) | |
download | php-git-b45774eed047dad63bb3959df1e38de866346b78.tar.gz |
Respect EG(vm_stack_page_size)
-rw-r--r-- | Zend/zend_execute.c | 16 | ||||
-rw-r--r-- | Zend/zend_execute.h | 1 |
2 files changed, 14 insertions, 3 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9bee0938be..0a505f55e8 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -170,9 +170,9 @@ ZEND_API const zend_internal_function zend_pass_function = { #define ZEND_VM_STACK_PAGE_SIZE (ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval)) -#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) \ - + (ZEND_VM_STACK_PAGE_SIZE - 1)) & ~(ZEND_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); @@ -192,6 +192,16 @@ ZEND_API void zend_vm_stack_init(void) EG(vm_stack_end) = EG(vm_stack)->end; } +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; +} + ZEND_API void zend_vm_stack_destroy(void) { zend_vm_stack stack = EG(vm_stack); @@ -212,7 +222,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 d09a3f3bc2..af329194bc 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); |