diff options
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r-- | Zend/zend_operators.c | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index ac11ed6668..69ee522b4c 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2175,53 +2175,49 @@ ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, } /* }}} */ -static zend_always_inline zend_bool instanceof_class(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ -{ - do { - if (instance_ce == ce) { - return 1; - } - instance_ce = instance_ce->parent; - } while (instance_ce); - return 0; -} -/* }}} */ - -static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ +ZEND_API zend_bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce) /* {{{ */ { uint32_t i; + ZEND_ASSERT(!(class_ce->ce_flags & ZEND_ACC_INTERFACE)); + ZEND_ASSERT(interface_ce->ce_flags & ZEND_ACC_INTERFACE); - if (instance_ce->num_interfaces) { - ZEND_ASSERT(instance_ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES); - for (i = 0; i < instance_ce->num_interfaces; i++) { - if (instance_ce->interfaces[i] == ce) { + if (class_ce->num_interfaces) { + ZEND_ASSERT(class_ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES); + for (i = 0; i < class_ce->num_interfaces; i++) { + if (class_ce->interfaces[i] == interface_ce) { return 1; } } } - return instance_ce == ce; -} -/* }}} */ - -// TODO: It would make more sense to expose instanceof_class + instanceof_interface instead -ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool is_interface) /* {{{ */ -{ - if (is_interface) { - ZEND_ASSERT(ce->ce_flags & ZEND_ACC_INTERFACE); - return instanceof_interface(instance_ce, ce); - } else { - ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_INTERFACE)); - return instanceof_class(instance_ce, ce); - } + return 0; } /* }}} */ -ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ +ZEND_API zend_bool ZEND_FASTCALL instanceof_function_slow(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ { + ZEND_ASSERT(instance_ce != ce && "Should have been checked already"); if (ce->ce_flags & ZEND_ACC_INTERFACE) { - return instanceof_interface(instance_ce, ce); + uint32_t i; + + if (instance_ce->num_interfaces) { + ZEND_ASSERT(instance_ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES); + for (i = 0; i < instance_ce->num_interfaces; i++) { + if (instance_ce->interfaces[i] == ce) { + return 1; + } + } + } + return 0; } else { - return instanceof_class(instance_ce, ce); + while (1) { + instance_ce = instance_ce->parent; + if (instance_ce == ce) { + return 1; + } + if (instance_ce == NULL) { + return 0; + } + } } } /* }}} */ |