summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c39
1 files changed, 12 insertions, 27 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 3eece7687c..afb5f6ea17 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -6174,13 +6174,11 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
}
/* }}} */
-static zend_trait_method_reference *zend_compile_method_ref(zend_ast *ast) /* {{{ */
+static void zend_compile_method_ref(zend_ast *ast, zend_trait_method_reference *method_ref) /* {{{ */
{
zend_ast *class_ast = ast->child[0];
zend_ast *method_ast = ast->child[1];
- zend_trait_method_reference *method_ref = emalloc(sizeof(zend_trait_method_reference));
- method_ref->ce = NULL;
method_ref->method_name = zend_string_copy(zend_ast_get_str(method_ast));
if (class_ast) {
@@ -6188,25 +6186,6 @@ static zend_trait_method_reference *zend_compile_method_ref(zend_ast *ast) /* {{
} else {
method_ref->class_name = NULL;
}
-
- return method_ref;
-}
-/* }}} */
-
-static zend_string **zend_compile_name_list(zend_ast *ast) /* {{{ */
-{
- zend_ast_list *list = zend_ast_get_list(ast);
- zend_string **names = safe_emalloc(sizeof(zend_string *), list->children + 1, 0);
- uint32_t i;
-
- for (i = 0; i < list->children; ++i) {
- zend_ast *name_ast = list->child[i];
- names[i] = zend_resolve_class_name_ast(name_ast);
- }
-
- names[list->children] = NULL;
-
- return names;
}
/* }}} */
@@ -6214,11 +6193,17 @@ static void zend_compile_trait_precedence(zend_ast *ast) /* {{{ */
{
zend_ast *method_ref_ast = ast->child[0];
zend_ast *insteadof_ast = ast->child[1];
+ zend_ast_list *insteadof_list = zend_ast_get_list(insteadof_ast);
+ uint32_t i;
+
+ zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence) + (insteadof_list->children - 1) * sizeof(zend_string*));
+ zend_compile_method_ref(method_ref_ast, &precedence->trait_method);
+ precedence->num_excludes = insteadof_list->children;
- zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence));
- precedence->trait_method = zend_compile_method_ref(method_ref_ast);
- precedence->exclude_from_classes
- = (void *) zend_compile_name_list(insteadof_ast);
+ for (i = 0; i < insteadof_list->children; ++i) {
+ zend_ast *name_ast = insteadof_list->child[i];
+ precedence->exclude_class_names[i] = zend_resolve_class_name_ast(name_ast);
+ }
zend_add_to_list(&CG(active_class_entry)->trait_precedences, precedence);
}
@@ -6241,7 +6226,7 @@ static void zend_compile_trait_alias(zend_ast *ast) /* {{{ */
}
alias = emalloc(sizeof(zend_trait_alias));
- alias->trait_method = zend_compile_method_ref(method_ref_ast);
+ zend_compile_method_ref(method_ref_ast, &alias->trait_method);
alias->modifiers = modifiers;
if (alias_ast) {