Skip to content

Commit e5eaa70

Browse files
committed
Merge pull request #7 from ircmaxell/returntypehinting
Workaround for opcache clearing symbol table
2 parents 1550503 + 4e7985c commit e5eaa70

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

Zend/zend_compile.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1893,18 +1893,23 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /*
18931893
int name_len;
18941894

18951895
if ((CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) && CG(active_op_array)->return_hint.used) {
1896-
zend_class_entry *ce = NULL;
18971896
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+
18981900
if (CG(active_op_array)->return_hint.type != IS_OBJECT) {
18991901
zend_error_noreturn(E_COMPILE_ERROR, errmsg,
19001902
zend_get_type_by_const(CG(active_op_array)->return_hint.type));
19011903
}
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);
19061910
zend_error_noreturn(E_COMPILE_ERROR, errmsg, CG(active_op_array)->return_hint.class_name);
19071911
}
1912+
efree(lower_name);
19081913
}
19091914

19101915
zend_do_extended_info(TSRMLS_C);

0 commit comments

Comments
 (0)