]> granicus.if.org Git - php/commitdiff
- Add var_dump support for closures
authorMarcus Boerger <helly@php.net>
Thu, 1 Jan 2009 16:21:07 +0000 (16:21 +0000)
committerMarcus Boerger <helly@php.net>
Thu, 1 Jan 2009 16:21:07 +0000 (16:21 +0000)
Zend/tests/closure_020.phpt
Zend/tests/closure_026.phpt
Zend/tests/closure_032.phpt
Zend/zend_closures.c

index 4143a90a40787319b4e98d50f78ab6e81bfaa8bc..77823135c588e68f297c73a0f8329caae46df255 100644 (file)
@@ -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)
index 235bc80514bdcd660de1257d60d419d0ed28f8c8..462e0e8eebd9572f4a0822fce0ce3e9388fe139a 100644 (file)
@@ -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)
index 6072f0d8d1f59cdb672cbcd44c5647075a664fa0..dd77dcd5e6a3d807995fdfdd746880760439890a 100644 (file)
@@ -53,6 +53,12 @@ Array
                 (
                     [0] => Closure Object
                         (
+                            [this] => 
+                            [parameter] => Array
+                                (
+                                    [$param] => <required>
+                                )
+
                         )
 
                 )
index 222f9973dcb5928b9772634c43e3db263bdff559..00ea7ecb77aa58153dbfa712e58b0dacb1b29227 100644 (file)
@@ -14,6 +14,7 @@
    +----------------------------------------------------------------------+
    | Authors: Christian Seiler <chris_se@gmx.net>                         |
    |          Dmitry Stogov <dmitry@zend.com>                             |
+   |          Marcus Boerger <helly@php.net>                              |
    +----------------------------------------------------------------------+
 */
 
@@ -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 ? "<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;
@@ -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;
 }
 /* }}} */