Skip to content

Commit 3f60cd9

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

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
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 & 15 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

@@ -7032,12 +7026,16 @@ static void zend_compile_implicit_closure_uses(closure_info *info, zend_op_array
70327026

70337027
zend_string *var_name;
70347028
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;
7029+
if (!op_array->static_variables) {
7030+
op_array->static_variables = zend_new_array(8);
7031+
}
70377032

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

7040-
opline = &op_array->opcodes[opnum];
7038+
zend_op *opline = &op_array->opcodes[opnum];
70417039
opline->opcode = ZEND_BIND_STATIC;
70427040
opline->op1_type = IS_CV;
70437041
opline->op1.var = lookup_cv(var_name);
@@ -7316,8 +7314,10 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel)
73167314
pass_two(CG(active_op_array));
73177315

73187316
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);
7317+
if (decl->kind == ZEND_AST_SHORT_CLOSURE) {
7318+
/* Depends on pass_two() */
7319+
zend_find_minimal_implicit_binds(&info, op_array);
7320+
}
73217321
zend_compile_implicit_closure_uses(&info, op_array, opnum_bind);
73227322
}
73237323

0 commit comments

Comments
 (0)