From 25cec568db9b2d7751a79f2b0baa5db14584e93e Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Thu, 1 Jan 2009 16:21:07 +0000 Subject: [PATCH] - Add var_dump support for closures --- Zend/tests/closure_020.phpt | 35 ++++++++++++++++++++++- Zend/tests/closure_026.phpt | 29 +++++++++++++++++-- Zend/tests/closure_032.phpt | 6 ++++ Zend/zend_closures.c | 56 +++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 3 deletions(-) diff --git a/Zend/tests/closure_020.phpt b/Zend/tests/closure_020.phpt index 4143a90a40..77823135c5 100644 --- a/Zend/tests/closure_020.phpt +++ b/Zend/tests/closure_020.phpt @@ -27,7 +27,40 @@ object(foo)#%d (%d) { [u"test":u"foo":private]=> int(3) [u"a"]=> - object(Closure)#%d (0) { + object(Closure)#%d (2) { + ["this"]=> + object(foo)#%d (2) { + [u"test":u"foo":private]=> + int(3) + [u"a"]=> + object(Closure)#%d (2) { + ["this"]=> + *RECURSION* + ["static"]=> + array(1) { + [u"a"]=> + *RECURSION* + } + } + } + ["static"]=> + array(1) { + [u"a"]=> + &object(foo)#%d (2) { + [u"test":u"foo":private]=> + int(3) + [u"a"]=> + object(Closure)#%d (2) { + ["this"]=> + *RECURSION* + ["static"]=> + array(1) { + [u"a"]=> + *RECURSION* + } + } + } + } } } bool(true) diff --git a/Zend/tests/closure_026.phpt b/Zend/tests/closure_026.phpt index 235bc80514..462e0e8eeb 100644 --- a/Zend/tests/closure_026.phpt +++ b/Zend/tests/closure_026.phpt @@ -32,7 +32,18 @@ object(foo)#%d (1) { [u"a"]=> array(1) { [0]=> - object(Closure)#%d (0) { + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + [u"a"]=> + array(1) { + [0]=> + object(Closure)#%d (1) { + ["this"]=> + *RECURSION* + } + } + } } } } @@ -41,7 +52,21 @@ int(1) unicode(1) "a" array(1) { [0]=> - object(Closure)#%d (0) { + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + [u"a"]=> + array(1) { + [0]=> + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + [u"a"]=> + *RECURSION* + } + } + } + } } } int(1) diff --git a/Zend/tests/closure_032.phpt b/Zend/tests/closure_032.phpt index 6072f0d8d1..dd77dcd5e6 100644 --- a/Zend/tests/closure_032.phpt +++ b/Zend/tests/closure_032.phpt @@ -53,6 +53,12 @@ Array ( [0] => Closure Object ( + [this] => + [parameter] => Array + ( + [$param] => + ) + ) ) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 222f9973dc..00ea7ecb77 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -14,6 +14,7 @@ +----------------------------------------------------------------------+ | Authors: Christian Seiler | | Dmitry Stogov | + | Marcus Boerger | +----------------------------------------------------------------------+ */ @@ -22,6 +23,7 @@ #include "zend.h" #include "zend_API.h" #include "zend_closures.h" +#include "zend_exceptions.h" #include "zend_interfaces.h" #include "zend_objects.h" #include "zend_objects_API.h" @@ -226,6 +228,59 @@ int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function } /* }}} */ +ZEND_API HashTable *zend_closure_get_debug_info(zval *object, int *is_temp TSRMLS_DC) /* {{{ */ +{ + zend_closure *closure = (zend_closure *)zend_object_store_get_object(object TSRMLS_CC); + HashTable *rv; + zval *val; + struct _zend_arg_info *arg_info = closure->func.common.arg_info; + + *is_temp = 1; + ALLOC_HASHTABLE(rv); + zend_hash_init(rv, 1, NULL, ZVAL_PTR_DTOR, 0); + val = closure->this_ptr; + if (!val) { + ALLOC_INIT_ZVAL(val); + } else { + Z_ADDREF_P(val); + } + zend_symtable_update(rv, "this", sizeof("this"), (void *) &val, sizeof(zval *), NULL); + if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) { + HashTable *static_variables = closure->func.op_array.static_variables; + MAKE_STD_ZVAL(val); + array_init(val); + zend_hash_copy(Z_ARRVAL_P(val), static_variables, (copy_ctor_func_t)zval_add_ref, NULL, sizeof(zval*)); + zend_symtable_update(rv, "static", sizeof("static"), (void *) &val, sizeof(zval *), NULL); + } + + if (arg_info) { + MAKE_STD_ZVAL(val); + array_init(val); + zend_uint i, required = closure->func.common.required_num_args; + for (i = 0; i < closure->func.common.num_args; i++) { + char *name, *info; + int name_len, info_len; + if (arg_info->name.v) { + name_len = zend_spprintf(&name, 0, "%s$%v", + arg_info->pass_by_reference ? "&" : "", + arg_info->name.v); + } else { + name_len = zend_spprintf(&name, 0, "%s$param%d", + arg_info->pass_by_reference ? "&" : "", + i + 1); + } + info_len = zend_spprintf(&info, 0, "%s", + i >= required ? "" : ""); + add_assoc_stringl_ex(val, name, name_len + 1, info, info_len, 0); + efree(name); + arg_info++; + } + zend_symtable_update(rv, "parameter", sizeof("parameter"), (void *) &val, sizeof(zval *), NULL); + } + return rv; +} +/* }}} */ + void zend_register_closure_ce(TSRMLS_D) /* {{{ */ { zend_class_entry ce; @@ -247,6 +302,7 @@ void zend_register_closure_ce(TSRMLS_D) /* {{{ */ closure_handlers.unset_property = zend_closure_unset_property; closure_handlers.compare_objects = zend_closure_compare_objects; closure_handlers.clone_obj = NULL; + closure_handlers.get_debug_info = zend_closure_get_debug_info; closure_handlers.get_closure = zend_closure_get_closure; } /* }}} */ -- 2.40.0