From d140df58e6152037e7e3a3a0b119eae4970dd77e Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 23 Aug 2018 17:16:28 +0300 Subject: 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. --- Zend/zend_interfaces.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'Zend/zend_interfaces.c') 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", -- cgit v1.2.1