diff options
| author | Stanislav Malyshev <stas@php.net> | 2002-03-10 13:42:37 +0000 |
|---|---|---|
| committer | Stanislav Malyshev <stas@php.net> | 2002-03-10 13:42:37 +0000 |
| commit | 04ed2b520f83f04ba9aa752bb3953bd825821b77 (patch) | |
| tree | 0344c084e369b0061efb68bff94c949f011177b4 /Zend/zend_object_handlers.c | |
| parent | 68976a35cefe23ccfd32843e9d846b840bbdd543 (diff) | |
| download | php-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.c | 20 |
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 */ |
