? Zend/.zend_compile.c.swp ? Zend/.zend_language_scanner.l.swp Index: ext/spl/php_spl.c =================================================================== RCS file: /repository/php-src/ext/spl/php_spl.c,v retrieving revision 1.52.2.28.2.17.2.22 diff -u -p -r1.52.2.28.2.17.2.22 php_spl.c --- ext/spl/php_spl.c 13 Jul 2008 21:45:07 -0000 1.52.2.28.2.17.2.22 +++ ext/spl/php_spl.c 22 Jul 2008 07:07:28 -0000 @@ -448,7 +448,7 @@ PHP_FUNCTION(spl_autoload_register) } } - if (!zend_is_callable_ex(zcallable, IS_CALLABLE_STRICT, &func_name, &func_name_len, &alfi.ce, &alfi.func_ptr, &obj_ptr, &error TSRMLS_CC)) { + if (!zend_is_callable_ex(zcallable, IS_CALLABLE_STRICT, &func_name, &func_name_len, &alfi.ce, NULL, &alfi.func_ptr, &obj_ptr, &error TSRMLS_CC)) { if (Z_TYPE_P(zcallable) == IS_ARRAY) { if (!obj_ptr && alfi.func_ptr && !(alfi.func_ptr->common.fn_flags & ZEND_ACC_STATIC)) { if (do_throw) { @@ -563,7 +563,7 @@ PHP_FUNCTION(spl_autoload_unregister) return; } - if (!zend_is_callable_ex(zcallable, IS_CALLABLE_CHECK_SYNTAX_ONLY, &func_name, &func_name_len, NULL, NULL, &obj_ptr, &error TSRMLS_CC)) { + if (!zend_is_callable_ex(zcallable, IS_CALLABLE_CHECK_SYNTAX_ONLY, &func_name, &func_name_len, NULL, NULL, NULL, &obj_ptr, &error TSRMLS_CC)) { zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Unable to unregister invalid function (%s)", error); if (error) { efree(error); Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php-src/ext/standard/basic_functions.c,v retrieving revision 1.725.2.31.2.64.2.37 diff -u -p -r1.725.2.31.2.64.2.37 basic_functions.c --- ext/standard/basic_functions.c 17 Jul 2008 19:29:34 -0000 1.725.2.31.2.64.2.37 +++ ext/standard/basic_functions.c 22 Jul 2008 07:07:29 -0000 @@ -811,19 +811,6 @@ ZEND_BEGIN_ARG_INFO(arginfo_call_user_me ZEND_END_ARG_INFO() static -ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call, 0, 0, 1) - ZEND_ARG_INFO(0, function_name) - ZEND_ARG_INFO(0, parameter) - ZEND_ARG_INFO(0, ...) -ZEND_END_ARG_INFO() - -static -ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call_array, 0, 0, 2) - ZEND_ARG_INFO(0, function_name) - ZEND_ARG_INFO(0, parameters) /* ARRAY_INFO(0, parameters, 1) */ -ZEND_END_ARG_INFO() - -static ZEND_BEGIN_ARG_INFO(arginfo_register_shutdown_function, 0) ZEND_ARG_INFO(0, function_name) ZEND_END_ARG_INFO() @@ -3357,8 +3344,6 @@ const zend_function_entry basic_function PHP_FE(call_user_func_array, arginfo_call_user_func_array) PHP_DEP_FE(call_user_method, arginfo_call_user_method) PHP_DEP_FE(call_user_method_array, arginfo_call_user_method_array) - PHP_FE(forward_static_call, arginfo_forward_static_call) - PHP_FE(forward_static_call_array, arginfo_forward_static_call_array) PHP_FE(serialize, arginfo_serialize) PHP_FE(unserialize, arginfo_unserialize) @@ -5221,66 +5206,6 @@ PHP_FUNCTION(call_user_method_array) } /* }}} */ -/* {{{ proto mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...]) U - Call a user function which is the first parameter */ -PHP_FUNCTION(forward_static_call) -{ - zval *retval_ptr = NULL; - zend_fcall_info fci; - zend_fcall_info_cache fci_cache; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) { - return; - } - - if (!EG(active_op_array)->scope) { - zend_error(E_ERROR, "Cannot call forward_static_call() when no class scope is active"); - } - - fci.retval_ptr_ptr = &retval_ptr; - - if (EG(called_scope) && - instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) { - fci_cache.calling_scope = EG(called_scope); - } - - if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) { - COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr); - } - - if (fci.params) { - efree(fci.params); - } -} -/* }}} */ - -/* {{{ proto mixed call_user_func_array(string function_name, array parameters) U - Call a user function which is the first parameter with the arguments contained in array */ -PHP_FUNCTION(forward_static_call_array) -{ - zval *params, *retval_ptr = NULL; - zend_fcall_info fci; - zend_fcall_info_cache fci_cache; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "fa/", &fci, &fci_cache, ¶ms) == FAILURE) { - return; - } - - zend_fcall_info_args(&fci, params TSRMLS_CC); - fci.retval_ptr_ptr = &retval_ptr; - - if (EG(called_scope) && - instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) { - fci_cache.calling_scope = EG(called_scope); - } - - if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) { - COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr); - } - - zend_fcall_info_args_clear(&fci, 1); -} -/* }}} */ void user_shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */ { Index: ext/standard/basic_functions.h =================================================================== RCS file: /repository/php-src/ext/standard/basic_functions.h,v retrieving revision 1.139.2.4.2.6.2.9 diff -u -p -r1.139.2.4.2.6.2.9 basic_functions.h --- ext/standard/basic_functions.h 15 Apr 2008 08:44:21 -0000 1.139.2.4.2.6.2.9 +++ ext/standard/basic_functions.h 22 Jul 2008 07:07:29 -0000 @@ -84,8 +84,6 @@ PHP_FUNCTION(call_user_func); PHP_FUNCTION(call_user_func_array); PHP_FUNCTION(call_user_method); PHP_FUNCTION(call_user_method_array); -PHP_FUNCTION(forward_static_call); -PHP_FUNCTION(forward_static_call_array); PHP_FUNCTION(register_shutdown_function); PHP_FUNCTION(highlight_file); Index: Zend/zend_API.c =================================================================== RCS file: /repository/ZendEngine2/zend_API.c,v retrieving revision 1.296.2.27.2.34.2.40 diff -u -p -r1.296.2.27.2.34.2.40 zend_API.c --- Zend/zend_API.c 14 Jul 2008 12:18:20 -0000 1.296.2.27.2.34.2.40 +++ Zend/zend_API.c 22 Jul 2008 07:07:29 -0000 @@ -2305,7 +2305,7 @@ ZEND_API int zend_disable_class(char *cl } /* }}} */ -static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, zend_class_entry *ce_org, zval *callable, zend_class_entry **ce_ptr, zend_function **fptr_ptr, char **error TSRMLS_DC) /* {{{ */ +static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, zend_class_entry *ce_org, zval *callable, zend_class_entry **ce_ptr, zend_uint *fetch_type, zend_function **fptr_ptr, char **error TSRMLS_DC) /* {{{ */ { int retval; char *lmname, *colon; @@ -2364,6 +2364,7 @@ static int zend_is_callable_check_func(i EG(scope) = ce_org; } *ce_ptr = zend_fetch_class(Z_STRVAL_P(callable), clen, ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_SILENT TSRMLS_CC); + *fetch_type = zend_get_class_fetch_type(Z_STRVAL_P(callable), clen); EG(scope) = last_scope; if (!*ce_ptr) { if (error) zend_spprintf(error, 0, "class '%.*Z' not found", clen, callable); @@ -2478,11 +2479,12 @@ static int zend_is_callable_check_func(i } /* }}} */ -ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr, char **error TSRMLS_DC) /* {{{ */ +ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_uint *fetch_type, zend_function **fptr_ptr, zval ***zobj_ptr_ptr, char **error TSRMLS_DC) /* {{{ */ { char *lcname; int callable_name_len_local; zend_class_entry *ce_local, **pce; + zend_uint fetch_type_local; zend_function *fptr_local; zval **zobj_ptr_local; @@ -2504,7 +2506,12 @@ ZEND_API zend_bool zend_is_callable_ex(z if (error) { *error = NULL; } + if (fetch_type == NULL) { + fetch_type = &fetch_type_local; + } + *ce_ptr = NULL; + *fetch_type = 0; *fptr_ptr = NULL; *zobj_ptr_ptr = NULL; @@ -2518,7 +2525,7 @@ ZEND_API zend_bool zend_is_callable_ex(z return 1; } - return zend_is_callable_check_func(check_flags, zobj_ptr_ptr, NULL, callable, ce_ptr, fptr_ptr, error TSRMLS_CC); + return zend_is_callable_check_func(check_flags, zobj_ptr_ptr, NULL, callable, ce_ptr, fetch_type, fptr_ptr, error TSRMLS_CC); case IS_ARRAY: { @@ -2558,13 +2565,16 @@ ZEND_API zend_bool zend_is_callable_ex(z Z_STRLEN_PP(obj) == sizeof("self") - 1 && !memcmp(lcname, "self", sizeof("self") - 1)) { ce = EG(active_op_array)->scope; + *fetch_type = ZEND_FETCH_CLASS_SELF; } else if (EG(active_op_array) && EG(active_op_array)->scope && Z_STRLEN_PP(obj) == sizeof("parent") - 1 && !memcmp(lcname, "parent", sizeof("parent") - 1)) { ce = EG(active_op_array)->scope->parent; + *fetch_type = ZEND_FETCH_CLASS_PARENT; } else if (Z_STRLEN_PP(obj) == sizeof("static") - 1 && !memcmp(lcname, "static", sizeof("static") - 1)) { ce = EG(called_scope); + *fetch_type = ZEND_FETCH_CLASS_STATIC; } else if (zend_lookup_class(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) { ce = *pce; } @@ -2593,7 +2603,7 @@ ZEND_API zend_bool zend_is_callable_ex(z } if (ce) { - return zend_is_callable_check_func(check_flags, zobj_ptr_ptr, ce, *method, ce_ptr, fptr_ptr, error TSRMLS_CC); + return zend_is_callable_check_func(check_flags, zobj_ptr_ptr, ce, *method, ce_ptr, fetch_type, fptr_ptr, error TSRMLS_CC); } else { if (error) zend_spprintf(error, 0, "first array member is not a valid %s", Z_TYPE_PP(obj) == IS_STRING ? "class name" : "object"); } @@ -2650,7 +2660,7 @@ ZEND_API zend_bool zend_is_callable(zval { TSRMLS_FETCH(); - return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL, NULL, NULL TSRMLS_CC); + return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL, NULL, NULL, NULL TSRMLS_CC); } /* }}} */ @@ -2660,7 +2670,7 @@ ZEND_API zend_bool zend_make_callable(zv zend_function *fptr; zval **zobj_ptr; - if (zend_is_callable_ex(callable, IS_CALLABLE_STRICT, callable_name, NULL, &ce, &fptr, &zobj_ptr, NULL TSRMLS_CC)) { + if (zend_is_callable_ex(callable, IS_CALLABLE_STRICT, callable_name, NULL, &ce, NULL, &fptr, &zobj_ptr, NULL TSRMLS_CC)) { if (Z_TYPE_P(callable) == IS_STRING && ce) { zval_dtor(callable); array_init(callable); @@ -2679,8 +2689,9 @@ ZEND_API int zend_fcall_info_init(zval * zend_class_entry *ce; zend_function *func; zval **obj; + zend_uint fetch_type; - if (!zend_is_callable_ex(callable, check_flags, callable_name, NULL, &ce, &func, &obj, error TSRMLS_CC)) { + if (!zend_is_callable_ex(callable, check_flags, callable_name, NULL, &ce, &fetch_type, &func, &obj, error TSRMLS_CC)) { return FAILURE; } @@ -2709,7 +2720,11 @@ ZEND_API int zend_fcall_info_init(zval * fcc->initialized = 1; fcc->function_handler = func; - fcc->calling_scope = ce; + if (fetch_type == ZEND_FETCH_CLASS_PARENT || fetch_type == ZEND_FETCH_CLASS_SELF) { + fcc->calling_scope = EG(called_scope); + } else { + fcc->calling_scope = ce; + } fcc->object_pp = obj; return SUCCESS; Index: Zend/zend_API.h =================================================================== RCS file: /repository/ZendEngine2/zend_API.h,v retrieving revision 1.207.2.8.2.8.2.13 diff -u -p -r1.207.2.8.2.8.2.13 zend_API.h --- Zend/zend_API.h 27 Jun 2008 21:16:41 -0000 1.207.2.8.2.8.2.13 +++ Zend/zend_API.h 22 Jul 2008 07:07:30 -0000 @@ -256,7 +256,7 @@ ZEND_API void zend_wrong_param_count(TSR #define IS_CALLABLE_STRICT (IS_CALLABLE_CHECK_IS_STATIC) -ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr, char **error TSRMLS_DC); +ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_uint *fetch_type, zend_function **fptr_ptr, zval ***zobj_ptr_ptr, char **error TSRMLS_DC); ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, char **callable_name); ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC); ZEND_API const char *zend_get_module_version(const char *module_name); Index: Zend/zend_execute_API.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute_API.c,v retrieving revision 1.331.2.20.2.24.2.43 diff -u -p -r1.331.2.20.2.24.2.43 zend_execute_API.c --- Zend/zend_execute_API.c 14 Jul 2008 09:49:00 -0000 1.331.2.20.2.24.2.43 +++ Zend/zend_execute_API.c 22 Jul 2008 07:07:31 -0000 @@ -773,6 +773,11 @@ int zend_call_function(zend_fcall_info * found = (*ce != NULL?SUCCESS:FAILURE); fci->object_pp = EG(This)?&EG(This):NULL; EX(object) = EG(This); + if (EG(called_scope)) { + calling_scope = EG(called_scope); + } else { + calling_scope = *ce; + } } else if (strcmp(Z_STRVAL_PP(fci->object_pp), "parent") == 0 && EG(active_op_array)) { if (!EG(active_op_array)->scope) { @@ -785,6 +790,11 @@ int zend_call_function(zend_fcall_info * found = (*ce != NULL?SUCCESS:FAILURE); fci->object_pp = EG(This)?&EG(This):NULL; EX(object) = EG(This); + if (EG(called_scope)) { + calling_scope = EG(called_scope); + } else { + calling_scope = *ce; + } } else if (Z_STRLEN_PP(fci->object_pp) == sizeof("static") - 1 && !memcmp(Z_STRVAL_PP(fci->object_pp), "static", sizeof("static") - 1) ) { @@ -795,6 +805,7 @@ int zend_call_function(zend_fcall_info * found = (*ce != NULL?SUCCESS:FAILURE); fci->object_pp = EG(This)?&EG(This):NULL; EX(object) = EG(This); + calling_scope = *ce; } else { zend_class_entry *scope; scope = EG(active_op_array) ? EG(active_op_array)->scope : NULL; @@ -811,12 +822,12 @@ int zend_call_function(zend_fcall_info * } else { fci->object_pp = NULL; } + calling_scope = *ce; } if (found == FAILURE) return FAILURE; fci->function_table = &(*ce)->function_table; - calling_scope = *ce; } else { zend_error(E_NOTICE, "Non-callable array passed to zend_call_function()"); return FAILURE; Index: Zend/zend_vm_def.h =================================================================== RCS file: /repository/ZendEngine2/zend_vm_def.h,v retrieving revision 1.59.2.29.2.48.2.60 diff -u -p -r1.59.2.29.2.48.2.60 zend_vm_def.h --- Zend/zend_vm_def.h 14 Jul 2008 12:18:20 -0000 1.59.2.29.2.48.2.60 +++ Zend/zend_vm_def.h 22 Jul 2008 07:07:32 -0000 @@ -1937,8 +1937,15 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_ME if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(OP2_TYPE != IS_UNUSED) { char *function_name_strval; @@ -1980,8 +1987,6 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_ME EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { Index: Zend/zend_vm_execute.h =================================================================== RCS file: /repository/ZendEngine2/zend_vm_execute.h,v retrieving revision 1.62.2.30.2.49.2.60 diff -u -p -r1.62.2.30.2.49.2.60 zend_vm_execute.h --- Zend/zend_vm_execute.h 14 Jul 2008 12:18:20 -0000 1.62.2.30.2.49.2.60 +++ Zend/zend_vm_execute.h 22 Jul 2008 07:07:40 -0000 @@ -2606,8 +2606,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CONST != IS_UNUSED) { char *function_name_strval; @@ -2649,8 +2656,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3194,8 +3199,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_TMP_VAR != IS_UNUSED) { char *function_name_strval; @@ -3237,8 +3249,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3662,8 +3672,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_VAR != IS_UNUSED) { char *function_name_strval; @@ -3705,8 +3722,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3886,8 +3901,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_UNUSED != IS_UNUSED) { char *function_name_strval; @@ -3929,8 +3951,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -4322,8 +4342,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CV != IS_UNUSED) { char *function_name_strval; @@ -4365,8 +4392,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -10260,8 +10285,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CONST != IS_UNUSED) { char *function_name_strval; @@ -10303,8 +10335,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -12092,8 +12122,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_TMP_VAR != IS_UNUSED) { char *function_name_strval; @@ -12135,8 +12172,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -13894,8 +13929,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_VAR != IS_UNUSED) { char *function_name_strval; @@ -13937,8 +13979,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -14799,8 +14839,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_UNUSED != IS_UNUSED) { char *function_name_strval; @@ -14842,8 +14889,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -16302,8 +16347,15 @@ static int ZEND_FASTCALL ZEND_INIT_STAT if (!ce) { zend_error(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant)); } + EX(called_scope) = ce; } else { ce = EX_T(opline->op1.u.var).class_entry; + + if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CV != IS_UNUSED) { char *function_name_strval; @@ -16345,8 +16397,6 @@ static int ZEND_FASTCALL ZEND_INIT_STAT EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { Index: Zend/tests/lsb_015.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_015.phpt,v retrieving revision 1.1.2.2 diff -u -p -r1.1.2.2 lsb_015.phpt --- Zend/tests/lsb_015.phpt 29 Sep 2007 07:28:34 -0000 1.1.2.2 +++ Zend/tests/lsb_015.phpt 22 Jul 2008 07:07:40 -0000 @@ -86,7 +86,7 @@ A B B B -A -A +B +B B ==DONE== Index: Zend/tests/lsb_019.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_019.phpt,v retrieving revision 1.1.2.2 diff -u -p -r1.1.2.2 lsb_019.phpt --- Zend/tests/lsb_019.phpt 3 Mar 2008 15:07:04 -0000 1.1.2.2 +++ Zend/tests/lsb_019.phpt 22 Jul 2008 07:07:40 -0000 @@ -1,5 +1,5 @@ --TEST-- -Test LSB of properties and methods declared as protected and overridden as public. +ZE2 Late Static Binding properties and methods declared as protected and overridden as public. --FILE-- +--EXPECTF-- +C +C +C +C +C +C +A +A +A +B +B +B