@@ -113,7 +113,7 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *
113113}
114114
115115ZEND_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- /* }}} */
0 commit comments