Clean up and clarify instanceof_function_ex()
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 24 Oct 2019 15:40:25 +0000 (17:40 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 24 Oct 2019 15:40:25 +0000 (17:40 +0200)
The instanceof_interface_only() function was dead code (always
returned zero).

Clarify that the last parameter indicates whether the passed CE
is interface or class and rewrite the code in terms of assertions.

Zend/zend_operators.c
Zend/zend_operators.h

index 7c0c5691646e9bbc4f6424f179a054ed8dbe2570..bf896a8befc3d5f9e190f175e48a2920087ddae4 100644 (file)
@@ -2309,22 +2309,6 @@ ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1,
 }
 /* }}} */
 
-static zend_bool ZEND_FASTCALL instanceof_interface_only(const zend_class_entry *instance_ce, const zend_class_entry *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 (instanceof_interface_only(instance_ce->interfaces[i], ce)) {
-                               return 1;
-                       }
-               }
-       }
-       return 0;
-}
-/* }}} */
-
 static zend_always_inline zend_bool instanceof_class(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
 {
        while (instance_ce) {
@@ -2353,21 +2337,16 @@ static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *inst
 }
 /* }}} */
 
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only) /* {{{ */
+// 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 (ce->ce_flags & ZEND_ACC_INTERFACE) {
-               if (!interfaces_only) {
-                       if (instanceof_interface_only(instance_ce, ce)) {
-                               return 1;
-                       }
-               } else {
-                       return instanceof_interface(instance_ce, ce);
-               }
-       }
-       if (!interfaces_only) {
+       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;
 }
 /* }}} */
 
index 9307bb88549de1c0c741d83f50c7dc7951b12120..1ca1c7751cd5bb7f4d415a511c2a93d14b6642b5 100644 (file)
@@ -63,7 +63,7 @@ ZEND_API int ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval *
 ZEND_API int ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2);
 ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
 
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only);
+ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool is_interface);
 ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce);
 
 /**