Skip to content

Commit

Permalink
Merge branch 'PHP-8.4'
Browse files Browse the repository at this point in the history
* PHP-8.4:
  Export visibility for promoted property (8.3)
  [ci skip] News for GH-17101
  Add test for GH-17101
  Print hooks in parameter exports
  Fix property hook name mismatch
  Extract hook export code
  Export visibility for promoted property
  • Loading branch information
nielsdos committed Dec 17, 2024
2 parents 18ba983 + 634c147 commit 97f44b7
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 44 deletions.
22 changes: 22 additions & 0 deletions Zend/tests/property_hooks/gh17101.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
GH-17101 (AST->string does not reproduce constructor property promotion correctly)
--FILE--
<?php

try {
assert(false && new class {
public function __construct( #[Foo] public private(set) bool $boolVal = false { final set => $this->boolVal = 1;} ) {}
});
} catch (Error $e) {
echo $e->getMessage(), "\n";
}

?>
--EXPECT--
assert(false && new class {
public function __construct(#[Foo] public private(set) bool $boolVal = false {
final set => $this->boolVal = 1;
}) {
}

})
92 changes: 48 additions & 44 deletions Zend/zend_ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -1761,6 +1761,44 @@ static ZEND_COLD void zend_ast_export_type(smart_str *str, zend_ast *ast, int in
zend_ast_export_ns_name(str, ast, 0, indent);
}

static ZEND_COLD void zend_ast_export_hook_list(smart_str *str, zend_ast_list *hook_list, int indent)
{
smart_str_appends(str, " {");
smart_str_appendc(str, '\n');
indent++;
zend_ast_export_indent(str, indent);

for (uint32_t i = 0; i < hook_list->children; i++) {
zend_ast_decl *hook = (zend_ast_decl *)hook_list->child[i];
zend_ast_export_visibility(str, hook->flags, ZEND_MODIFIER_TARGET_PROPERTY);
if (hook->flags & ZEND_ACC_FINAL) {
smart_str_appends(str, "final ");
}
smart_str_append(str, hook->name);
zend_ast *body = hook->child[2];
if (body == NULL) {
smart_str_appendc(str, ';');
} else if (body->kind == ZEND_AST_PROPERTY_HOOK_SHORT_BODY) {
smart_str_appends(str, " => ");
zend_ast_export_ex(str, body->child[0], 0, indent);
smart_str_appendc(str, ';');
} else {
smart_str_appends(str, " {\n");
zend_ast_export_stmt(str, body, indent + 1);
zend_ast_export_indent(str, indent);
smart_str_appendc(str, '}');
}
if (i < (hook_list->children - 1)) {
smart_str_appendc(str, '\n');
zend_ast_export_indent(str, indent);
}
}
smart_str_appendc(str, '\n');
indent--;
zend_ast_export_indent(str, indent);
smart_str_appendc(str, '}');
}

#define BINARY_OP(_op, _p, _pl, _pr) do { \
op = _op; \
p = _p; \
Expand Down Expand Up @@ -2406,49 +2444,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
}

if (ast->child[3]) {
zend_ast_list *hook_list = zend_ast_get_list(ast->child[3]);

smart_str_appends(str, " {");
smart_str_appendc(str, '\n');
indent++;
zend_ast_export_indent(str, indent);

for (uint32_t i = 0; i < hook_list->children; i++) {
zend_ast_decl *hook = (zend_ast_decl *)hook_list->child[i];
zend_ast_export_visibility(str, hook->flags, ZEND_MODIFIER_TARGET_PROPERTY);
if (hook->flags & ZEND_ACC_FINAL) {
smart_str_appends(str, "final ");
}
switch (i) {
case ZEND_PROPERTY_HOOK_GET:
smart_str_appends(str, "get");
break;
case ZEND_PROPERTY_HOOK_SET:
smart_str_appends(str, "set");
break;
}
zend_ast *body = hook->child[2];
if (body == NULL) {
smart_str_appendc(str, ';');
} else if (body->kind == ZEND_AST_PROPERTY_HOOK_SHORT_BODY) {
smart_str_appends(str, " => ");
zend_ast_export_ex(str, body->child[0], 0, indent);
smart_str_appendc(str, ';');
} else {
smart_str_appends(str, " {\n");
zend_ast_export_stmt(str, body, indent + 1);
zend_ast_export_indent(str, indent);
smart_str_appendc(str, '}');
}
if (i < (hook_list->children - 1)) {
smart_str_appendc(str, '\n');
zend_ast_export_indent(str, indent);
}
}
smart_str_appendc(str, '\n');
indent--;
zend_ast_export_indent(str, indent);
smart_str_appendc(str, '}');
zend_ast_export_hook_list(str, zend_ast_get_list(ast->child[3]), indent);
}
break;
case ZEND_AST_CONST_ELEM:
Expand Down Expand Up @@ -2575,6 +2571,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
if (ast->child[3]) {
zend_ast_export_attributes(str, ast->child[3], indent, 0);
}
zend_ast_export_visibility(str, ast->attr, ZEND_MODIFIER_TARGET_CPP);
if (ast->child[0]) {
zend_ast_export_type(str, ast->child[0], indent);
smart_str_appendc(str, ' ');
Expand All @@ -2587,7 +2584,14 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
}
smart_str_appendc(str, '$');
zend_ast_export_name(str, ast->child[1], 0, indent);
APPEND_DEFAULT_VALUE(2);
if (ast->child[2]) {
smart_str_appends(str, " = ");
zend_ast_export_ex(str, ast->child[2], 0, indent);
}
if (ast->child[5]) {
zend_ast_export_hook_list(str, zend_ast_get_list(ast->child[5]), indent);
}
break;
case ZEND_AST_ENUM_CASE:
if (ast->child[3]) {
zend_ast_export_attributes(str, ast->child[3], indent, 1);
Expand Down

0 comments on commit 97f44b7

Please sign in to comment.