]> granicus.if.org Git - php/commitdiff
Make OBJCE return zend_class_entry*, also some cleanups
authorStanislav Malyshev <stas@php.net>
Tue, 30 Apr 2002 09:56:48 +0000 (09:56 +0000)
committerStanislav Malyshev <stas@php.net>
Tue, 30 Apr 2002 09:56:48 +0000 (09:56 +0000)
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_operators.h

index 015197ca688a2eb2f24d815105b95b0ed2920646..c0d00c48f83a1bdb7a2610ce7a9ca1de66a0e73e 100644 (file)
@@ -198,23 +198,15 @@ ZEND_API char *zend_zval_type_name(zval *arg)
        }
 }
 
-ZEND_API zend_class_entry **zend_get_class_entry(zval *zobject)
+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);
+               return 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);
+               zend_error(E_ERROR, "Class entry requested for an object without PHP class");
+               return NULL;
        }
-
-       return ce;
 }
 
 static int zend_check_class(zval *obj, zend_class_entry *expected_ce)
@@ -615,12 +607,12 @@ ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type
 
 ZEND_API int _object_init_ex(zval *arg, zend_class_entry *class_type ZEND_FILE_LINE_DC TSRMLS_DC)
 {
-       return _object_and_properties_init(arg, class_type, 0 ZEND_FILE_LINE_CC TSRMLS_CC);
+       return _object_and_properties_init(arg, class_type, 0 ZEND_FILE_LINE_RELAY_CC TSRMLS_CC);
 }
 
 ZEND_API int _object_init(zval *arg ZEND_FILE_LINE_DC TSRMLS_DC)
 {
-       return _object_init_ex(arg, zend_standard_class_def ZEND_FILE_LINE_CC TSRMLS_CC);
+       return _object_init_ex(arg, zend_standard_class_def ZEND_FILE_LINE_RELAY_CC TSRMLS_CC);
 }
 
 
index 2d028b8529e23149cb350cd61b515fd379e9de74..f0f38dd386b0c405005743e9310703defde9bd8e 100644 (file)
@@ -148,7 +148,7 @@ 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);
+ZEND_API zend_class_entry *zend_get_class_entry(zval *zobject);
 
 #define getThis() (this_ptr)
 
index 42d5f77af457959220632a21f56acb15bfaf8755..dc398e73de25e33175e6307795949590ccd9e0af 100644 (file)
@@ -502,10 +502,11 @@ ZEND_FUNCTION(get_class)
        }
 
        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) {
-               zend_class_entry *ce, **_ce;
+               Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) {
+               zend_class_entry *ce;
 
-               if (((_ce = zend_get_class_entry(*arg)) == NULL) || ((ce = *_ce) == NULL)) {
+               ce = zend_get_class_entry(*arg);
+               if (!ce) {
                        RETURN_FALSE;
                }
 
@@ -532,19 +533,20 @@ ZEND_FUNCTION(get_parent_class)
        if (Z_TYPE_PP(arg) == IS_OBJECT) {
                char *name;
                zend_uint name_length;
-               
-               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) {
-                       zend_class_entry *ce, **_ce;
-
-                       if (!(_ce = zend_get_class_entry(*arg)) || !(ce = *_ce) || !(ce = ce->parent)) {
-                               RETURN_FALSE;
-                       }
 
+               /* first try asking handler for parent class name */
+               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) {
                        name = ce->name;
                        name_length = ce->name_length;
+
+                       RETURN_STRINGL(name, name_length, 1);
+               }
+               /* then try getting the class entry
+                  if successfull, will fall through to standard ce handling */
+               if(!Z_OBJ_HT_PP(arg)->get_class_entry || !(ce = zend_get_class_entry(*arg))) {
+                       RETURN_FALSE;
                }
-               RETURN_STRINGL(name, name_length, 1);
        } else if (Z_TYPE_PP(arg) == IS_STRING) {
                zend_class_entry **pce;
                
index c9efe5fbe5af064066f720d049f0bc9c811d3c9d..eb95aca182dbf97ad42b456c5f1d1cbf9f292cd7 100644 (file)
@@ -215,6 +215,14 @@ 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;
+       zobj = Z_OBJ_P(object);
+
+       return zobj->ce;
+}
+
 zend_object_handlers std_object_handlers = {
        zend_objects_add_ref,                    /* add_ref */
        zend_objects_del_ref,                    /* del_ref */
@@ -233,8 +241,8 @@ zend_object_handlers std_object_handlers = {
        zend_std_get_method,                     /* get_method */
        NULL,                                    /* call_method */
        zend_std_get_constructor,                /* get_constructor */
-       NULL,                                    /* get_class_entry */
-       NULL,                                    /* get_class */
+       zend_std_object_get_class,               /* get_class_entry */
+       NULL,                                    /* get_class_name */
        zend_std_compare_objects                 /* compare_objects */
 };
 
index cce40f22710211011d9689a16b16d37ef528e9d3..3d721b8247c0977ccad137928e9e1f72027af6e5 100644 (file)
@@ -43,7 +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 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);
 
index 720aaf2e2145bdcfcf63c43a272a3739fb57f0a8..aa27d26ef662053830ddac77b1d83d39927f731a 100644 (file)
@@ -235,7 +235,7 @@ 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_OBJCE(zval)          zend_get_class_entry(&(zval))
 #define Z_OBJPROP(zval)                Z_OBJ(zval)->properties
 #define Z_RESVAL(zval)         (zval).value.lval