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_operators.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_operators.c')
-rw-r--r-- | Zend/zend_operators.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index d639eb6b9d..e868a8b413 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2278,9 +2278,12 @@ static zend_bool ZEND_FASTCALL instanceof_interface_only(const zend_class_entry { uint32_t i; - for (i = 0; i < instance_ce->num_interfaces; i++) { - if (instanceof_interface_only(instance_ce->interfaces[i], ce)) { - return 1; + if (instance_ce->num_interfaces) { + ZEND_ASSERT(!(instance_ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + for (i = 0; i < instance_ce->num_interfaces; i++) { + if (instanceof_interface_only(instance_ce->interfaces[i], ce)) { + return 1; + } } } return 0; @@ -2303,9 +2306,12 @@ static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *inst { uint32_t i; - for (i = 0; i < instance_ce->num_interfaces; i++) { - if (instanceof_interface(instance_ce->interfaces[i], ce)) { - return 1; + if (instance_ce->num_interfaces) { + ZEND_ASSERT(!(instance_ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + for (i = 0; i < instance_ce->num_interfaces; i++) { + if (instanceof_interface(instance_ce->interfaces[i], ce)) { + return 1; + } } } return instanceof_class(instance_ce, ce); |