]> granicus.if.org Git - php/commitdiff
Fix bugs in AST printer
authorsunnyeo <psnyeo88@kaist.ac.kr>
Fri, 28 Jun 2019 14:06:01 +0000 (16:06 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 28 Jun 2019 14:08:44 +0000 (16:08 +0200)
Closes GH-4324.

Zend/tests/assert/expect_020.phpt [new file with mode: 0644]
Zend/zend_ast.c

diff --git a/Zend/tests/assert/expect_020.phpt b/Zend/tests/assert/expect_020.phpt
new file mode 100644 (file)
index 0000000..ef8fd5e
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+AST pretty-printer
+--INI--
+zend.assertions=1
+assert.exception=0
+--FILE--
+<?php
+assert(0 && ($a = function () {
+       $var = 'test';
+       $str = "$var, $var[1], {$var}[], {$var[1]}[], ${var}[], ${var[1]}[]";
+}));
+?>
+--EXPECTF--
+Warning: assert(): assert(0 && ($a = function () {
+    $var = 'test';
+    $str = "$var, {$var[1]}, {$var}[], {$var[1]}[], {$var}[], {$var[1]}[]";
+})) failed in %sexpect_020.php on line %d
index b7aa87e2c5bc67e34bb03c0c1fdab10beb242561..6e3447eb732f7493c9ea2a5011b8b09d67151ba9 100644 (file)
@@ -731,6 +731,11 @@ static int zend_ast_valid_var_name(const char *s, size_t len)
        return 1;
 }
 
+static ZEND_COLD int zend_ast_var_needs_braces(char ch)
+{
+       return ch == '[' || zend_ast_valid_var_char(ch);
+}
+
 static void zend_ast_export_var(smart_str *str, zend_ast *ast, int priority, int indent)
 {
        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
                           ast->child[0]->kind == ZEND_AST_ZVAL &&
                           (i + 1 == list->children ||
                            list->child[i + 1]->kind != ZEND_AST_ZVAL ||
-                           !zend_ast_valid_var_char(
+                           !zend_ast_var_needs_braces(
                                *Z_STRVAL_P(
                                    zend_ast_get_zval(list->child[i + 1]))))) {
                        zend_ast_export_ex(str, ast, 0, indent);
@@ -1390,6 +1395,8 @@ simple_list:
                                zend_ast_export_ex(str, ast->child[1], 80, indent);
                                smart_str_appends(str, " => ");
                        }
+                       if (ast->attr)
+                               smart_str_appendc(str, '&');
                        zend_ast_export_ex(str, ast->child[0], 80, indent);
                        break;
                case ZEND_AST_NEW: