Skip to content

Commit 1d13cb0

Browse files
committed
Sync with RFC: arrow functions are not changed
1 parent a24dbeb commit 1d13cb0

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

Zend/tests/arrow_functions/001.phpt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ $var = 6;
3232
var_dump((fn() => fn() => $var)()());
3333
var_dump((fn() => function() use($var) { return $var; })()());
3434

35+
// All literal variables are closed over
36+
$a = 0;
37+
$foo = fn() => $a = $var;
38+
var_dump((new ReflectionFunction($foo))->getStaticVariables());
39+
3540
?>
3641
--EXPECT--
3742
int(1)
@@ -43,3 +48,9 @@ int(6)
4348
int(5)
4449
int(6)
4550
int(6)
51+
array(2) {
52+
["a"]=>
53+
int(0)
54+
["var"]=>
55+
int(6)
56+
}

Zend/zend_compile.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6943,14 +6943,6 @@ static void zend_find_minimal_implicit_binds(closure_info *info, zend_op_array *
69436943
continue;
69446944
}
69456945

6946-
if (!op_array->static_variables) {
6947-
op_array->static_variables = zend_new_array(8);
6948-
}
6949-
6950-
if (!zend_hash_add(op_array->static_variables, var_name, &EG(uninitialized_zval))) {
6951-
continue;
6952-
}
6953-
69546946
zend_hash_add_empty_element(&min_uses, var_name);
69556947
}
69566948
} ZEND_BITSET_FOREACH_END();
@@ -6977,7 +6969,9 @@ static void zend_compile_implicit_lexical_binds(
69776969

69786970
ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name)
69796971
zval *value = zend_hash_find(op_array->static_variables, var_name);
6980-
ZEND_ASSERT(value);
6972+
if (!value) {
6973+
continue;
6974+
}
69816975

69826976
uint32_t offset = (uint32_t)((char*)value - (char*)op_array->static_variables->arData);
69836977

@@ -7028,16 +7022,18 @@ static void zend_compile_implicit_closure_uses(closure_info *info, zend_op_array
70287022
return;
70297023
}
70307024

7031-
ZEND_ASSERT(op_array->static_variables);
7032-
70337025
zend_string *var_name;
70347026
ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name)
7035-
zval *value = zend_hash_find(op_array->static_variables, var_name);
7036-
zend_op *opline;
7027+
if (!op_array->static_variables) {
7028+
op_array->static_variables = zend_new_array(8);
7029+
}
70377030

7038-
ZEND_ASSERT(value);
7031+
zval *value = zend_hash_add(op_array->static_variables, var_name, &EG(uninitialized_zval));
7032+
if (!value) {
7033+
continue;
7034+
}
70397035

7040-
opline = &op_array->opcodes[opnum];
7036+
zend_op *opline = &op_array->opcodes[opnum];
70417037
opline->opcode = ZEND_BIND_STATIC;
70427038
opline->op1_type = IS_CV;
70437039
opline->op1.var = lookup_cv(var_name);
@@ -7316,8 +7312,10 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel)
73167312
pass_two(CG(active_op_array));
73177313

73187314
if (decl->kind == ZEND_AST_ARROW_FUNC || decl->kind == ZEND_AST_SHORT_CLOSURE) {
7319-
/* Depends on pass_two() */
7320-
zend_find_minimal_implicit_binds(&info, op_array);
7315+
if (decl->kind == ZEND_AST_SHORT_CLOSURE) {
7316+
/* Depends on pass_two() */
7317+
zend_find_minimal_implicit_binds(&info, op_array);
7318+
}
73217319
zend_compile_implicit_closure_uses(&info, op_array, opnum_bind);
73227320
}
73237321

0 commit comments

Comments
 (0)