summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-06-22 17:23:04 +0300
committerDmitry Stogov <dmitry@zend.com>2016-06-22 17:23:04 +0300
commit3c84e5e1ceff8b7a17c3047c5ade822067a55a70 (patch)
tree300d66ecbf3bb2467a7322e4ef5c93732e2ade26
parentc196f9cdf73f49a73eb35919525cfc4b218174bc (diff)
downloadphp-git-3c84e5e1ceff8b7a17c3047c5ade822067a55a70.tar.gz
Allow "proxy" ovjects to substitute their class names through get_class_name() handler (similar to var_dump() and others).
-rw-r--r--Zend/zend_builtin_functions.c16
-rw-r--r--Zend/zend_exceptions.c6
2 files changed, 17 insertions, 5 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 558a1b2ac6..006a499db9 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -2388,8 +2388,10 @@ ZEND_FUNCTION(debug_print_backtrace)
if (object) {
if (func->common.scope) {
class_name = func->common.scope->name;
- } else {
+ } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
class_name = object->ce->name;
+ } else {
+ class_name = object->handlers->get_class_name(object);
}
call_type = "->";
@@ -2449,6 +2451,11 @@ ZEND_FUNCTION(debug_print_backtrace)
if (class_name) {
ZEND_PUTS(ZSTR_VAL(class_name));
ZEND_PUTS(call_type);
+ if (object
+ && !func->common.scope
+ && object->handlers->get_class_name != std_object_handlers.get_class_name) {
+ zend_string_release(class_name);
+ }
}
zend_printf("%s(", function_name);
if (Z_TYPE(arg_array) != IS_UNDEF) {
@@ -2608,9 +2615,12 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
if (object) {
if (func->common.scope) {
add_assoc_str_ex(&stack_frame, "class", sizeof("class")-1, zend_string_copy(func->common.scope->name));
- } else {
+ } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
add_assoc_str_ex(&stack_frame, "class", sizeof("class")-1, zend_string_copy(object->ce->name));
-
+ } else {
+ zend_string *class_name = object->handlers->get_class_name(object);
+ add_assoc_str_ex(&stack_frame, "class", sizeof("class")-1, class_name);
+ zend_string_release(class_name);
}
if ((options & DEBUG_BACKTRACE_PROVIDE_OBJECT) != 0) {
zval zv;
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index b52dc2362c..663e83f821 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -563,11 +563,13 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
case IS_ARRAY:
smart_str_appends(str, "Array, ");
break;
- case IS_OBJECT:
+ case IS_OBJECT: {
+ zend_string *class_name = Z_OBJ_HANDLER_P(arg, get_class_name)(Z_OBJ_P(arg));
smart_str_appends(str, "Object(");
- smart_str_appends(str, ZSTR_VAL(Z_OBJCE_P(arg)->name));
+ smart_str_appends(str, ZSTR_VAL(class_name));
smart_str_appends(str, "), ");
break;
+ }
}
}
/* }}} */