summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c64
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;
+ }
+ }
}
}
/* }}} */