Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_3) / zend_closures.c /tests closure_022.phpt

From: Date: Fri, 25 Jul 2008 03:18:27 +0000
Subject: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_3) / zend_closures.c /tests closure_022.phpt
References: 1 2 3 4  Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-6936@lists.php.net to get a copy of this message
Thanks for idea. I'll check if it works for all cases. Dmitry. Marcus Boerger wrote:
Hello Dmitry, you implemented all property handlers and have them all issue an error message. How about allowing setting the property handlers all to NULL and have the errors be generated in the enhine instead? marcus Thursday, July 24, 2008, 8:42:04 AM, you wrote:
Hi Marcus,
Sorry, but I don't understand what do you propose?
Thanks. Dmitry.
Marcus Boerger wrote:
Hello Dmitry, assuming they could, somehow, that would be kind of local static variables, right? So that would be keeping state accross calls. Which we can do already. But other than that you are of course right that they cannot have properties. The last thing you made me wonder about is whether setting the handlers to NULL shouldn't trigge the errors already so that not all (strange) objects have to do this. marcus Tuesday, July 22, 2008, 9:29:31 AM, you wrote:
dmitry          Tue Jul 22 07:29:31 2008 UTC
  Added files:                 (Branch: PHP_5_3)
    /ZendEngine2/tests  closure_022.phpt   Modified files:                  /ZendEngine2        zend_closures.c   Log:
Closure object cannot have properties http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.c?r1=1.3.2.3&r2=1.3.2.4&diff_format=u Index: ZendEngine2/zend_closures.c diff -u ZendEngine2/zend_closures.c:1.3.2.3 ZendEngine2/zend_closures.c:1.3.2.4
--- ZendEngine2/zend_closures.c:1.3.2.3       Mon Jul 14 12:18:20 2008
+++ ZendEngine2/zend_closures.c       Tue Jul 22 07:29:31 2008
@@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.c,v 1.3.2.3 2008/07/14 12:18:20 dmitry Exp $ */ +/* $Id: zend_closures.c,v 1.3.2.4 2008/07/22 07:29:31 dmitry Exp $ */ #include "zend.h" #include "zend_API.h" @@ -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;
@@ -137,6 +140,39 @@ } /* }}} */ +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;
@@ -195,6 +231,11 @@
        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;
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/closure_022.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/closure_022.phpt +++ ZendEngine2/tests/closure_022.phpt --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
Best regards, Marcus
Best regards, Marcus


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