cvs: ZendEngine2(PHP_5_3) / zend_closures.c /tests closure_020.phpt closure_026.phpt closure_032.phpt

From: Date: Thu, 01 Jan 2009 16:22:44 +0000
Subject: cvs: ZendEngine2(PHP_5_3) / zend_closures.c /tests closure_020.phpt closure_026.phpt closure_032.phpt
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-7280@lists.php.net to get a copy of this message
helly Thu Jan 1 16:22:44 2009 UTC Modified files: (Branch: PHP_5_3) /ZendEngine2 zend_closures.c /ZendEngine2/tests closure_020.phpt closure_026.phpt closure_032.phpt Log: - MFH Add var_dump support for closures http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.c?r1=1.3.2.17&r2=1.3.2.18&diff_format=u Index: ZendEngine2/zend_closures.c diff -u ZendEngine2/zend_closures.c:1.3.2.17 ZendEngine2/zend_closures.c:1.3.2.18 --- ZendEngine2/zend_closures.c:1.3.2.17 Wed Dec 31 11:15:31 2008 +++ ZendEngine2/zend_closures.c Thu Jan 1 16:22:44 2009 @@ -14,14 +14,16 @@ +----------------------------------------------------------------------+ | Authors: Christian Seiler <chris_se@gmx.net> | | Dmitry Stogov <dmitry@zend.com> | + | Marcus Boerger <helly@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.c,v 1.3.2.17 2008/12/31 11:15:31 sebastian Exp $ */ +/* $Id: zend_closures.c,v 1.3.2.18 2009/01/01 16:22:44 helly Exp $ */ #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" @@ -222,6 +224,59 @@ } /* }}} */ +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) { + name_len = zend_spprintf(&name, 0, "%s$%s", + arg_info->pass_by_reference ? "&" : "", + arg_info->name); + } 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 ? "<optional>" : "<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; @@ -243,6 +298,7 @@ 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; } /* }}} */ http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/closure_020.phpt?r1=1.1.2.1&r2=1.1.2.2&diff_format=u Index: ZendEngine2/tests/closure_020.phpt diff -u ZendEngine2/tests/closure_020.phpt:1.1.2.1 ZendEngine2/tests/closure_020.phpt:1.1.2.2 --- ZendEngine2/tests/closure_020.phpt:1.1.2.1 Mon Jul 14 13:36:40 2008 +++ ZendEngine2/tests/closure_020.phpt Thu Jan 1 16:22:44 2009 @@ -27,7 +27,40 @@ ["test":"foo":private]=> int(3) ["a"]=> - object(Closure)#%d (0) { + object(Closure)#%d (2) { + ["this"]=> + object(foo)#%d (2) { + ["test":"foo":private]=> + int(3) + ["a"]=> + object(Closure)#%d (2) { + ["this"]=> + *RECURSION* + ["static"]=> + array(1) { + ["a"]=> + *RECURSION* + } + } + } + ["static"]=> + array(1) { + ["a"]=> + &object(foo)#%d (2) { + ["test":"foo":private]=> + int(3) + ["a"]=> + object(Closure)#%d (2) { + ["this"]=> + *RECURSION* + ["static"]=> + array(1) { + ["a"]=> + *RECURSION* + } + } + } + } } } bool(true) http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/closure_026.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: ZendEngine2/tests/closure_026.phpt diff -u ZendEngine2/tests/closure_026.phpt:1.1.2.2 ZendEngine2/tests/closure_026.phpt:1.1.2.3 --- ZendEngine2/tests/closure_026.phpt:1.1.2.2 Mon Jul 28 14:10:00 2008 +++ ZendEngine2/tests/closure_026.phpt Thu Jan 1 16:22:44 2009 @@ -32,7 +32,18 @@ ["a"]=> array(1) { [0]=> - object(Closure)#%d (0) { + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + ["a"]=> + array(1) { + [0]=> + object(Closure)#%d (1) { + ["this"]=> + *RECURSION* + } + } + } } } } @@ -41,7 +52,21 @@ string(1) "a" array(1) { [0]=> - object(Closure)#%d (0) { + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + ["a"]=> + array(1) { + [0]=> + object(Closure)#%d (1) { + ["this"]=> + object(foo)#%d (1) { + ["a"]=> + *RECURSION* + } + } + } + } } } int(1) http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/closure_032.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: ZendEngine2/tests/closure_032.phpt diff -u ZendEngine2/tests/closure_032.phpt:1.1.2.2 ZendEngine2/tests/closure_032.phpt:1.1.2.3 --- ZendEngine2/tests/closure_032.phpt:1.1.2.2 Mon Nov 3 19:28:32 2008 +++ ZendEngine2/tests/closure_032.phpt Thu Jan 1 16:22:44 2009 @@ -53,6 +53,12 @@ ( [0] => Closure Object ( + [this] => + [parameter] => Array + ( + [$param] => <required> + ) + ) )

« previous php.zend-engine.cvs (#7280) next »