@@ -170,9 +170,9 @@ ZEND_API const zend_internal_function zend_pass_function = {
170
170
171
171
#define ZEND_VM_STACK_PAGE_SIZE (ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval))
172
172
173
- #define ZEND_VM_STACK_PAGE_ALIGNED_SIZE (size ) \
173
+ #define ZEND_VM_STACK_PAGE_ALIGNED_SIZE (size , page_size ) \
174
174
(((size) + ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval) \
175
- + (ZEND_VM_STACK_PAGE_SIZE - 1)) & ~(ZEND_VM_STACK_PAGE_SIZE - 1))
175
+ + ((page_size) - 1)) & ~((page_size) - 1))
176
176
177
177
static zend_always_inline zend_vm_stack zend_vm_stack_new_page (size_t size , zend_vm_stack prev ) {
178
178
zend_vm_stack page = (zend_vm_stack )emalloc (size );
@@ -191,6 +191,16 @@ ZEND_API void zend_vm_stack_init(void)
191
191
EG (vm_stack_end ) = EG (vm_stack )-> end ;
192
192
}
193
193
194
+ ZEND_API void zend_vm_stack_init_ex (size_t page_size )
195
+ {
196
+ /* page_size must be a power of 2 */
197
+ ZEND_ASSERT (page_size > 0 && (page_size & (page_size - 1 )) == 0 );
198
+ EG (vm_stack_page_size ) = page_size ;
199
+ EG (vm_stack ) = zend_vm_stack_new_page (page_size , NULL );
200
+ EG (vm_stack_top ) = EG (vm_stack )-> top ;
201
+ EG (vm_stack_end ) = EG (vm_stack )-> end ;
202
+ }
203
+
194
204
ZEND_API void zend_vm_stack_destroy (void )
195
205
{
196
206
zend_vm_stack stack = EG (vm_stack );
@@ -211,7 +221,7 @@ ZEND_API void* zend_vm_stack_extend(size_t size)
211
221
stack -> top = EG (vm_stack_top );
212
222
EG (vm_stack ) = stack = zend_vm_stack_new_page (
213
223
EXPECTED (size < EG (vm_stack_page_size ) - (ZEND_VM_STACK_HEADER_SLOTS * sizeof (zval ))) ?
214
- EG (vm_stack_page_size ) : ZEND_VM_STACK_PAGE_ALIGNED_SIZE (size ),
224
+ EG (vm_stack_page_size ) : ZEND_VM_STACK_PAGE_ALIGNED_SIZE (size , EG ( vm_stack_page_size ) ),
215
225
stack );
216
226
ptr = stack -> top ;
217
227
EG (vm_stack_top ) = (void * )(((char * )ptr ) + size );
0 commit comments