summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-07-11 18:56:10 +0300
committerDmitry Stogov <dmitry@zend.com>2018-07-11 18:56:10 +0300
commit85ee47eda00d68219f9ff34965bdede1e45f1f63 (patch)
treed8e04f2480b746e1241c57d39dbe6a54f1eec130 /Zend/zend_opcode.c
parent2367e649bc98f77202351af9079d6577d072228b (diff)
downloadphp-git-85ee47eda00d68219f9ff34965bdede1e45f1f63.tar.gz
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.
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r--Zend/zend_opcode.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 9031242345..ce0cd2d4a5 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -169,14 +169,11 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce)
if (ce->trait_aliases) {
size_t i = 0;
while (ce->trait_aliases[i]) {
- if (ce->trait_aliases[i]->trait_method) {
- if (ce->trait_aliases[i]->trait_method->method_name) {
- zend_string_release_ex(ce->trait_aliases[i]->trait_method->method_name, 0);
- }
- if (ce->trait_aliases[i]->trait_method->class_name) {
- zend_string_release_ex(ce->trait_aliases[i]->trait_method->class_name, 0);
- }
- efree(ce->trait_aliases[i]->trait_method);
+ if (ce->trait_aliases[i]->trait_method.method_name) {
+ zend_string_release_ex(ce->trait_aliases[i]->trait_method.method_name, 0);
+ }
+ if (ce->trait_aliases[i]->trait_method.class_name) {
+ zend_string_release_ex(ce->trait_aliases[i]->trait_method.class_name, 0);
}
if (ce->trait_aliases[i]->alias) {
@@ -191,21 +188,15 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce)
}
if (ce->trait_precedences) {
- size_t i = 0;
+ int i = 0;
+ int j;
while (ce->trait_precedences[i]) {
- zend_string_release_ex(ce->trait_precedences[i]->trait_method->method_name, 0);
- zend_string_release_ex(ce->trait_precedences[i]->trait_method->class_name, 0);
- efree(ce->trait_precedences[i]->trait_method);
-
- if (ce->trait_precedences[i]->exclude_from_classes) {
- size_t j = 0;
- zend_trait_precedence *cur_precedence = ce->trait_precedences[i];
- while (cur_precedence->exclude_from_classes[j].class_name) {
- zend_string_release_ex(cur_precedence->exclude_from_classes[j].class_name, 0);
- j++;
- }
- efree(ce->trait_precedences[i]->exclude_from_classes);
+ zend_string_release_ex(ce->trait_precedences[i]->trait_method.method_name, 0);
+ zend_string_release_ex(ce->trait_precedences[i]->trait_method.class_name, 0);
+
+ for (j = 0; j < ce->trait_precedences[i]->num_excludes; j++) {
+ zend_string_release_ex(ce->trait_precedences[i]->exclude_class_names[j], 0);
}
efree(ce->trait_precedences[i]);
i++;