diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-08-23 17:16:28 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-08-23 17:16:28 +0300 |
commit | d140df58e6152037e7e3a3a0b119eae4970dd77e (patch) | |
tree | 5ee51b3be6f0619a077d57310e23b490525f9354 /Zend/zend_interfaces.c | |
parent | 4bf1d0b3a4b53a0d374f8c94ad506fcf8dee2d7e (diff) | |
download | php-git-d140df58e6152037e7e3a3a0b119eae4970dd77e.tar.gz |
Keep information about unresolved interfaces in zend_class_entry->interface_names.
Move interface implementation code into ZEND_DECLARE_*CLASS opcodes.
Remove ZEND_ADD_INTERFACE and ZEND_VERIFY_ABSTRACT_CLASS opcodes.
Diffstat (limited to 'Zend/zend_interfaces.c')
-rw-r--r-- | Zend/zend_interfaces.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 7ccfe1fa75..cf92cbf4d7 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -290,9 +290,12 @@ static int zend_implement_traversable(zend_class_entry *interface, zend_class_en if (class_type->get_iterator || (class_type->parent && class_type->parent->get_iterator)) { return SUCCESS; } - for (i = 0; i < class_type->num_interfaces; i++) { - if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) { - return SUCCESS; + if (class_type->num_interfaces) { + ZEND_ASSERT(!(class_type->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + for (i = 0; i < class_type->num_interfaces; i++) { + if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) { + return SUCCESS; + } } } zend_error_noreturn(E_CORE_ERROR, "Class %s must implement interface %s as part of either %s or %s", @@ -317,6 +320,7 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { /* c-level get_iterator cannot be changed (exception being only Traversable is implemented) */ if (class_type->num_interfaces) { + ZEND_ASSERT(!(class_type->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { zend_error_noreturn(E_ERROR, "Class %s cannot implement both %s and %s at the same time", |