]> granicus.if.org Git - php/commitdiff
Optimize instanceof_class/interface
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 24 Oct 2019 15:47:35 +0000 (17:47 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 24 Oct 2019 15:47:35 +0000 (17:47 +0200)
instanceof_class does not need to check for a NULL pointer in the
first iteration -- passing NULL to this function is illegal.

instanceof_interface does not need to use instanceof_class(), it
only has to check whether the CEs match exactly. There is no way
for an interface to appear inside "parent", it will always be in
"interfaces" only.

Zend/zend_operators.c

index bf896a8befc3d5f9e190f175e48a2920087ddae4..c2ea3cd65ac37848d3b0ae1c626bdb12deef294f 100644 (file)
@@ -2311,12 +2311,12 @@ 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) /* {{{ */
 {
-       while (instance_ce) {
+       do {
                if (instance_ce == ce) {
                        return 1;
                }
                instance_ce = instance_ce->parent;
-       }
+       } while (instance_ce);
        return 0;
 }
 /* }}} */
@@ -2333,7 +2333,7 @@ static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *inst
                        }
                }
        }
-       return instanceof_class(instance_ce, ce);
+       return instance_ce == ce;
 }
 /* }}} */