diff options
| -rw-r--r-- | NEWS | 2 | ||||
| -rwxr-xr-x | Zend/tests/bug30828.phpt | 61 | ||||
| -rw-r--r-- | Zend/zend_builtin_functions.c | 28 |
3 files changed, 81 insertions, 10 deletions
@@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2005, PHP 5.1 Beta 3 +- Fixed bug #30828 (debug_backtrace() reports incorrect class in overridden + methods). (Dmitry) - Fixed bug #27268 (Bad references accentuated by clone). (Dmitry) 22 Jun 2005, PHP 5.1 Beta 2 diff --git a/Zend/tests/bug30828.phpt b/Zend/tests/bug30828.phpt new file mode 100755 index 0000000000..d05dbb606d --- /dev/null +++ b/Zend/tests/bug30828.phpt @@ -0,0 +1,61 @@ +--TEST-- +Bug #30828 (debug_backtrace() reports incorrect class in overridden methods) +--FILE-- +<?php +class A { + function __construct() { + debug_print_backtrace(); + $bt = debug_backtrace(); + foreach ($bt as $t) { + print $t['class'].$t['type'].$t['function']."\n"; + } + } + + function foo() { + debug_print_backtrace(); + $bt = debug_backtrace(); + foreach ($bt as $t) { + print $t['class'].$t['type'].$t['function']."\n"; + } + } + + static function bar() { + debug_print_backtrace(); + $bt = debug_backtrace(); + foreach ($bt as $t) { + print $t['class'].$t['type'].$t['function']."\n"; + } + } +} + +class B extends A { + function __construct() { + parent::__construct(); + } + + function foo() { + parent::foo(); + } + + static function bar() { + parent::bar(); + } +} + +$b = new B(); +$b->foo(); +B::bar(); +?> +--EXPECTF-- +#0 A->__construct() called at [%sbug30828.php:30] +#1 B->__construct() called at [%sbug30828.php:42] +A->__construct +B->__construct +#0 A->foo() called at [%sbug30828.php:34] +#1 B->foo() called at [%sbug30828.php:43] +A->foo +B->foo +#0 A::bar() called at [%sbug30828.php:38] +#1 B::bar() called at [%sbug30828.php:44] +A::bar +B::bar diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index df4e7bd3ee..ba54430bbe 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1713,12 +1713,16 @@ ZEND_FUNCTION(debug_print_backtrace) if (function_name) { if (ptr->object) { - zend_uint class_name_len; - if (Z_OBJ_HT_P(ptr->object)->get_class_name == NULL || - Z_OBJ_HT_P(ptr->object)->get_class_name(ptr->object, &class_name, &class_name_len, 0 TSRMLS_CC) != SUCCESS) { - class_name = Z_OBJCE(*ptr->object)->name; + if (ptr->function_state.function->common.scope) { + class_name = ptr->function_state.function->common.scope->name; } else { - free_class_name = class_name; + zend_uint class_name_len; + if (Z_OBJ_HT_P(ptr->object)->get_class_name == NULL || + Z_OBJ_HT_P(ptr->object)->get_class_name(ptr->object, &class_name, &class_name_len, 0 TSRMLS_CC) != SUCCESS) { + class_name = Z_OBJCE(*ptr->object)->name; + } else { + free_class_name = class_name; + } } call_type = "->"; } else if (ptr->function_state.function->common.scope) { @@ -1870,12 +1874,16 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last TSRML add_assoc_string_ex(stack_frame, "function", sizeof("function"), function_name, 1); if (ptr->object && Z_TYPE_P(ptr->object) == IS_OBJECT) { - zend_uint class_name_len; - if (Z_OBJ_HT_P(ptr->object)->get_class_name == NULL || - Z_OBJ_HT_P(ptr->object)->get_class_name(ptr->object, &class_name, &class_name_len, 0 TSRMLS_CC) != SUCCESS) { - add_assoc_string_ex(stack_frame, "class", sizeof("class"), Z_OBJCE(*ptr->object)->name, 1); + if (ptr->function_state.function->common.scope) { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), ptr->function_state.function->common.scope->name, 1); } else { - add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 0); + zend_uint class_name_len; + if (Z_OBJ_HT_P(ptr->object)->get_class_name == NULL || + Z_OBJ_HT_P(ptr->object)->get_class_name(ptr->object, &class_name, &class_name_len, 0 TSRMLS_CC) != SUCCESS) { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), Z_OBJCE(*ptr->object)->name, 1); + } else { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 0); + } } add_assoc_string_ex(stack_frame, "type", sizeof("type"), "->", 1); } else if (ptr->function_state.function->common.scope) { |
