Skip to content

Commit 1310748

Browse files
committed
Do not make Closures in const-expr toplevel
1 parent d8f4b45 commit 1310748

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

Zend/zend_compile.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8210,15 +8210,17 @@ static zend_string *zend_begin_func_decl(znode *result, zend_op_array *op_array,
82108210
zend_register_seen_symbol(lcname, ZEND_SYMBOL_FUNCTION);
82118211
if (!toplevel) {
82128212
uint32_t func_ref = zend_add_dynamic_func_def(op_array);
8213-
if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
8214-
opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL);
8215-
opline->op2.num = func_ref;
8216-
} else {
8217-
opline = get_next_op();
8218-
opline->opcode = ZEND_DECLARE_FUNCTION;
8219-
opline->op1_type = IS_CONST;
8220-
LITERAL_STR(opline->op1, zend_string_copy(lcname));
8221-
opline->op2.num = func_ref;
8213+
if (decl->kind != ZEND_AST_OP_ARRAY) {
8214+
if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
8215+
opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL);
8216+
opline->op2.num = func_ref;
8217+
} else {
8218+
opline = get_next_op();
8219+
opline->opcode = ZEND_DECLARE_FUNCTION;
8220+
opline->op1_type = IS_CONST;
8221+
LITERAL_STR(opline->op1, zend_string_copy(lcname));
8222+
opline->op2.num = func_ref;
8223+
}
82228224
}
82238225
}
82248226
return lcname;
@@ -8260,7 +8262,7 @@ static zend_op_array *zend_compile_func_decl_ex(
82608262
op_array->doc_comment = zend_string_copy(decl->doc_comment);
82618263
}
82628264

8263-
if (decl->kind == ZEND_AST_CLOSURE || decl->kind == ZEND_AST_ARROW_FUNC) {
8265+
if (decl->kind == ZEND_AST_CLOSURE || decl->kind == ZEND_AST_ARROW_FUNC || decl->kind == ZEND_AST_OP_ARRAY) {
82648266
op_array->fn_flags |= ZEND_ACC_CLOSURE;
82658267
}
82668268

@@ -11198,7 +11200,11 @@ static void zend_compile_const_expr_closure(zend_ast **ast_ptr)
1119811200
}
1119911201

1120011202
znode node;
11201-
zend_op_array *op = zend_compile_func_decl(&node, *ast_ptr, 1);
11203+
zend_ast *ast = *ast_ptr;
11204+
zend_ast_kind old_kind = ast->kind;
11205+
ast->kind = ZEND_AST_OP_ARRAY;
11206+
zend_op_array *op = zend_compile_func_decl(&node, ast, /* toplevel */ false);
11207+
ast->kind = old_kind;
1120211208

1120311209
zend_ast_destroy(*ast_ptr);
1120411210
zval z;

0 commit comments

Comments
 (0)