@@ -45,83 +45,83 @@ static inline size_t zend_ast_list_size(uint32_t children) {
4545 return sizeof (zend_ast_list ) - sizeof (zend_ast * ) + sizeof (zend_ast * ) * children ;
4646}
4747
48- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_znode (zend_ast_loc * loc , znode * node ) {
48+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_znode (znode * node ) {
4949 zend_ast_znode * ast ;
5050
5151 ast = zend_ast_alloc (sizeof (zend_ast_znode ));
5252 ast -> kind = ZEND_AST_ZNODE ;
5353 ast -> attr = 0 ;
54- ast -> lineno = loc -> start_line ;
54+ ast -> lineno = CG ( zend_lineno ) ;
5555 ast -> node = * node ;
5656 return (zend_ast * ) ast ;
5757}
5858
59- static zend_always_inline zend_ast * zend_ast_create_zval_int (
60- zend_ast_loc * loc , zval * zv , uint32_t attr ) {
59+ static zend_always_inline zend_ast * zend_ast_create_zval_int (zval * zv , uint32_t attr , uint32_t lineno ) {
6160 zend_ast_zval * ast ;
6261
6362 ast = zend_ast_alloc (sizeof (zend_ast_zval ));
6463 ast -> kind = ZEND_AST_ZVAL ;
6564 ast -> attr = attr ;
6665 ZVAL_COPY_VALUE (& ast -> val , zv );
67- Z_LINENO (ast -> val ) = loc -> start_line ;
66+ Z_LINENO (ast -> val ) = lineno ;
6867 return (zend_ast * ) ast ;
6968}
7069
71- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_ex (
72- zend_ast_loc * loc , zval * zv , zend_ast_attr attr ) {
73- return zend_ast_create_zval_int (loc , zv , attr );
70+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_with_lineno (zval * zv , uint32_t lineno ) {
71+ return zend_ast_create_zval_int (zv , 0 , lineno );
7472}
7573
76- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval ( zend_ast_loc * loc , zval * zv ) {
77- return zend_ast_create_zval_int (loc , zv , 0 );
74+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_ex ( zval * zv , zend_ast_attr attr ) {
75+ return zend_ast_create_zval_int (zv , attr , CG ( zend_lineno ) );
7876}
7977
80- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_str (zend_ast_loc * loc , zend_string * str ) {
78+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval (zval * zv ) {
79+ return zend_ast_create_zval_int (zv , 0 , CG (zend_lineno ));
80+ }
81+
82+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_str (zend_string * str ) {
8183 zval zv ;
8284 ZVAL_STR (& zv , str );
83- return zend_ast_create_zval_int (loc , & zv , 0 );
85+ return zend_ast_create_zval_int (& zv , 0 , CG ( zend_lineno ) );
8486}
8587
86- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_long (zend_ast_loc * loc , zend_long lval ) {
88+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_long (zend_long lval ) {
8789 zval zv ;
8890 ZVAL_LONG (& zv , lval );
89- return zend_ast_create_zval_int (loc , & zv , 0 );
91+ return zend_ast_create_zval_int (& zv , 0 , CG ( zend_lineno ) );
9092}
9193
92- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant (
93- zend_ast_loc * loc , zend_string * name , zend_ast_attr attr ) {
94+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant (zend_string * name , zend_ast_attr attr ) {
9495 zend_ast_zval * ast ;
9596
9697 ast = zend_ast_alloc (sizeof (zend_ast_zval ));
9798 ast -> kind = ZEND_AST_CONSTANT ;
9899 ast -> attr = attr ;
99100 ZVAL_STR (& ast -> val , name );
100- Z_LINENO (ast -> val ) = loc -> start_line ;
101+ Z_LINENO (ast -> val ) = CG ( zend_lineno ) ;
101102 return (zend_ast * ) ast ;
102103}
103104
104- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name (
105- zend_ast_loc * loc , zend_ast * class_name , zend_ast * name ) {
105+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name (zend_ast * class_name , zend_ast * name ) {
106106 zend_string * name_str = zend_ast_get_str (name );
107107 if (zend_string_equals_literal_ci (name_str , "class" )) {
108108 zend_string_release (name_str );
109- return zend_ast_create (loc , ZEND_AST_CLASS_NAME , class_name );
109+ return zend_ast_create (ZEND_AST_CLASS_NAME , class_name );
110110 } else {
111- return zend_ast_create (loc , ZEND_AST_CLASS_CONST , class_name , name );
111+ return zend_ast_create (ZEND_AST_CLASS_CONST , class_name , name );
112112 }
113113}
114114
115115ZEND_API zend_ast * zend_ast_create_decl (
116- zend_ast_loc * loc , zend_ast_kind kind , uint32_t flags , zend_string * doc_comment ,
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 ;
120120
121121 ast = zend_ast_alloc (sizeof (zend_ast_decl ));
122122 ast -> kind = kind ;
123123 ast -> attr = 0 ;
124- ast -> start_lineno = loc -> start_line ;
124+ ast -> start_lineno = start_lineno ;
125125 ast -> end_lineno = CG (zend_lineno );
126126 ast -> flags = flags ;
127127 ast -> lex_pos = LANG_SCNG (yy_text );
@@ -136,50 +136,63 @@ ZEND_API zend_ast *zend_ast_create_decl(
136136}
137137
138138#if ZEND_AST_SPEC
139- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_0 (zend_ast_loc * loc , zend_ast_kind kind ) {
139+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_0 (zend_ast_kind kind ) {
140140 zend_ast * ast ;
141141
142142 ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 0 );
143143 ast = zend_ast_alloc (zend_ast_size (0 ));
144144 ast -> kind = kind ;
145145 ast -> attr = 0 ;
146- ast -> lineno = loc -> start_line ;
146+ ast -> lineno = CG ( zend_lineno ) ;
147147
148148 return ast ;
149149}
150150
151- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_1 (
152- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child ) {
151+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_1 (zend_ast_kind kind , zend_ast * child ) {
153152 zend_ast * ast ;
153+ uint32_t lineno ;
154154
155155 ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 1 );
156156 ast = zend_ast_alloc (zend_ast_size (1 ));
157157 ast -> kind = kind ;
158158 ast -> attr = 0 ;
159159 ast -> child [0 ] = child ;
160- ast -> lineno = loc -> start_line ;
160+ if (child ) {
161+ lineno = zend_ast_get_lineno (child );
162+ } else {
163+ lineno = CG (zend_lineno );
164+ }
165+ ast -> lineno = lineno ;
166+ ast -> lineno = lineno ;
161167
162168 return ast ;
163169}
164170
165- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_2 (
166- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 ) {
171+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_2 (zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 ) {
167172 zend_ast * ast ;
173+ uint32_t lineno ;
168174
169175 ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 2 );
170176 ast = zend_ast_alloc (zend_ast_size (2 ));
171177 ast -> kind = kind ;
172178 ast -> attr = 0 ;
173179 ast -> child [0 ] = child1 ;
174180 ast -> child [1 ] = child2 ;
175- ast -> lineno = loc -> start_line ;
181+ if (child1 ) {
182+ lineno = zend_ast_get_lineno (child1 );
183+ } else if (child2 ) {
184+ lineno = zend_ast_get_lineno (child2 );
185+ } else {
186+ lineno = CG (zend_lineno );
187+ }
188+ ast -> lineno = lineno ;
176189
177190 return ast ;
178191}
179192
180- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3 (
181- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 , zend_ast * child3 ) {
193+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3 (zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 , zend_ast * child3 ) {
182194 zend_ast * ast ;
195+ uint32_t lineno ;
183196
184197 ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 3 );
185198 ast = zend_ast_alloc (zend_ast_size (3 ));
@@ -188,14 +201,23 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3(
188201 ast -> child [0 ] = child1 ;
189202 ast -> child [1 ] = child2 ;
190203 ast -> child [2 ] = child3 ;
191- ast -> lineno = loc -> start_line ;
204+ if (child1 ) {
205+ lineno = zend_ast_get_lineno (child1 );
206+ } else if (child2 ) {
207+ lineno = zend_ast_get_lineno (child2 );
208+ } else if (child3 ) {
209+ lineno = zend_ast_get_lineno (child3 );
210+ } else {
211+ lineno = CG (zend_lineno );
212+ }
213+ ast -> lineno = lineno ;
192214
193215 return ast ;
194216}
195217
196- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4 (
197- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 , zend_ast * child3 , zend_ast * child4 ) {
218+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4 (zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 , zend_ast * child3 , zend_ast * child4 ) {
198219 zend_ast * ast ;
220+ uint32_t lineno ;
199221
200222 ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 4 );
201223 ast = zend_ast_alloc (zend_ast_size (4 ));
@@ -205,45 +227,64 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4(
205227 ast -> child [1 ] = child2 ;
206228 ast -> child [2 ] = child3 ;
207229 ast -> child [3 ] = child4 ;
208- ast -> lineno = loc -> start_line ;
230+ if (child1 ) {
231+ lineno = zend_ast_get_lineno (child1 );
232+ } else if (child2 ) {
233+ lineno = zend_ast_get_lineno (child2 );
234+ } else if (child3 ) {
235+ lineno = zend_ast_get_lineno (child3 );
236+ } else if (child4 ) {
237+ lineno = zend_ast_get_lineno (child4 );
238+ } else {
239+ lineno = CG (zend_lineno );
240+ }
241+ ast -> lineno = lineno ;
209242
210243 return ast ;
211244}
212245
213- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_0 (zend_ast_loc * loc , zend_ast_kind kind ) {
246+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_0 (zend_ast_kind kind ) {
214247 zend_ast * ast ;
215248 zend_ast_list * list ;
216249
217250 ast = zend_ast_alloc (zend_ast_list_size (4 ));
218251 list = (zend_ast_list * ) ast ;
219252 list -> kind = kind ;
220253 list -> attr = 0 ;
221- list -> lineno = loc -> start_line ;
254+ list -> lineno = CG ( zend_lineno ) ;
222255 list -> children = 0 ;
223256
224257 return ast ;
225258}
226259
227- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_1 (
228- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child ) {
260+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_1 (zend_ast_kind kind , zend_ast * child ) {
229261 zend_ast * ast ;
230262 zend_ast_list * list ;
263+ uint32_t lineno ;
231264
232265 ast = zend_ast_alloc (zend_ast_list_size (4 ));
233266 list = (zend_ast_list * ) ast ;
234267 list -> kind = kind ;
235268 list -> attr = 0 ;
236269 list -> children = 1 ;
237270 list -> child [0 ] = child ;
238- list -> lineno = loc -> start_line ;
271+ if (child ) {
272+ lineno = zend_ast_get_lineno (child );
273+ if (lineno > CG (zend_lineno )) {
274+ lineno = CG (zend_lineno );
275+ }
276+ } else {
277+ lineno = CG (zend_lineno );
278+ }
279+ list -> lineno = lineno ;
239280
240281 return ast ;
241282}
242283
243- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2 (
244- zend_ast_loc * loc , zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 ) {
284+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2 (zend_ast_kind kind , zend_ast * child1 , zend_ast * child2 ) {
245285 zend_ast * ast ;
246286 zend_ast_list * list ;
287+ uint32_t lineno ;
247288
248289 ast = zend_ast_alloc (zend_ast_list_size (4 ));
249290 list = (zend_ast_list * ) ast ;
@@ -252,57 +293,82 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2(
252293 list -> children = 2 ;
253294 list -> child [0 ] = child1 ;
254295 list -> child [1 ] = child2 ;
255- list -> lineno = loc -> start_line ;
296+ if (child1 ) {
297+ lineno = zend_ast_get_lineno (child1 );
298+ if (lineno > CG (zend_lineno )) {
299+ lineno = CG (zend_lineno );
300+ }
301+ } else if (child2 ) {
302+ lineno = zend_ast_get_lineno (child2 );
303+ if (lineno > CG (zend_lineno )) {
304+ lineno = CG (zend_lineno );
305+ }
306+ } else {
307+ list -> children = 0 ;
308+ lineno = CG (zend_lineno );
309+ }
310+ list -> lineno = lineno ;
256311
257312 return ast ;
258313}
259314#else
260- static zend_ast * zend_ast_create_from_va_list (
261- zend_ast_loc * loc , zend_ast_kind kind , zend_ast_attr attr , va_list va ) {
315+ static zend_ast * zend_ast_create_from_va_list (zend_ast_kind kind , zend_ast_attr attr , va_list va ) {
262316 uint32_t i , children = kind >> ZEND_AST_NUM_CHILDREN_SHIFT ;
263317 zend_ast * ast ;
264318
265319 ast = zend_ast_alloc (zend_ast_size (children ));
266320 ast -> kind = kind ;
267321 ast -> attr = attr ;
268- ast -> lineno = loc -> start_line ;
322+ ast -> lineno = (uint32_t ) -1 ;
323+
324+ for (i = 0 ; i < children ; ++ i ) {
325+ ast -> child [i ] = va_arg (va , zend_ast * );
326+ if (ast -> child [i ] != NULL ) {
327+ uint32_t lineno = zend_ast_get_lineno (ast -> child [i ]);
328+ if (lineno < ast -> lineno ) {
329+ ast -> lineno = lineno ;
330+ }
331+ }
332+ }
333+
334+ if (ast -> lineno == UINT_MAX ) {
335+ ast -> lineno = CG (zend_lineno );
336+ }
269337
270338 return ast ;
271339}
272340
273- ZEND_API zend_ast * zend_ast_create_ex (
274- zend_ast_loc * loc , zend_ast_kind kind , zend_ast_attr attr , ...) {
341+ ZEND_API zend_ast * zend_ast_create_ex (zend_ast_kind kind , zend_ast_attr attr , ...) {
275342 va_list va ;
276343 zend_ast * ast ;
277344
278345 va_start (va , attr );
279- ast = zend_ast_create_from_va_list (loc , kind , attr , va );
346+ ast = zend_ast_create_from_va_list (kind , attr , va );
280347 va_end (va );
281348
282349 return ast ;
283350}
284351
285- ZEND_API zend_ast * zend_ast_create (zend_ast_loc * loc , zend_ast_kind kind , ...) {
352+ ZEND_API zend_ast * zend_ast_create (zend_ast_kind kind , ...) {
286353 va_list va ;
287354 zend_ast * ast ;
288355
289356 va_start (va , kind );
290- ast = zend_ast_create_from_va_list (loc , kind , 0 , va );
357+ ast = zend_ast_create_from_va_list (kind , 0 , va );
291358 va_end (va );
292359
293360 return ast ;
294361}
295362
296- ZEND_API zend_ast * zend_ast_create_list (
297- zend_ast_loc * loc , uint32_t init_children , zend_ast_kind kind , ...) {
363+ ZEND_API zend_ast * zend_ast_create_list (uint32_t init_children , zend_ast_kind kind , ...) {
298364 zend_ast * ast ;
299365 zend_ast_list * list ;
300366
301367 ast = zend_ast_alloc (zend_ast_list_size (4 ));
302368 list = (zend_ast_list * ) ast ;
303369 list -> kind = kind ;
304370 list -> attr = 0 ;
305- list -> lineno = loc -> start_line ;
371+ list -> lineno = CG ( zend_lineno ) ;
306372 list -> children = 0 ;
307373
308374 {
@@ -312,6 +378,12 @@ ZEND_API zend_ast *zend_ast_create_list(
312378 for (i = 0 ; i < init_children ; ++ i ) {
313379 zend_ast * child = va_arg (va , zend_ast * );
314380 ast = zend_ast_list_add (ast , child );
381+ if (child != NULL ) {
382+ uint32_t lineno = zend_ast_get_lineno (child );
383+ if (lineno < ast -> lineno ) {
384+ ast -> lineno = lineno ;
385+ }
386+ }
315387 }
316388 va_end (va );
317389 }
0 commit comments