@@ -268,8 +268,10 @@ static void ast_to_zval(zval *zv, zend_ast *ast, zend_long version);
268
268
269
269
static void ast_create_virtual_node_ex (
270
270
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 , ... ) {
272
272
zval tmp_zv ;
273
+ va_list va ;
274
+ uint32_t i ;
273
275
274
276
object_init_ex (zv , ast_node_ce );
275
277
@@ -285,22 +287,25 @@ static void ast_create_virtual_node_ex(
285
287
array_init (& tmp_zv );
286
288
ast_update_property (zv , AST_STR (str_children ), & tmp_zv , AST_CACHE_SLOT_CHILDREN );
287
289
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 ;
290
294
if (child_name ) {
291
295
zend_hash_add_new (Z_ARRVAL (tmp_zv ), child_name , child_zv );
292
296
} else {
293
297
zend_hash_next_index_insert (Z_ARRVAL (tmp_zv ), child_zv );
294
298
}
295
299
}
300
+ va_end (va );
296
301
}
297
302
298
303
static void ast_create_virtual_node (
299
304
zval * zv , zend_ast_kind kind , zend_ast * child , zend_long version ) {
300
305
zval child_zv ;
301
306
ast_to_zval (& child_zv , child , version );
302
307
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 );
304
309
}
305
310
306
311
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
337
342
zval tmp ;
338
343
ast_create_virtual_node (& tmp , AST_NAME , child , version );
339
344
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 );
341
346
}
342
347
#endif
343
348
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
364
369
&& (type = lookup_builtin_type (zend_ast_get_str (child )))) {
365
370
/* Convert "int" etc typehints to TYPE nodes */
366
371
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 );
368
373
} else {
369
374
ast_create_virtual_node (& child_zv , AST_NAME , child , version );
370
375
}
@@ -374,7 +379,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
374
379
zval tmp ;
375
380
ZVAL_COPY_VALUE (& tmp , & child_zv );
376
381
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 );
378
383
}
379
384
} else if (ast -> kind == ZEND_AST_CLOSURE_USES ) {
380
385
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
385
390
zval tmp ;
386
391
ast_to_zval (& tmp , child , version );
387
392
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 );
389
394
} else {
390
395
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 );
392
397
}
393
398
} else if (i == 2
394
399
&& (ast -> kind == ZEND_AST_PROP_ELEM || ast -> kind == ZEND_AST_CONST_ELEM )) {
395
400
/* Skip docComment child -- It's handled separately */
396
401
continue ;
397
402
#if PHP_VERSION_ID >= 70100
398
403
} else if (ast -> kind == ZEND_AST_LIST ) {
404
+ /* Emulate simple variable list */
399
405
ast_to_zval (& child_zv , child -> child [0 ], version );
400
406
#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 );
405
416
#endif
406
417
} else {
407
418
ast_to_zval (& child_zv , child , version );
@@ -480,7 +491,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast, zend_long version) {
480
491
#else
481
492
if (version >= 35 && ast -> kind == ZEND_AST_LIST ) {
482
493
ast -> kind = ZEND_AST_ARRAY ;
483
- ast -> attr = ZEND_AST_LIST ;
494
+ ast -> attr = ZEND_ARRAY_SYNTAX_LIST ;
484
495
}
485
496
#endif
486
497
0 commit comments