]> granicus.if.org Git - php/commitdiff
- read_property cleanup
authorZeev Suraski <zeev@php.net>
Wed, 5 Feb 2003 14:27:30 +0000 (14:27 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 5 Feb 2003 14:27:30 +0000 (14:27 +0000)
- Implement unset/isset/empty for PPP

Zend/zend_execute.c
Zend/zend_object_handlers.c
Zend/zend_object_handlers.h
Zend/zend_objects_API.c

index 8d32f44da6659e79ff438a3c71a5eca9719a84d8..b452b83fbc4acf2e9f2bdb0e29a49031f0973b64 100644 (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);
index b287e97f18eaab1e9759e718a7e3eb34abfaf31e..999db97fdbb3d410c185674ffd4adb2bff6da2a1 100644 (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;
index 98857e3facd6f8b83341e91a0e508a92199bf288..442d92b72a6814d95a162c3a92d644c10032a4db 100644 (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 */
index f317b1ef8a22486071cc9d15c28f9d84d5309fd6..7bc297b39169108518094f9ecd0e735b05625fa5 100644 (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");
        }