[php-src] PHP-8.4: zend_test: Fix function and constant imports in compile_to_ast and add support for grouping
| From: | mainframe98 via ndossche | Date: | Sat, 24 Oct 2026 12:53:40 +0000 |
| Subject: | [php-src] PHP-8.4: zend_test: Fix function and constant imports in compile_to_ast and add support for grouping | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-142670@lists.php.net to get a copy of this message | ||
Author: mainframe98 (mainframe98)
Committer: ndossche (ndossche)
Date: 2026-10-24T14:52:44+02:00
Commit: https://github.com/php/php-src/commit/f6c9428b97aa0f5ee38abbc3398dc833eb3e2eac
Raw diff: https://github.com/php/php-src/commit/f6c9428b97aa0f5ee38abbc3398dc833eb3e2eac.diff
zend_test: Fix function and constant imports in compile_to_ast and add support for grouping
While writing a test for it, I discovered the logic for printing
the AST representation of use statements was broken and grouping
did not work. That has been fixed and incorporated into the test.
Closes GH-24418.
Changed paths:
A ext/zend_test/tests/compile_to_ast/namespace.phpt
M NEWS
M Zend/zend_ast.c
Diff:
diff --git a/NEWS b/NEWS
index e07d065e3852..b52fdfe6dc81 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,8 @@ PHP NEWS
. Fixed bug GH-24321 (ZTS: global_map_ptr_last survives zend_shutdown(),
so an in-process engine restart keeps growing the map_ptr table).
(David Carlier)
+ . Fix function and constant imports in compile_to_ast and add support
+ for grouping. (Klaas Skelte van der Werf)
- Date:
. Fixed bug GH-20503 (Assertion failure with ext/date DateInterval property
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index a39f8d30820c..4e640a321d1f 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -2046,9 +2046,9 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int
prio
break;
case ZEND_AST_USE:
smart_str_appends(str, "use ");
- if (ast->attr == T_FUNCTION) {
+ if (ast->attr == ZEND_SYMBOL_FUNCTION) {
smart_str_appends(str, "function ");
- } else if (ast->attr == T_CONST) {
+ } else if (ast->attr == ZEND_SYMBOL_CONST) {
smart_str_appends(str, "const ");
}
goto simple_list;
@@ -2489,6 +2489,19 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int
prio
}
break;
case ZEND_AST_USE_ELEM:
+ if (ast->attr == ZEND_SYMBOL_FUNCTION) {
+ smart_str_appends(str, "function ");
+ } else if (ast->attr == ZEND_SYMBOL_CONST) {
+ smart_str_appends(str, "const ");
+ }
+
+ zend_ast_export_name(str, ast->child[0], 0, indent);
+
+ if (ast->child[1]) {
+ smart_str_appends(str, " as ");
+ zend_ast_export_name(str, ast->child[1], 0, indent);
+ }
+ break;
case ZEND_AST_TRAIT_ALIAS:
zend_ast_export_name(str, ast->child[0], 0, indent);
if (ast->attr & ZEND_ACC_PUBLIC) {
@@ -2510,6 +2523,18 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int
prio
smart_str_appends(str, ": ");
ast = ast->child[1];
goto tail_call;
+ case ZEND_AST_GROUP_USE:
+ smart_str_appends(str, "use ");
+ if (ast->attr == ZEND_SYMBOL_FUNCTION) {
+ smart_str_appends(str, "function ");
+ } else if (ast->attr == ZEND_SYMBOL_CONST) {
+ smart_str_appends(str, "const ");
+ }
+ smart_str_append(str, zend_ast_get_str(ast->child[0]));
+ smart_str_appends(str, "\\{");
+ zend_ast_export_list(str, zend_ast_get_list(ast->child[1]), true, 20, indent);
+ smart_str_appends(str, "}");
+ break;
/* 3 child nodes */
case ZEND_AST_METHOD_CALL:
diff --git a/ext/zend_test/tests/compile_to_ast/namespace.phpt
b/ext/zend_test/tests/compile_to_ast/namespace.phpt
new file mode 100644
index 000000000000..ee0165a2600b
--- /dev/null
+++ b/ext/zend_test/tests/compile_to_ast/namespace.phpt
@@ -0,0 +1,68 @@
+--TEST--
+AST can be recreated (namespace)
+--EXTENSIONS--
+zend_test
+--FILE--
+<?php
+
+namespace Foo {
+ class FooTest {
+ }
+
+ function fn_foo() {
+ }
+
+ function fn_bar() {
+ }
+}
+
+namespace Bar {
+ class BarTest {
+ }
+
+ function fn_bar() {
+ }
+}
+
+namespace {
+ use function Bar\fn_bar;
+ use Foo\{function fn_foo, FooTest, function fn_bar as fn_foobar};
+
+ new FooTest();
+ fn_bar();
+ fn_foobar();
+
+ echo zend_test_compile_to_ast(file_get_contents( __FILE__ ));
+}
+
+?>
+--EXPECT--
+namespace Foo {
+ class FooTest {
+ }
+
+ function fn_foo() {
+ }
+
+ function fn_bar() {
+ }
+
+}
+
+namespace Bar {
+ class BarTest {
+ }
+
+ function fn_bar() {
+ }
+
+}
+
+namespace {
+ use function Bar\fn_bar;
+ use Foo\{function fn_foo, FooTest, function fn_bar as fn_foobar};
+ new FooTest();
+ fn_bar();
+ fn_foobar();
+ echo zend_test_compile_to_ast(file_get_contents(__FILE__));
+}