Skip to content

Commit 85ee47e

Browse files
committed
Changed structure of zend_class_entry.trait_aliases and zend_class_entry.trait_precedences to avoid keeping "intermediate" trait references, that are used only during inheritance.
1 parent 2367e64 commit 85ee47e

File tree

9 files changed

+211
-330
lines changed

9 files changed

+211
-330
lines changed

Zend/zend.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,17 @@ typedef struct _zend_unserialize_data zend_unserialize_data;
8686

8787
typedef struct _zend_trait_method_reference {
8888
zend_string *method_name;
89-
zend_class_entry *ce;
9089
zend_string *class_name;
9190
} zend_trait_method_reference;
9291

9392
typedef struct _zend_trait_precedence {
94-
zend_trait_method_reference *trait_method;
95-
union {
96-
zend_class_entry *ce;
97-
zend_string *class_name;
98-
} *exclude_from_classes;
93+
zend_trait_method_reference trait_method;
94+
uint32_t num_excludes;
95+
zend_string *exclude_class_names[1];
9996
} zend_trait_precedence;
10097

10198
typedef struct _zend_trait_alias {
102-
zend_trait_method_reference *trait_method;
99+
zend_trait_method_reference trait_method;
103100

104101
/**
105102
* name for method to be added

Zend/zend_compile.c

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6174,51 +6174,36 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
61746174
}
61756175
/* }}} */
61766176

6177-
static zend_trait_method_reference *zend_compile_method_ref(zend_ast *ast) /* {{{ */
6177+
static void zend_compile_method_ref(zend_ast *ast, zend_trait_method_reference *method_ref) /* {{{ */
61786178
{
61796179
zend_ast *class_ast = ast->child[0];
61806180
zend_ast *method_ast = ast->child[1];
61816181

6182-
zend_trait_method_reference *method_ref = emalloc(sizeof(zend_trait_method_reference));
6183-
method_ref->ce = NULL;
61846182
method_ref->method_name = zend_string_copy(zend_ast_get_str(method_ast));
61856183

61866184
if (class_ast) {
61876185
method_ref->class_name = zend_resolve_class_name_ast(class_ast);
61886186
} else {
61896187
method_ref->class_name = NULL;
61906188
}
6191-
6192-
return method_ref;
6193-
}
6194-
/* }}} */
6195-
6196-
static zend_string **zend_compile_name_list(zend_ast *ast) /* {{{ */
6197-
{
6198-
zend_ast_list *list = zend_ast_get_list(ast);
6199-
zend_string **names = safe_emalloc(sizeof(zend_string *), list->children + 1, 0);
6200-
uint32_t i;
6201-
6202-
for (i = 0; i < list->children; ++i) {
6203-
zend_ast *name_ast = list->child[i];
6204-
names[i] = zend_resolve_class_name_ast(name_ast);
6205-
}
6206-
6207-
names[list->children] = NULL;
6208-
6209-
return names;
62106189
}
62116190
/* }}} */
62126191

62136192
static void zend_compile_trait_precedence(zend_ast *ast) /* {{{ */
62146193
{
62156194
zend_ast *method_ref_ast = ast->child[0];
62166195
zend_ast *insteadof_ast = ast->child[1];
6196+
zend_ast_list *insteadof_list = zend_ast_get_list(insteadof_ast);
6197+
uint32_t i;
6198+
6199+
zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence) + (insteadof_list->children - 1) * sizeof(zend_string*));
6200+
zend_compile_method_ref(method_ref_ast, &precedence->trait_method);
6201+
precedence->num_excludes = insteadof_list->children;
62176202

6218-
zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence));
6219-
precedence->trait_method = zend_compile_method_ref(method_ref_ast);
6220-
precedence->exclude_from_classes
6221-
= (void *) zend_compile_name_list(insteadof_ast);
6203+
for (i = 0; i < insteadof_list->children; ++i) {
6204+
zend_ast *name_ast = insteadof_list->child[i];
6205+
precedence->exclude_class_names[i] = zend_resolve_class_name_ast(name_ast);
6206+
}
62226207

62236208
zend_add_to_list(&CG(active_class_entry)->trait_precedences, precedence);
62246209
}
@@ -6241,7 +6226,7 @@ static void zend_compile_trait_alias(zend_ast *ast) /* {{{ */
62416226
}
62426227

62436228
alias = emalloc(sizeof(zend_trait_alias));
6244-
alias->trait_method = zend_compile_method_ref(method_ref_ast);
6229+
zend_compile_method_ref(method_ref_ast, &alias->trait_method);
62456230
alias->modifiers = modifiers;
62466231

62476232
if (alias_ast) {

0 commit comments

Comments
 (0)