]> granicus.if.org Git - php/commitdiff
Allow "proxy" ovjects to substitute their class names through get_class_name() handle...
authorDmitry Stogov <dmitry@zend.com>
Wed, 22 Jun 2016 14:23:04 +0000 (17:23 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 22 Jun 2016 14:23:04 +0000 (17:23 +0300)
Zend/zend_builtin_functions.c
Zend/zend_exceptions.c

index 558a1b2ac6ca7dfee3ef7b4be35850a1ec8f9ebc..006a499db9424c4fdb06f0e7273d099a0fa9f1fe 100644 (file)
@@ -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;
index b52dc2362cf5c3e8f6e1b649eb5f1babd11c9194..663e83f8215aefa34f807f5c6780a02e6e6cada5 100644 (file)
@@ -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;
+               }
        }
 }
 /* }}} */