Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_3) / zend_closures.c /tests closure_022.phpt
| From: | Dmitry Stogov | 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:Best regards, MarcusHello 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 5Best regards, Marcus