Skip to content

Commit c7024e4

Browse files
committed
Switch to alternative object syntax
Topic of discussion for the community.
1 parent febcdb8 commit c7024e4

File tree

7 files changed

+42
-29
lines changed

7 files changed

+42
-29
lines changed

Zend/tests/pattern_matching/is/binding.phpt

Lines changed: 4 additions & 4 deletions
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 { $a, $b, $c, $d });
51+
var_dump(new Many() is Many(:$a, :$b, :$c, :$d));
5252
var_dump($a, $b, $c, $d, isset($e));
5353

54-
var_dump(new Many() is { $a, $b, $c, $d, $e, $f, $g, $h, $i, $j });
54+
var_dump(new Many() is Many(:$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

Lines changed: 4 additions & 4 deletions
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 { a: $a, b: $b });
10+
var_dump(new Pair(1, 2) is Pair(a: $a, b: $b));
1111
var_dump($a, $b);
1212
unset($a, $b);
1313

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

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

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

Zend/tests/pattern_matching/is/object.phpt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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 { 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 });
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));
6161

6262
var_dump(Foo::isSelfFoo($foo));
6363
var_dump(Foo::isSelfFoo($bar));

Zend/tests/pattern_matching/is/object_shorthand.phpt

Lines changed: 2 additions & 2 deletions
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 { $a, b: 2 });
10+
var_dump(new Foo(1, 2) is Foo(:$a, b: 2));
1111
var_dump($a);
12-
var_dump(new Foo(1, 2) is { a: 3, $b });
12+
var_dump(new Foo(1, 2) is Foo(a: 3, :$b));
1313
var_dump($b);
1414

1515
?>

Zend/zend_ast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ enum _zend_ast_kind {
118118
ZEND_AST_TYPE_PATTERN,
119119
ZEND_AST_ARRAY_PATTERN,
120120
ZEND_AST_BINDING_PATTERN,
121-
ZEND_AST_OBJECT_PATTERN,
122121
ZEND_AST_EXPR_LIKE_PATTERN,
123122

124123
/* 2 child nodes */
@@ -164,6 +163,7 @@ enum _zend_ast_kind {
164163
ZEND_AST_PARENT_PROPERTY_HOOK_CALL,
165164
ZEND_AST_PIPE,
166165
ZEND_AST_IS,
166+
ZEND_AST_OBJECT_PATTERN,
167167
ZEND_AST_OBJECT_PATTERN_ELEMENT,
168168
ZEND_AST_ARRAY_PATTERN_ELEMENT,
169169
ZEND_AST_CLASS_CONST_PATTERN,

Zend/zend_compile.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6914,13 +6914,13 @@ static void zend_pm_compile_container(
69146914
zend_ast_list *element_list = zend_ast_get_list(ast->child[0]);
69156915

69166916
/* Make sure the value is actually of the right type. */
6917-
zend_pm_copy_tmp(&expr_copy_node, expr_node, false);
6918-
zend_op *is_array_op = zend_emit_op(NULL, ZEND_TYPE_CHECK, &expr_copy_node, NULL);
6919-
SET_NODE(is_array_op->result, result);
6920-
is_array_op->extended_value = is_array ? MAY_BE_ARRAY : MAY_BE_OBJECT;
6921-
zend_pm_emit_jmpz_ex(result, false_label);
6922-
69236917
if (is_array) {
6918+
zend_pm_copy_tmp(&expr_copy_node, expr_node, false);
6919+
zend_op *is_array_op = zend_emit_op(NULL, ZEND_TYPE_CHECK, &expr_copy_node, NULL);
6920+
SET_NODE(is_array_op->result, result);
6921+
is_array_op->extended_value = is_array ? MAY_BE_ARRAY : MAY_BE_OBJECT;
6922+
zend_pm_emit_jmpz_ex(result, false_label);
6923+
69246924
/* Make sure the array has the right size. */
69256925
zend_pm_copy_tmp(&expr_copy_node, expr_node, false);
69266926
znode count_node;
@@ -6934,6 +6934,19 @@ static void zend_pm_compile_container(
69346934
(ast->attr & ZEND_ARRAY_PATTERN_NON_EXHAUSTIVE) ? ZEND_IS_SMALLER_OR_EQUAL : ZEND_IS_EQUAL,
69356935
&count_target_node, &count_node);
69366936
SET_NODE(count_ok_op->result, result);
6937+
zend_pm_emit_jmpz_ex(result, false_label);
6938+
} else {
6939+
zend_pm_copy_tmp(&expr_copy_node, expr_node, false);
6940+
6941+
znode class_node;
6942+
zend_compile_class_ref(&class_node, ast->child[1], ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION | ZEND_FETCH_CLASS_SILENT);
6943+
6944+
zend_op *opline = zend_emit_op_tmp(NULL, ZEND_INSTANCEOF, &expr_copy_node, NULL);
6945+
SET_NODE(opline->result, result);
6946+
opline->op2_type = IS_CONST;
6947+
opline->op2.constant = zend_add_class_name_literal(Z_STR(class_node.u.constant));
6948+
opline->extended_value = zend_alloc_cache_slot();
6949+
69376950
zend_pm_emit_jmpz_ex(result, false_label);
69386951
}
69396952

Zend/zend_language_parser.y

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,7 +1446,7 @@ scalar_pattern:
14461446
;
14471447

14481448
object_pattern:
1449-
'{' object_pattern_element_list '}' { $$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN, $2); }
1449+
class_name '(' object_pattern_element_list ')' { $$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN, $3, $1); }
14501450
;
14511451

14521452
object_pattern_element_list:
@@ -1462,9 +1462,9 @@ non_empty_object_pattern_element_list:
14621462

14631463
object_pattern_element:
14641464
T_STRING ':' pattern { $$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN_ELEMENT, $1, $3); }
1465-
| binding_pattern {
1466-
zend_string *name = zend_string_copy(zend_ast_get_str($1->child[0]));
1467-
$$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN_ELEMENT, zend_ast_create_zval_from_str(name), $1);
1465+
| ':' binding_pattern {
1466+
zend_string *name = zend_string_copy(zend_ast_get_str($2->child[0]));
1467+
$$ = zend_ast_create(ZEND_AST_OBJECT_PATTERN_ELEMENT, zend_ast_create_zval_from_str(name), $2);
14681468
}
14691469
;
14701470

0 commit comments

Comments
 (0)