@@ -45,83 +45,83 @@ static inline size_t zend_ast_list_size(uint32_t children) {
45
45
return sizeof (zend_ast_list ) - sizeof (zend_ast * ) + sizeof (zend_ast * ) * children ;
46
46
}
47
47
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 ) {
49
49
zend_ast_znode * ast ;
50
50
51
51
ast = zend_ast_alloc (sizeof (zend_ast_znode ));
52
52
ast -> kind = ZEND_AST_ZNODE ;
53
53
ast -> attr = 0 ;
54
- ast -> lineno = loc -> start_line ;
54
+ ast -> lineno = CG ( zend_lineno ) ;
55
55
ast -> node = * node ;
56
56
return (zend_ast * ) ast ;
57
57
}
58
58
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 ) {
61
60
zend_ast_zval * ast ;
62
61
63
62
ast = zend_ast_alloc (sizeof (zend_ast_zval ));
64
63
ast -> kind = ZEND_AST_ZVAL ;
65
64
ast -> attr = attr ;
66
65
ZVAL_COPY_VALUE (& ast -> val , zv );
67
- Z_LINENO (ast -> val ) = loc -> start_line ;
66
+ Z_LINENO (ast -> val ) = lineno ;
68
67
return (zend_ast * ) ast ;
69
68
}
70
69
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 );
74
72
}
75
73
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 ) );
78
76
}
79
77
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 ) {
81
83
zval zv ;
82
84
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 ) );
84
86
}
85
87
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 ) {
87
89
zval zv ;
88
90
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 ) );
90
92
}
91
93
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 ) {
94
95
zend_ast_zval * ast ;
95
96
96
97
ast = zend_ast_alloc (sizeof (zend_ast_zval ));
97
98
ast -> kind = ZEND_AST_CONSTANT ;
98
99
ast -> attr = attr ;
99
100
ZVAL_STR (& ast -> val , name );
100
- Z_LINENO (ast -> val ) = loc -> start_line ;
101
+ Z_LINENO (ast -> val ) = CG ( zend_lineno ) ;
101
102
return (zend_ast * ) ast ;
102
103
}
103
104
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 ) {
106
106
zend_string * name_str = zend_ast_get_str (name );
107
107
if (zend_string_equals_literal_ci (name_str , "class" )) {
108
108
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 );
110
110
} 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 );
112
112
}
113
113
}
114
114
115
115
ZEND_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 ,
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 ;
120
120
121
121
ast = zend_ast_alloc (sizeof (zend_ast_decl ));
122
122
ast -> kind = kind ;
123
123
ast -> attr = 0 ;
124
- ast -> start_lineno = loc -> start_line ;
124
+ ast -> start_lineno = start_lineno ;
125
125
ast -> end_lineno = CG (zend_lineno );
126
126
ast -> flags = flags ;
127
127
ast -> lex_pos = LANG_SCNG (yy_text );
@@ -136,50 +136,63 @@ ZEND_API zend_ast *zend_ast_create_decl(
136
136
}
137
137
138
138
#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 ) {
140
140
zend_ast * ast ;
141
141
142
142
ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 0 );
143
143
ast = zend_ast_alloc (zend_ast_size (0 ));
144
144
ast -> kind = kind ;
145
145
ast -> attr = 0 ;
146
- ast -> lineno = loc -> start_line ;
146
+ ast -> lineno = CG ( zend_lineno ) ;
147
147
148
148
return ast ;
149
149
}
150
150
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 ) {
153
152
zend_ast * ast ;
153
+ uint32_t lineno ;
154
154
155
155
ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 1 );
156
156
ast = zend_ast_alloc (zend_ast_size (1 ));
157
157
ast -> kind = kind ;
158
158
ast -> attr = 0 ;
159
159
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 ;
161
167
162
168
return ast ;
163
169
}
164
170
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 ) {
167
172
zend_ast * ast ;
173
+ uint32_t lineno ;
168
174
169
175
ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 2 );
170
176
ast = zend_ast_alloc (zend_ast_size (2 ));
171
177
ast -> kind = kind ;
172
178
ast -> attr = 0 ;
173
179
ast -> child [0 ] = child1 ;
174
180
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 ;
176
189
177
190
return ast ;
178
191
}
179
192
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 ) {
182
194
zend_ast * ast ;
195
+ uint32_t lineno ;
183
196
184
197
ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 3 );
185
198
ast = zend_ast_alloc (zend_ast_size (3 ));
@@ -188,14 +201,23 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3(
188
201
ast -> child [0 ] = child1 ;
189
202
ast -> child [1 ] = child2 ;
190
203
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 ;
192
214
193
215
return ast ;
194
216
}
195
217
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 ) {
198
219
zend_ast * ast ;
220
+ uint32_t lineno ;
199
221
200
222
ZEND_ASSERT (kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 4 );
201
223
ast = zend_ast_alloc (zend_ast_size (4 ));
@@ -205,45 +227,64 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4(
205
227
ast -> child [1 ] = child2 ;
206
228
ast -> child [2 ] = child3 ;
207
229
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 ;
209
242
210
243
return ast ;
211
244
}
212
245
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 ) {
214
247
zend_ast * ast ;
215
248
zend_ast_list * list ;
216
249
217
250
ast = zend_ast_alloc (zend_ast_list_size (4 ));
218
251
list = (zend_ast_list * ) ast ;
219
252
list -> kind = kind ;
220
253
list -> attr = 0 ;
221
- list -> lineno = loc -> start_line ;
254
+ list -> lineno = CG ( zend_lineno ) ;
222
255
list -> children = 0 ;
223
256
224
257
return ast ;
225
258
}
226
259
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 ) {
229
261
zend_ast * ast ;
230
262
zend_ast_list * list ;
263
+ uint32_t lineno ;
231
264
232
265
ast = zend_ast_alloc (zend_ast_list_size (4 ));
233
266
list = (zend_ast_list * ) ast ;
234
267
list -> kind = kind ;
235
268
list -> attr = 0 ;
236
269
list -> children = 1 ;
237
270
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 ;
239
280
240
281
return ast ;
241
282
}
242
283
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 ) {
245
285
zend_ast * ast ;
246
286
zend_ast_list * list ;
287
+ uint32_t lineno ;
247
288
248
289
ast = zend_ast_alloc (zend_ast_list_size (4 ));
249
290
list = (zend_ast_list * ) ast ;
@@ -252,57 +293,82 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2(
252
293
list -> children = 2 ;
253
294
list -> child [0 ] = child1 ;
254
295
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 ;
256
311
257
312
return ast ;
258
313
}
259
314
#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 ) {
262
316
uint32_t i , children = kind >> ZEND_AST_NUM_CHILDREN_SHIFT ;
263
317
zend_ast * ast ;
264
318
265
319
ast = zend_ast_alloc (zend_ast_size (children ));
266
320
ast -> kind = kind ;
267
321
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
+ }
269
337
270
338
return ast ;
271
339
}
272
340
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 , ...) {
275
342
va_list va ;
276
343
zend_ast * ast ;
277
344
278
345
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 );
280
347
va_end (va );
281
348
282
349
return ast ;
283
350
}
284
351
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 , ...) {
286
353
va_list va ;
287
354
zend_ast * ast ;
288
355
289
356
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 );
291
358
va_end (va );
292
359
293
360
return ast ;
294
361
}
295
362
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 , ...) {
298
364
zend_ast * ast ;
299
365
zend_ast_list * list ;
300
366
301
367
ast = zend_ast_alloc (zend_ast_list_size (4 ));
302
368
list = (zend_ast_list * ) ast ;
303
369
list -> kind = kind ;
304
370
list -> attr = 0 ;
305
- list -> lineno = loc -> start_line ;
371
+ list -> lineno = CG ( zend_lineno ) ;
306
372
list -> children = 0 ;
307
373
308
374
{
@@ -312,6 +378,12 @@ ZEND_API zend_ast *zend_ast_create_list(
312
378
for (i = 0 ; i < init_children ; ++ i ) {
313
379
zend_ast * child = va_arg (va , zend_ast * );
314
380
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
+ }
315
387
}
316
388
va_end (va );
317
389
}
0 commit comments