Skip to content

Commit d3853b9

Browse files
committed
And fix the PHP 7.0 build again...
This code is getting damn ugly
1 parent 322e614 commit d3853b9

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

ast.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,10 @@ static void ast_to_zval(zval *zv, zend_ast *ast, zend_long version);
268268

269269
static void ast_create_virtual_node_ex(
270270
zval *zv, zend_ast_kind kind, zend_ast_attr attr, uint32_t lineno,
271-
zval *child_zv, zend_long version) {
271+
zend_long version, uint32_t num_children, ...) {
272272
zval tmp_zv;
273+
va_list va;
274+
uint32_t i;
273275

274276
object_init_ex(zv, ast_node_ce);
275277

@@ -285,22 +287,25 @@ static void ast_create_virtual_node_ex(
285287
array_init(&tmp_zv);
286288
ast_update_property(zv, AST_STR(str_children), &tmp_zv, AST_CACHE_SLOT_CHILDREN);
287289

288-
if (child_zv) {
289-
zend_string *child_name = version >= 30 ? ast_kind_child_name(kind, 0) : NULL;
290+
va_start(va, num_children);
291+
for (i = 0; i < num_children; i++) {
292+
zval *child_zv = va_arg(va, zval *);
293+
zend_string *child_name = version >= 30 ? ast_kind_child_name(kind, i) : NULL;
290294
if (child_name) {
291295
zend_hash_add_new(Z_ARRVAL(tmp_zv), child_name, child_zv);
292296
} else {
293297
zend_hash_next_index_insert(Z_ARRVAL(tmp_zv), child_zv);
294298
}
295299
}
300+
va_end(va);
296301
}
297302

298303
static void ast_create_virtual_node(
299304
zval *zv, zend_ast_kind kind, zend_ast *child, zend_long version) {
300305
zval child_zv;
301306
ast_to_zval(&child_zv, child, version);
302307
return ast_create_virtual_node_ex(
303-
zv, kind, child->attr, zend_ast_get_lineno(child), &child_zv, version);
308+
zv, kind, child->attr, zend_ast_get_lineno(child), version, 1, &child_zv);
304309
}
305310

306311
static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version) {
@@ -337,7 +342,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
337342
zval tmp;
338343
ast_create_virtual_node(&tmp, AST_NAME, child, version);
339344
ast_create_virtual_node_ex(
340-
&child_zv, ZEND_AST_NAME_LIST, 0, zend_ast_get_lineno(child), &tmp, version);
345+
&child_zv, ZEND_AST_NAME_LIST, 0, zend_ast_get_lineno(child), version, 1, &tmp);
341346
}
342347
#endif
343348
else if (ast_is_name(child, ast, i)) {
@@ -364,7 +369,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
364369
&& (type = lookup_builtin_type(zend_ast_get_str(child)))) {
365370
/* Convert "int" etc typehints to TYPE nodes */
366371
ast_create_virtual_node_ex(
367-
&child_zv, ZEND_AST_TYPE, type, zend_ast_get_lineno(child), NULL, version);
372+
&child_zv, ZEND_AST_TYPE, type, zend_ast_get_lineno(child), version, 0);
368373
} else {
369374
ast_create_virtual_node(&child_zv, AST_NAME, child, version);
370375
}
@@ -374,7 +379,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
374379
zval tmp;
375380
ZVAL_COPY_VALUE(&tmp, &child_zv);
376381
ast_create_virtual_node_ex(
377-
&child_zv, AST_NULLABLE_TYPE, 0, zend_ast_get_lineno(child), &tmp, version);
382+
&child_zv, AST_NULLABLE_TYPE, 0, zend_ast_get_lineno(child), version, 1, &tmp);
378383
}
379384
} else if (ast->kind == ZEND_AST_CLOSURE_USES) {
380385
ast_create_virtual_node(&child_zv, AST_CLOSURE_VAR, child, version);
@@ -385,23 +390,29 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
385390
zval tmp;
386391
ast_to_zval(&tmp, child, version);
387392
ast_create_virtual_node_ex(
388-
&child_zv, ZEND_AST_STMT_LIST, 0, zend_ast_get_lineno(child), &tmp, version);
393+
&child_zv, ZEND_AST_STMT_LIST, 0, zend_ast_get_lineno(child), version, 1, &tmp);
389394
} else {
390395
ast_create_virtual_node_ex(
391-
&child_zv, ZEND_AST_STMT_LIST, 0, zend_ast_get_lineno(ast), NULL, version);
396+
&child_zv, ZEND_AST_STMT_LIST, 0, zend_ast_get_lineno(ast), version, 0);
392397
}
393398
} else if (i == 2
394399
&& (ast->kind == ZEND_AST_PROP_ELEM || ast->kind == ZEND_AST_CONST_ELEM)) {
395400
/* Skip docComment child -- It's handled separately */
396401
continue;
397402
#if PHP_VERSION_ID >= 70100
398403
} else if (ast->kind == ZEND_AST_LIST) {
404+
/* Emulate simple variable list */
399405
ast_to_zval(&child_zv, child->child[0], version);
400406
#else
401-
} else if (ast->kind == ZEND_AST_LIST && version >= 35) {
402-
zend_ast *new_child = zend_ast_create(ZEND_AST_ARRAY_ELEM, child, NULL);
403-
new_child->lineno = zend_ast_get_lineno(child);
404-
ast_to_zval(&child_zv, new_child, version);
407+
} else if (version >= 35 && ast->kind == ZEND_AST_ARRAY
408+
&& ast->attr == ZEND_ARRAY_SYNTAX_LIST) {
409+
/* Emulate ARRAY_ELEM list */
410+
zval ch0, ch1;
411+
ast_to_zval(&ch0, child, version);
412+
ZVAL_NULL(&ch1);
413+
ast_create_virtual_node_ex(
414+
&child_zv, ZEND_AST_ARRAY_ELEM, 0, zend_ast_get_lineno(child), version,
415+
2, &ch0, &ch1);
405416
#endif
406417
} else {
407418
ast_to_zval(&child_zv, child, version);
@@ -480,7 +491,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast, zend_long version) {
480491
#else
481492
if (version >= 35 && ast->kind == ZEND_AST_LIST) {
482493
ast->kind = ZEND_AST_ARRAY;
483-
ast->attr = ZEND_AST_LIST;
494+
ast->attr = ZEND_ARRAY_SYNTAX_LIST;
484495
}
485496
#endif
486497

0 commit comments

Comments
 (0)