diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-07-11 18:56:10 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-07-11 18:56:10 +0300 |
commit | 85ee47eda00d68219f9ff34965bdede1e45f1f63 (patch) | |
tree | d8e04f2480b746e1241c57d39dbe6a54f1eec130 /Zend/zend_opcode.c | |
parent | 2367e649bc98f77202351af9079d6577d072228b (diff) | |
download | php-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.c | 33 |
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++; |