]> granicus.if.org Git - php/commitdiff
added get_class_entry callback handler to the
authorHarald Radi <phanto@php.net>
Mon, 22 Apr 2002 14:22:27 +0000 (14:22 +0000)
committerHarald Radi <phanto@php.net>
Mon, 22 Apr 2002 14:22:27 +0000 (14:22 +0000)
object handlers structure

Zend/zend_API.c
Zend/zend_API.h
Zend/zend_builtin_functions.c
Zend/zend_object_handlers.c
Zend/zend_object_handlers.h
Zend/zend_objects.h
Zend/zend_operators.h

index 26ee2ce77d6406af2aafe0bc58179209a6f813fb..6efa0ff214690b664a08d0928dac4986469503da 100644 (file)
@@ -198,6 +198,25 @@ ZEND_API char *zend_zval_type_name(zval *arg)
        }
 }
 
+ZEND_API zend_class_entry **zend_get_class_entry(zval *zobject)
+{
+       zend_class_entry **ce;
+
+       if (Z_OBJ_HT_P(zobject)->get_class_entry) {
+               TSRMLS_FETCH();
+               ce = Z_OBJ_HT_P(zobject)->get_class_entry(zobject TSRMLS_CC);
+       } else {
+               if(!IS_ZEND_STD_OBJECT(*zobject)) {
+                       zend_error(E_ERROR, "Class entry required for an object without class");
+                       return NULL;
+               }
+
+               ce = &(Z_OBJ_P(zobject)->ce);
+       }
+
+       return ce;
+}
+
 static int zend_check_class(zval *obj, zend_class_entry *expected_ce)
 {
        zend_class_entry *ce;
@@ -206,16 +225,12 @@ static int zend_check_class(zval *obj, zend_class_entry *expected_ce)
                return 0;
        }
 
-       /* TBI!! new object handlers */
-       if(!IS_ZEND_STD_OBJECT(*obj)) {
-               return 0;
-       }
-       
        for (ce = Z_OBJCE_P(obj); ce != NULL; ce = ce->parent) {
                if (ce == expected_ce) {
                        return 1;
                }
        }
+
        return 0;
 }
 
@@ -402,7 +417,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec)
                        {
                                zval **p = va_arg(*va, zval **);
                                zend_class_entry *ce = va_arg(*va, zend_class_entry *);
-                               if (Z_TYPE_PP(arg) != IS_OBJECT || !zend_check_class(*arg, ce)) {
+                               if (!zend_check_class(*arg, ce)) {
                                        if (Z_TYPE_PP(arg) == IS_NULL && return_null) {
                                                *p = NULL;
                                        } else {
index c78c2fa1dbc69b107c8eeb59c13420874384aae8..be5e8b1861168d081905bee5f057936cc180b301 100644 (file)
@@ -148,6 +148,8 @@ ZEND_API void zend_wrong_param_count(TSRMLS_D);
 ZEND_API zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callable_name);
 ZEND_API char *zend_get_module_version(char *module_name);
 
+ZEND_API zend_class_entry **zend_get_class_entry(zval *zobject);
+
 #define getThis() (this_ptr)
 
 #define WRONG_PARAM_COUNT                                      ZEND_WRONG_PARAM_COUNT()
index 8341bd7df3bae9d01520006b7c7ba460dcd68d6f..a1a2797ca51ef6bcf8bca8fe95c2a8c6b9e0019d 100644 (file)
@@ -501,9 +501,16 @@ ZEND_FUNCTION(get_class)
                RETURN_FALSE;
        }
 
-       if(Z_OBJ_HT_PP(arg)->get_class_name == NULL ||
+       if (Z_OBJ_HT_PP(arg)->get_class_name == NULL ||
           Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) {
-               RETURN_FALSE;
+               zend_class_entry *ce, **_ce;
+
+               if (((_ce = zend_get_class_entry(*arg)) == NULL) || ((ce = *_ce) == NULL)) {
+                       RETURN_FALSE;
+               }
+
+               name = ce->name;
+               name_len = ce->name_length;
        }
 
        RETURN_STRINGL(name, name_len, 1);
@@ -526,9 +533,16 @@ ZEND_FUNCTION(get_parent_class)
                char *name;
                zend_uint name_length;
                
-               if(Z_OBJ_HT_PP(arg)->get_class_name == NULL ||
+               if (Z_OBJ_HT_PP(arg)->get_class_name == NULL ||
                   Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_length, 1 TSRMLS_CC) != SUCCESS) {
-                       RETURN_FALSE;
+                       zend_class_entry *ce, **_ce;
+
+                       if (!(_ce = zend_get_class_entry(*arg)) || !(ce = *_ce) || !(ce = ce->parent)) {
+                               RETURN_FALSE;
+                       }
+
+                       name = ce->name;
+                       name_length = ce->name_length;
                }
                RETURN_STRINGL(name, name_length, 1);
        } else if (Z_TYPE_PP(arg) == IS_STRING) {
index a2a7a5665c7ef736a9723c2c43af4f404975bf2e..c9efe5fbe5af064066f720d049f0bc9c811d3c9d 100644 (file)
@@ -10,7 +10,7 @@
 static HashTable *zend_std_get_properties(zval *object TSRMLS_DC)
 {
        zend_object *zobj;
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
        return zobj->properties;
 }
 
@@ -20,7 +20,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC)
        zval tmp_member;
        zval **retval;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
 
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -67,7 +67,7 @@ static void zend_std_write_property(zval *object, zval *member, zval *value TSRM
        zval tmp_member;
        zval **variable_ptr;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
 
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -102,7 +102,7 @@ static zval **zend_std_get_property_ptr(zval *object, zval *member TSRMLS_DC)
        zval tmp_member;
        zval **retval;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
 
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -133,7 +133,7 @@ static void zend_std_unset_property(zval *object, zval *member TSRMLS_DC)
        zend_object *zobj;
        zval tmp_member;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
 
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -152,7 +152,7 @@ static union _zend_function *zend_std_get_method(zval *object, char *method_name
        zend_object *zobj;
        zend_function *func_method;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
        if(zend_hash_find(&zobj->ce->function_table, method_name, method_len+1, (void **)&func_method) == FAILURE) {
                zend_error(E_ERROR, "Call to undefined function %s()", method_name);
        }
@@ -164,38 +164,18 @@ static union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC)
 {
        zend_object *zobj;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
        return zobj->ce->constructor;
 }
 
-static int zend_std_get_class(zval *object, char **class_name, zend_uint *class_name_len, int parent TSRMLS_DC)
-{
-       zend_object *zobj;
-       zend_class_entry *ce;
-       
-       zobj = Z_GET_OBJ(object);
-       if(parent) {
-               ce = zobj->ce->parent;
-       } else {
-               ce = zobj->ce;
-       }
-       if(!ce) {
-               return FAILURE;
-       }
-       
-       *class_name = zobj->ce->name;
-       *class_name_len = zobj->ce->name_length;
-       return SUCCESS;
-}
-
 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;
        
-       zobj1 = Z_GET_OBJ(o1);
-       zobj2 = Z_GET_OBJ(o2);
+       zobj1 = Z_OBJ_P(o1);
+       zobj2 = Z_OBJ_P(o2);
 
        if(zobj1->ce != zobj2->ce) {
                return 1; /* different classes */
@@ -210,7 +190,7 @@ static int zend_std_has_property(zval *object, zval *member, int check_empty TSR
        zval **value;
        zval tmp_member;
        
-       zobj = Z_GET_OBJ(object);
+       zobj = Z_OBJ_P(object);
        
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -253,7 +233,8 @@ zend_object_handlers std_object_handlers = {
        zend_std_get_method,                     /* get_method */
        NULL,                                    /* call_method */
        zend_std_get_constructor,                /* get_constructor */
-       zend_std_get_class,                      /* get_class */
+       NULL,                                    /* get_class_entry */
+       NULL,                                    /* get_class */
        zend_std_compare_objects                 /* compare_objects */
 };
 
index 62db62484631cc1a8f41264e890870902542a673..cce40f22710211011d9689a16b16d37ef528e9d3 100644 (file)
@@ -43,6 +43,7 @@ typedef void (*zend_object_del_ref_t)(zval *object TSRMLS_DC);
 typedef void (*zend_object_delete_obj_t)(zval *object TSRMLS_DC);
 typedef zend_object_value (*zend_object_clone_obj_t)(zval *object TSRMLS_DC);
 
+typedef zend_class_entry **(*zend_object_get_class_entry_t)(zval *object TSRMLS_DC);
 typedef int (*zend_object_get_class_name_t)(zval *object, char **class_name, zend_uint *class_name_len, int parent TSRMLS_DC);
 typedef int (*zend_object_compare_t)(zval *object1, zval *object2 TSRMLS_DC);
 
@@ -65,6 +66,7 @@ typedef struct _zend_object_handlers {
        zend_object_get_method_t                 get_method;
        zend_object_call_method_t                call_method;
        zend_object_get_constructor_t            get_constructor;
+       zend_object_get_class_entry_t            get_class_entry;
        zend_object_get_class_name_t             get_class_name;
        zend_object_compare_t                    compare_objects;
 } zend_object_handlers;
index 27e3dca8ddc24380ed22cf4d5be95970035e4888..0b17a9bb1cc1933e1a3fc735c93068fc24e4fde7 100644 (file)
@@ -36,6 +36,4 @@ void zend_objects_del_ref(zval *object TSRMLS_DC);
 void zend_objects_delete_obj(zval *object TSRMLS_DC);
 zend_object_value zend_objects_clone_obj(zval *object TSRMLS_DC);
 
-#define Z_GET_OBJ(object_zval) zend_objects_get_address(object_zval)
-
 #endif /* ZEND_OBJECTS_H */
index b7e5b878bd0a2f90db4a8af78bc3b8bfb6892999..f7ce84423aeb3ca0c6dceedc1d8031aad675eafa 100644 (file)
@@ -235,8 +235,8 @@ ZEND_API int zend_atoi(const char *str, int str_len);
 #define Z_OBJ_HANDLE(zval)  (zval).value.obj.handle
 #define Z_OBJ_HT(zval)      (zval).value.obj.handlers
 #define Z_OBJ(zval)                    zend_objects_get_address(&(zval))
+#define Z_OBJCE(zval)          (*zend_get_class_entry(&(zval)))
 #define Z_OBJPROP(zval)                Z_OBJ(zval)->properties
-#define Z_OBJCE(zval)          Z_OBJ(zval)->ce
 #define Z_RESVAL(zval)         (zval).value.lval
 
 #define Z_LVAL_P(zval_p)               Z_LVAL(*zval_p)