? Zend/.zend_compile.c.swp ? Zend/.zend_language_scanner.l.swp 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.35 diff -u -p -r1.725.2.31.2.64.2.35 basic_functions.c --- ext/standard/basic_functions.c 25 May 2008 14:06:13 -0000 1.725.2.31.2.64.2.35 +++ ext/standard/basic_functions.c 24 Jun 2008 18:31:05 -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 24 Jun 2008 18:31:06 -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.38 diff -u -p -r1.296.2.27.2.34.2.38 zend_API.c --- Zend/zend_API.c 5 Jun 2008 18:53:06 -0000 1.296.2.27.2.34.2.38 +++ Zend/zend_API.c 24 Jun 2008 18:31:06 -0000 @@ -2304,7 +2304,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; @@ -2363,6 +2363,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); @@ -2477,11 +2478,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; @@ -2503,7 +2505,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; @@ -2517,7 +2524,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: { @@ -2557,13 +2564,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; } @@ -2592,7 +2602,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"); } @@ -2635,7 +2645,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); } /* }}} */ @@ -2645,7 +2655,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); @@ -2664,8 +2674,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; } @@ -2694,7 +2705,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) { + 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.12 diff -u -p -r1.207.2.8.2.8.2.12 zend_API.h --- Zend/zend_API.h 27 May 2008 10:29:33 -0000 1.207.2.8.2.8.2.12 +++ Zend/zend_API.h 24 Jun 2008 18:31:06 -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.42 diff -u -p -r1.331.2.20.2.24.2.42 zend_execute_API.c --- Zend/zend_execute_API.c 5 Jun 2008 18:50:29 -0000 1.331.2.20.2.24.2.42 +++ Zend/zend_execute_API.c 24 Jun 2008 18:31:07 -0000 @@ -772,6 +772,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 if (strcmp(Z_STRVAL_PP(fci->object_pp), "parent") == 0 && EG(active_op_array)) { if (!EG(active_op_array)->scope) { @@ -784,6 +785,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) ) { @@ -794,6 +800,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; @@ -810,12 +817,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.58 diff -u -p -r1.59.2.29.2.48.2.58 zend_vm_def.h --- Zend/zend_vm_def.h 11 Jun 2008 13:18:39 -0000 1.59.2.29.2.48.2.58 +++ Zend/zend_vm_def.h 24 Jun 2008 18:31:08 -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) { + 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.58 diff -u -p -r1.62.2.30.2.49.2.58 zend_vm_execute.h --- Zend/zend_vm_execute.h 11 Jun 2008 13:18:39 -0000 1.62.2.30.2.49.2.58 +++ Zend/zend_vm_execute.h 24 Jun 2008 18:31:16 -0000 @@ -2570,8 +2570,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CONST != IS_UNUSED) { char *function_name_strval; @@ -2613,8 +2620,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 { @@ -3143,8 +3148,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_TMP_VAR != IS_UNUSED) { char *function_name_strval; @@ -3186,8 +3198,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 { @@ -3611,8 +3621,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_VAR != IS_UNUSED) { char *function_name_strval; @@ -3654,8 +3671,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 { @@ -3835,8 +3850,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_UNUSED != IS_UNUSED) { char *function_name_strval; @@ -3878,8 +3900,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 { @@ -4271,8 +4291,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CV != IS_UNUSED) { char *function_name_strval; @@ -4314,8 +4341,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 { @@ -10209,8 +10234,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CONST != IS_UNUSED) { char *function_name_strval; @@ -10252,8 +10284,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 { @@ -12041,8 +12071,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_TMP_VAR != IS_UNUSED) { char *function_name_strval; @@ -12084,8 +12121,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 { @@ -13843,8 +13878,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_VAR != IS_UNUSED) { char *function_name_strval; @@ -13886,8 +13928,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 { @@ -14748,8 +14788,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_UNUSED != IS_UNUSED) { char *function_name_strval; @@ -14791,8 +14838,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 { @@ -16251,8 +16296,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) { + EX(called_scope) = EG(called_scope); + } else { + EX(called_scope) = ce; + } } if(IS_CV != IS_UNUSED) { char *function_name_strval; @@ -16294,8 +16346,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_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 24 Jun 2008 18:31:16 -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 +A +A +A Index: ext/standard/tests/class_object/forward_static_call_001.phpt =================================================================== RCS file: ext/standard/tests/class_object/forward_static_call_001.phpt diff -N ext/standard/tests/class_object/forward_static_call_001.phpt --- ext/standard/tests/class_object/forward_static_call_001.phpt 7 Apr 2008 10:44:59 -0000 1.1.2.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,83 +0,0 @@ ---TEST-- -forward_static_call() called from outside of a method. ---FILE-- - -===DONE=== ---EXPECTF-- -A -- -B -B -- -B -B -B -- -B -B -- -C -C -- -B -B -C -- -B -C -===DONE=== Index: ext/standard/tests/class_object/forward_static_call_002.phpt =================================================================== RCS file: ext/standard/tests/class_object/forward_static_call_002.phpt diff -N ext/standard/tests/class_object/forward_static_call_002.phpt --- ext/standard/tests/class_object/forward_static_call_002.phpt 7 Apr 2008 10:44:59 -0000 1.1.2.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,21 +0,0 @@ ---TEST-- -forward_static_call() from outside of a class method. ---FILE-- - ---EXPECTF-- -Fatal error: Cannot call forward_static_call() when no class scope is active in %s on line %d Index: ext/standard/tests/class_object/forward_static_call_003.phpt =================================================================== RCS file: ext/standard/tests/class_object/forward_static_call_003.phpt diff -N ext/standard/tests/class_object/forward_static_call_003.phpt --- ext/standard/tests/class_object/forward_static_call_003.phpt 7 Apr 2008 10:44:59 -0000 1.1.2.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,51 +0,0 @@ ---TEST-- -forward_static_call() calling outside of the inheritance chain. ---FILE-- - -===DONE=== ---EXPECTF-- -A -- -B -B -- -C -B -B -===DONE===