- read_property cleanup

- Implement unset/isset/empty for PPP
This commit is contained in:
Zeev Suraski 2003-02-05 14:27:30 +00:00
parent 17439aa9c4
commit f660d28143
4 changed files with 54 additions and 31 deletions

View file

@ -391,7 +391,7 @@ static inline void zend_assign_to_object_op(znode *result, znode *op1, znode *op
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
@ -1013,7 +1013,7 @@ static void zend_fetch_property_address_read(znode *result, znode *op1, znode *o
}
/* here we are sure we are dealing with an object */
*retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
*retval = Z_OBJ_HT_P(container)->read_property(container, offset TSRMLS_CC);
if (offset == &tmp) {
zval_dtor(offset);
}
@ -1059,7 +1059,7 @@ static void zend_pre_incdec_property(znode *result, znode *op1, znode *op2, temp
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
incdec_op(z);
Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
@ -1106,7 +1106,7 @@ static void zend_post_incdec_property(znode *result, znode *op1, znode *op2, tem
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
*retval = *z;
zendi_zval_copy_ctor(*retval);

View file

@ -178,7 +178,7 @@ inline int zend_verify_property_access(zend_property_info *property_info, zend_c
}
zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC)
zval *zend_std_read_property(zval *object, zval *member TSRMLS_DC)
{
zend_object *zobj;
zval tmp_member;
@ -228,26 +228,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC)
retval = &EG(uninitialized_zval_ptr);
}
} else {
switch (type) {
case BP_VAR_R:
zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member));
/* break missing intentionally */
case BP_VAR_IS:
retval = &EG(uninitialized_zval_ptr);
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member));
/* break missing intentionally */
case BP_VAR_W: {
zval *new_zval = &EG(uninitialized_zval);
new_zval->refcount++;
zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &new_zval, sizeof(zval *), (void **) &retval);
}
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member));
}
}
if (member == &tmp_member) {
@ -391,6 +372,8 @@ static void zend_std_unset_property(zval *object, zval *member TSRMLS_DC)
{
zend_object *zobj;
zval tmp_member;
zend_property_info *property_info;
zend_property_info std_property_info;
zobj = Z_OBJ_P(object);
@ -400,7 +383,20 @@ static void zend_std_unset_property(zval *object, zval *member TSRMLS_DC)
convert_to_string(&tmp_member);
member = &tmp_member;
}
zend_hash_del(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1);
if (zend_hash_find(&zobj->ce->properties_info, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &property_info)==FAILURE) {
std_property_info.flags = ZEND_ACC_PUBLIC;
std_property_info.name = Z_STRVAL_P(member);
std_property_info.name_length = Z_STRLEN_P(member);
std_property_info.h = zend_get_hash_value(std_property_info.name, std_property_info.name_length+1);
property_info = &std_property_info;
}
if (!zend_verify_property_access(property_info, zobj->ce TSRMLS_CC)) {
zend_error(E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), zobj->ce->name, Z_STRVAL_P(member));
}
zend_hash_del(zobj->properties, property_info->name, property_info->name_length+1);
if (member == &tmp_member) {
zval_dtor(member);
}
@ -729,8 +725,10 @@ static union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC)
return constructor;
}
int zend_compare_symbol_tables_i(HashTable *ht1, HashTable *ht2 TSRMLS_DC);
static int zend_std_compare_objects(zval *o1, zval *o2 TSRMLS_DC)
{
zend_object *zobj1, *zobj2;
@ -744,6 +742,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2 TSRMLS_DC)
return zend_compare_symbol_tables_i(zobj1->properties, zobj2->properties TSRMLS_CC);
}
static int zend_std_has_property(zval *object, zval *member, int check_empty TSRMLS_DC)
{
zend_object *zobj;
@ -751,16 +750,39 @@ static int zend_std_has_property(zval *object, zval *member, int check_empty TSR
zval **value;
zval tmp_member;
zobj = Z_OBJ_P(object);
zend_property_info *property_info;
zend_property_info std_property_info;
zobj = Z_OBJ_P(object);
if (member->type != IS_STRING) {
tmp_member = *member;
zval_copy_ctor(&tmp_member);
convert_to_string(&tmp_member);
member = &tmp_member;
}
if (zend_hash_find(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **)&value) == SUCCESS) {
#if DEBUG_OBJECT_HANDLERS
fprintf(stderr, "Read object #%d property: %s\n", Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
#endif
if (zend_hash_find(&zobj->ce->properties_info, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &property_info)==FAILURE) {
std_property_info.flags = ZEND_ACC_PUBLIC;
std_property_info.name = Z_STRVAL_P(member);
std_property_info.name_length = Z_STRLEN_P(member);
std_property_info.h = zend_get_hash_value(std_property_info.name, std_property_info.name_length+1);
property_info = &std_property_info;
}
#if DEBUG_OBJECT_HANDLERS
zend_printf("Access type for %s::%s is %s\n", zobj->ce->name, Z_STRVAL_P(member), zend_visibility_string(property_info->flags));
#endif
if (!zend_verify_property_access(property_info, zobj->ce TSRMLS_CC)) {
zend_error(E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), zobj->ce->name, Z_STRVAL_P(member));
}
if (zend_hash_find(zobj->properties, property_info->name, property_info->name_length+1, (void **) &value) == SUCCESS) {
if (check_empty) {
result = zend_is_true(*value);
} else {
@ -776,6 +798,7 @@ static int zend_std_has_property(zval *object, zval *member, int check_empty TSR
return result;
}
zend_class_entry *zend_std_object_get_class(zval *object TSRMLS_DC)
{
zend_object *zobj;

View file

@ -24,7 +24,7 @@
union _zend_function;
typedef zval *(*zend_object_read_property_t)(zval *object, zval *member, int type TSRMLS_DC);
typedef zval *(*zend_object_read_property_t)(zval *object, zval *member TSRMLS_DC);
/* Used to fetch property from the object, read-only */
typedef void (*zend_object_write_property_t)(zval *object, zval *member, zval *value TSRMLS_DC);
/* Used to set property of the object */

View file

@ -255,7 +255,7 @@ ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC)
zend_proxy_object *probj = zend_object_store_get_object(property TSRMLS_CC);
if (Z_OBJ_HT_P(probj->object) && Z_OBJ_HT_P(probj->object)->read_property) {
return Z_OBJ_HT_P(probj->object)->read_property(probj->object, probj->property, BP_VAR_R TSRMLS_CC);
return Z_OBJ_HT_P(probj->object)->read_property(probj->object, probj->property TSRMLS_CC);
} else {
zend_error(E_WARNING, "Cannot read property of object - no read handler defined");
}