Skip to content

Commit f7327b6

Browse files
sunnyeonikic
authored andcommitted
Fix bugs in AST printer
Closes GH-4324.
1 parent 05c00a8 commit f7327b6

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

Zend/tests/assert/expect_020.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
AST pretty-printer
3+
--INI--
4+
zend.assertions=1
5+
assert.exception=0
6+
--FILE--
7+
<?php
8+
assert(0 && ($a = function () {
9+
$var = 'test';
10+
$str = "$var, $var[1], {$var}[], {$var[1]}[], ${var}[], ${var[1]}[]";
11+
}));
12+
?>
13+
--EXPECTF--
14+
Warning: assert(): assert(0 && ($a = function () {
15+
$var = 'test';
16+
$str = "$var, {$var[1]}, {$var}[], {$var[1]}[], {$var}[], {$var[1]}[]";
17+
})) failed in %sexpect_020.php on line %d

Zend/zend_ast.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,11 @@ static int zend_ast_valid_var_name(const char *s, size_t len)
731731
return 1;
732732
}
733733

734+
static ZEND_COLD int zend_ast_var_needs_braces(char ch)
735+
{
736+
return ch == '[' || zend_ast_valid_var_char(ch);
737+
}
738+
734739
static void zend_ast_export_var(smart_str *str, zend_ast *ast, int priority, int indent)
735740
{
736741
if (ast->kind == ZEND_AST_ZVAL) {
@@ -778,7 +783,7 @@ static void zend_ast_export_encaps_list(smart_str *str, char quote, zend_ast_lis
778783
ast->child[0]->kind == ZEND_AST_ZVAL &&
779784
(i + 1 == list->children ||
780785
list->child[i + 1]->kind != ZEND_AST_ZVAL ||
781-
!zend_ast_valid_var_char(
786+
!zend_ast_var_needs_braces(
782787
*Z_STRVAL_P(
783788
zend_ast_get_zval(list->child[i + 1]))))) {
784789
zend_ast_export_ex(str, ast, 0, indent);
@@ -1390,6 +1395,8 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int
13901395
zend_ast_export_ex(str, ast->child[1], 80, indent);
13911396
smart_str_appends(str, " => ");
13921397
}
1398+
if (ast->attr)
1399+
smart_str_appendc(str, '&');
13931400
zend_ast_export_ex(str, ast->child[0], 80, indent);
13941401
break;
13951402
case ZEND_AST_NEW:

0 commit comments

Comments
 (0)