summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevi Morrison <levim@php.net>2015-05-20 19:50:20 -0600
committerNikita Popov <nikic@php.net>2015-05-23 11:12:13 +0200
commite22ceb6e829ebb0f54a89d85d35f4aec3e9b5712 (patch)
tree3c08d0e93a202d70ae4b7bfca11b665f16066b8d
parent339283c52304f93969eff6a397c1842c1d54f707 (diff)
downloadphp-git-e22ceb6e829ebb0f54a89d85d35f4aec3e9b5712.tar.gz
Remove duplication
-rw-r--r--Zend/zend_compile.c76
1 files changed, 33 insertions, 43 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 3d61b37b9e..41d6ead229 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -4192,6 +4192,35 @@ ZEND_API void zend_set_function_arg_flags(zend_function *func) /* {{{ */
}
/* }}} */
+
+static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info) /* {{{ */
+{
+ if (ast->kind == ZEND_AST_TYPE) {
+ arg_info->type_hint = ast->attr;
+ } else {
+ zend_string *class_name = zend_ast_get_str(ast);
+ zend_uchar type = zend_lookup_builtin_type_by_name(class_name);
+
+ if (type != 0) {
+ arg_info->type_hint = type;
+ } else {
+ uint32_t fetch_type = zend_get_class_fetch_type_ast(ast);
+ if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
+ class_name = zend_resolve_class_name_ast(ast);
+ zend_assert_valid_class_name(class_name);
+ } else {
+ zend_ensure_valid_class_fetch_type(fetch_type);
+ zend_string_addref(class_name);
+ }
+
+ arg_info->type_hint = IS_OBJECT;
+ arg_info->class_name = class_name;
+ }
+ }
+}
+/* }}} */
+
+
void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
@@ -4209,28 +4238,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
arg_infos->allow_null = 0;
arg_infos->class_name = NULL;
- if (return_type_ast->kind == ZEND_AST_TYPE) {
- arg_infos->type_hint = return_type_ast->attr;
- } else {
- zend_string *class_name = zend_ast_get_str(return_type_ast);
- zend_uchar type = zend_lookup_builtin_type_by_name(class_name);
-
- if (type != 0) {
- arg_infos->type_hint = type;
- } else {
- uint32_t fetch_type = zend_get_class_fetch_type_ast(return_type_ast);
- if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
- class_name = zend_resolve_class_name_ast(return_type_ast);
- zend_assert_valid_class_name(class_name);
- } else {
- zend_ensure_valid_class_fetch_type(fetch_type);
- zend_string_addref(class_name);
- }
-
- arg_infos->type_hint = IS_OBJECT;
- arg_infos->class_name = class_name;
- }
- }
+ zend_compile_typename(return_type_ast, arg_infos);
arg_infos++;
op_array->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE;
@@ -4321,8 +4329,9 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
op_array->fn_flags |= ZEND_ACC_HAS_TYPE_HINTS;
arg_info->allow_null = has_null_default;
+ zend_compile_typename(type_ast, arg_info);
+
if (type_ast->kind == ZEND_AST_TYPE) {
- arg_info->type_hint = type_ast->attr;
if (arg_info->type_hint == IS_ARRAY) {
if (default_ast && !has_null_default
&& Z_TYPE(default_node.u.constant) != IS_ARRAY
@@ -4338,32 +4347,13 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
}
}
} else {
- zend_string *class_name = zend_ast_get_str(type_ast);
- zend_uchar type;
-
- type = zend_lookup_builtin_type_by_name(class_name);
- if (type != 0) {
- arg_info->type_hint = type;
- } else {
- uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast);
- if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
- class_name = zend_resolve_class_name_ast(type_ast);
- zend_assert_valid_class_name(class_name);
- } else {
- zend_ensure_valid_class_fetch_type(fetch_type);
- zend_string_addref(class_name);
- }
-
- arg_info->type_hint = IS_OBJECT;
- arg_info->class_name = class_name;
- }
if (default_ast && !has_null_default && !Z_CONSTANT(default_node.u.constant)) {
if (arg_info->class_name) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
"with a class type hint can only be NULL");
} else if (!ZEND_SAME_FAKE_TYPE(arg_info->type_hint, Z_TYPE(default_node.u.constant))) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
- "with a %s type hint can only be %s or NULL", class_name->val, class_name->val);
+ "with a %s type hint can only be %s or NULL", arg_info->class_name->val, arg_info->class_name->val);
}
}
}