@@ -293,24 +293,30 @@ int _check_inherited_arg_info(
293
293
}
294
294
}
295
295
zend_string_release (proto_class_name );
296
- } else if (proto_type_code == IS_ITERABLE && variance == COVARIANT ) {
297
- zend_class_entry * fe_ce = zend_lookup_class (fe_class_name );
298
- code = fe_ce && instanceof_function (fe_ce , zend_ce_traversable );
296
+ } else if (variance == COVARIANT ) {
297
+ if (proto_type_code == IS_ITERABLE ) {
298
+ zend_class_entry * fe_ce = zend_lookup_class (fe_class_name );
299
+ code = fe_ce && instanceof_function (fe_ce , zend_ce_traversable );
300
+ } else if (proto_type_code != IS_OBJECT ) {
301
+ code = 0 ;
302
+ }
299
303
} else {
300
304
code = 0 ;
301
305
}
302
306
303
307
zend_string_release (fe_class_name );
304
308
return code ;
305
309
} else if (ZEND_TYPE_IS_CLASS (proto_type )) {
306
- if (variance == CONTRAVARIANT && fe_type_code == IS_ITERABLE ) {
307
- zend_string * proto_class_name =
308
- _resolve_parent_and_self (proto , ZEND_TYPE_NAME (proto_type ));
309
- zend_class_entry * proto_ce = zend_lookup_class (proto_class_name );
310
- zend_string_release (proto_class_name );
311
- return proto_ce && instanceof_function (proto_ce , zend_ce_traversable );
312
- } else {
313
- return 0 ;
310
+ if (variance == CONTRAVARIANT ) {
311
+ if (fe_type_code == IS_ITERABLE ) {
312
+ zend_string * proto_class_name =
313
+ _resolve_parent_and_self (proto , ZEND_TYPE_NAME (proto_type ));
314
+ zend_class_entry * proto_ce = zend_lookup_class (proto_class_name );
315
+ zend_string_release (proto_class_name );
316
+ return proto_ce && instanceof_function (proto_ce , zend_ce_traversable );
317
+ } else if (fe_type_code == IS_OBJECT ) {
318
+ return 1 ;
319
+ }
314
320
}
315
321
} else if (fe_type_code == IS_ITERABLE || proto_type_code == IS_ITERABLE ) {
316
322
return (variance == COVARIANT && fe_type_code == IS_ARRAY )
0 commit comments