cvs: ZendEngine2 / zend_object_handlers.c

From: Date: Mon, 19 Jul 2004 14:26:53 +0000
Subject: cvs: ZendEngine2 / zend_object_handlers.c
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-2768@lists.php.net to get a copy of this message
stas Mon Jul 19 10:26:53 2004 EDT Modified files: /ZendEngine2 zend_object_handlers.c Log: __set and __get will be called not only when variable doesn't exist but also when it's invisible http://cvs.php.net/diff.php/ZendEngine2/zend_object_handlers.c?r1=1.102&r2=1.103&ty=u Index: ZendEngine2/zend_object_handlers.c diff -u ZendEngine2/zend_object_handlers.c:1.102 ZendEngine2/zend_object_handlers.c:1.103 --- ZendEngine2/zend_object_handlers.c:1.102 Mon Jul 19 03:19:02 2004 +++ ZendEngine2/zend_object_handlers.c Mon Jul 19 10:26:53 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_object_handlers.c,v 1.102 2004/07/19 07:19:02 andi Exp $ */ +/* $Id: zend_object_handlers.c,v 1.103 2004/07/19 14:26:53 stas Exp $ */ #include "zend.h" #include "zend_globals.h" @@ -269,9 +269,11 @@ zval *rv = NULL; zend_property_info *property_info; int silent; + zend_bool use_get; silent = (type == BP_VAR_IS); zobj = Z_OBJ_P(object); + use_get = (zobj->ce->__get && !zobj->in_get); if (member->type != IS_STRING) { tmp_member = *member; @@ -284,10 +286,11 @@ fprintf(stderr, "Read object #%d property: %s\n", Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member)); #endif - property_info = zend_get_property_info(zobj, member, 0 TSRMLS_CC); + /* make zend_get_property_info silent if we have getter - we may want to use it */ + property_info = zend_get_property_info(zobj, member, use_get TSRMLS_CC); - if (zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) { - if (zobj->ce->__get && !zobj->in_get) { + if (!property_info || zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) { + if (use_get) { /* have getter - try with it! */ zobj->in_get = 1; /* prevent circular getting */ rv = zend_std_call_getter(object, member TSRMLS_CC); @@ -319,8 +322,10 @@ zval **variable_ptr; int setter_done = 0; zend_property_info *property_info; - + zend_bool use_set; + zobj = Z_OBJ_P(object); + use_set = (zobj->ce->__set && !zobj->in_set); if (member->type != IS_STRING) { tmp_member = *member; @@ -329,9 +334,9 @@ member = &tmp_member; } - property_info = zend_get_property_info(zobj, member, 0 TSRMLS_CC); + property_info = zend_get_property_info(zobj, member, use_set TSRMLS_CC); - if (zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &variable_ptr) == SUCCESS) { + if (property_info && zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &variable_ptr) == SUCCESS) { if (*variable_ptr == value) { /* if we already have this value there, we don't actually need to do anything */ setter_done = 1; @@ -350,7 +355,7 @@ } } } else { - if (zobj->ce->__set && !zobj->in_set) { + if (use_set) { zobj->in_set = 1; /* prevent circular setting */ if (zend_std_call_setter(object, member, value TSRMLS_CC) != SUCCESS) { /* for now, just ignore it - __set should take care of warnings, etc. */

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