Index: ext/spl/php_spl.c =================================================================== RCS file: /repository/php-src/ext/spl/php_spl.c,v retrieving revision 1.136 diff -u -p -r1.136 php_spl.c --- ext/spl/php_spl.c 13 Jul 2008 21:38:58 -0000 1.136 +++ ext/spl/php_spl.c 22 Jul 2008 07:06:55 -0000 @@ -450,7 +450,7 @@ PHP_FUNCTION(spl_autoload_register) zval_dtor(&ztmp); } - if (!zend_is_callable_ex(zcallable, IS_CALLABLE_STRICT, &zfunc_name, &alfi.ce, &alfi.func_ptr, &obj_ptr, &error TSRMLS_CC)) { + if (!zend_is_callable_ex(zcallable, IS_CALLABLE_STRICT, &zfunc_name, &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) { @@ -573,7 +573,7 @@ PHP_FUNCTION(spl_autoload_unregister) return; } - if (!zend_is_callable_ex(zcallable, IS_CALLABLE_CHECK_SYNTAX_ONLY, &zfunc_name, NULL, NULL, &obj_ptr, &error TSRMLS_CC)) { + if (!zend_is_callable_ex(zcallable, IS_CALLABLE_CHECK_SYNTAX_ONLY, &zfunc_name, 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.901 diff -u -p -r1.901 basic_functions.c --- ext/standard/basic_functions.c 17 Jul 2008 09:52:51 -0000 1.901 +++ ext/standard/basic_functions.c 22 Jul 2008 07:06:56 -0000 @@ -817,19 +817,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() @@ -3402,8 +3389,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.164 diff -u -p -r1.164 basic_functions.h --- ext/standard/basic_functions.h 24 May 2008 14:36:16 -0000 1.164 +++ ext/standard/basic_functions.h 22 Jul 2008 07:06:56 -0000 @@ -83,8 +83,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.475 diff -u -p -r1.475 zend_API.c --- Zend/zend_API.c 14 Jul 2008 12:17:16 -0000 1.475 +++ Zend/zend_API.c 22 Jul 2008 07:06:57 -0000 @@ -2690,7 +2690,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; zstr lmname, mname, colon = NULL_ZSTR; @@ -2773,6 +2773,7 @@ static int zend_is_callable_check_func(i EG(scope) = ce_org; } *ce_ptr = zend_u_fetch_class(Z_TYPE_P(callable), Z_UNIVAL_P(callable), clen, ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_SILENT TSRMLS_CC); + *fetch_type = zend_get_class_fetch_type(Z_TYPE_P(callable), Z_UNIVAL_P(callable), clen); EG(scope) = last_scope; if (!*ce_ptr) { if (error) { @@ -2888,11 +2889,12 @@ static int zend_is_callable_check_func(i } /* }}} */ -ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *callable_name, 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, zval *callable_name, zend_class_entry **ce_ptr, zend_uint *fetch_type, zend_function **fptr_ptr, zval ***zobj_ptr_ptr, char **error TSRMLS_DC) /* {{{ */ { zstr lcname; unsigned int lcname_len; zend_class_entry *ce_local, **pce; + zend_uint fetch_type_local; zend_function *fptr_local; zval **zobj_ptr_local; @@ -2911,7 +2913,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; @@ -2927,7 +2934,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: { @@ -3011,13 +3018,16 @@ ZEND_API zend_bool zend_is_callable_ex(z lcname_len == sizeof("self")-1 && ZEND_U_EQUAL(Z_TYPE_PP(obj), lcname, lcname_len, "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 && lcname_len == sizeof("parent")-1 && ZEND_U_EQUAL(Z_TYPE_PP(obj), lcname, lcname_len, "parent", sizeof("parent")-1)) { ce = EG(active_op_array)->scope->parent; + *fetch_type = ZEND_FETCH_CLASS_PARENT; } else if (lcname_len == sizeof("static")-1 && ZEND_U_EQUAL(Z_TYPE_PP(obj), lcname, lcname_len, "static", sizeof("static")-1)) { ce = EG(called_scope); + *fetch_type = ZEND_FETCH_CLASS_STATIC; } else if (zend_u_lookup_class(Z_TYPE_PP(obj), Z_UNIVAL_PP(obj), Z_UNILEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) { ce = *pce; } @@ -3072,7 +3082,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 || Z_TYPE_PP(obj) == IS_UNICODE) ? "class name" : "object"); } @@ -3133,7 +3143,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 TSRMLS_CC); + return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL, NULL, NULL TSRMLS_CC); } /* }}} */ @@ -3143,7 +3153,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, &ce, &fptr, &zobj_ptr, NULL TSRMLS_CC)) { + if (zend_is_callable_ex(callable, IS_CALLABLE_STRICT, callable_name, &ce, NULL, &fptr, &zobj_ptr, NULL TSRMLS_CC)) { if ((Z_TYPE_P(callable) == IS_STRING || Z_TYPE_P(callable) == IS_UNICODE) && ce) { zval_dtor(callable); array_init(callable); @@ -3161,8 +3171,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, &ce, &func, &obj, error TSRMLS_CC)) { + if (!zend_is_callable_ex(callable, check_flags, callable_name, &ce, &fetch_type, &func, &obj, error TSRMLS_CC)) { return FAILURE; } @@ -3186,7 +3197,11 @@ ZEND_API int zend_fcall_info_init(zval * } else { 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; } Index: Zend/zend_API.h =================================================================== RCS file: /repository/ZendEngine2/zend_API.h,v retrieving revision 1.302 diff -u -p -r1.302 zend_API.h --- Zend/zend_API.h 27 Jun 2008 21:18:41 -0000 1.302 +++ Zend/zend_API.h 22 Jul 2008 07:06:58 -0000 @@ -263,7 +263,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, zval *callable_name, 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, zval *callable_name, 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, zval *callable_name); ZEND_API zend_bool zend_make_callable(zval *callable, zval *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.451 diff -u -p -r1.451 zend_execute_API.c --- Zend/zend_execute_API.c 8 Jul 2008 07:05:03 -0000 1.451 +++ Zend/zend_execute_API.c 22 Jul 2008 07:06:59 -0000 @@ -834,6 +834,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 (EG(active_op_array) && Z_UNILEN_PP(fci->object_pp) == sizeof("parent") - 1 && ZEND_U_EQUAL(Z_TYPE_PP(fci->object_pp), Z_UNIVAL_PP(fci->object_pp), Z_UNILEN_PP(fci->object_pp), "parent", sizeof("parent") - 1) @@ -848,6 +853,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_UNILEN_PP(fci->object_pp) == sizeof("static") - 1 && ZEND_U_EQUAL(Z_TYPE_PP(fci->object_pp), Z_UNIVAL_PP(fci->object_pp), Z_UNILEN_PP(fci->object_pp), "static", sizeof("static") - 1) ) { @@ -858,6 +868,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; @@ -874,12 +885,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.234 diff -u -p -r1.234 zend_vm_def.h --- Zend/zend_vm_def.h 8 Jul 2008 07:05:03 -0000 1.234 +++ Zend/zend_vm_def.h 22 Jul 2008 07:07:00 -0000 @@ -1991,8 +1991,15 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_ME if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -2037,8 +2044,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.238 diff -u -p -r1.238 zend_vm_execute.h --- Zend/zend_vm_execute.h 8 Jul 2008 07:05:03 -0000 1.238 +++ Zend/zend_vm_execute.h 22 Jul 2008 07:07:08 -0000 @@ -2683,8 +2683,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -2729,8 +2736,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3279,8 +3284,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -3325,8 +3337,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3751,8 +3761,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -3797,8 +3814,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -3979,8 +3994,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -4025,8 +4047,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -4419,8 +4439,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -4465,8 +4492,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -10657,8 +10682,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -10703,8 +10735,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -12548,8 +12578,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -12594,8 +12631,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -14409,8 +14444,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -14455,8 +14497,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -15368,8 +15408,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -15414,8 +15461,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI EX(fbc) = ce->constructor; } - EX(called_scope) = ce; - if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) { EX(object) = NULL; } else { @@ -16879,8 +16924,15 @@ static int ZEND_FASTCALL ZEND_INIT_STATI if (!ce) { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(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) { zstr function_name_strval; @@ -16925,8 +16977,6 @@ static int ZEND_FASTCALL ZEND_INIT_STATI 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_007.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_007.phpt,v retrieving revision 1.4 diff -u -p -r1.4 lsb_007.phpt --- Zend/tests/lsb_007.phpt 26 May 2008 14:33:43 -0000 1.4 +++ Zend/tests/lsb_007.phpt 22 Jul 2008 07:07:08 -0000 @@ -9,4 +9,4 @@ class Foo implements static { ?> ==DONE== --EXPECTF-- -Parse error: parse error, expecting `T_STRING' or `T_PAAMAYIM_NEKUDOTAYIM' or `T_NAMESPACE' in %slsb_007.php on line %d \ No newline at end of file +Parse error: syntax error, unexpected T_STATIC, expecting T_STRING or T_PAAMAYIM_NEKUDOTAYIM or T_NAMESPACE in %s%elsb_007.php on line %d Index: Zend/tests/lsb_008.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_008.phpt,v retrieving revision 1.2 diff -u -p -r1.2 lsb_008.phpt --- Zend/tests/lsb_008.phpt 26 May 2008 14:33:43 -0000 1.2 +++ Zend/tests/lsb_008.phpt 22 Jul 2008 07:07:08 -0000 @@ -5,4 +5,4 @@ ZE2 Late Static Binding class name "stat class static { } --EXPECTF-- -Parse error: parse error, expecting `T_STRING' in %slsb_008.php on line %d +Parse error: syntax error, unexpected T_STATIC, expecting T_STRING in %s%elsb_008.php on line %d Index: Zend/tests/lsb_009.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_009.phpt,v retrieving revision 1.2 diff -u -p -r1.2 lsb_009.phpt --- Zend/tests/lsb_009.phpt 26 May 2008 14:33:43 -0000 1.2 +++ Zend/tests/lsb_009.phpt 22 Jul 2008 07:07:08 -0000 @@ -5,4 +5,4 @@ ZE2 Late Static Binding interface name " interface static { } --EXPECTF-- -Parse error: parse error, expecting `T_STRING' in %slsb_009.php on line %d +Parse error: syntax error, unexpected T_STATIC, expecting T_STRING in %s%elsb_009.php on line %d Index: Zend/tests/lsb_015.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/lsb_015.phpt,v retrieving revision 1.2 diff -u -p -r1.2 lsb_015.phpt --- Zend/tests/lsb_015.phpt 26 May 2008 14:33:43 -0000 1.2 +++ Zend/tests/lsb_015.phpt 22 Jul 2008 07:07:08 -0000 @@ -68,7 +68,7 @@ echo "via B:\n"; B::myCatch(); ?> ==DONE== ---EXPECT-- +--EXPECTF-- via A: A A @@ -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.2 diff -u -p -r1.2 lsb_019.phpt --- Zend/tests/lsb_019.phpt 26 May 2008 14:33:43 -0000 1.2 +++ Zend/tests/lsb_019.phpt 22 Jul 2008 07:07:08 -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