cvs: ZendEngine2 / zend_API.c zend_API.h zend_builtin_functions.c zend_object_handlers.c zend_object_handlers.h zend_objects.h zend_operators.h

From: Date: Mon, 22 Apr 2002 14:22:27 +0000
Subject: cvs: ZendEngine2 / zend_API.c zend_API.h zend_builtin_functions.c zend_object_handlers.c zend_object_handlers.h zend_objects.h zend_operators.h
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-64@lists.php.net to get a copy of this message
phanto Mon Apr 22 10:22:27 2002 EDT Modified files: /ZendEngine2 zend_API.c zend_API.h zend_builtin_functions.c zend_object_handlers.c zend_object_handlers.h zend_objects.h zend_operators.h Log: added get_class_entry callback handler to the object handlers structure

Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.124 ZendEngine2/zend_API.c:1.125 --- ZendEngine2/zend_API.c:1.124 Tue Mar 12 14:22:29 2002 +++ ZendEngine2/zend_API.c Mon Apr 22 10:22:26 2002 @@ -198,6 +198,25 @@ } } +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 @@ 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 @@ { 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: ZendEngine2/zend_API.h diff -u ZendEngine2/zend_API.h:1.114 ZendEngine2/zend_API.h:1.115 --- ZendEngine2/zend_API.h:1.114 Thu Feb 7 09:08:43 2002 +++ ZendEngine2/zend_API.h Mon Apr 22 10:22:26 2002 @@ -148,6 +148,8 @@ 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: ZendEngine2/zend_builtin_functions.c diff -u ZendEngine2/zend_builtin_functions.c:1.115 ZendEngine2/zend_builtin_functions.c:1.116 --- ZendEngine2/zend_builtin_functions.c:1.115 Tue Mar 12 05:08:47 2002 +++ ZendEngine2/zend_builtin_functions.c Mon Apr 22 10:22:26 2002 @@ -501,9 +501,16 @@ 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 @@ 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: ZendEngine2/zend_object_handlers.c diff -u ZendEngine2/zend_object_handlers.c:1.3 ZendEngine2/zend_object_handlers.c:1.4 --- ZendEngine2/zend_object_handlers.c:1.3 Sun Mar 10 08:42:37 2002 +++ ZendEngine2/zend_object_handlers.c Mon Apr 22 10:22:27 2002 @@ -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 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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_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: ZendEngine2/zend_object_handlers.h diff -u ZendEngine2/zend_object_handlers.h:1.3 ZendEngine2/zend_object_handlers.h:1.4 --- ZendEngine2/zend_object_handlers.h:1.3 Fri Mar 15 11:26:17 2002 +++ ZendEngine2/zend_object_handlers.h Mon Apr 22 10:22:27 2002 @@ -43,6 +43,7 @@ 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 @@ 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: ZendEngine2/zend_objects.h diff -u ZendEngine2/zend_objects.h:1.8 ZendEngine2/zend_objects.h:1.9 --- ZendEngine2/zend_objects.h:1.8 Fri Mar 15 11:26:17 2002 +++ ZendEngine2/zend_objects.h Mon Apr 22 10:22:27 2002 @@ -36,6 +36,4 @@ 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: ZendEngine2/zend_operators.h diff -u ZendEngine2/zend_operators.h:1.53 ZendEngine2/zend_operators.h:1.54 --- ZendEngine2/zend_operators.h:1.53 Thu Feb 7 09:08:43 2002 +++ ZendEngine2/zend_operators.h Mon Apr 22 10:22:27 2002 @@ -235,8 +235,8 @@ #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)
« previous php.zend-engine.cvs (#64) next »