summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-08-23 17:16:28 +0300
committerDmitry Stogov <dmitry@zend.com>2018-08-23 17:16:28 +0300
commitd140df58e6152037e7e3a3a0b119eae4970dd77e (patch)
tree5ee51b3be6f0619a077d57310e23b490525f9354 /Zend/zend_operators.c
parent4bf1d0b3a4b53a0d374f8c94ad506fcf8dee2d7e (diff)
downloadphp-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.c18
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);