summaryrefslogtreecommitdiff
path: root/ext/reflection/php_reflection.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r--ext/reflection/php_reflection.c88
1 files changed, 30 insertions, 58 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 0757e75f29..9c465d78d4 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -603,18 +603,15 @@ static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_
} else {
smart_str_append_printf(str, "<required> ");
}
- if (arg_info->class_name) {
+ if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
smart_str_append_printf(str, "%s ",
- (fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) ?
- ((zend_internal_arg_info*)arg_info)->class_name :
- ZSTR_VAL(arg_info->class_name));
- if (arg_info->allow_null) {
+ ZSTR_VAL(ZEND_TYPE_NAME(arg_info->type)));
+ if (ZEND_TYPE_ALLOW_NULL(arg_info->type)) {
smart_str_append_printf(str, "or NULL ");
}
- } else if (arg_info->type_hint) {
- smart_str_append_printf(str, "%s ", zend_get_type_by_const(arg_info->type_hint));
- if (arg_info->allow_null) {
+ } else if (ZEND_TYPE_IS_CODE(arg_info->type)) {
+ smart_str_append_printf(str, "%s ", zend_get_type_by_const(ZEND_TYPE_CODE(arg_info->type)));
+ if (ZEND_TYPE_ALLOW_NULL(arg_info->type)) {
smart_str_append_printf(str, "or NULL ");
}
}
@@ -825,18 +822,15 @@ static void _function_string(smart_str *str, zend_function *fptr, zend_class_ent
smart_str_free(&param_indent);
if (fptr->op_array.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
smart_str_append_printf(str, " %s- Return [ ", indent);
- if (fptr->common.arg_info[-1].class_name) {
+ if (ZEND_TYPE_IS_CLASS(fptr->common.arg_info[-1].type)) {
smart_str_append_printf(str, "%s ",
- (fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) ?
- ((zend_internal_arg_info*)(fptr->common.arg_info - 1))->class_name :
- ZSTR_VAL(fptr->common.arg_info[-1].class_name));
- if (fptr->common.arg_info[-1].allow_null) {
+ ZSTR_VAL(ZEND_TYPE_NAME(fptr->common.arg_info[-1].type)));
+ if (ZEND_TYPE_ALLOW_NULL(fptr->common.arg_info[-1].type)) {
smart_str_appends(str, "or NULL ");
}
- } else if (fptr->common.arg_info[-1].type_hint) {
- smart_str_append_printf(str, "%s ", zend_get_type_by_const(fptr->common.arg_info[-1].type_hint));
- if (fptr->common.arg_info[-1].allow_null) {
+ } else if (ZEND_TYPE_IS_CODE(fptr->common.arg_info[-1].type)) {
+ smart_str_append_printf(str, "%s ", zend_get_type_by_const(ZEND_TYPE_CODE(fptr->common.arg_info[-1].type)));
+ if (ZEND_TYPE_ALLOW_NULL(fptr->common.arg_info[-1].type)) {
smart_str_appends(str, "or NULL ");
}
}
@@ -2551,7 +2545,7 @@ ZEND_METHOD(reflection_parameter, getClass)
}
GET_REFLECTION_OBJECT_PTR(param);
- if (param->arg_info->class_name) {
+ if (ZEND_TYPE_IS_CLASS(param->arg_info->type)) {
/* Class name is stored as a string, we might also get "self" or "parent"
* - For "self", simply use the function scope. If scope is NULL then
* the function is global and thus self does not make any sense
@@ -2564,25 +2558,17 @@ ZEND_METHOD(reflection_parameter, getClass)
* TODO: Think about moving these checks to the compiler or some sort of
* lint-mode.
*/
- const char *class_name;
- size_t class_name_len;
+ zend_string *class_name;
- if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) {
- class_name = ((zend_internal_arg_info*)param->arg_info)->class_name;
- class_name_len = strlen(class_name);
- } else {
- class_name = ZSTR_VAL(param->arg_info->class_name);
- class_name_len = ZSTR_LEN(param->arg_info->class_name);
- }
- if (0 == zend_binary_strcasecmp(class_name, class_name_len, "self", sizeof("self")- 1)) {
+ class_name = ZEND_TYPE_NAME(param->arg_info->type);
+ if (0 == zend_binary_strcasecmp(ZSTR_VAL(class_name), ZSTR_LEN(class_name), "self", sizeof("self")- 1)) {
ce = param->fptr->common.scope;
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0,
"Parameter uses 'self' as type hint but function is not a class member!");
return;
}
- } else if (0 == zend_binary_strcasecmp(class_name, class_name_len, "parent", sizeof("parent")- 1)) {
+ } else if (0 == zend_binary_strcasecmp(ZSTR_VAL(class_name), ZSTR_LEN(class_name), "parent", sizeof("parent")- 1)) {
ce = param->fptr->common.scope;
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0,
@@ -2596,17 +2582,10 @@ ZEND_METHOD(reflection_parameter, getClass)
}
ce = ce->parent;
} else {
- if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) {
- zend_string *name = zend_string_init(class_name, class_name_len, 0);
- ce = zend_lookup_class(name);
- zend_string_release(name);
- } else {
- ce = zend_lookup_class(param->arg_info->class_name);
- }
+ ce = zend_lookup_class(class_name);
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Class %s does not exist", class_name);
+ "Class %s does not exist", ZSTR_VAL(class_name));
return;
}
}
@@ -2627,7 +2606,7 @@ ZEND_METHOD(reflection_parameter, hasType)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->type_hint != 0);
+ RETVAL_BOOL(ZEND_TYPE_IS_SET(param->arg_info->type));
}
/* }}} */
@@ -2643,11 +2622,7 @@ ZEND_METHOD(reflection_parameter, getType)
}
GET_REFLECTION_OBJECT_PTR(param);
- if (((param->fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) ?
- ((zend_internal_arg_info*)param->arg_info)->type_hint :
- param->arg_info->type_hint) == 0)
- {
+ if (!ZEND_TYPE_IS_SET(param->arg_info->type)) {
RETURN_NULL();
}
reflection_type_factory(_copy_function(param->fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, param->arg_info, return_value);
@@ -2666,7 +2641,7 @@ ZEND_METHOD(reflection_parameter, isArray)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->type_hint == IS_ARRAY);
+ RETVAL_BOOL(ZEND_TYPE_CODE(param->arg_info->type) == IS_ARRAY);
}
/* }}} */
@@ -2682,7 +2657,7 @@ ZEND_METHOD(reflection_parameter, isCallable)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->type_hint == IS_CALLABLE);
+ RETVAL_BOOL(ZEND_TYPE_CODE(param->arg_info->type) == IS_CALLABLE);
}
/* }}} */
@@ -2698,7 +2673,7 @@ ZEND_METHOD(reflection_parameter, allowsNull)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->allow_null);
+ RETVAL_BOOL(ZEND_TYPE_ALLOW_NULL(param->arg_info->type));
}
/* }}} */
@@ -2897,7 +2872,7 @@ ZEND_METHOD(reflection_type, allowsNull)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->allow_null);
+ RETVAL_BOOL(ZEND_TYPE_ALLOW_NULL(param->arg_info->type));
}
/* }}} */
@@ -2913,21 +2888,18 @@ ZEND_METHOD(reflection_type, isBuiltin)
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->arg_info->type_hint != IS_OBJECT);
+ RETVAL_BOOL(ZEND_TYPE_IS_CODE(param->arg_info->type));
}
/* }}} */
/* {{{ reflection_type_name */
static zend_string *reflection_type_name(type_reference *param) {
- switch (param->arg_info->type_hint) {
+ if (ZEND_TYPE_IS_CLASS(param->arg_info->type)) {
+ return zend_string_copy(ZEND_TYPE_NAME(param->arg_info->type));
+ }
+ switch (ZEND_TYPE_CODE(param->arg_info->type)) {
case IS_ARRAY: return zend_string_init("array", sizeof("array") - 1, 0);
case IS_CALLABLE: return zend_string_init("callable", sizeof("callable") - 1, 0);
- case IS_OBJECT:
- if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
- !(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) {
- return zend_string_init(((zend_internal_arg_info*)param->arg_info)->class_name, strlen(((zend_internal_arg_info*)param->arg_info)->class_name), 0);
- }
- return zend_string_copy(param->arg_info->class_name);
case IS_STRING: return zend_string_init("string", sizeof("string") - 1, 0);
case _IS_BOOL: return zend_string_init("bool", sizeof("bool") - 1, 0);
case IS_LONG: return zend_string_init("int", sizeof("int") - 1, 0);