24 Jan 10:41
cvs: ZendEngine2 / zend_API.c zend_builtin_functions.c zend_compile.h zend_execute.c zend_execute.h zend_execute_API.c zend_globals.h zend_vm_def.h zend_vm_execute.h zend_vm_execute.skl zend_vm_gen.php /tests bug41209.phpt
Dmitry Stogov <dmitry <at> php.net>
2008-01-24 09:41:48 GMT
2008-01-24 09:41:48 GMT
dmitry Thu Jan 24 09:41:48 2008 UTC
Modified files:
/ZendEngine2 zend_API.c zend_builtin_functions.c zend_compile.h
zend_execute.c zend_execute.h zend_execute_API.c
zend_globals.h zend_vm_def.h zend_vm_execute.h
zend_vm_execute.skl zend_vm_gen.php
/ZendEngine2/tests bug41209.phpt
Log:
Changed EG(argument_stack) implementation.
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.c?r1=1.451&r2=1.452&diff_format=u Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.451 ZendEngine2/zend_API.c:1.452 --- ZendEngine2/zend_API.c:1.451 Mon Dec 31 07:12:06 2007 +++ ZendEngine2/zend_API.c Thu Jan 24 09:41:48 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.c,v 1.451 2007/12/31 07:12:06 sebastian Exp $ */ +/* $Id: zend_API.c,v 1.452 2008/01/24 09:41:48 dmitry Exp $ */ #include "zend.h" #include "zend_execute.h" @@ -43,7 +43,7 @@ zval **param, *param_ptr; TSRMLS_FETCH(); - p = EG(argument_stack).top_element-2; + p = zend_vm_stack_top(TSRMLS_C) - 1; arg_count = (int)(zend_uintptr_t) *p; if (param_count>arg_count) { @@ -81,7 +81,7 @@ int arg_count; zval *param_ptr; - p = EG(argument_stack).top_element-2; + p = zend_vm_stack_top(TSRMLS_C) - 1; arg_count = (int)(zend_uintptr_t) *p; if (param_count>arg_count) { @@ -119,7 +119,7 @@ zval ***param; TSRMLS_FETCH(); - p = EG(argument_stack).top_element-2; + p = zend_vm_stack_top(TSRMLS_C) - 1; arg_count = (int)(zend_uintptr_t) *p; if (param_count>arg_count) { @@ -142,7 +142,7 @@ void **p; int arg_count; - p = EG(argument_stack).top_element-2; + p = zend_vm_stack_top(TSRMLS_C) - 1; arg_count = (int)(zend_uintptr_t) *p; if (param_count>arg_count) { @@ -165,7 +165,7 @@ void **p; int arg_count; - p = EG(argument_stack).top_element-2; + p = zend_vm_stack_top(TSRMLS_C) - 1; arg_count = (int)(zend_uintptr_t) *p; if (param_count>arg_count) { @@ -963,7 +963,7 @@ return FAILURE; } - arg_count = (int)(zend_uintptr_t) *(EG(argument_stack).top_element-2); + arg_count = (int)(zend_uintptr_t) *(zend_vm_stack_top(TSRMLS_C) - 1); if (num_args > arg_count) { zend_error(E_WARNING, "%v(): could not obtain parameters for parsing", @@ -976,7 +976,7 @@ for (spec_walk = type_spec, i = 0; *spec_walk && i < num_args; spec_walk++) { switch (*spec_walk) { case 'T': - arg = (zval **) (EG(argument_stack).top_element - 2 - (arg_count-i)); + arg = (zval**)zend_vm_stack_top(TSRMLS_C) - 1 - (arg_count-i); if (Z_TYPE_PP(arg) == IS_UNICODE && (T_arg_type == -1 || T_arg_type == IS_STRING)) { /* we can upgrade from strings to Unicode */ T_arg_type = IS_UNICODE; @@ -1023,7 +1023,7 @@ if (num_varargs > 0) { int iv = 0; - zval **p = (zval **) (EG(argument_stack).top_element - 2 - (arg_count - i)); + zval **p = (zval **) (zend_vm_stack_top(TSRMLS_C) - 1 - (arg_count - i)); *n_varargs = num_varargs; @@ -1043,7 +1043,7 @@ } } - arg = (zval **) (EG(argument_stack).top_element - 2 - (arg_count-i)); + arg = (zval **) (zend_vm_stack_top(TSRMLS_C) - 1 - (arg_count-i)); if (zend_parse_arg(i+1, arg, va, &type_spec, quiet, T_arg_type TSRMLS_CC) == FAILURE) { /* clean up varargs array if it was used */ http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_builtin_functions.c?r1=1.360&r2=1.361&diff_format=u Index: ZendEngine2/zend_builtin_functions.c diff -u ZendEngine2/zend_builtin_functions.c:1.360 ZendEngine2/zend_builtin_functions.c:1.361 --- ZendEngine2/zend_builtin_functions.c:1.360 Tue Jan 22 09:29:29 2008 +++ ZendEngine2/zend_builtin_functions.c Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_builtin_functions.c,v 1.360 2008/01/22 09:29:29 dmitry Exp $ */ +/* $Id: zend_builtin_functions.c,v 1.361 2008/01/24 09:41:48 dmitry Exp $ */ #include "zend.h" #include "zend_API.h" @@ -178,18 +178,10 @@ Get the number of arguments that were passed to the function */ ZEND_FUNCTION(func_num_args) { - void **p; - int arg_count; + zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; - p = EG(argument_stack).top_element-1-1; - arg_count = (int)(zend_uintptr_t) *p; /* this is the amount of arguments passed to func_num_args(); */ - p -= 1+arg_count; - if (*p) { - zend_error(E_ERROR, "func_num_args(): Can't be used as a function parameter"); - } - --p; - if (p>=EG(argument_stack).elements) { - RETURN_LONG((long)(zend_uintptr_t) *p); + if (ex && ex->function_state.arguments) { + RETURN_LONG((long)(zend_uintptr_t)*(ex->function_state.arguments)); } else { zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context"); RETURN_LONG(-1); @@ -206,6 +198,7 @@ zval **z_requested_offset; zval *arg; long requested_offset; + zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &z_requested_offset)==FAILURE) { RETURN_FALSE; @@ -218,20 +211,15 @@ RETURN_FALSE; } - p = EG(argument_stack).top_element-1-1; - arg_count = (int)(zend_uintptr_t) *p; /* this is the amount of arguments passed to func_get_arg(); */ - p -= 1+arg_count; - if (*p) { - zend_error(E_ERROR, "func_get_arg(): Can't be used as a function parameter"); - } - --p; - if (p<EG(argument_stack).elements) { + if (!ex || !ex->function_state.arguments) { zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context"); RETURN_FALSE; } - arg_count = (int)(zend_uintptr_t) *p; - if (requested_offset>=arg_count) { + p = ex->function_state.arguments; + arg_count = (int)(zend_uintptr_t) *p; /* this is the amount of arguments passed to func_get_arg(); */ + + if (requested_offset >= arg_count) { zend_error(E_WARNING, "func_get_arg(): Argument %ld not passed to function", requested_offset); RETURN_FALSE; } @@ -250,21 +238,15 @@ void **p; int arg_count; int i; + zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; - p = EG(argument_stack).top_element-1-1; - arg_count = (int)(zend_uintptr_t) *p; /* this is the amount of arguments passed to func_get_args(); */ - p -= 1+arg_count; - if (*p) { - zend_error(E_ERROR, "func_get_args(): Can't be used as a function parameter"); - } - --p; - - if (p<EG(argument_stack).elements) { + if (!ex || !ex->function_state.arguments) { zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context"); RETURN_FALSE; } - arg_count = (int)(zend_uintptr_t) *p; + p = ex->function_state.arguments; + arg_count = (int)(zend_uintptr_t) *p; /* this is the amount of arguments passed to func_get_args(); */ array_init(return_value); for (i=0; i<arg_count; i++) { @@ -1786,14 +1768,12 @@ } /* }}} */ -static zval *debug_backtrace_get_args(void ***curpos TSRMLS_DC) /* {{{ */ +static zval *debug_backtrace_get_args(void **curpos TSRMLS_DC) /* {{{ */ { - void **p = *curpos - 2; + void **p = curpos; zval *arg_array, **arg; int arg_count = (int)(zend_uintptr_t) *p; - *curpos -= (arg_count+2); - MAKE_STD_ZVAL(arg_array); array_init(arg_array); p -= arg_count; @@ -1811,11 +1791,6 @@ } } - /* skip args from incomplete frames */ - while ((((*curpos)-1) > EG(argument_stack).elements) && *((*curpos)-1)) { - (*curpos)--; - } - return arg_array; } /* }}} */ @@ -1848,47 +1823,16 @@ char *call_type; char *include_filename = NULL; zval *arg_array = NULL; - void **cur_arg_pos = EG(argument_stack).top_element; - void **args = cur_arg_pos; - int arg_stack_consistent = 0; - int frames_on_stack = 0; int indent = 0; if (ZEND_NUM_ARGS()) { ZEND_WRONG_PARAM_COUNT(); } - while (--args > EG(argument_stack).elements) { - if (*args--) { - break; - } - args -= *(ulong*)args; - frames_on_stack++; - - /* skip args from incomplete frames */ - while (((args-1) > EG(argument_stack).elements) && *(args-1)) { - args--; - } - - if ((args-1) == EG(argument_stack).elements) { - arg_stack_consistent = 1; - break; - } - } - ptr = EG(current_execute_data); /* skip debug_backtrace() */ ptr = ptr->prev_execute_data; - cur_arg_pos -= 2; - frames_on_stack--; - - if (arg_stack_consistent) { - /* skip args from incomplete frames */ - while (((cur_arg_pos-1) > EG(argument_stack).elements) && *(cur_arg_pos-1)) { - cur_arg_pos--; - } - } while (ptr) { zstr free_class_name = NULL_ZSTR; @@ -1906,7 +1850,7 @@ skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL && skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL_BY_NAME && skip->prev_execute_data->opline->opcode != ZEND_INCLUDE_OR_EVAL) { - skip = skip->prev_execute_data; + skip = skip->prev_execute_data; } if (skip->op_array) { @@ -1943,9 +1887,8 @@ call_type = NULL; } if ((! ptr->opline) || ((ptr->opline->opcode == ZEND_DO_FCALL_BY_NAME) || (ptr->opline->opcode == ZEND_DO_FCALL))) { - if (arg_stack_consistent && (frames_on_stack > 0)) { - arg_array = debug_backtrace_get_args(&cur_arg_pos TSRMLS_CC); - frames_on_stack--; + if (ptr->function_state.arguments) { + arg_array = debug_backtrace_get_args(ptr->function_state.arguments TSRMLS_CC); } } } else { @@ -2048,28 +1991,6 @@ zstr class_name; char *include_filename = NULL; zval *stack_frame; - void **cur_arg_pos = EG(argument_stack).top_element; - void **args = cur_arg_pos; - int arg_stack_consistent = 0; - int frames_on_stack = 0; - - while (--args > EG(argument_stack).elements) { - if (*args--) { - break; - } - args -= *(ulong*)args; - frames_on_stack++; - - /* skip args from incomplete frames */ - while (((args-1) > EG(argument_stack).elements) && *(args-1)) { - args--; - } - - if ((args-1) == EG(argument_stack).elements) { - arg_stack_consistent = 1; - break; - } - } ptr = EG(current_execute_data); @@ -2080,17 +2001,7 @@ /* skip debug_backtrace() */ if (skip_last-- && ptr) { - int arg_count = *((ulong*)(cur_arg_pos - 2)); - cur_arg_pos -= (arg_count + 2); - frames_on_stack--; ptr = ptr->prev_execute_data; - - if (arg_stack_consistent) { - /* skip args from incomplete frames */ - while (((cur_arg_pos-1) > EG(argument_stack).elements) && *(cur_arg_pos-1)) { - cur_arg_pos--; - } - } } array_init(return_value); @@ -2164,9 +2075,8 @@ } if ((! ptr->opline) || ((ptr->opline->opcode == ZEND_DO_FCALL_BY_NAME) || (ptr->opline->opcode == ZEND_DO_FCALL))) { - if (arg_stack_consistent && (frames_on_stack > 0)) { - add_ascii_assoc_zval_ex(stack_frame, "args", sizeof("args"), debug_backtrace_get_args(&cur_arg_pos TSRMLS_CC)); - frames_on_stack--; + if (ptr->function_state.arguments) { + add_assoc_zval_ex(stack_frame, "args", sizeof("args"), debug_backtrace_get_args(ptr->function_state.arguments TSRMLS_CC)); } } } else { http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.372&r2=1.373&diff_format=u Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.372 ZendEngine2/zend_compile.h:1.373 --- ZendEngine2/zend_compile.h:1.372 Mon Dec 31 07:12:06 2007 +++ ZendEngine2/zend_compile.h Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.372 2007/12/31 07:12:06 sebastian Exp $ */ +/* $Id: zend_compile.h,v 1.373 2008/01/24 09:41:48 dmitry Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -276,6 +276,7 @@ typedef struct _zend_function_state { zend_function *function; + void **arguments; } zend_function_state; @@ -304,7 +305,6 @@ union _temp_variable *Ts; zval ***CVs; zend_bool original_in_execution; - ALLOCA_FLAG(use_heap) HashTable *symbol_table; struct _zend_execute_data *prev_execute_data; zval *old_error_reporting; http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.786&r2=1.787&diff_format=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.786 ZendEngine2/zend_execute.c:1.787 --- ZendEngine2/zend_execute.c:1.786 Wed Jan 23 19:15:11 2008 +++ ZendEngine2/zend_execute.c Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.786 2008/01/23 19:15:11 dmitry Exp $ */ +/* $Id: zend_execute.c,v 1.787 2008/01/24 09:41:48 dmitry Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -1418,10 +1418,10 @@ EX(opline)++ #define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \ - free_alloca(EX(CVs), EX(use_heap)); \ EG(in_execution) = EX(original_in_execution); \ EG(current_execute_data) = EX(prev_execute_data); \ - EG(opline_ptr) = NULL; + EG(opline_ptr) = NULL; \ + zend_vm_stack_free(execute_data TSRMLS_CC); #define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \ ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); \ http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.h?r1=1.110&r2=1.111&diff_format=u Index: ZendEngine2/zend_execute.h diff -u ZendEngine2/zend_execute.h:1.110 ZendEngine2/zend_execute.h:1.111 --- ZendEngine2/zend_execute.h:1.110 Mon Dec 31 07:12:06 2007 +++ ZendEngine2/zend_execute.h Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.h,v 1.110 2007/12/31 07:12:06 sebastian Exp $ */ +/* $Id: zend_execute.h,v 1.111 2008/01/24 09:41:48 dmitry Exp $ */ #ifndef ZEND_EXECUTE_H #define ZEND_EXECUTE_H @@ -153,30 +153,158 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *scope TSRMLS_DC); /* dedicated Zend executor functions - do not use! */ -static inline void zend_ptr_stack_clear_multiple(TSRMLS_D) +#define ZEND_VM_STACK_PAGE_SIZE (64 * 1024) + +struct _zend_vm_stack { + void **top; + void **end; + zend_vm_stack prev; + void *elements[1]; +}; + +#define ZEND_VM_STACK_GROW_IF_NEEDED(count) \ + do { \ + if (UNEXPECTED(count > \ + EG(argument_stack)->end - EG(argument_stack)->top)) { \ + zend_vm_stack_extend(count TSRMLS_CC); \ + } \ + } while (0) + +static inline zend_vm_stack zend_vm_stack_new_page(int count) { + zend_vm_stack page = emalloc(sizeof(*page)+sizeof(page->elements[0])*(count-1)); + + page->top = page->elements; + page->end = page->elements + count; + page->prev = NULL; + return page; +} + +static inline void zend_vm_stack_init(TSRMLS_D) +{ + EG(argument_stack) = zend_vm_stack_new_page(ZEND_VM_STACK_PAGE_SIZE); +} + +static inline void zend_vm_stack_destroy(TSRMLS_D) +{ + zend_vm_stack stack = EG(argument_stack); + + while (stack != NULL) { + zend_vm_stack p = stack->prev; + efree(stack); + stack = p; + } +} + +static inline void zend_vm_stack_extend(int count TSRMLS_DC) +{ + zend_vm_stack p = zend_vm_stack_new_page(count >= ZEND_VM_STACK_PAGE_SIZE ? count : ZEND_VM_STACK_PAGE_SIZE); + p->prev = EG(argument_stack); + EG(argument_stack) = p; +} + +static inline void **zend_vm_stack_top(TSRMLS_D) +{ + return EG(argument_stack)->top; +} + +static inline void zend_vm_stack_push(void *ptr TSRMLS_DC) +{ + ZEND_VM_STACK_GROW_IF_NEEDED(1); + *(EG(argument_stack)->top++) = ptr; +} + +static inline void zend_vm_stack_push_nocheck(void *ptr TSRMLS_DC) +{ + *(EG(argument_stack)->top++) = ptr; +} + +static inline void *zend_vm_stack_pop(TSRMLS_D) +{ + void *el = *(--EG(argument_stack)->top); + + if (UNEXPECTED(EG(argument_stack)->top == EG(argument_stack)->elements)) { + zend_vm_stack p = EG(argument_stack); + EG(argument_stack) = p->prev; + efree(p); + } + return el; +} + +static inline void *zend_vm_stack_alloc(size_t size TSRMLS_DC) +{ + void *ret; + + size = (size + (sizeof(void*) - 1)) / sizeof(void*); + + ZEND_VM_STACK_GROW_IF_NEEDED(size); + ret = EG(argument_stack)->top; + EG(argument_stack)->top += size; + return ret; +} + +static inline void zend_vm_stack_free(void *ptr TSRMLS_DC) +{ + if (UNEXPECTED(EG(argument_stack)->elements == ptr)) { + zend_vm_stack p = EG(argument_stack); + + EG(argument_stack) = p->prev; + efree(p); + } else { + EG(argument_stack)->top = ptr; + } +} + +static inline void** zend_vm_stack_push_args(int count TSRMLS_DC) +{ + + if (UNEXPECTED(EG(argument_stack)->top - EG(argument_stack)->elements < count) || + UNEXPECTED(EG(argument_stack)->top == EG(argument_stack)->end)) { + zend_vm_stack p = EG(argument_stack); + + zend_vm_stack_extend(count + 1 TSRMLS_CC); + + EG(argument_stack)->top += count; + *(EG(argument_stack)->top) = (void*)(zend_uintptr_t)count; + while (count-- > 0) { + void *data = *(--p-≥top); + + if (UNEXPECTED(p->top == p->elements)) { + zend_vm_stack r = p; + + EG(argument_stack)->prev = p->prev; + p = p->prev; + efree(r); + } + *(EG(argument_stack)->elements + count) = data; + } + return EG(argument_stack)->top++; + } + *(EG(argument_stack)->top) = (void*)(zend_uintptr_t)count; + return EG(argument_stack)->top++; +} + +static inline void zend_vm_stack_clear_multiple(TSRMLS_D) { - void **p = EG(argument_stack).top_element-2; + void **p = EG(argument_stack)->top - 1; int delete_count = (int)(zend_uintptr_t) *p; - EG(argument_stack).top -= (delete_count+2); while (--delete_count>=0) { zval *q = *(zval **)(--p); *p = NULL; zval_ptr_dtor(&q); } - EG(argument_stack).top_element = p; + zend_vm_stack_free(p TSRMLS_CC); } -static inline int zend_ptr_stack_get_arg(int requested_arg, void **data TSRMLS_DC) +static inline zval** zend_vm_stack_get_arg(int requested_arg TSRMLS_DC) { - void **p = EG(argument_stack).top_element-2; + void **p = EG(current_execute_data)->prev_execute_data->function_state.arguments; int arg_count = (int)(zend_uintptr_t) *p; - if (requested_arg>arg_count) { - return FAILURE; + if (UNEXPECTED(requested_arg > arg_count)) { + return NULL; } - *data = (p-arg_count+requested_arg-1); - return SUCCESS; + return (zval**)p - arg_count + requested_arg - 1; } void execute_new_code(TSRMLS_D); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.432&r2=1.433&diff_format=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.432 ZendEngine2/zend_execute_API.c:1.433 --- ZendEngine2/zend_execute_API.c:1.432 Tue Jan 22 09:29:29 2008 +++ ZendEngine2/zend_execute_API.c Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.432 2008/01/22 09:29:29 dmitry Exp $ */ +/* $Id: zend_execute_API.c,v 1.433 2008/01/24 09:41:48 dmitry Exp $ */ #include <stdio.h> #include <signal.h> @@ -159,8 +159,8 @@ EG(in_autoload) = NULL; EG(autoload_func) = NULL; - zend_ptr_stack_init(&EG(argument_stack)); - zend_ptr_stack_push(&EG(argument_stack), (void *) NULL); + zend_vm_stack_init(TSRMLS_C); + zend_vm_stack_push((void *) NULL TSRMLS_CC); zend_u_hash_init(&EG(symbol_table), 50, NULL, ZVAL_PTR_DTOR, 0, UG(unicode)); { @@ -308,7 +308,7 @@ } zend_hash_apply(EG(class_table), (apply_func_t) zend_cleanup_class_data TSRMLS_CC); - zend_ptr_stack_destroy(&EG(argument_stack)); + zend_vm_stack_destroy(TSRMLS_C); /* Destroy all op arrays */ if (EG(full_tables_cleanup)) { @@ -1040,6 +1040,12 @@ } } + if (call_via_handler) { + ZEND_VM_STACK_GROW_IF_NEEDED(2 + 1); + } else { + ZEND_VM_STACK_GROW_IF_NEEDED(fci->param_count + 1); + } + for (i=0; i<fci->param_count; i++) { zval *param; @@ -1051,8 +1057,8 @@ if (fci->no_separation) { if(i) { /* hack to clean up the stack */ - zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) (zend_uintptr_t) i, NULL); - zend_ptr_stack_clear_multiple(TSRMLS_C); + zend_vm_stack_push_nocheck((void *) (zend_uintptr_t)i TSRMLS_CC); + zend_vm_stack_clear_multiple(TSRMLS_C); } if (old_func_name) { efree(Z_STRVAL_P(fci->function_name)); @@ -1092,17 +1098,18 @@ if (call_via_handler) { add_next_index_zval(params_array, param); } else { - zend_ptr_stack_push(&EG(argument_stack), param); + zend_vm_stack_push_nocheck(param TSRMLS_CC); } } if (call_via_handler) { - zend_ptr_stack_push(&EG(argument_stack), method_name); - zend_ptr_stack_push(&EG(argument_stack), params_array); + zend_vm_stack_push_nocheck(method_name TSRMLS_CC); + zend_vm_stack_push_nocheck(params_array TSRMLS_CC); fci->param_count = 2; } - zend_ptr_stack_2_push(&EG(argument_stack), (void *) (zend_uintptr_t) fci->param_count, NULL); + EX(function_state).arguments = zend_vm_stack_top(TSRMLS_C); + zend_vm_stack_push_nocheck((void*)(zend_uintptr_t)fci->param_count TSRMLS_CC); current_scope = EG(scope); EG(scope) = calling_scope; @@ -1191,7 +1198,7 @@ *fci->retval_ptr_ptr = NULL; } } - zend_ptr_stack_clear_multiple(TSRMLS_C); + zend_vm_stack_clear_multiple(TSRMLS_C); if (call_via_handler) { zval_ptr_dtor(&method_name); zval_ptr_dtor(¶ms_array); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_globals.h?r1=1.173&r2=1.174&diff_format=u Index: ZendEngine2/zend_globals.h diff -u ZendEngine2/zend_globals.h:1.173 ZendEngine2/zend_globals.h:1.174 --- ZendEngine2/zend_globals.h:1.173 Mon Jan 21 19:41:41 2008 +++ ZendEngine2/zend_globals.h Thu Jan 24 09:41:48 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_globals.h,v 1.173 2008/01/21 19:41:41 dmitry Exp $ */ +/* $Id: zend_globals.h,v 1.174 2008/01/24 09:41:48 dmitry Exp $ */ #ifndef ZEND_GLOBALS_H #define ZEND_GLOBALS_H @@ -64,6 +64,7 @@ zval ticks; } zend_declarables; +typedef struct _zend_vm_stack *zend_vm_stack; struct _zend_compiler_globals { zend_stack bp_stack; @@ -207,7 +208,7 @@ HashTable regular_list; HashTable persistent_list; - zend_ptr_stack argument_stack; + zend_vm_stack argument_stack; int user_error_handler_error_reporting; zval *user_error_handler; http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.208&r2=1.209&diff_format=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.208 ZendEngine2/zend_vm_def.h:1.209 --- ZendEngine2/zend_vm_def.h:1.208 Wed Jan 23 17:56:15 2008 +++ ZendEngine2/zend_vm_def.h Thu Jan 24 09:41:48 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.208 2008/01/23 17:56:15 dmitry Exp $ */ +/* $Id: zend_vm_def.h,v 1.209 2008/01/24 09:41:48 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -2153,7 +2153,7 @@ } zend_ptr_stack_3_pop(&EG(arg_types_stack), (void*)&EX(called_scope), (void**)&ex_object, (void**)&EX(fbc)); - zend_ptr_stack_2_push(&EG(argument_stack), (void *)(zend_uintptr_t)opline->extended_value, NULL); + EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -2163,11 +2163,8 @@ if (EX(function_state).function->common.arg_info) { zend_uint i=0; - zval **p; - ulong arg_count; - - p = (zval **) EG(argument_stack).top_element-2; - arg_count = (ulong)(zend_uintptr_t) *p; + zval **p = (zval**)EX(function_state).arguments; + ulong arg_count = opline->extended_value; while (arg_count>0) { zend_verify_arg_type(EX(function_state).function, ++i, *(p-arg_count), 0 TSRMLS_CC); @@ -2255,6 +2252,7 @@ } EX(function_state).function = (zend_function *) EX(op_array); + EX(function_state).arguments = NULL; if (EG(This)) { if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) { @@ -2279,7 +2277,7 @@ EG(called_scope) = current_called_scope; } - zend_ptr_stack_clear_multiple(TSRMLS_C); + zend_vm_stack_clear_multiple(TSRMLS_C); if (EG(exception)) { zend_throw_exception_internal(NULL TSRMLS_CC); @@ -2455,7 +2453,7 @@ if (!IS_OP1_TMP_FREE()) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); FREE_OP1_IF_VAR(); } ZEND_VM_NEXT_OPCODE(); @@ -2482,7 +2480,7 @@ zval_copy_ctor(varptr); } Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); FREE_OP1(); /* for string offsets */ ZEND_VM_NEXT_OPCODE(); @@ -2518,7 +2516,7 @@ (Z_REFCOUNT_P(varptr) == 1 && (OP1_TYPE == IS_CV || free_op1.var)))) { Z_SET_ISREF_P(varptr); Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); } else { zval *valptr; @@ -2528,7 +2526,7 @@ if (!IS_OP1_TMP_FREE()) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } FREE_OP1_IF_VAR(); ZEND_VM_NEXT_OPCODE(); @@ -2549,7 +2547,7 @@ SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr); varptr = *varptr_ptr; Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE(); @@ -2569,10 +2567,10 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY) { zend_op *opline = EX(opline); - zval **param; zend_uint arg_num = Z_LVAL(opline->op1.u.constant); + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); - if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { + if (param == NULL) { char *space; zstr class_name = get_active_class_name(&space TSRMLS_CC); zend_execute_data *ptr = EX(prev_execute_data); @@ -2606,11 +2604,12 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST) { zend_op *opline = EX(opline); - zval **param, *assignment_value, **var_ptr; + zval *assignment_value, **var_ptr; zend_uint arg_num = Z_LVAL(opline->op1.u.constant); zend_free_op free_res; + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); - if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { + if (param == NULL) { if ((Z_TYPE(opline->op2.u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) { zval *default_value; @@ -4173,15 +4172,16 @@ int i; zend_uint catch_op_num; int catched = 0; - zval **stack_zval_pp; zval restored_error_reporting; - - stack_zval_pp = (zval **) EG(argument_stack).top_element - 1; - while (*stack_zval_pp != NULL) { - zval_ptr_dtor(stack_zval_pp); - EG(argument_stack).top_element--; - EG(argument_stack).top--; - stack_zval_pp--; + + void **stack_frame = (void**)execute_data + + (sizeof(zend_execute_data) + + sizeof(zval**) * EX(op_array)->last_var + + sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*); + + while (zend_vm_stack_top(TSRMLS_C) != stack_frame) { + zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C); + zval_ptr_dtor(&stack_zval_p); } for (i=0; i<EG(active_op_array)->last_try_catch; i++) { http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.214&r2=1.215&diff_format=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.214 ZendEngine2/zend_vm_execute.h:1.215 --- ZendEngine2/zend_vm_execute.h:1.214 Wed Jan 23 17:56:15 2008 +++ ZendEngine2/zend_vm_execute.h Thu Jan 24 09:41:48 2008 @@ -30,10 +30,13 @@ #define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC +#undef EX +#define EX(element) execute_data->element + ZEND_API void execute(zend_op_array *op_array TSRMLS_DC) { - zend_execute_data execute_data; + zend_execute_data *execute_data; if (EG(exception)) { @@ -41,23 +44,23 @@ } /* Initialize execute_data */ + execute_data = (zend_execute_data *)zend_vm_stack_alloc( + sizeof(zend_execute_data) + + sizeof(zval**) * op_array->last_var + + sizeof(temp_variable) * op_array->T TSRMLS_CC); + + EX(CVs) = (zval***)((char*)execute_data + sizeof(zend_execute_data)); + memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); + EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var); EX(fbc) = NULL; EX(called_scope) = NULL; EX(object) = NULL; EX(old_error_reporting) = NULL; - if (EXPECTED(op_array->T < TEMP_VAR_STACK_LIMIT && op_array->last_var < TEMP_VAR_STACK_LIMIT)) { - EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var + sizeof(temp_variable) * op_array->T, EX(use_heap)); - } else { - SET_ALLOCA_FLAG(EX(use_heap)); - EX(CVs) = (zval***)safe_emalloc(sizeof(temp_variable), op_array->T, sizeof(zval**) * op_array->last_var); - } - EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var); - memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); EX(op_array) = op_array; EX(original_in_execution) = EG(in_execution); EX(symbol_table) = EG(active_symbol_table); EX(prev_execute_data) = EG(current_execute_data); - EG(current_execute_data) = &execute_data; + EG(current_execute_data) = execute_data; EG(in_execution) = 1; if (op_array->start_op) { @@ -76,6 +79,7 @@ EG(opline_ptr) = &EX(opline); EX(function_state).function = (zend_function *) op_array; + EX(function_state).arguments = NULL; while (1) { #ifdef ZEND_WIN32 @@ -84,7 +88,7 @@ } #endif - if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) { + if (EX(opline)->handler(execute_data TSRMLS_CC) > 0) { return; } @@ -92,9 +96,6 @@ zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); } -#undef EX -#define EX(element) execute_data->element - static int ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { #if DEBUG_ZEND>=2 @@ -173,7 +174,7 @@ } zend_ptr_stack_3_pop(&EG(arg_types_stack), (void*)&EX(called_scope), (void**)&ex_object, (void**)&EX(fbc)); - zend_ptr_stack_2_push(&EG(argument_stack), (void *)(zend_uintptr_t)opline->extended_value, NULL); + EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -183,11 +184,8 @@ if (EX(function_state).function->common.arg_info) { zend_uint i=0; - zval **p; - ulong arg_count; - - p = (zval **) EG(argument_stack).top_element-2; - arg_count = (ulong)(zend_uintptr_t) *p; + zval **p = (zval**)EX(function_state).arguments; + ulong arg_count = opline->extended_value; while (arg_count>0) { zend_verify_arg_type(EX(function_state).function, ++i, *(p-arg_count), 0 TSRMLS_CC); @@ -275,6 +273,7 @@ } EX(function_state).function = (zend_function *) EX(op_array); + EX(function_state).arguments = NULL; if (EG(This)) { if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) { @@ -299,7 +298,7 @@ EG(called_scope) = current_called_scope; } - zend_ptr_stack_clear_multiple(TSRMLS_C); + zend_vm_stack_clear_multiple(TSRMLS_C); if (EG(exception)) { zend_throw_exception_internal(NULL TSRMLS_CC); @@ -348,10 +347,10 @@ static int ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zval **param; zend_uint arg_num = Z_LVAL(opline->op1.u.constant); + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); - if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { + if (param == NULL) { char *space; zstr class_name = get_active_class_name(&space TSRMLS_CC); zend_execute_data *ptr = EX(prev_execute_data); @@ -527,15 +526,16 @@ int i; zend_uint catch_op_num; int catched = 0; - zval **stack_zval_pp; zval restored_error_reporting; - stack_zval_pp = (zval **) EG(argument_stack).top_element - 1; - while (*stack_zval_pp != NULL) { - zval_ptr_dtor(stack_zval_pp); - EG(argument_stack).top_element--; - EG(argument_stack).top--; - stack_zval_pp--; + void **stack_frame = (void**)execute_data + + (sizeof(zend_execute_data) + + sizeof(zval**) * EX(op_array)->last_var + + sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*); + + while (zend_vm_stack_top(TSRMLS_C) != stack_frame) { + zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C); + zval_ptr_dtor(&stack_zval_p); } for (i=0; i<EG(active_op_array)->last_try_catch; i++) { @@ -723,11 +723,12 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zval **param, *assignment_value, **var_ptr; + zval *assignment_value, **var_ptr; zend_uint arg_num = Z_LVAL(opline->op1.u.constant); zend_free_op free_res; + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); - if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { + if (param == NULL) { if ((Z_TYPE(opline->op2.u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) { zval *default_value; @@ -1502,7 +1503,7 @@ if (!0) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } ZEND_VM_NEXT_OPCODE(); @@ -4756,7 +4757,7 @@ if (!1) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } ZEND_VM_NEXT_OPCODE(); @@ -7993,7 +7994,7 @@ if (!0) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; } ZEND_VM_NEXT_OPCODE(); @@ -8020,7 +8021,7 @@ zval_copy_ctor(varptr); } Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* for string offsets */ ZEND_VM_NEXT_OPCODE(); @@ -8056,7 +8057,7 @@ (Z_REFCOUNT_P(varptr) == 1 && (IS_VAR == IS_CV || free_op1.var)))) { Z_SET_ISREF_P(varptr); Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); } else { zval *valptr; @@ -8066,7 +8067,7 @@ if (!0) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; ZEND_VM_NEXT_OPCODE(); @@ -8087,7 +8088,7 @@ SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr); varptr = *varptr_ptr; Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; ZEND_VM_NEXT_OPCODE(); @@ -22129,7 +22130,7 @@ if (!0) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } ZEND_VM_NEXT_OPCODE(); @@ -22156,7 +22157,7 @@ zval_copy_ctor(varptr); } Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); ; /* for string offsets */ ZEND_VM_NEXT_OPCODE(); @@ -22192,7 +22193,7 @@ (Z_REFCOUNT_P(varptr) == 1 && (IS_CV == IS_CV || free_op1.var)))) { Z_SET_ISREF_P(varptr); Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); } else { zval *valptr; @@ -22202,7 +22203,7 @@ if (!0) { zval_copy_ctor(valptr); } - zend_ptr_stack_push(&EG(argument_stack), valptr); + zend_vm_stack_push(valptr TSRMLS_CC); } ZEND_VM_NEXT_OPCODE(); @@ -22223,7 +22224,7 @@ SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr); varptr = *varptr_ptr; Z_ADDREF_P(varptr); - zend_ptr_stack_push(&EG(argument_stack), varptr); + zend_vm_stack_push(varptr TSRMLS_CC); ZEND_VM_NEXT_OPCODE(); } http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.skl?r1=1.12&r2=1.13&diff_format=u Index: ZendEngine2/zend_vm_execute.skl diff -u ZendEngine2/zend_vm_execute.skl:1.12 ZendEngine2/zend_vm_execute.skl:1.13 --- ZendEngine2/zend_vm_execute.skl:1.12 Fri Nov 23 15:02:50 2007 +++ ZendEngine2/zend_vm_execute.skl Thu Jan 24 09:41:48 2008 @@ -2,7 +2,7 @@ ZEND_API void {%EXECUTOR_NAME%}(zend_op_array *op_array TSRMLS_DC) { - zend_execute_data execute_data; + zend_execute_data *execute_data; {%HELPER_VARS%} {%INTERNAL_LABELS%} @@ -12,23 +12,23 @@ } /* Initialize execute_data */ + execute_data = (zend_execute_data *)zend_vm_stack_alloc( + sizeof(zend_execute_data) + + sizeof(zval**) * op_array->last_var + + sizeof(temp_variable) * op_array->T TSRMLS_CC); + + EX(CVs) = (zval***)((char*)execute_data + sizeof(zend_execute_data)); + memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); + EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var); EX(fbc) = NULL; EX(called_scope) = NULL; EX(object) = NULL; EX(old_error_reporting) = NULL; - if (EXPECTED(op_array->T < TEMP_VAR_STACK_LIMIT && op_array->last_var < TEMP_VAR_STACK_LIMIT)) { - EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var + sizeof(temp_variable) * op_array->T, EX(use_heap)); - } else { - SET_ALLOCA_FLAG(EX(use_heap)); - EX(CVs) = (zval***)safe_emalloc(sizeof(temp_variable), op_array->T, sizeof(zval**) * op_array->last_var); - } - EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var); - memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); EX(op_array) = op_array; EX(original_in_execution) = EG(in_execution); EX(symbol_table) = EG(active_symbol_table); EX(prev_execute_data) = EG(current_execute_data); - EG(current_execute_data) = &execute_data; + EG(current_execute_data) = execute_data; EG(in_execution) = 1; if (op_array->start_op) { @@ -47,9 +47,10 @@ EG(opline_ptr) = &EX(opline); EX(function_state).function = (zend_function *) op_array; + EX(function_state).arguments = NULL; while (1) { - {%ZEND_VM_CONTINUE_LABEL%} + {%ZEND_VM_CONTINUE_LABEL%} #ifdef ZEND_WIN32 if (EG(timed_out)) { zend_timeout(0); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_gen.php?r1=1.23&r2=1.24&diff_format=u Index: ZendEngine2/zend_vm_gen.php diff -u ZendEngine2/zend_vm_gen.php:1.23 ZendEngine2/zend_vm_gen.php:1.24 --- ZendEngine2/zend_vm_gen.php:1.23 Mon Dec 31 07:24:13 2007 +++ ZendEngine2/zend_vm_gen.php Thu Jan 24 09:41:48 2008 @@ -16,7 +16,7 @@ | Authors: Dmitry Stogov <dmitry <at> zend.com> | +----------------------------------------------------------------------+ - $Id: zend_vm_gen.php,v 1.23 2007/12/31 07:24:13 sebastian Exp $ + $Id: zend_vm_gen.php,v 1.24 2008/01/24 09:41:48 dmitry Exp $ */ $header_text = <<< DATA @@ -404,7 +404,7 @@ "/ZEND_VM_DISPATCH_TO_HELPER_EX\(\s*([A-Za-z_]*)\s*,\s*([A-Za-z_]*)\s*,\s*(.*)\s*\);/me", ), array( - "&execute_data", + "execute_data", "goto \\1".($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]."_LABEL", "'goto '.helper_name('\\1',$spec,'$op1','$op2')", "'\\2 = \\3; goto '.helper_name('\\1',$spec,'$op1','$op2').';'", @@ -420,7 +420,7 @@ "/ZEND_VM_DISPATCH_TO_HELPER_EX\(\s*([A-Za-z_]*)\s*,\s*([A-Za-z_]*)\s*,\s*(.*)\s*\);/me", ), array( - "&execute_data", + "execute_data", "goto \\1".($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]."_HANDLER", "'goto '.helper_name('\\1',$spec,'$op1','$op2')", "'\\2 = \\3; goto '.helper_name('\\1',$spec,'$op1','$op2').';'", @@ -801,20 +801,26 @@ out($f,"#define ZEND_VM_RETURN() return 1\n"); out($f,"#define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n\n"); out($f,"#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC\n"); + out($f,"#undef EX\n"); + out($f,"#define EX(element) execute_data->element\n\n"); break; case ZEND_VM_KIND_SWITCH: out($f,"\n"); out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n"); out($f,"#define ZEND_VM_RETURN() return\n"); out($f,"#define ZEND_VM_DISPATCH(opcode, opline) dispatch_handler = zend_vm_get_opcode_handler(opcode, opline); goto zend_vm_dispatch;\n\n"); - out($f,"#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL &execute_data TSRMLS_CC\n"); + out($f,"#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC\n"); + out($f,"#undef EX\n"); + out($f,"#define EX(element) execute_data->element\n\n"); break; case ZEND_VM_KIND_GOTO: out($f,"\n"); out($f,"#define ZEND_VM_CONTINUE() goto *(void**)(EX(opline)->handler)\n"); out($f,"#define ZEND_VM_RETURN() return\n"); out($f,"#define ZEND_VM_DISPATCH(opcode, opline) goto *(void**)(zend_vm_get_opcode_handler(opcode, opline));\n\n"); - out($f,"#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL &execute_data TSRMLS_CC\n"); + out($f,"#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC\n"); + out($f,"#undef EX\n"); + out($f,"#define EX(element) execute_data->element\n\n"); break; } break; @@ -862,7 +868,7 @@ // Emit code that dispatches to opcode handler switch ($kind) { case ZEND_VM_KIND_CALL: - out($f, $m[1]."if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0)".$m[3]."\n"); + out($f, $m[1]."if (EX(opline)->handler(execute_data TSRMLS_CC) > 0)".$m[3]."\n"); break; case ZEND_VM_KIND_SWITCH: out($f, $m[1]."dispatch_handler = EX(opline)->handler;\nzend_vm_dispatch:\n".$m[1]."switch ((int)dispatch_handler)".$m[3]."\n"); @@ -886,9 +892,7 @@ // Unspecialized executor with CALL threading is the same as the // old one, so we don't need to produce code twitch if (!$old || ZEND_VM_SPEC || (ZEND_VM_KIND != ZEND_VM_KIND_CALL)) { - out($f,"#undef EX\n"); - out($f,"#define EX(element) execute_data->element\n\n"); - // Emit executor code + // Emit executor code gen_executor_code($f, $spec, $kind, $m[1]); } } http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug41209.phpt?r1=1.1&r2=1.2&diff_format=u Index: ZendEngine2/tests/bug41209.phpt diff -u ZendEngine2/tests/bug41209.phpt:1.1 ZendEngine2/tests/bug41209.phpt:1.2 --- ZendEngine2/tests/bug41209.phpt:1.1 Fri Apr 27 08:11:37 2007 +++ ZendEngine2/tests/bug41209.phpt Thu Jan 24 09:41:48 2008 @@ -41,6 +41,6 @@ --EXPECTF-- Fatal error: Uncaught exception 'ErrorException' with message 'Undefined variable: id' in %s:%d Stack trace: -#0 %s(%d): env::errorHandler() +#0 %s(%d): env::errorHandler(8, '%s', '%s', 34, Array) #1 {main} thrown in %s on line %d
-- -- Zend Engine CVS Mailing List (http://cvs.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RSS Feed