summaryrefslogtreecommitdiff
path: root/Zend/zend_object_handlers.c
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2002-03-10 13:42:37 +0000
committerStanislav Malyshev <stas@php.net>2002-03-10 13:42:37 +0000
commit04ed2b520f83f04ba9aa752bb3953bd825821b77 (patch)
tree0344c084e369b0061efb68bff94c949f011177b4 /Zend/zend_object_handlers.c
parent68976a35cefe23ccfd32843e9d846b840bbdd543 (diff)
downloadphp-git-04ed2b520f83f04ba9aa752bb3953bd825821b77.tar.gz
New stuff for objects API:
- Better assignment handling - More flexible operations with zval-containing objects
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r--Zend/zend_object_handlers.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 9db2cbce5a..a2a7a5665c 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -65,7 +65,7 @@ static void zend_std_write_property(zval *object, zval *member, zval *value TSRM
{
zend_object *zobj;
zval tmp_member;
- zval *variable_ptr;
+ zval **variable_ptr;
zobj = Z_GET_OBJ(object);
@@ -77,19 +77,20 @@ static void zend_std_write_property(zval *object, zval *member, zval *value TSRM
}
if (zend_hash_find(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member), (void **) &variable_ptr) == SUCCESS) {
- if (variable_ptr == EG(error_zval_ptr) || member == EG(error_zval_ptr)) {
+ if (*variable_ptr == EG(error_zval_ptr) || member == EG(error_zval_ptr)) {
/* variable_ptr = EG(uninitialized_zval_ptr); */
/* } else if (variable_ptr==&EG(uninitialized_zval) || variable_ptr!=value_ptr) { */
- } else if (variable_ptr != value) {
- variable_ptr->refcount--;
- if (variable_ptr->refcount == 0) {
- zendi_zval_dtor(*variable_ptr);
- FREE_ZVAL(variable_ptr);
+ } else if (*variable_ptr != value) {
+ (*variable_ptr)->refcount--;
+ if ((*variable_ptr)->refcount == 0) {
+ zendi_zval_dtor(**variable_ptr);
+ FREE_ZVAL(*variable_ptr);
}
}
}
- zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &value, sizeof(zval *), NULL);
+ value->refcount++;
+ zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &value, sizeof(zval *), NULL);
if (member == &tmp_member) {
zval_dtor(member);
}
@@ -117,7 +118,7 @@ static zval **zend_std_get_property_ptr(zval *object, zval *member TSRMLS_DC)
if (zend_hash_find(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &retval) == FAILURE) {
zval *new_zval = &EG(uninitialized_zval);
- // zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member));
+ zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member));
new_zval->refcount++;
zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &new_zval, sizeof(zval *), (void **) &retval);
}
@@ -243,6 +244,7 @@ zend_object_handlers std_object_handlers = {
zend_std_read_property, /* read_property */
zend_std_write_property, /* write_property */
zend_std_get_property_ptr, /* get_property_ptr */
+ zend_std_get_property_ptr, /* get_property_zval_ptr */
NULL, /* get */
NULL, /* set */
zend_std_has_property, /* has_property */