@@ -2175,53 +2175,49 @@ ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1,
2175
2175
}
2176
2176
/* }}} */
2177
2177
2178
- static zend_always_inline zend_bool instanceof_class (const zend_class_entry * instance_ce , const zend_class_entry * ce ) /* {{{ */
2179
- {
2180
- do {
2181
- if (instance_ce == ce ) {
2182
- return 1 ;
2183
- }
2184
- instance_ce = instance_ce -> parent ;
2185
- } while (instance_ce );
2186
- return 0 ;
2187
- }
2188
- /* }}} */
2189
-
2190
- static zend_bool ZEND_FASTCALL instanceof_interface (const zend_class_entry * instance_ce , const zend_class_entry * ce ) /* {{{ */
2178
+ ZEND_API zend_bool ZEND_FASTCALL zend_class_implements_interface (const zend_class_entry * class_ce , const zend_class_entry * interface_ce ) /* {{{ */
2191
2179
{
2192
2180
uint32_t i ;
2181
+ ZEND_ASSERT (!(class_ce -> ce_flags & ZEND_ACC_INTERFACE ));
2182
+ ZEND_ASSERT (interface_ce -> ce_flags & ZEND_ACC_INTERFACE );
2193
2183
2194
- if (instance_ce -> num_interfaces ) {
2195
- ZEND_ASSERT (instance_ce -> ce_flags & ZEND_ACC_RESOLVED_INTERFACES );
2196
- for (i = 0 ; i < instance_ce -> num_interfaces ; i ++ ) {
2197
- if (instance_ce -> interfaces [i ] == ce ) {
2184
+ if (class_ce -> num_interfaces ) {
2185
+ ZEND_ASSERT (class_ce -> ce_flags & ZEND_ACC_RESOLVED_INTERFACES );
2186
+ for (i = 0 ; i < class_ce -> num_interfaces ; i ++ ) {
2187
+ if (class_ce -> interfaces [i ] == interface_ce ) {
2198
2188
return 1 ;
2199
2189
}
2200
2190
}
2201
2191
}
2202
- return instance_ce == ce ;
2203
- }
2204
- /* }}} */
2205
-
2206
- // TODO: It would make more sense to expose instanceof_class + instanceof_interface instead
2207
- ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex (const zend_class_entry * instance_ce , const zend_class_entry * ce , zend_bool is_interface ) /* {{{ */
2208
- {
2209
- if (is_interface ) {
2210
- ZEND_ASSERT (ce -> ce_flags & ZEND_ACC_INTERFACE );
2211
- return instanceof_interface (instance_ce , ce );
2212
- } else {
2213
- ZEND_ASSERT (!(ce -> ce_flags & ZEND_ACC_INTERFACE ));
2214
- return instanceof_class (instance_ce , ce );
2215
- }
2192
+ return 0 ;
2216
2193
}
2217
2194
/* }}} */
2218
2195
2219
- ZEND_API zend_bool ZEND_FASTCALL instanceof_function (const zend_class_entry * instance_ce , const zend_class_entry * ce ) /* {{{ */
2196
+ ZEND_API zend_bool ZEND_FASTCALL instanceof_function_slow (const zend_class_entry * instance_ce , const zend_class_entry * ce ) /* {{{ */
2220
2197
{
2198
+ ZEND_ASSERT (instance_ce != ce && "Should have been checked already" );
2221
2199
if (ce -> ce_flags & ZEND_ACC_INTERFACE ) {
2222
- return instanceof_interface (instance_ce , ce );
2200
+ uint32_t i ;
2201
+
2202
+ if (instance_ce -> num_interfaces ) {
2203
+ ZEND_ASSERT (instance_ce -> ce_flags & ZEND_ACC_RESOLVED_INTERFACES );
2204
+ for (i = 0 ; i < instance_ce -> num_interfaces ; i ++ ) {
2205
+ if (instance_ce -> interfaces [i ] == ce ) {
2206
+ return 1 ;
2207
+ }
2208
+ }
2209
+ }
2210
+ return 0 ;
2223
2211
} else {
2224
- return instanceof_class (instance_ce , ce );
2212
+ while (1 ) {
2213
+ instance_ce = instance_ce -> parent ;
2214
+ if (instance_ce == ce ) {
2215
+ return 1 ;
2216
+ }
2217
+ if (instance_ce == NULL ) {
2218
+ return 0 ;
2219
+ }
2220
+ }
2225
2221
}
2226
2222
}
2227
2223
/* }}} */
0 commit comments