Skip to content

Commit c62f10f

Browse files
committed
Add explicit ARRAY_ELEM_REF flag
Instead of using magic value "1". Add a test for by-ref destructing functionality in PHP 7.3. It also worked previously, this is just improving the dumping functionality.
1 parent 5dd4ace commit c62f10f

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ ast\flags\EXEC_REQUIRE_ONCE
373373
ast\flags\ARRAY_SYNTAX_SHORT
374374
ast\flags\ARRAY_SYNTAX_LONG
375375
ast\flags\ARRAY_SYNTAX_LIST
376+
377+
// Used by ast\AST_ARRAY_ELEM (exclusive)
378+
ast\flags\ARRAY_ELEM_REF
376379
```
377380

378381
AST node kinds

ast.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ static const char *array_flags[] = {
191191
NULL
192192
};
193193

194+
static const char *array_elem_flags[] = {
195+
AST_FLAG(ARRAY_ELEM_REF),
196+
NULL
197+
};
198+
194199
static const char *closure_use_flags[] = {
195200
AST_FLAG(CLOSURE_USE_REF),
196201
NULL
@@ -239,6 +244,7 @@ static const ast_flag_info flag_info[] = {
239244
{ ZEND_AST_USE_ELEM, 0, use_flags },
240245
{ ZEND_AST_INCLUDE_OR_EVAL, 0, include_flags },
241246
{ ZEND_AST_ARRAY, 0, array_flags },
247+
{ ZEND_AST_ARRAY_ELEM, 0, array_elem_flags },
242248
{ AST_CLOSURE_VAR, 0, closure_use_flags },
243249
{ ZEND_AST_METHOD, 1, func_flags },
244250
{ ZEND_AST_FUNC_DECL, 1, func_flags },
@@ -1152,7 +1158,8 @@ PHP_MINIT_FUNCTION(ast) {
11521158
ast_register_flag_constant("FUNC_RETURNS_REF", ZEND_ACC_RETURN_REFERENCE);
11531159
ast_register_flag_constant("FUNC_GENERATOR", ZEND_ACC_GENERATOR);
11541160

1155-
ast_register_flag_constant("CLOSURE_USE_REF", 1);
1161+
ast_register_flag_constant("ARRAY_ELEM_REF", 1);
1162+
ast_register_flag_constant("CLOSURE_USE_REF", ZEND_BIND_REF);
11561163

11571164
ast_register_flag_constant("CLASS_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
11581165
ast_register_flag_constant("CLASS_FINAL", ZEND_ACC_FINAL);

tests/by_ref_destructuring.phpt

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
--TEST--
2+
By-reference array destructuring (PHP 7.3)
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 70300) die('skip PHP >= 7.3 only'); ?>
5+
--FILE--
6+
<?php
7+
8+
require __DIR__ . '/../util.php';
9+
10+
$code = <<<'PHP'
11+
<?php
12+
list($a, &$b) = $c;
13+
[$a, &$b] = $c;
14+
$c = [$a, &$b];
15+
PHP;
16+
echo ast_dump(ast\parse_code($code, $version=50)), "\n";
17+
18+
?>
19+
--EXPECT--
20+
AST_STMT_LIST
21+
0: AST_ASSIGN
22+
var: AST_ARRAY
23+
flags: ARRAY_SYNTAX_LIST (1)
24+
0: AST_ARRAY_ELEM
25+
flags: 0
26+
value: AST_VAR
27+
name: "a"
28+
key: null
29+
1: AST_ARRAY_ELEM
30+
flags: ARRAY_ELEM_REF (1)
31+
value: AST_VAR
32+
name: "b"
33+
key: null
34+
expr: AST_VAR
35+
name: "c"
36+
1: AST_ASSIGN
37+
var: AST_ARRAY
38+
flags: ARRAY_SYNTAX_SHORT (3)
39+
0: AST_ARRAY_ELEM
40+
flags: 0
41+
value: AST_VAR
42+
name: "a"
43+
key: null
44+
1: AST_ARRAY_ELEM
45+
flags: ARRAY_ELEM_REF (1)
46+
value: AST_VAR
47+
name: "b"
48+
key: null
49+
expr: AST_VAR
50+
name: "c"
51+
2: AST_ASSIGN
52+
var: AST_VAR
53+
name: "c"
54+
expr: AST_ARRAY
55+
flags: ARRAY_SYNTAX_SHORT (3)
56+
0: AST_ARRAY_ELEM
57+
flags: 0
58+
value: AST_VAR
59+
name: "a"
60+
key: null
61+
1: AST_ARRAY_ELEM
62+
flags: ARRAY_ELEM_REF (1)
63+
value: AST_VAR
64+
name: "b"
65+
key: null

tests/metadata.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ AST_GREATER: []
8888
AST_GREATER_EQUAL: []
8989
AST_AND: []
9090
AST_OR: []
91-
AST_ARRAY_ELEM: []
91+
AST_ARRAY_ELEM: [ARRAY_ELEM_REF]
9292
AST_NEW: []
9393
AST_INSTANCEOF: []
9494
AST_YIELD: []

0 commit comments

Comments
 (0)