Skip to content

Commit 7f72d77

Browse files
committed
Revert "Switch to bison location tracking"
This reverts commit e528762. Dmitry reports that this has a non-trivial impact on parsing overhead, especially on 32-bit systems. As we don't have a strong need for this change right now, I'm reverting it. See also comments on e528762.
1 parent bcb99a3 commit 7f72d77

9 files changed

+488
-449
lines changed

Zend/zend_ast.c

+128-56
Original file line numberDiff line numberDiff line change
@@ -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

115115
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,
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

Comments
 (0)