]> granicus.if.org Git - php/commitdiff
Closure object cannot have properties
authorDmitry Stogov <dmitry@php.net>
Tue, 22 Jul 2008 07:29:14 +0000 (07:29 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 22 Jul 2008 07:29:14 +0000 (07:29 +0000)
Zend/tests/closure_022.phpt [new file with mode: 0755]
Zend/zend_closures.c

diff --git a/Zend/tests/closure_022.phpt b/Zend/tests/closure_022.phpt
new file mode 100755 (executable)
index 0000000..25fbe93
--- /dev/null
@@ -0,0 +1,12 @@
+--TEST--
+Closure 022: Closure properties
+--FILE--
+<?php
+$a = 0;
+$foo = function() use ($a) {
+};
+$foo->a = 1;
+?>
+--EXPECTF--
+Fatal error: Closure object cannot have properties in %sclosure_022.php on line 5
+
index fd9b4ddcb0890691bd8ccabec7c8c76dbfa9499b..04e4ad6d2408648fd56959092aca9e50fb7a2f52 100644 (file)
@@ -29,6 +29,9 @@
 #define ZEND_INVOKE_FUNC_NAME "__invoke"
 #define ZEND_CLOSURE_PRINT_NAME "Closure object"
 
+#define ZEND_CLOSURE_PROPERTY_ERROR() \
+       zend_error(E_ERROR, "Closure object cannot have properties")
+
 typedef struct _zend_closure {
        zend_object    std;
        zend_function  func;
@@ -146,6 +149,39 @@ static zend_function *zend_closure_get_method(zval **object_ptr, zstr method_nam
 }
 /* }}} */
 
+static zval *zend_closure_read_property(zval *object, zval *member, int type TSRMLS_DC) /* {{{ */
+{
+    ZEND_CLOSURE_PROPERTY_ERROR();
+       return NULL;
+}
+/* }}} */
+
+static void zend_closure_write_property(zval *object, zval *member, zval *value TSRMLS_DC) /* {{{ */
+{
+    ZEND_CLOSURE_PROPERTY_ERROR();
+}
+/* }}} */
+
+static zval **zend_closure_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC) /* {{{ */
+{
+    ZEND_CLOSURE_PROPERTY_ERROR();
+       return NULL;
+}
+/* }}} */
+
+static int zend_closure_has_property(zval *object, zval *member, int has_set_exists TSRMLS_DC) /* {{{ */
+{
+    ZEND_CLOSURE_PROPERTY_ERROR();
+       return 0;
+}
+/* }}} */
+
+static void zend_closure_unset_property(zval *object, zval *member TSRMLS_DC) /* {{{ */
+{
+    ZEND_CLOSURE_PROPERTY_ERROR();
+}
+/* }}} */
+
 static void zend_closure_free_storage(void *object TSRMLS_DC) /* {{{ */
 {
        zend_closure *closure = (zend_closure *)object;
@@ -207,6 +243,11 @@ void zend_register_closure_ce(TSRMLS_D) /* {{{ */
        memcpy(&closure_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
        closure_handlers.get_constructor = zend_closure_get_constructor;
        closure_handlers.get_method = zend_closure_get_method;
+       closure_handlers.write_property = zend_closure_write_property;
+       closure_handlers.read_property = zend_closure_read_property;
+       closure_handlers.get_property_ptr_ptr = zend_closure_get_property_ptr_ptr;
+       closure_handlers.has_property = zend_closure_has_property;
+       closure_handlers.unset_property = zend_closure_unset_property;
        closure_handlers.compare_objects = zend_closure_compare_objects;
        closure_handlers.cast_object = zend_closure_cast_object_tostring;
        closure_handlers.clone_obj = NULL;