mirror of
https://github.com/php/php-src.git
synced 2026-04-28 18:53:33 +02:00
Make OBJCE return zend_class_entry*, also some cleanups
This commit is contained in:
+6
-14
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user