@@ -1893,18 +1893,23 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /*
1893
1893
int name_len ;
1894
1894
1895
1895
if ((CG (active_op_array )-> fn_flags & ZEND_ACC_GENERATOR ) && CG (active_op_array )-> return_hint .used ) {
1896
- zend_class_entry * ce = NULL ;
1897
1896
char * errmsg = "Generators may only be hinted as Generator, Iterator or Traversable, %s is not a valid type" ;
1897
+ char * lower_name ;
1898
+ int class_hint_len = CG (active_op_array )-> return_hint .class_name_len ;
1899
+
1898
1900
if (CG (active_op_array )-> return_hint .type != IS_OBJECT ) {
1899
1901
zend_error_noreturn (E_COMPILE_ERROR , errmsg ,
1900
1902
zend_get_type_by_const (CG (active_op_array )-> return_hint .type ));
1901
1903
}
1902
-
1903
- ce = zend_fetch_class_by_name (CG (active_op_array )-> return_hint .class_name , CG (active_op_array )-> return_hint .class_name_len , NULL , ZEND_FETCH_CLASS_SILENT TSRMLS_CC );
1904
-
1905
- if (!ce || !instanceof_function (zend_ce_generator , ce TSRMLS_CC )) {
1904
+ lower_name = zend_str_tolower_dup (CG (active_op_array )-> return_hint .class_name , class_hint_len );
1905
+ if (0 != zend_binary_strcmp (lower_name , class_hint_len , "traversable" , 11 )
1906
+ && 0 != zend_binary_strcmp (lower_name , class_hint_len , "generator" , 9 )
1907
+ && 0 != zend_binary_strcmp (lower_name , class_hint_len , "iterator" , 8 )
1908
+ ) {
1909
+ efree (lower_name );
1906
1910
zend_error_noreturn (E_COMPILE_ERROR , errmsg , CG (active_op_array )-> return_hint .class_name );
1907
1911
}
1912
+ efree (lower_name );
1908
1913
}
1909
1914
1910
1915
zend_do_extended_info (TSRMLS_C );
0 commit comments