@@ -113,7 +113,7 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *
113
113
}
114
114
115
115
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 ,
117
117
zend_string * name , zend_ast * child0 , zend_ast * child1 , zend_ast * child2 , zend_ast * child3
118
118
) {
119
119
zend_ast_decl * ast ;
@@ -126,7 +126,7 @@ ZEND_API zend_ast *zend_ast_create_decl(
126
126
ast -> flags = flags ;
127
127
ast -> lex_pos = LANG_SCNG (yy_text );
128
128
ast -> doc_comment = doc_comment ;
129
- ast -> attributes = attributes ;
129
+ ast -> attributes = NULL ;
130
130
ast -> name = name ;
131
131
ast -> child [0 ] = child0 ;
132
132
ast -> child [1 ] = child1 ;
@@ -859,7 +859,7 @@ ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast)
859
859
zend_string_release_ex (decl -> doc_comment , 0 );
860
860
}
861
861
if (decl -> attributes ) {
862
- zend_array_ptr_dtor (decl -> attributes );
862
+ zend_ast_destroy (decl -> attributes );
863
863
}
864
864
zend_ast_destroy (decl -> child [0 ]);
865
865
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
1545
1545
case ZEND_AST_CLASS_CONST_DECL :
1546
1546
smart_str_appends (str , "const " );
1547
1547
goto simple_list ;
1548
+ case ZEND_AST_CLASS_CONST_DECL_ATTRIBUTES :
1549
+ zend_ast_export_ex (str , ast -> child [0 ], 0 , indent );
1550
+ break ;
1548
1551
case ZEND_AST_NAME_LIST :
1549
1552
zend_ast_export_name_list (str , (zend_ast_list * )ast , indent );
1550
1553
break ;
@@ -2116,101 +2119,31 @@ ZEND_API ZEND_COLD zend_string *zend_ast_export(const char *prefix, zend_ast *as
2116
2119
return str .s ;
2117
2120
}
2118
2121
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 )
2141
2123
{
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 );
2162
2125
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" );
2212
2146
}
2213
2147
2214
- return list_ast ;
2148
+ return ast ;
2215
2149
}
2216
- /* }}} */
0 commit comments