diff options
Diffstat (limited to 'Zend')
| -rw-r--r-- | Zend/zend_API.c | 27 | ||||
| -rw-r--r-- | Zend/zend_API.h | 2 | ||||
| -rw-r--r-- | Zend/zend_builtin_functions.c | 22 | ||||
| -rw-r--r-- | Zend/zend_object_handlers.c | 43 | ||||
| -rw-r--r-- | Zend/zend_object_handlers.h | 2 | ||||
| -rw-r--r-- | Zend/zend_objects.h | 2 | ||||
| -rw-r--r-- | Zend/zend_operators.h | 2 | 
7 files changed, 56 insertions, 44 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 26ee2ce77d..6efa0ff214 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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 { diff --git a/Zend/zend_API.h b/Zend/zend_API.h index c78c2fa1db..be5e8b1861 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -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() diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 8341bd7df3..a1a2797ca5 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -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) { diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a2a7a5665c..c9efe5fbe5 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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 */  }; diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 62db624846..cce40f2271 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -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; diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h index 27e3dca8dd..0b17a9bb1c 100644 --- a/Zend/zend_objects.h +++ b/Zend/zend_objects.h @@ -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 */ diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index b7e5b878bd..f7ce84423a 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -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)  | 
