Skip to content

Commit d4c370d

Browse files
TysonAndrenikic
authored andcommitted
Support FLAGS_COALESCE on AST_ASSIGN_OP (??=)
1 parent 7fe259e commit d4c370d

File tree

5 files changed

+49
-5
lines changed

5 files changed

+49
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ ast\flags\BINARY_MOD
297297
ast\flags\BINARY_POW
298298
ast\flags\BINARY_SHIFT_LEFT
299299
ast\flags\BINARY_SHIFT_RIGHT
300+
ast\flags\BINARY_COALESCE
300301
301302
// Used by ast\AST_BINARY_OP (exclusive)
302303
ast\flags\BINARY_BOOL_AND
@@ -311,7 +312,6 @@ ast\flags\BINARY_IS_SMALLER_OR_EQUAL
311312
ast\flags\BINARY_IS_GREATER
312313
ast\flags\BINARY_IS_GREATER_OR_EQUAL
313314
ast\flags\BINARY_SPACESHIP
314-
ast\flags\BINARY_COALESCE
315315
316316
// Used by ast\AST_MAGIC_CONST (exclusive)
317317
ast\flags\MAGIC_LINE

ast.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ static const char *unary_op_flags[] = {
134134
AST_FLAG(BINARY_MOD), \
135135
AST_FLAG(BINARY_POW), \
136136
AST_FLAG(BINARY_SHIFT_LEFT), \
137-
AST_FLAG(BINARY_SHIFT_RIGHT) \
137+
AST_FLAG(BINARY_SHIFT_RIGHT), \
138+
AST_FLAG(BINARY_COALESCE) \
138139

139140
static const char *binary_op_flags[] = {
140141
AST_SHARED_BINARY_OP_FLAGS,
@@ -150,7 +151,6 @@ static const char *binary_op_flags[] = {
150151
AST_FLAG(BINARY_IS_GREATER),
151152
AST_FLAG(BINARY_IS_GREATER_OR_EQUAL),
152153
AST_FLAG(BINARY_SPACESHIP),
153-
AST_FLAG(BINARY_COALESCE),
154154
NULL
155155
};
156156

@@ -720,6 +720,10 @@ static void ast_to_zval(zval *zv, zend_ast *ast, ast_state_info_t *state) {
720720
return;
721721
}
722722
break;
723+
case ZEND_AST_ASSIGN_COALESCE:
724+
ast->kind = ZEND_AST_ASSIGN_OP;
725+
ast->attr = AST_BINARY_COALESCE;
726+
break;
723727
#endif
724728
}
725729

package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<notes>
2626
- Fix a segfault in PHP 7.4-dev after typed properties support was added.
2727
- Add AST version 70 (experimental): This adds AST_PROP_GROUP with type information for property groups.
28+
- Support BINARY_COALESCE as a flag of AST_ASSIGN_OP for the `??=` operator in PHP 7.4-dev.
2829
</notes>
2930
<contents>
3031
<dir name="/">

tests/metadata.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ AST_CALL: []
7979
AST_CLASS_CONST: []
8080
AST_ASSIGN: []
8181
AST_ASSIGN_REF: []
82-
AST_ASSIGN_OP: [BINARY_BITWISE_OR, BINARY_BITWISE_AND, BINARY_BITWISE_XOR, BINARY_CONCAT, BINARY_ADD, BINARY_SUB, BINARY_MUL, BINARY_DIV, BINARY_MOD, BINARY_POW, BINARY_SHIFT_LEFT, BINARY_SHIFT_RIGHT]
83-
AST_BINARY_OP: [BINARY_BITWISE_OR, BINARY_BITWISE_AND, BINARY_BITWISE_XOR, BINARY_CONCAT, BINARY_ADD, BINARY_SUB, BINARY_MUL, BINARY_DIV, BINARY_MOD, BINARY_POW, BINARY_SHIFT_LEFT, BINARY_SHIFT_RIGHT, BINARY_BOOL_AND, BINARY_BOOL_OR, BINARY_BOOL_XOR, BINARY_IS_IDENTICAL, BINARY_IS_NOT_IDENTICAL, BINARY_IS_EQUAL, BINARY_IS_NOT_EQUAL, BINARY_IS_SMALLER, BINARY_IS_SMALLER_OR_EQUAL, BINARY_IS_GREATER, BINARY_IS_GREATER_OR_EQUAL, BINARY_SPACESHIP, BINARY_COALESCE]
82+
AST_ASSIGN_OP: [BINARY_BITWISE_OR, BINARY_BITWISE_AND, BINARY_BITWISE_XOR, BINARY_CONCAT, BINARY_ADD, BINARY_SUB, BINARY_MUL, BINARY_DIV, BINARY_MOD, BINARY_POW, BINARY_SHIFT_LEFT, BINARY_SHIFT_RIGHT, BINARY_COALESCE]
83+
AST_BINARY_OP: [BINARY_BITWISE_OR, BINARY_BITWISE_AND, BINARY_BITWISE_XOR, BINARY_CONCAT, BINARY_ADD, BINARY_SUB, BINARY_MUL, BINARY_DIV, BINARY_MOD, BINARY_POW, BINARY_SHIFT_LEFT, BINARY_SHIFT_RIGHT, BINARY_COALESCE, BINARY_BOOL_AND, BINARY_BOOL_OR, BINARY_BOOL_XOR, BINARY_IS_IDENTICAL, BINARY_IS_NOT_IDENTICAL, BINARY_IS_EQUAL, BINARY_IS_NOT_EQUAL, BINARY_IS_SMALLER, BINARY_IS_SMALLER_OR_EQUAL, BINARY_IS_GREATER, BINARY_IS_GREATER_OR_EQUAL, BINARY_SPACESHIP]
8484
AST_ARRAY_ELEM: [ARRAY_ELEM_REF]
8585
AST_NEW: []
8686
AST_INSTANCEOF: []

tests/php74_ast_assign_coalesce.phpt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
'??=' operator in PHP 7.4
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 70400) die('skip PHP >= 7.4 only'); ?>
5+
--FILE--
6+
<?php
7+
8+
require __DIR__ . '/../util.php';
9+
10+
$code = <<<'PHP'
11+
<?php
12+
$x ??= 2;
13+
Foo::$prop['offset'] ??= $other ??= 'value';
14+
PHP;
15+
16+
$node = ast\parse_code($code, $version=70);
17+
echo ast_dump($node), "\n";
18+
?>
19+
--EXPECTF--
20+
AST_STMT_LIST
21+
0: AST_ASSIGN_OP
22+
flags: BINARY_COALESCE (%d)
23+
var: AST_VAR
24+
name: "x"
25+
expr: 2
26+
1: AST_ASSIGN_OP
27+
flags: BINARY_COALESCE (%d)
28+
var: AST_DIM
29+
expr: AST_STATIC_PROP
30+
class: AST_NAME
31+
flags: NAME_NOT_FQ (%d)
32+
name: "Foo"
33+
prop: "prop"
34+
dim: "offset"
35+
expr: AST_ASSIGN_OP
36+
flags: BINARY_COALESCE (%d)
37+
var: AST_VAR
38+
name: "other"
39+
expr: "value"

0 commit comments

Comments
 (0)