Skip to content

Commit 00c8d29

Browse files
committed
Merge remote-tracking branch 'koolkode/Attributes' into AttributesPatch
2 parents dcae6bd + 34a8904 commit 00c8d29

14 files changed

+610
-258
lines changed

Zend/zend_ast.c

Lines changed: 29 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *
113113
}
114114

115115
ZEND_API zend_ast *zend_ast_create_decl(
116-
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment, HashTable *attributes,
116+
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment,
117117
zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2, zend_ast *child3
118118
) {
119119
zend_ast_decl *ast;
@@ -126,7 +126,7 @@ ZEND_API zend_ast *zend_ast_create_decl(
126126
ast->flags = flags;
127127
ast->lex_pos = LANG_SCNG(yy_text);
128128
ast->doc_comment = doc_comment;
129-
ast->attributes = attributes;
129+
ast->attributes = NULL;
130130
ast->name = name;
131131
ast->child[0] = child0;
132132
ast->child[1] = child1;
@@ -859,7 +859,7 @@ ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast)
859859
zend_string_release_ex(decl->doc_comment, 0);
860860
}
861861
if (decl->attributes) {
862-
zend_array_ptr_dtor(decl->attributes);
862+
zend_ast_destroy(decl->attributes);
863863
}
864864
zend_ast_destroy(decl->child[0]);
865865
zend_ast_destroy(decl->child[1]);
@@ -1545,6 +1545,9 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
15451545
case ZEND_AST_CLASS_CONST_DECL:
15461546
smart_str_appends(str, "const ");
15471547
goto simple_list;
1548+
case ZEND_AST_CLASS_CONST_DECL_ATTRIBUTES:
1549+
zend_ast_export_ex(str, ast->child[0], 0, indent);
1550+
break;
15481551
case ZEND_AST_NAME_LIST:
15491552
zend_ast_export_name_list(str, (zend_ast_list*)ast, indent);
15501553
break;
@@ -2116,101 +2119,31 @@ ZEND_API ZEND_COLD zend_string *zend_ast_export(const char *prefix, zend_ast *as
21162119
return str.s;
21172120
}
21182121

2119-
ZEND_API void zend_ast_convert_to_object(zval *p, zend_ast *ast, zend_class_entry *ce)
2120-
{
2121-
if (ast->kind == ZEND_AST_CONSTANT) {
2122-
zend_string *name = zend_ast_get_constant_name(ast);
2123-
zval *zv = zend_get_constant_ex(name, ce, ast->attr);
2124-
if (UNEXPECTED(zv == NULL)) {
2125-
return;
2126-
}
2127-
2128-
ZVAL_COPY_OR_DUP(p, zv);
2129-
} else {
2130-
zval tmp;
2131-
2132-
if (UNEXPECTED(zend_ast_evaluate(&tmp, ast, ce) != SUCCESS)) {
2133-
return;
2134-
}
2135-
2136-
ZVAL_COPY_VALUE(p, &tmp);
2137-
}
2138-
}
2139-
2140-
zval *zend_ast_convert_attributes(HashTable *attributes, zend_class_entry *ce)
2122+
zend_ast * ZEND_FASTCALL zend_ast_with_attributes(zend_ast *ast, zend_ast *attr)
21412123
{
2142-
zval *val, tmp;
2143-
zval *res = emalloc(sizeof(zval));
2144-
2145-
array_init(res);
2146-
2147-
ZEND_HASH_FOREACH_VAL(attributes, val) {
2148-
if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
2149-
zend_ast_convert_to_object(&tmp, Z_ASTVAL_P(val), ce);
2150-
zend_hash_next_index_insert(Z_ARRVAL_P(res), &tmp);
2151-
break;
2152-
} else {
2153-
if (Z_REFCOUNTED_P(val)) {
2154-
Z_ADDREF_P(val);
2155-
}
2156-
zend_hash_next_index_insert(Z_ARRVAL_P(res), val);
2157-
}
2158-
} ZEND_HASH_FOREACH_END();
2159-
2160-
return res;
2161-
}
2124+
ZEND_ASSERT(attr->kind == ZEND_AST_ATTRIBUTE_LIST);
21622125

2163-
void zend_ast_add_attribute(zend_ast *name, zend_ast *value) /* {{{ */
2164-
{
2165-
zval *val, tmp;
2166-
zend_string *key;
2167-
2168-
zval *zv = zend_ast_get_zval(name);
2169-
key = Z_STR_P(zv);
2170-
2171-
if (!CG(attributes)) {
2172-
ALLOC_HASHTABLE(CG(attributes));
2173-
zend_hash_init(CG(attributes), 8, NULL, ZVAL_PTR_DTOR, 0);
2174-
}
2175-
2176-
ZVAL_NULL(&tmp);
2177-
val = zend_hash_add(CG(attributes), key, &tmp);
2178-
2179-
if (!val) {
2180-
zend_error_noreturn(E_COMPILE_ERROR, "Redeclared attribute %s", ZSTR_VAL(key));
2181-
}
2182-
2183-
if (value) {
2184-
if (value->kind == ZEND_AST_ZVAL) {
2185-
zval *zv = zend_ast_get_zval(value);
2186-
2187-
ZVAL_COPY_VALUE(val, zv);
2188-
} else {
2189-
zend_const_expr_to_zval(&tmp, value);
2190-
ZVAL_COPY_VALUE(val, &tmp);
2191-
}
2192-
} else {
2193-
array_init(val);
2194-
}
2195-
}
2196-
/* }}} */
2197-
2198-
zend_ast *zend_ast_add_attribute_value(zend_ast *list_ast, zend_ast *val_ast) /* {{{ */
2199-
{
2200-
zval *list, *val, arr;
2201-
2202-
if (list_ast->kind == ZEND_AST_ZVAL) {
2203-
list = zend_ast_get_zval(list_ast);
2204-
if (Z_TYPE_P(list) != IS_ARRAY) {
2205-
array_init(&arr);
2206-
zend_hash_next_index_insert_new(Z_ARRVAL(arr), list);
2207-
ZVAL_ARR(list, Z_ARR(arr));
2208-
}
2209-
2210-
val = zend_ast_get_zval(val_ast);
2211-
zend_hash_next_index_insert_new(Z_ARRVAL_P(list), val);
2126+
switch (ast->kind) {
2127+
case ZEND_AST_FUNC_DECL:
2128+
case ZEND_AST_CLOSURE:
2129+
case ZEND_AST_METHOD:
2130+
case ZEND_AST_CLASS:
2131+
case ZEND_AST_ARROW_FUNC:
2132+
((zend_ast_decl *) ast)->attributes = attr;
2133+
break;
2134+
case ZEND_AST_PROP_GROUP:
2135+
ast->child[2] = attr;
2136+
break;
2137+
case ZEND_AST_PARAM:
2138+
ast->child[3] = attr;
2139+
break;
2140+
case ZEND_AST_CLASS_CONST_DECL:
2141+
ast = zend_ast_create(ZEND_AST_CLASS_CONST_DECL_ATTRIBUTES, ast, attr);
2142+
ast->lineno = ast->child[0]->lineno;
2143+
break;
2144+
default:
2145+
zend_error_noreturn(E_COMPILE_ERROR, "Invalid use of attributes");
22122146
}
22132147

2214-
return list_ast;
2148+
return ast;
22152149
}
2216-
/* }}} */

Zend/zend_ast.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ enum _zend_ast_kind {
6262
ZEND_AST_TRAIT_ADAPTATIONS,
6363
ZEND_AST_USE,
6464
ZEND_AST_TYPE_UNION,
65+
ZEND_AST_ATTRIBUTE_LIST,
6566

6667
/* 0 child nodes */
6768
ZEND_AST_MAGIC_CONST = 0 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -138,7 +139,8 @@ enum _zend_ast_kind {
138139
ZEND_AST_USE_ELEM,
139140
ZEND_AST_TRAIT_ALIAS,
140141
ZEND_AST_GROUP_USE,
141-
ZEND_AST_PROP_GROUP,
142+
ZEND_AST_CLASS_CONST_DECL_ATTRIBUTES,
143+
ZEND_AST_ATTRIBUTE,
142144

143145
/* 3 child nodes */
144146
ZEND_AST_METHOD_CALL = 3 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -147,13 +149,14 @@ enum _zend_ast_kind {
147149

148150
ZEND_AST_TRY,
149151
ZEND_AST_CATCH,
150-
ZEND_AST_PARAM,
152+
ZEND_AST_PROP_GROUP,
153+
ZEND_AST_PROP_ELEM,
154+
ZEND_AST_CONST_ELEM,
151155

152156
/* 4 child nodes */
153157
ZEND_AST_FOR = 4 << ZEND_AST_NUM_CHILDREN_SHIFT,
154158
ZEND_AST_FOREACH,
155-
ZEND_AST_PROP_ELEM,
156-
ZEND_AST_CONST_ELEM,
159+
ZEND_AST_PARAM,
157160
};
158161

159162
typedef uint16_t zend_ast_kind;
@@ -191,7 +194,7 @@ typedef struct _zend_ast_decl {
191194
uint32_t flags;
192195
unsigned char *lex_pos;
193196
zend_string *doc_comment;
194-
HashTable *attributes;
197+
zend_ast *attributes;
195198
zend_string *name;
196199
zend_ast *child[4];
197200
} zend_ast_decl;
@@ -270,7 +273,7 @@ ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind ki
270273
ZEND_API zend_ast * ZEND_FASTCALL zend_ast_list_add(zend_ast *list, zend_ast *op);
271274

272275
ZEND_API zend_ast *zend_ast_create_decl(
273-
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment, HashTable *attributes,
276+
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment,
274277
zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2, zend_ast *child3
275278
);
276279

@@ -354,7 +357,6 @@ static zend_always_inline zend_ast *zend_ast_list_rtrim(zend_ast *ast) {
354357
return ast;
355358
}
356359

357-
void zend_ast_add_attribute(zend_ast *name, zend_ast *value);
358-
zend_ast *zend_ast_add_attribute_value(zend_ast *list_ast, zend_ast *val_ast);
359-
zval *zend_ast_convert_attributes(HashTable *attributes, zend_class_entry *ce);
360+
zend_ast * ZEND_FASTCALL zend_ast_with_attributes(zend_ast *ast, zend_ast *attr);
361+
360362
#endif

0 commit comments

Comments
 (0)