Skip to content

Commit 0166290

Browse files
committed
Transform Foo {} to Foo & {}
This avoids a grammar ambiguity.
1 parent ced9c19 commit 0166290

File tree

7 files changed

+28
-33
lines changed

7 files changed

+28
-33
lines changed

Zend/tests/pattern_matching/is/binding.phpt

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ var_dump($a);
3636
var_dump('Hello world' is $a);
3737
var_dump($a);
3838

39-
var_dump(new Box(42) is Box { value: $a });
39+
var_dump(new Box(42) is Box & { value: $a });
4040
var_dump($a);
4141

42-
var_dump(new NotBox(43) is Box { value: $a });
42+
var_dump(new NotBox(43) is Box & { value: $a });
4343
var_dump($a);
4444

4545
var_dump(43 is $a & int);
@@ -48,10 +48,10 @@ var_dump($a);
4848
var_dump([] is $a & string);
4949
var_dump($a);
5050

51-
var_dump(new Many() is Many { $a, $b, $c, $d });
51+
var_dump(new Many() is { $a, $b, $c, $d });
5252
var_dump($a, $b, $c, $d, isset($e));
5353

54-
var_dump(new Many() is Many { $a, $b, $c, $d, $e, $f, $g, $h, $i, $j });
54+
var_dump(new Many() is { $a, $b, $c, $d, $e, $f, $g, $h, $i, $j });
5555
var_dump($a, $b, $c, $d, $e, $f, $g, $h, $i, $j);
5656

5757
?>

Zend/tests/pattern_matching/is/delayed_binding.phpt

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ class Pair {
77
public function __construct(public $a, public $b) {}
88
}
99

10-
var_dump(new Pair(1, 2) is Pair { a: $a, b: $b });
10+
var_dump(new Pair(1, 2) is { a: $a, b: $b });
1111
var_dump($a, $b);
1212
unset($a, $b);
1313

14-
var_dump(new Pair(1, 2) is Pair { a: $a, b: 3 });
14+
var_dump(new Pair(1, 2) is { a: $a, b: 3 });
1515
var_dump($a, $b);
1616
unset($a, $b);
1717

18-
var_dump(new Pair(new \stdClass(), 2) is Pair { a: $a, b: 2 });
18+
var_dump(new Pair(new \stdClass(), 2) is { a: $a, b: 2 });
1919
var_dump($a, $b);
2020
unset($a, $b);
2121

22-
var_dump(new Pair(new \stdClass(), 2) is Pair { a: $a, b: 3 });
22+
var_dump(new Pair(new \stdClass(), 2) is { a: $a, b: 3 });
2323
var_dump($a, $b);
2424
unset($a, $b);
2525

Zend/tests/pattern_matching/is/object.phpt

+12-12
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ class Foo {
99
) {}
1010

1111
public static function isSelfFoo($value) {
12-
return $value is self {};
12+
return $value is self;
1313
}
1414

1515
public static function isStaticFoo($value) {
16-
return $value is static {};
16+
return $value is static;
1717
}
1818
}
1919

2020
class Bar extends Foo implements Baz {
2121
public static function isSelfBar($value) {
22-
return $value is self {};
22+
return $value is self;
2323
}
2424

2525
public static function isParentBar($value) {
26-
return $value is parent {};
26+
return $value is parent;
2727
}
2828
}
2929

@@ -50,14 +50,14 @@ var_dump(null is Baz);
5050
var_dump(null is Qux);
5151
var_dump(null is Quux);
5252

53-
var_dump($foo is Foo { a: 42 });
54-
var_dump($foo is Foo { a: 42|43 });
55-
var_dump($foo is Foo { a: 'hello world' });
56-
var_dump($foo is Foo { b: 42 });
57-
var_dump($bar is Foo { a: 42 });
58-
var_dump($bar is Foo { a: 42|43 });
59-
var_dump($bar is Foo { a: 'hello world' });
60-
var_dump($bar is Foo { b: 42 });
53+
var_dump($foo is { a: 42 });
54+
var_dump($foo is { a: 42|43 });
55+
var_dump($foo is { a: 'hello world' });
56+
var_dump($foo is { b: 42 });
57+
var_dump($bar is { a: 42 });
58+
var_dump($bar is { a: 42|43 });
59+
var_dump($bar is { a: 'hello world' });
60+
var_dump($bar is { b: 42 });
6161
6262
var_dump(Foo::isSelfFoo($foo));
6363
var_dump(Foo::isSelfFoo($bar));

Zend/tests/pattern_matching/is/object_shorthand.phpt

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ class Foo {
77
public function __construct(public $a, public $b) {}
88
}
99

10-
var_dump(new Foo(1, 2) is Foo { $a, b: 2 });
10+
var_dump(new Foo(1, 2) is { $a, b: 2 });
1111
var_dump($a);
12-
var_dump(new Foo(1, 2) is Foo { a: 3, $b });
12+
var_dump(new Foo(1, 2) is { a: 3, $b });
1313
var_dump($b);
1414

1515
?>

Zend/zend_ast.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ enum _zend_ast_kind {
116116
ZEND_AST_TYPE_PATTERN,
117117
ZEND_AST_ARRAY_PATTERN,
118118
ZEND_AST_BINDING_PATTERN,
119+
ZEND_AST_OBJECT_PATTERN,
119120

120121
/* 2 child nodes */
121122
ZEND_AST_DIM = 2 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -161,7 +162,6 @@ enum _zend_ast_kind {
161162
ZEND_AST_IS,
162163
ZEND_AST_OR_PATTERN,
163164
ZEND_AST_AND_PATTERN,
164-
ZEND_AST_OBJECT_PATTERN,
165165
ZEND_AST_OBJECT_PATTERN_ELEMENT,
166166
ZEND_AST_RANGE_PATTERN,
167167
ZEND_AST_ARRAY_PATTERN_ELEMENT,

Zend/zend_language_parser.y

+4-4
Original file line numberDiff line numberDiff line change
@@ -964,9 +964,9 @@ attributed_class_statement:
964964
property_modifiers optional_type_without_static property_list ';'
965965
{ $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3, NULL);
966966
$$->attr = $1; }
967-
/*| property_modifiers optional_type_without_static hooked_property
967+
| property_modifiers optional_type_without_static hooked_property
968968
{ $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, zend_ast_create_list(1, ZEND_AST_PROP_DECL, $3), NULL);
969-
$$->attr = $1; }*/
969+
$$->attr = $1; }
970970
| class_const_modifiers T_CONST class_const_list ';'
971971
{ $$ = zend_ast_create(ZEND_AST_CLASS_CONST_GROUP, $3, NULL, NULL);
972972
$$->attr = $1; }
@@ -1125,7 +1125,7 @@ property_hook_list:
11251125

11261126
optional_property_hook_list:
11271127
%empty { $$ = NULL; }
1128-
/*| '{' property_hook_list '}' { $$ = $2; }*/
1128+
| '{' property_hook_list '}' { $$ = $2; }
11291129
;
11301130

11311131
property_hook_modifiers:
@@ -1394,7 +1394,7 @@ scalar_pattern:
13941394
;
13951395

13961396
object_pattern:
1397-
atomic_pattern '{' object_pattern_element_list '}' { $$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN, $1, $3); }
1397+
'{' object_pattern_element_list '}' { $$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN, $2); }
13981398
;
13991399

14001400
object_pattern_element_list:

Zend/zend_pattern_matching.c

+1-6
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,7 @@ static pm_result match_object(zval *zv, zend_ast *pattern)
124124
}
125125

126126
zend_object *obj = Z_OBJ_P(zv);
127-
pm_result type_result = match_type(zv, pattern->child[0]);
128-
if (type_result != PM_MATCH) {
129-
return type_result;
130-
}
131-
132-
zend_ast_list *elements = zend_ast_get_list(pattern->child[1]);
127+
zend_ast_list *elements = zend_ast_get_list(pattern->child[0]);
133128
for (uint32_t i = 0; i < elements->children; i++) {
134129
zend_ast *element = elements->child[i];
135130
zend_ast *property_or_method_call = element->child[0];

0 commit comments

Comments
 (0)