yarp 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/CONTRIBUTING.md +4 -0
  4. data/{Makefile.in → Makefile} +5 -4
  5. data/README.md +6 -3
  6. data/config.yml +83 -274
  7. data/docs/build_system.md +4 -15
  8. data/docs/building.md +1 -5
  9. data/docs/encoding.md +1 -0
  10. data/docs/{extension.md → ruby_api.md} +6 -3
  11. data/docs/serialization.md +71 -24
  12. data/ext/yarp/api_node.c +173 -585
  13. data/ext/yarp/extconf.rb +15 -10
  14. data/ext/yarp/extension.c +4 -2
  15. data/ext/yarp/extension.h +1 -1
  16. data/include/yarp/ast.h +167 -306
  17. data/include/yarp/defines.h +5 -15
  18. data/include/yarp/enc/yp_encoding.h +1 -0
  19. data/include/yarp/unescape.h +1 -1
  20. data/include/yarp/util/yp_buffer.h +9 -0
  21. data/include/yarp/util/yp_constant_pool.h +3 -0
  22. data/include/yarp/util/yp_list.h +7 -7
  23. data/include/yarp/util/yp_newline_list.h +4 -0
  24. data/include/yarp/util/yp_state_stack.h +1 -1
  25. data/include/yarp/util/yp_string.h +5 -1
  26. data/include/yarp/version.h +2 -3
  27. data/include/yarp.h +4 -2
  28. data/lib/yarp/ffi.rb +226 -0
  29. data/lib/yarp/lex_compat.rb +16 -2
  30. data/lib/yarp/node.rb +594 -1437
  31. data/lib/yarp/ripper_compat.rb +3 -3
  32. data/lib/yarp/serialize.rb +312 -149
  33. data/lib/yarp.rb +167 -2
  34. data/src/enc/yp_unicode.c +9 -0
  35. data/src/node.c +92 -250
  36. data/src/prettyprint.c +81 -206
  37. data/src/serialize.c +124 -149
  38. data/src/unescape.c +29 -35
  39. data/src/util/yp_buffer.c +18 -0
  40. data/src/util/yp_list.c +7 -16
  41. data/src/util/yp_state_stack.c +0 -6
  42. data/src/util/yp_string.c +8 -17
  43. data/src/yarp.c +444 -717
  44. data/yarp.gemspec +5 -5
  45. metadata +6 -6
  46. data/config.h.in +0 -25
  47. data/configure +0 -4487
data/ext/yarp/api_node.c CHANGED
@@ -17,6 +17,7 @@ extern VALUE rb_cYARPLocation;
17
17
  static VALUE rb_cYARPAliasNode;
18
18
  static VALUE rb_cYARPAlternationPatternNode;
19
19
  static VALUE rb_cYARPAndNode;
20
+ static VALUE rb_cYARPAndWriteNode;
20
21
  static VALUE rb_cYARPArgumentsNode;
21
22
  static VALUE rb_cYARPArrayNode;
22
23
  static VALUE rb_cYARPArrayPatternNode;
@@ -36,18 +37,9 @@ static VALUE rb_cYARPCallOperatorWriteNode;
36
37
  static VALUE rb_cYARPCapturePatternNode;
37
38
  static VALUE rb_cYARPCaseNode;
38
39
  static VALUE rb_cYARPClassNode;
39
- static VALUE rb_cYARPClassVariableOperatorAndWriteNode;
40
- static VALUE rb_cYARPClassVariableOperatorOrWriteNode;
41
- static VALUE rb_cYARPClassVariableOperatorWriteNode;
42
40
  static VALUE rb_cYARPClassVariableReadNode;
43
41
  static VALUE rb_cYARPClassVariableWriteNode;
44
- static VALUE rb_cYARPConstantOperatorAndWriteNode;
45
- static VALUE rb_cYARPConstantOperatorOrWriteNode;
46
- static VALUE rb_cYARPConstantOperatorWriteNode;
47
42
  static VALUE rb_cYARPConstantPathNode;
48
- static VALUE rb_cYARPConstantPathOperatorAndWriteNode;
49
- static VALUE rb_cYARPConstantPathOperatorOrWriteNode;
50
- static VALUE rb_cYARPConstantPathOperatorWriteNode;
51
43
  static VALUE rb_cYARPConstantPathWriteNode;
52
44
  static VALUE rb_cYARPConstantReadNode;
53
45
  static VALUE rb_cYARPConstantWriteNode;
@@ -59,14 +51,12 @@ static VALUE rb_cYARPEmbeddedVariableNode;
59
51
  static VALUE rb_cYARPEnsureNode;
60
52
  static VALUE rb_cYARPFalseNode;
61
53
  static VALUE rb_cYARPFindPatternNode;
54
+ static VALUE rb_cYARPFlipFlopNode;
62
55
  static VALUE rb_cYARPFloatNode;
63
56
  static VALUE rb_cYARPForNode;
64
57
  static VALUE rb_cYARPForwardingArgumentsNode;
65
58
  static VALUE rb_cYARPForwardingParameterNode;
66
59
  static VALUE rb_cYARPForwardingSuperNode;
67
- static VALUE rb_cYARPGlobalVariableOperatorAndWriteNode;
68
- static VALUE rb_cYARPGlobalVariableOperatorOrWriteNode;
69
- static VALUE rb_cYARPGlobalVariableOperatorWriteNode;
70
60
  static VALUE rb_cYARPGlobalVariableReadNode;
71
61
  static VALUE rb_cYARPGlobalVariableWriteNode;
72
62
  static VALUE rb_cYARPHashNode;
@@ -74,9 +64,6 @@ static VALUE rb_cYARPHashPatternNode;
74
64
  static VALUE rb_cYARPIfNode;
75
65
  static VALUE rb_cYARPImaginaryNode;
76
66
  static VALUE rb_cYARPInNode;
77
- static VALUE rb_cYARPInstanceVariableOperatorAndWriteNode;
78
- static VALUE rb_cYARPInstanceVariableOperatorOrWriteNode;
79
- static VALUE rb_cYARPInstanceVariableOperatorWriteNode;
80
67
  static VALUE rb_cYARPInstanceVariableReadNode;
81
68
  static VALUE rb_cYARPInstanceVariableWriteNode;
82
69
  static VALUE rb_cYARPIntegerNode;
@@ -88,9 +75,6 @@ static VALUE rb_cYARPKeywordHashNode;
88
75
  static VALUE rb_cYARPKeywordParameterNode;
89
76
  static VALUE rb_cYARPKeywordRestParameterNode;
90
77
  static VALUE rb_cYARPLambdaNode;
91
- static VALUE rb_cYARPLocalVariableOperatorAndWriteNode;
92
- static VALUE rb_cYARPLocalVariableOperatorOrWriteNode;
93
- static VALUE rb_cYARPLocalVariableOperatorWriteNode;
94
78
  static VALUE rb_cYARPLocalVariableReadNode;
95
79
  static VALUE rb_cYARPLocalVariableWriteNode;
96
80
  static VALUE rb_cYARPMatchPredicateNode;
@@ -102,8 +86,10 @@ static VALUE rb_cYARPNextNode;
102
86
  static VALUE rb_cYARPNilNode;
103
87
  static VALUE rb_cYARPNoKeywordsParameterNode;
104
88
  static VALUE rb_cYARPNumberedReferenceReadNode;
89
+ static VALUE rb_cYARPOperatorWriteNode;
105
90
  static VALUE rb_cYARPOptionalParameterNode;
106
91
  static VALUE rb_cYARPOrNode;
92
+ static VALUE rb_cYARPOrWriteNode;
107
93
  static VALUE rb_cYARPParametersNode;
108
94
  static VALUE rb_cYARPParenthesesNode;
109
95
  static VALUE rb_cYARPPinnedExpressionNode;
@@ -257,6 +243,13 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
257
243
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->right);
258
244
  break;
259
245
  }
246
+ #line 111 "api_node.c.erb"
247
+ case YP_NODE_AND_WRITE_NODE: {
248
+ yp_and_write_node_t *cast = (yp_and_write_node_t *) node;
249
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
250
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
251
+ break;
252
+ }
260
253
  #line 111 "api_node.c.erb"
261
254
  case YP_NODE_ARGUMENTS_NODE: {
262
255
  yp_arguments_node_t *cast = (yp_arguments_node_t *) node;
@@ -318,7 +311,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
318
311
  case YP_NODE_BLOCK_NODE: {
319
312
  yp_block_node_t *cast = (yp_block_node_t *) node;
320
313
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->parameters);
321
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
314
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
322
315
  break;
323
316
  }
324
317
  #line 111 "api_node.c.erb"
@@ -384,25 +377,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
384
377
  yp_class_node_t *cast = (yp_class_node_t *) node;
385
378
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->constant_path);
386
379
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->superclass);
387
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
388
- break;
389
- }
390
- #line 111 "api_node.c.erb"
391
- case YP_NODE_CLASS_VARIABLE_OPERATOR_AND_WRITE_NODE: {
392
- yp_class_variable_operator_and_write_node_t *cast = (yp_class_variable_operator_and_write_node_t *) node;
393
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
394
- break;
395
- }
396
- #line 111 "api_node.c.erb"
397
- case YP_NODE_CLASS_VARIABLE_OPERATOR_OR_WRITE_NODE: {
398
- yp_class_variable_operator_or_write_node_t *cast = (yp_class_variable_operator_or_write_node_t *) node;
399
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
400
- break;
401
- }
402
- #line 111 "api_node.c.erb"
403
- case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
404
- yp_class_variable_operator_write_node_t *cast = (yp_class_variable_operator_write_node_t *) node;
405
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
380
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
406
381
  break;
407
382
  }
408
383
  #line 111 "api_node.c.erb"
@@ -411,24 +386,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
411
386
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
412
387
  break;
413
388
  }
414
- #line 111 "api_node.c.erb"
415
- case YP_NODE_CONSTANT_OPERATOR_AND_WRITE_NODE: {
416
- yp_constant_operator_and_write_node_t *cast = (yp_constant_operator_and_write_node_t *) node;
417
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
418
- break;
419
- }
420
- #line 111 "api_node.c.erb"
421
- case YP_NODE_CONSTANT_OPERATOR_OR_WRITE_NODE: {
422
- yp_constant_operator_or_write_node_t *cast = (yp_constant_operator_or_write_node_t *) node;
423
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
424
- break;
425
- }
426
- #line 111 "api_node.c.erb"
427
- case YP_NODE_CONSTANT_OPERATOR_WRITE_NODE: {
428
- yp_constant_operator_write_node_t *cast = (yp_constant_operator_write_node_t *) node;
429
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
430
- break;
431
- }
432
389
  #line 111 "api_node.c.erb"
433
390
  case YP_NODE_CONSTANT_PATH_NODE: {
434
391
  yp_constant_path_node_t *cast = (yp_constant_path_node_t *) node;
@@ -436,27 +393,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
436
393
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->child);
437
394
  break;
438
395
  }
439
- #line 111 "api_node.c.erb"
440
- case YP_NODE_CONSTANT_PATH_OPERATOR_AND_WRITE_NODE: {
441
- yp_constant_path_operator_and_write_node_t *cast = (yp_constant_path_operator_and_write_node_t *) node;
442
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
443
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
444
- break;
445
- }
446
- #line 111 "api_node.c.erb"
447
- case YP_NODE_CONSTANT_PATH_OPERATOR_OR_WRITE_NODE: {
448
- yp_constant_path_operator_or_write_node_t *cast = (yp_constant_path_operator_or_write_node_t *) node;
449
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
450
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
451
- break;
452
- }
453
- #line 111 "api_node.c.erb"
454
- case YP_NODE_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
455
- yp_constant_path_operator_write_node_t *cast = (yp_constant_path_operator_write_node_t *) node;
456
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
457
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
458
- break;
459
- }
460
396
  #line 111 "api_node.c.erb"
461
397
  case YP_NODE_CONSTANT_PATH_WRITE_NODE: {
462
398
  yp_constant_path_write_node_t *cast = (yp_constant_path_write_node_t *) node;
@@ -475,7 +411,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
475
411
  yp_def_node_t *cast = (yp_def_node_t *) node;
476
412
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->receiver);
477
413
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->parameters);
478
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
414
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
479
415
  break;
480
416
  }
481
417
  #line 111 "api_node.c.erb"
@@ -519,6 +455,13 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
519
455
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->right);
520
456
  break;
521
457
  }
458
+ #line 111 "api_node.c.erb"
459
+ case YP_NODE_FLIP_FLOP_NODE: {
460
+ yp_flip_flop_node_t *cast = (yp_flip_flop_node_t *) node;
461
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->left);
462
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->right);
463
+ break;
464
+ }
522
465
  #line 111 "api_node.c.erb"
523
466
  case YP_NODE_FOR_NODE: {
524
467
  yp_for_node_t *cast = (yp_for_node_t *) node;
@@ -533,24 +476,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
533
476
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->block);
534
477
  break;
535
478
  }
536
- #line 111 "api_node.c.erb"
537
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_AND_WRITE_NODE: {
538
- yp_global_variable_operator_and_write_node_t *cast = (yp_global_variable_operator_and_write_node_t *) node;
539
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
540
- break;
541
- }
542
- #line 111 "api_node.c.erb"
543
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_OR_WRITE_NODE: {
544
- yp_global_variable_operator_or_write_node_t *cast = (yp_global_variable_operator_or_write_node_t *) node;
545
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
546
- break;
547
- }
548
- #line 111 "api_node.c.erb"
549
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
550
- yp_global_variable_operator_write_node_t *cast = (yp_global_variable_operator_write_node_t *) node;
551
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
552
- break;
553
- }
554
479
  #line 111 "api_node.c.erb"
555
480
  case YP_NODE_GLOBAL_VARIABLE_WRITE_NODE: {
556
481
  yp_global_variable_write_node_t *cast = (yp_global_variable_write_node_t *) node;
@@ -596,24 +521,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
596
521
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
597
522
  break;
598
523
  }
599
- #line 111 "api_node.c.erb"
600
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_AND_WRITE_NODE: {
601
- yp_instance_variable_operator_and_write_node_t *cast = (yp_instance_variable_operator_and_write_node_t *) node;
602
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
603
- break;
604
- }
605
- #line 111 "api_node.c.erb"
606
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_OR_WRITE_NODE: {
607
- yp_instance_variable_operator_or_write_node_t *cast = (yp_instance_variable_operator_or_write_node_t *) node;
608
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
609
- break;
610
- }
611
- #line 111 "api_node.c.erb"
612
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
613
- yp_instance_variable_operator_write_node_t *cast = (yp_instance_variable_operator_write_node_t *) node;
614
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
615
- break;
616
- }
617
524
  #line 111 "api_node.c.erb"
618
525
  case YP_NODE_INSTANCE_VARIABLE_WRITE_NODE: {
619
526
  yp_instance_variable_write_node_t *cast = (yp_instance_variable_write_node_t *) node;
@@ -670,25 +577,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
670
577
  case YP_NODE_LAMBDA_NODE: {
671
578
  yp_lambda_node_t *cast = (yp_lambda_node_t *) node;
672
579
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->parameters);
673
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
674
- break;
675
- }
676
- #line 111 "api_node.c.erb"
677
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_AND_WRITE_NODE: {
678
- yp_local_variable_operator_and_write_node_t *cast = (yp_local_variable_operator_and_write_node_t *) node;
679
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
680
- break;
681
- }
682
- #line 111 "api_node.c.erb"
683
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_OR_WRITE_NODE: {
684
- yp_local_variable_operator_or_write_node_t *cast = (yp_local_variable_operator_or_write_node_t *) node;
685
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
686
- break;
687
- }
688
- #line 111 "api_node.c.erb"
689
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
690
- yp_local_variable_operator_write_node_t *cast = (yp_local_variable_operator_write_node_t *) node;
691
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
580
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
692
581
  break;
693
582
  }
694
583
  #line 111 "api_node.c.erb"
@@ -715,7 +604,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
715
604
  case YP_NODE_MODULE_NODE: {
716
605
  yp_module_node_t *cast = (yp_module_node_t *) node;
717
606
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->constant_path);
718
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
607
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
719
608
  break;
720
609
  }
721
610
  #line 111 "api_node.c.erb"
@@ -733,6 +622,13 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
733
622
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->arguments);
734
623
  break;
735
624
  }
625
+ #line 111 "api_node.c.erb"
626
+ case YP_NODE_OPERATOR_WRITE_NODE: {
627
+ yp_operator_write_node_t *cast = (yp_operator_write_node_t *) node;
628
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
629
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
630
+ break;
631
+ }
736
632
  #line 111 "api_node.c.erb"
737
633
  case YP_NODE_OPTIONAL_PARAMETER_NODE: {
738
634
  yp_optional_parameter_node_t *cast = (yp_optional_parameter_node_t *) node;
@@ -746,6 +642,13 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
746
642
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->right);
747
643
  break;
748
644
  }
645
+ #line 111 "api_node.c.erb"
646
+ case YP_NODE_OR_WRITE_NODE: {
647
+ yp_or_write_node_t *cast = (yp_or_write_node_t *) node;
648
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->target);
649
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->value);
650
+ break;
651
+ }
749
652
  #line 111 "api_node.c.erb"
750
653
  case YP_NODE_PARAMETERS_NODE: {
751
654
  yp_parameters_node_t *cast = (yp_parameters_node_t *) node;
@@ -769,7 +672,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
769
672
  #line 111 "api_node.c.erb"
770
673
  case YP_NODE_PARENTHESES_NODE: {
771
674
  yp_parentheses_node_t *cast = (yp_parentheses_node_t *) node;
772
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
675
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
773
676
  break;
774
677
  }
775
678
  #line 111 "api_node.c.erb"
@@ -851,7 +754,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
851
754
  case YP_NODE_SINGLETON_CLASS_NODE: {
852
755
  yp_singleton_class_node_t *cast = (yp_singleton_class_node_t *) node;
853
756
  yp_node_stack_push(&node_stack, (yp_node_t *) cast->expression);
854
- yp_node_stack_push(&node_stack, (yp_node_t *) cast->statements);
757
+ yp_node_stack_push(&node_stack, (yp_node_t *) cast->body);
855
758
  break;
856
759
  }
857
760
  #line 111 "api_node.c.erb"
@@ -995,13 +898,33 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
995
898
  rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPAndNode));
996
899
  break;
997
900
  }
901
+ #line 137 "api_node.c.erb"
902
+ case YP_NODE_AND_WRITE_NODE: {
903
+ yp_and_write_node_t *cast = (yp_and_write_node_t *) node;
904
+ VALUE argv[4];
905
+
906
+ // target
907
+ argv[0] = rb_ary_pop(value_stack);
908
+
909
+ // value
910
+ argv[1] = rb_ary_pop(value_stack);
911
+
912
+ // operator_loc
913
+ argv[2] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
914
+
915
+ // location
916
+ argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
917
+
918
+ rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPAndWriteNode));
919
+ break;
920
+ }
998
921
  #line 137 "api_node.c.erb"
999
922
  case YP_NODE_ARGUMENTS_NODE: {
1000
923
  yp_arguments_node_t *cast = (yp_arguments_node_t *) node;
1001
924
  VALUE argv[2];
1002
925
 
1003
926
  // arguments
1004
- argv[0] = rb_ary_new();
927
+ argv[0] = rb_ary_new_capa(cast->arguments.size);
1005
928
  for (size_t index = 0; index < cast->arguments.size; index++) {
1006
929
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
1007
930
  }
@@ -1018,7 +941,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1018
941
  VALUE argv[4];
1019
942
 
1020
943
  // elements
1021
- argv[0] = rb_ary_new();
944
+ argv[0] = rb_ary_new_capa(cast->elements.size);
1022
945
  for (size_t index = 0; index < cast->elements.size; index++) {
1023
946
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
1024
947
  }
@@ -1044,7 +967,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1044
967
  argv[0] = rb_ary_pop(value_stack);
1045
968
 
1046
969
  // requireds
1047
- argv[1] = rb_ary_new();
970
+ argv[1] = rb_ary_new_capa(cast->requireds.size);
1048
971
  for (size_t index = 0; index < cast->requireds.size; index++) {
1049
972
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
1050
973
  }
@@ -1053,7 +976,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1053
976
  argv[2] = rb_ary_pop(value_stack);
1054
977
 
1055
978
  // posts
1056
- argv[3] = rb_ary_new();
979
+ argv[3] = rb_ary_new_capa(cast->posts.size);
1057
980
  for (size_t index = 0; index < cast->posts.size; index++) {
1058
981
  rb_ary_push(argv[3], rb_ary_pop(value_stack));
1059
982
  }
@@ -1169,7 +1092,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1169
1092
  VALUE argv[6];
1170
1093
 
1171
1094
  // locals
1172
- argv[0] = rb_ary_new();
1095
+ argv[0] = rb_ary_new_capa(cast->locals.size);
1173
1096
  for (size_t index = 0; index < cast->locals.size; index++) {
1174
1097
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
1175
1098
  }
@@ -1177,7 +1100,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1177
1100
  // parameters
1178
1101
  argv[1] = rb_ary_pop(value_stack);
1179
1102
 
1180
- // statements
1103
+ // body
1181
1104
  argv[2] = rb_ary_pop(value_stack);
1182
1105
 
1183
1106
  // opening_loc
@@ -1218,7 +1141,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1218
1141
  argv[0] = rb_ary_pop(value_stack);
1219
1142
 
1220
1143
  // locals
1221
- argv[1] = rb_ary_new();
1144
+ argv[1] = rb_ary_new_capa(cast->locals.size);
1222
1145
  for (size_t index = 0; index < cast->locals.size; index++) {
1223
1146
  yp_location_t location = cast->locals.locations[index];
1224
1147
  rb_ary_push(argv[1], yp_location_new(parser, location.start, location.end, source));
@@ -1280,7 +1203,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1280
1203
  argv[6] = rb_ary_pop(value_stack);
1281
1204
 
1282
1205
  // flags
1283
- argv[7] = ULONG2NUM(cast->flags);
1206
+ argv[7] = ULONG2NUM(node->flags >> 1);
1284
1207
 
1285
1208
  // name
1286
1209
  argv[8] = yp_string_new(&cast->name, encoding);
@@ -1383,7 +1306,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1383
1306
  argv[0] = rb_ary_pop(value_stack);
1384
1307
 
1385
1308
  // conditions
1386
- argv[1] = rb_ary_new();
1309
+ argv[1] = rb_ary_new_capa(cast->conditions.size);
1387
1310
  for (size_t index = 0; index < cast->conditions.size; index++) {
1388
1311
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
1389
1312
  }
@@ -1409,7 +1332,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1409
1332
  VALUE argv[8];
1410
1333
 
1411
1334
  // locals
1412
- argv[0] = rb_ary_new();
1335
+ argv[0] = rb_ary_new_capa(cast->locals.size);
1413
1336
  for (size_t index = 0; index < cast->locals.size; index++) {
1414
1337
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
1415
1338
  }
@@ -1426,7 +1349,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1426
1349
  // superclass
1427
1350
  argv[4] = rb_ary_pop(value_stack);
1428
1351
 
1429
- // statements
1352
+ // body
1430
1353
  argv[5] = rb_ary_pop(value_stack);
1431
1354
 
1432
1355
  // end_keyword_loc
@@ -1438,69 +1361,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1438
1361
  rb_ary_push(value_stack, rb_class_new_instance(8, argv, rb_cYARPClassNode));
1439
1362
  break;
1440
1363
  }
1441
- #line 137 "api_node.c.erb"
1442
- case YP_NODE_CLASS_VARIABLE_OPERATOR_AND_WRITE_NODE: {
1443
- yp_class_variable_operator_and_write_node_t *cast = (yp_class_variable_operator_and_write_node_t *) node;
1444
- VALUE argv[4];
1445
-
1446
- // name_loc
1447
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1448
-
1449
- // operator_loc
1450
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1451
-
1452
- // value
1453
- argv[2] = rb_ary_pop(value_stack);
1454
-
1455
- // location
1456
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1457
-
1458
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPClassVariableOperatorAndWriteNode));
1459
- break;
1460
- }
1461
- #line 137 "api_node.c.erb"
1462
- case YP_NODE_CLASS_VARIABLE_OPERATOR_OR_WRITE_NODE: {
1463
- yp_class_variable_operator_or_write_node_t *cast = (yp_class_variable_operator_or_write_node_t *) node;
1464
- VALUE argv[4];
1465
-
1466
- // name_loc
1467
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1468
-
1469
- // operator_loc
1470
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1471
-
1472
- // value
1473
- argv[2] = rb_ary_pop(value_stack);
1474
-
1475
- // location
1476
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1477
-
1478
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPClassVariableOperatorOrWriteNode));
1479
- break;
1480
- }
1481
- #line 137 "api_node.c.erb"
1482
- case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
1483
- yp_class_variable_operator_write_node_t *cast = (yp_class_variable_operator_write_node_t *) node;
1484
- VALUE argv[5];
1485
-
1486
- // name_loc
1487
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1488
-
1489
- // operator_loc
1490
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1491
-
1492
- // value
1493
- argv[2] = rb_ary_pop(value_stack);
1494
-
1495
- // operator
1496
- argv[3] = rb_id2sym(constants[cast->operator - 1]);
1497
-
1498
- // location
1499
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
1500
-
1501
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPClassVariableOperatorWriteNode));
1502
- break;
1503
- }
1504
1364
  #line 137 "api_node.c.erb"
1505
1365
  case YP_NODE_CLASS_VARIABLE_READ_NODE: {
1506
1366
  VALUE argv[1];
@@ -1531,69 +1391,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1531
1391
  rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPClassVariableWriteNode));
1532
1392
  break;
1533
1393
  }
1534
- #line 137 "api_node.c.erb"
1535
- case YP_NODE_CONSTANT_OPERATOR_AND_WRITE_NODE: {
1536
- yp_constant_operator_and_write_node_t *cast = (yp_constant_operator_and_write_node_t *) node;
1537
- VALUE argv[4];
1538
-
1539
- // name_loc
1540
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1541
-
1542
- // operator_loc
1543
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1544
-
1545
- // value
1546
- argv[2] = rb_ary_pop(value_stack);
1547
-
1548
- // location
1549
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1550
-
1551
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPConstantOperatorAndWriteNode));
1552
- break;
1553
- }
1554
- #line 137 "api_node.c.erb"
1555
- case YP_NODE_CONSTANT_OPERATOR_OR_WRITE_NODE: {
1556
- yp_constant_operator_or_write_node_t *cast = (yp_constant_operator_or_write_node_t *) node;
1557
- VALUE argv[4];
1558
-
1559
- // name_loc
1560
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1561
-
1562
- // operator_loc
1563
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1564
-
1565
- // value
1566
- argv[2] = rb_ary_pop(value_stack);
1567
-
1568
- // location
1569
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1570
-
1571
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPConstantOperatorOrWriteNode));
1572
- break;
1573
- }
1574
- #line 137 "api_node.c.erb"
1575
- case YP_NODE_CONSTANT_OPERATOR_WRITE_NODE: {
1576
- yp_constant_operator_write_node_t *cast = (yp_constant_operator_write_node_t *) node;
1577
- VALUE argv[5];
1578
-
1579
- // name_loc
1580
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
1581
-
1582
- // operator_loc
1583
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1584
-
1585
- // value
1586
- argv[2] = rb_ary_pop(value_stack);
1587
-
1588
- // operator
1589
- argv[3] = rb_id2sym(constants[cast->operator - 1]);
1590
-
1591
- // location
1592
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
1593
-
1594
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPConstantOperatorWriteNode));
1595
- break;
1596
- }
1597
1394
  #line 137 "api_node.c.erb"
1598
1395
  case YP_NODE_CONSTANT_PATH_NODE: {
1599
1396
  yp_constant_path_node_t *cast = (yp_constant_path_node_t *) node;
@@ -1614,69 +1411,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1614
1411
  rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPConstantPathNode));
1615
1412
  break;
1616
1413
  }
1617
- #line 137 "api_node.c.erb"
1618
- case YP_NODE_CONSTANT_PATH_OPERATOR_AND_WRITE_NODE: {
1619
- yp_constant_path_operator_and_write_node_t *cast = (yp_constant_path_operator_and_write_node_t *) node;
1620
- VALUE argv[4];
1621
-
1622
- // target
1623
- argv[0] = rb_ary_pop(value_stack);
1624
-
1625
- // operator_loc
1626
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1627
-
1628
- // value
1629
- argv[2] = rb_ary_pop(value_stack);
1630
-
1631
- // location
1632
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1633
-
1634
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPConstantPathOperatorAndWriteNode));
1635
- break;
1636
- }
1637
- #line 137 "api_node.c.erb"
1638
- case YP_NODE_CONSTANT_PATH_OPERATOR_OR_WRITE_NODE: {
1639
- yp_constant_path_operator_or_write_node_t *cast = (yp_constant_path_operator_or_write_node_t *) node;
1640
- VALUE argv[4];
1641
-
1642
- // target
1643
- argv[0] = rb_ary_pop(value_stack);
1644
-
1645
- // operator_loc
1646
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1647
-
1648
- // value
1649
- argv[2] = rb_ary_pop(value_stack);
1650
-
1651
- // location
1652
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
1653
-
1654
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPConstantPathOperatorOrWriteNode));
1655
- break;
1656
- }
1657
- #line 137 "api_node.c.erb"
1658
- case YP_NODE_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
1659
- yp_constant_path_operator_write_node_t *cast = (yp_constant_path_operator_write_node_t *) node;
1660
- VALUE argv[5];
1661
-
1662
- // target
1663
- argv[0] = rb_ary_pop(value_stack);
1664
-
1665
- // operator_loc
1666
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1667
-
1668
- // value
1669
- argv[2] = rb_ary_pop(value_stack);
1670
-
1671
- // operator
1672
- argv[3] = rb_id2sym(constants[cast->operator - 1]);
1673
-
1674
- // location
1675
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
1676
-
1677
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPConstantPathOperatorWriteNode));
1678
- break;
1679
- }
1680
1414
  #line 137 "api_node.c.erb"
1681
1415
  case YP_NODE_CONSTANT_PATH_WRITE_NODE: {
1682
1416
  yp_constant_path_write_node_t *cast = (yp_constant_path_write_node_t *) node;
@@ -1741,11 +1475,11 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1741
1475
  // parameters
1742
1476
  argv[2] = rb_ary_pop(value_stack);
1743
1477
 
1744
- // statements
1478
+ // body
1745
1479
  argv[3] = rb_ary_pop(value_stack);
1746
1480
 
1747
1481
  // locals
1748
- argv[4] = rb_ary_new();
1482
+ argv[4] = rb_ary_new_capa(cast->locals.size);
1749
1483
  for (size_t index = 0; index < cast->locals.size; index++) {
1750
1484
  rb_ary_push(argv[4], rb_id2sym(constants[cast->locals.ids[index] - 1]));
1751
1485
  }
@@ -1896,7 +1630,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1896
1630
  argv[1] = rb_ary_pop(value_stack);
1897
1631
 
1898
1632
  // requireds
1899
- argv[2] = rb_ary_new();
1633
+ argv[2] = rb_ary_new_capa(cast->requireds.size);
1900
1634
  for (size_t index = 0; index < cast->requireds.size; index++) {
1901
1635
  rb_ary_push(argv[2], rb_ary_pop(value_stack));
1902
1636
  }
@@ -1916,6 +1650,29 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1916
1650
  rb_ary_push(value_stack, rb_class_new_instance(7, argv, rb_cYARPFindPatternNode));
1917
1651
  break;
1918
1652
  }
1653
+ #line 137 "api_node.c.erb"
1654
+ case YP_NODE_FLIP_FLOP_NODE: {
1655
+ yp_flip_flop_node_t *cast = (yp_flip_flop_node_t *) node;
1656
+ VALUE argv[5];
1657
+
1658
+ // left
1659
+ argv[0] = rb_ary_pop(value_stack);
1660
+
1661
+ // right
1662
+ argv[1] = rb_ary_pop(value_stack);
1663
+
1664
+ // operator_loc
1665
+ argv[2] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
1666
+
1667
+ // flags
1668
+ argv[3] = ULONG2NUM(node->flags >> 1);
1669
+
1670
+ // location
1671
+ argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
1672
+
1673
+ rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPFlipFlopNode));
1674
+ break;
1675
+ }
1919
1676
  #line 137 "api_node.c.erb"
1920
1677
  case YP_NODE_FLOAT_NODE: {
1921
1678
  VALUE argv[1];
@@ -1991,69 +1748,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
1991
1748
  rb_ary_push(value_stack, rb_class_new_instance(2, argv, rb_cYARPForwardingSuperNode));
1992
1749
  break;
1993
1750
  }
1994
- #line 137 "api_node.c.erb"
1995
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_AND_WRITE_NODE: {
1996
- yp_global_variable_operator_and_write_node_t *cast = (yp_global_variable_operator_and_write_node_t *) node;
1997
- VALUE argv[4];
1998
-
1999
- // name_loc
2000
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2001
-
2002
- // operator_loc
2003
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2004
-
2005
- // value
2006
- argv[2] = rb_ary_pop(value_stack);
2007
-
2008
- // location
2009
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
2010
-
2011
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPGlobalVariableOperatorAndWriteNode));
2012
- break;
2013
- }
2014
- #line 137 "api_node.c.erb"
2015
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_OR_WRITE_NODE: {
2016
- yp_global_variable_operator_or_write_node_t *cast = (yp_global_variable_operator_or_write_node_t *) node;
2017
- VALUE argv[4];
2018
-
2019
- // name_loc
2020
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2021
-
2022
- // operator_loc
2023
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2024
-
2025
- // value
2026
- argv[2] = rb_ary_pop(value_stack);
2027
-
2028
- // location
2029
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
2030
-
2031
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPGlobalVariableOperatorOrWriteNode));
2032
- break;
2033
- }
2034
- #line 137 "api_node.c.erb"
2035
- case YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
2036
- yp_global_variable_operator_write_node_t *cast = (yp_global_variable_operator_write_node_t *) node;
2037
- VALUE argv[5];
2038
-
2039
- // name_loc
2040
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2041
-
2042
- // operator_loc
2043
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2044
-
2045
- // value
2046
- argv[2] = rb_ary_pop(value_stack);
2047
-
2048
- // operator
2049
- argv[3] = rb_id2sym(constants[cast->operator - 1]);
2050
-
2051
- // location
2052
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
2053
-
2054
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPGlobalVariableOperatorWriteNode));
2055
- break;
2056
- }
2057
1751
  #line 137 "api_node.c.erb"
2058
1752
  case YP_NODE_GLOBAL_VARIABLE_READ_NODE: {
2059
1753
  VALUE argv[1];
@@ -2093,7 +1787,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2093
1787
  argv[0] = yp_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
2094
1788
 
2095
1789
  // elements
2096
- argv[1] = rb_ary_new();
1790
+ argv[1] = rb_ary_new_capa(cast->elements.size);
2097
1791
  for (size_t index = 0; index < cast->elements.size; index++) {
2098
1792
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2099
1793
  }
@@ -2116,7 +1810,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2116
1810
  argv[0] = rb_ary_pop(value_stack);
2117
1811
 
2118
1812
  // assocs
2119
- argv[1] = rb_ary_new();
1813
+ argv[1] = rb_ary_new_capa(cast->assocs.size);
2120
1814
  for (size_t index = 0; index < cast->assocs.size; index++) {
2121
1815
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2122
1816
  }
@@ -2198,69 +1892,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2198
1892
  rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPInNode));
2199
1893
  break;
2200
1894
  }
2201
- #line 137 "api_node.c.erb"
2202
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_AND_WRITE_NODE: {
2203
- yp_instance_variable_operator_and_write_node_t *cast = (yp_instance_variable_operator_and_write_node_t *) node;
2204
- VALUE argv[4];
2205
-
2206
- // name_loc
2207
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2208
-
2209
- // operator_loc
2210
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2211
-
2212
- // value
2213
- argv[2] = rb_ary_pop(value_stack);
2214
-
2215
- // location
2216
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
2217
-
2218
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPInstanceVariableOperatorAndWriteNode));
2219
- break;
2220
- }
2221
- #line 137 "api_node.c.erb"
2222
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_OR_WRITE_NODE: {
2223
- yp_instance_variable_operator_or_write_node_t *cast = (yp_instance_variable_operator_or_write_node_t *) node;
2224
- VALUE argv[4];
2225
-
2226
- // name_loc
2227
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2228
-
2229
- // operator_loc
2230
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2231
-
2232
- // value
2233
- argv[2] = rb_ary_pop(value_stack);
2234
-
2235
- // location
2236
- argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
2237
-
2238
- rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPInstanceVariableOperatorOrWriteNode));
2239
- break;
2240
- }
2241
- #line 137 "api_node.c.erb"
2242
- case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
2243
- yp_instance_variable_operator_write_node_t *cast = (yp_instance_variable_operator_write_node_t *) node;
2244
- VALUE argv[5];
2245
-
2246
- // name_loc
2247
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2248
-
2249
- // operator_loc
2250
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2251
-
2252
- // value
2253
- argv[2] = rb_ary_pop(value_stack);
2254
-
2255
- // operator
2256
- argv[3] = rb_id2sym(constants[cast->operator - 1]);
2257
-
2258
- // location
2259
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
2260
-
2261
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPInstanceVariableOperatorWriteNode));
2262
- break;
2263
- }
2264
1895
  #line 137 "api_node.c.erb"
2265
1896
  case YP_NODE_INSTANCE_VARIABLE_READ_NODE: {
2266
1897
  VALUE argv[1];
@@ -2310,7 +1941,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2310
1941
  argv[0] = yp_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
2311
1942
 
2312
1943
  // parts
2313
- argv[1] = rb_ary_new();
1944
+ argv[1] = rb_ary_new_capa(cast->parts.size);
2314
1945
  for (size_t index = 0; index < cast->parts.size; index++) {
2315
1946
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2316
1947
  }
@@ -2319,7 +1950,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2319
1950
  argv[2] = yp_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
2320
1951
 
2321
1952
  // flags
2322
- argv[3] = ULONG2NUM(cast->flags);
1953
+ argv[3] = ULONG2NUM(node->flags >> 1);
2323
1954
 
2324
1955
  // location
2325
1956
  argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
@@ -2336,7 +1967,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2336
1967
  argv[0] = cast->opening_loc.start == NULL ? Qnil : yp_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
2337
1968
 
2338
1969
  // parts
2339
- argv[1] = rb_ary_new();
1970
+ argv[1] = rb_ary_new_capa(cast->parts.size);
2340
1971
  for (size_t index = 0; index < cast->parts.size; index++) {
2341
1972
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2342
1973
  }
@@ -2359,7 +1990,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2359
1990
  argv[0] = cast->opening_loc.start == NULL ? Qnil : yp_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
2360
1991
 
2361
1992
  // parts
2362
- argv[1] = rb_ary_new();
1993
+ argv[1] = rb_ary_new_capa(cast->parts.size);
2363
1994
  for (size_t index = 0; index < cast->parts.size; index++) {
2364
1995
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2365
1996
  }
@@ -2382,7 +2013,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2382
2013
  argv[0] = yp_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
2383
2014
 
2384
2015
  // parts
2385
- argv[1] = rb_ary_new();
2016
+ argv[1] = rb_ary_new_capa(cast->parts.size);
2386
2017
  for (size_t index = 0; index < cast->parts.size; index++) {
2387
2018
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2388
2019
  }
@@ -2402,7 +2033,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2402
2033
  VALUE argv[2];
2403
2034
 
2404
2035
  // elements
2405
- argv[0] = rb_ary_new();
2036
+ argv[0] = rb_ary_new_capa(cast->elements.size);
2406
2037
  for (size_t index = 0; index < cast->elements.size; index++) {
2407
2038
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
2408
2039
  }
@@ -2453,7 +2084,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2453
2084
  VALUE argv[5];
2454
2085
 
2455
2086
  // locals
2456
- argv[0] = rb_ary_new();
2087
+ argv[0] = rb_ary_new_capa(cast->locals.size);
2457
2088
  for (size_t index = 0; index < cast->locals.size; index++) {
2458
2089
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
2459
2090
  }
@@ -2464,7 +2095,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2464
2095
  // parameters
2465
2096
  argv[2] = rb_ary_pop(value_stack);
2466
2097
 
2467
- // statements
2098
+ // body
2468
2099
  argv[3] = rb_ary_pop(value_stack);
2469
2100
 
2470
2101
  // location
@@ -2473,78 +2104,6 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2473
2104
  rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPLambdaNode));
2474
2105
  break;
2475
2106
  }
2476
- #line 137 "api_node.c.erb"
2477
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_AND_WRITE_NODE: {
2478
- yp_local_variable_operator_and_write_node_t *cast = (yp_local_variable_operator_and_write_node_t *) node;
2479
- VALUE argv[5];
2480
-
2481
- // name_loc
2482
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2483
-
2484
- // operator_loc
2485
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2486
-
2487
- // value
2488
- argv[2] = rb_ary_pop(value_stack);
2489
-
2490
- // constant_id
2491
- argv[3] = rb_id2sym(constants[cast->constant_id - 1]);
2492
-
2493
- // location
2494
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
2495
-
2496
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPLocalVariableOperatorAndWriteNode));
2497
- break;
2498
- }
2499
- #line 137 "api_node.c.erb"
2500
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_OR_WRITE_NODE: {
2501
- yp_local_variable_operator_or_write_node_t *cast = (yp_local_variable_operator_or_write_node_t *) node;
2502
- VALUE argv[5];
2503
-
2504
- // name_loc
2505
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2506
-
2507
- // operator_loc
2508
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2509
-
2510
- // value
2511
- argv[2] = rb_ary_pop(value_stack);
2512
-
2513
- // constant_id
2514
- argv[3] = rb_id2sym(constants[cast->constant_id - 1]);
2515
-
2516
- // location
2517
- argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
2518
-
2519
- rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPLocalVariableOperatorOrWriteNode));
2520
- break;
2521
- }
2522
- #line 137 "api_node.c.erb"
2523
- case YP_NODE_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
2524
- yp_local_variable_operator_write_node_t *cast = (yp_local_variable_operator_write_node_t *) node;
2525
- VALUE argv[6];
2526
-
2527
- // name_loc
2528
- argv[0] = yp_location_new(parser, cast->name_loc.start, cast->name_loc.end, source);
2529
-
2530
- // operator_loc
2531
- argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2532
-
2533
- // value
2534
- argv[2] = rb_ary_pop(value_stack);
2535
-
2536
- // constant_id
2537
- argv[3] = rb_id2sym(constants[cast->constant_id - 1]);
2538
-
2539
- // operator_id
2540
- argv[4] = rb_id2sym(constants[cast->operator_id - 1]);
2541
-
2542
- // location
2543
- argv[5] = yp_location_new(parser, node->location.start, node->location.end, source);
2544
-
2545
- rb_ary_push(value_stack, rb_class_new_instance(6, argv, rb_cYARPLocalVariableOperatorWriteNode));
2546
- break;
2547
- }
2548
2107
  #line 137 "api_node.c.erb"
2549
2108
  case YP_NODE_LOCAL_VARIABLE_READ_NODE: {
2550
2109
  yp_local_variable_read_node_t *cast = (yp_local_variable_read_node_t *) node;
@@ -2644,7 +2203,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2644
2203
  VALUE argv[6];
2645
2204
 
2646
2205
  // locals
2647
- argv[0] = rb_ary_new();
2206
+ argv[0] = rb_ary_new_capa(cast->locals.size);
2648
2207
  for (size_t index = 0; index < cast->locals.size; index++) {
2649
2208
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
2650
2209
  }
@@ -2655,7 +2214,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2655
2214
  // constant_path
2656
2215
  argv[2] = rb_ary_pop(value_stack);
2657
2216
 
2658
- // statements
2217
+ // body
2659
2218
  argv[3] = rb_ary_pop(value_stack);
2660
2219
 
2661
2220
  // end_keyword_loc
@@ -2673,7 +2232,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2673
2232
  VALUE argv[6];
2674
2233
 
2675
2234
  // targets
2676
- argv[0] = rb_ary_new();
2235
+ argv[0] = rb_ary_new_capa(cast->targets.size);
2677
2236
  for (size_t index = 0; index < cast->targets.size; index++) {
2678
2237
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
2679
2238
  }
@@ -2750,6 +2309,29 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2750
2309
  rb_ary_push(value_stack, rb_class_new_instance(1, argv, rb_cYARPNumberedReferenceReadNode));
2751
2310
  break;
2752
2311
  }
2312
+ #line 137 "api_node.c.erb"
2313
+ case YP_NODE_OPERATOR_WRITE_NODE: {
2314
+ yp_operator_write_node_t *cast = (yp_operator_write_node_t *) node;
2315
+ VALUE argv[5];
2316
+
2317
+ // target
2318
+ argv[0] = rb_ary_pop(value_stack);
2319
+
2320
+ // operator_loc
2321
+ argv[1] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2322
+
2323
+ // operator
2324
+ argv[2] = rb_id2sym(constants[cast->operator - 1]);
2325
+
2326
+ // value
2327
+ argv[3] = rb_ary_pop(value_stack);
2328
+
2329
+ // location
2330
+ argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
2331
+
2332
+ rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cYARPOperatorWriteNode));
2333
+ break;
2334
+ }
2753
2335
  #line 137 "api_node.c.erb"
2754
2336
  case YP_NODE_OPTIONAL_PARAMETER_NODE: {
2755
2337
  yp_optional_parameter_node_t *cast = (yp_optional_parameter_node_t *) node;
@@ -2793,25 +2375,45 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2793
2375
  rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPOrNode));
2794
2376
  break;
2795
2377
  }
2378
+ #line 137 "api_node.c.erb"
2379
+ case YP_NODE_OR_WRITE_NODE: {
2380
+ yp_or_write_node_t *cast = (yp_or_write_node_t *) node;
2381
+ VALUE argv[4];
2382
+
2383
+ // target
2384
+ argv[0] = rb_ary_pop(value_stack);
2385
+
2386
+ // value
2387
+ argv[1] = rb_ary_pop(value_stack);
2388
+
2389
+ // operator_loc
2390
+ argv[2] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2391
+
2392
+ // location
2393
+ argv[3] = yp_location_new(parser, node->location.start, node->location.end, source);
2394
+
2395
+ rb_ary_push(value_stack, rb_class_new_instance(4, argv, rb_cYARPOrWriteNode));
2396
+ break;
2397
+ }
2796
2398
  #line 137 "api_node.c.erb"
2797
2399
  case YP_NODE_PARAMETERS_NODE: {
2798
2400
  yp_parameters_node_t *cast = (yp_parameters_node_t *) node;
2799
2401
  VALUE argv[8];
2800
2402
 
2801
2403
  // requireds
2802
- argv[0] = rb_ary_new();
2404
+ argv[0] = rb_ary_new_capa(cast->requireds.size);
2803
2405
  for (size_t index = 0; index < cast->requireds.size; index++) {
2804
2406
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
2805
2407
  }
2806
2408
 
2807
2409
  // optionals
2808
- argv[1] = rb_ary_new();
2410
+ argv[1] = rb_ary_new_capa(cast->optionals.size);
2809
2411
  for (size_t index = 0; index < cast->optionals.size; index++) {
2810
2412
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
2811
2413
  }
2812
2414
 
2813
2415
  // posts
2814
- argv[2] = rb_ary_new();
2416
+ argv[2] = rb_ary_new_capa(cast->posts.size);
2815
2417
  for (size_t index = 0; index < cast->posts.size; index++) {
2816
2418
  rb_ary_push(argv[2], rb_ary_pop(value_stack));
2817
2419
  }
@@ -2820,7 +2422,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2820
2422
  argv[3] = rb_ary_pop(value_stack);
2821
2423
 
2822
2424
  // keywords
2823
- argv[4] = rb_ary_new();
2425
+ argv[4] = rb_ary_new_capa(cast->keywords.size);
2824
2426
  for (size_t index = 0; index < cast->keywords.size; index++) {
2825
2427
  rb_ary_push(argv[4], rb_ary_pop(value_stack));
2826
2428
  }
@@ -2842,7 +2444,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2842
2444
  yp_parentheses_node_t *cast = (yp_parentheses_node_t *) node;
2843
2445
  VALUE argv[4];
2844
2446
 
2845
- // statements
2447
+ // body
2846
2448
  argv[0] = rb_ary_pop(value_stack);
2847
2449
 
2848
2450
  // opening_loc
@@ -2949,7 +2551,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2949
2551
  VALUE argv[3];
2950
2552
 
2951
2553
  // locals
2952
- argv[0] = rb_ary_new();
2554
+ argv[0] = rb_ary_new_capa(cast->locals.size);
2953
2555
  for (size_t index = 0; index < cast->locals.size; index++) {
2954
2556
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
2955
2557
  }
@@ -2978,7 +2580,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
2978
2580
  argv[2] = yp_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
2979
2581
 
2980
2582
  // flags
2981
- argv[3] = ULONG2NUM(cast->flags);
2583
+ argv[3] = ULONG2NUM(node->flags >> 1);
2982
2584
 
2983
2585
  // location
2984
2586
  argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
@@ -3027,7 +2629,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3027
2629
  argv[3] = yp_string_new(&cast->unescaped, encoding);
3028
2630
 
3029
2631
  // flags
3030
- argv[4] = ULONG2NUM(cast->flags);
2632
+ argv[4] = ULONG2NUM(node->flags >> 1);
3031
2633
 
3032
2634
  // location
3033
2635
  argv[5] = yp_location_new(parser, node->location.start, node->location.end, source);
@@ -3041,7 +2643,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3041
2643
  VALUE argv[4];
3042
2644
 
3043
2645
  // parameters
3044
- argv[0] = rb_ary_new();
2646
+ argv[0] = rb_ary_new_capa(cast->parameters.size);
3045
2647
  for (size_t index = 0; index < cast->parameters.size; index++) {
3046
2648
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
3047
2649
  }
@@ -3101,7 +2703,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3101
2703
  argv[0] = yp_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source);
3102
2704
 
3103
2705
  // exceptions
3104
- argv[1] = rb_ary_new();
2706
+ argv[1] = rb_ary_new_capa(cast->exceptions.size);
3105
2707
  for (size_t index = 0; index < cast->exceptions.size; index++) {
3106
2708
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
3107
2709
  }
@@ -3184,7 +2786,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3184
2786
  VALUE argv[7];
3185
2787
 
3186
2788
  // locals
3187
- argv[0] = rb_ary_new();
2789
+ argv[0] = rb_ary_new_capa(cast->locals.size);
3188
2790
  for (size_t index = 0; index < cast->locals.size; index++) {
3189
2791
  rb_ary_push(argv[0], rb_id2sym(constants[cast->locals.ids[index] - 1]));
3190
2792
  }
@@ -3198,7 +2800,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3198
2800
  // expression
3199
2801
  argv[3] = rb_ary_pop(value_stack);
3200
2802
 
3201
- // statements
2803
+ // body
3202
2804
  argv[4] = rb_ary_pop(value_stack);
3203
2805
 
3204
2806
  // end_keyword_loc
@@ -3267,7 +2869,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3267
2869
  VALUE argv[2];
3268
2870
 
3269
2871
  // body
3270
- argv[0] = rb_ary_new();
2872
+ argv[0] = rb_ary_new_capa(cast->body.size);
3271
2873
  for (size_t index = 0; index < cast->body.size; index++) {
3272
2874
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
3273
2875
  }
@@ -3382,7 +2984,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3382
2984
  VALUE argv[3];
3383
2985
 
3384
2986
  // names
3385
- argv[0] = rb_ary_new();
2987
+ argv[0] = rb_ary_new_capa(cast->names.size);
3386
2988
  for (size_t index = 0; index < cast->names.size; index++) {
3387
2989
  rb_ary_push(argv[0], rb_ary_pop(value_stack));
3388
2990
  }
@@ -3437,7 +3039,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3437
3039
  argv[2] = rb_ary_pop(value_stack);
3438
3040
 
3439
3041
  // flags
3440
- argv[3] = ULONG2NUM(cast->flags);
3042
+ argv[3] = ULONG2NUM(node->flags >> 1);
3441
3043
 
3442
3044
  // location
3443
3045
  argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
@@ -3454,7 +3056,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3454
3056
  argv[0] = yp_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source);
3455
3057
 
3456
3058
  // conditions
3457
- argv[1] = rb_ary_new();
3059
+ argv[1] = rb_ary_new_capa(cast->conditions.size);
3458
3060
  for (size_t index = 0; index < cast->conditions.size; index++) {
3459
3061
  rb_ary_push(argv[1], rb_ary_pop(value_stack));
3460
3062
  }
@@ -3483,7 +3085,7 @@ yp_ast_new(yp_parser_t *parser, yp_node_t *node, rb_encoding *encoding) {
3483
3085
  argv[2] = rb_ary_pop(value_stack);
3484
3086
 
3485
3087
  // flags
3486
- argv[3] = ULONG2NUM(cast->flags);
3088
+ argv[3] = ULONG2NUM(node->flags >> 1);
3487
3089
 
3488
3090
  // location
3489
3091
  argv[4] = yp_location_new(parser, node->location.start, node->location.end, source);
@@ -3553,6 +3155,7 @@ Init_yarp_api_node(void) {
3553
3155
  rb_cYARPAliasNode = rb_define_class_under(rb_cYARP, "AliasNode", rb_cYARPNode);
3554
3156
  rb_cYARPAlternationPatternNode = rb_define_class_under(rb_cYARP, "AlternationPatternNode", rb_cYARPNode);
3555
3157
  rb_cYARPAndNode = rb_define_class_under(rb_cYARP, "AndNode", rb_cYARPNode);
3158
+ rb_cYARPAndWriteNode = rb_define_class_under(rb_cYARP, "AndWriteNode", rb_cYARPNode);
3556
3159
  rb_cYARPArgumentsNode = rb_define_class_under(rb_cYARP, "ArgumentsNode", rb_cYARPNode);
3557
3160
  rb_cYARPArrayNode = rb_define_class_under(rb_cYARP, "ArrayNode", rb_cYARPNode);
3558
3161
  rb_cYARPArrayPatternNode = rb_define_class_under(rb_cYARP, "ArrayPatternNode", rb_cYARPNode);
@@ -3572,18 +3175,9 @@ Init_yarp_api_node(void) {
3572
3175
  rb_cYARPCapturePatternNode = rb_define_class_under(rb_cYARP, "CapturePatternNode", rb_cYARPNode);
3573
3176
  rb_cYARPCaseNode = rb_define_class_under(rb_cYARP, "CaseNode", rb_cYARPNode);
3574
3177
  rb_cYARPClassNode = rb_define_class_under(rb_cYARP, "ClassNode", rb_cYARPNode);
3575
- rb_cYARPClassVariableOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "ClassVariableOperatorAndWriteNode", rb_cYARPNode);
3576
- rb_cYARPClassVariableOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "ClassVariableOperatorOrWriteNode", rb_cYARPNode);
3577
- rb_cYARPClassVariableOperatorWriteNode = rb_define_class_under(rb_cYARP, "ClassVariableOperatorWriteNode", rb_cYARPNode);
3578
3178
  rb_cYARPClassVariableReadNode = rb_define_class_under(rb_cYARP, "ClassVariableReadNode", rb_cYARPNode);
3579
3179
  rb_cYARPClassVariableWriteNode = rb_define_class_under(rb_cYARP, "ClassVariableWriteNode", rb_cYARPNode);
3580
- rb_cYARPConstantOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "ConstantOperatorAndWriteNode", rb_cYARPNode);
3581
- rb_cYARPConstantOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "ConstantOperatorOrWriteNode", rb_cYARPNode);
3582
- rb_cYARPConstantOperatorWriteNode = rb_define_class_under(rb_cYARP, "ConstantOperatorWriteNode", rb_cYARPNode);
3583
3180
  rb_cYARPConstantPathNode = rb_define_class_under(rb_cYARP, "ConstantPathNode", rb_cYARPNode);
3584
- rb_cYARPConstantPathOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "ConstantPathOperatorAndWriteNode", rb_cYARPNode);
3585
- rb_cYARPConstantPathOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "ConstantPathOperatorOrWriteNode", rb_cYARPNode);
3586
- rb_cYARPConstantPathOperatorWriteNode = rb_define_class_under(rb_cYARP, "ConstantPathOperatorWriteNode", rb_cYARPNode);
3587
3181
  rb_cYARPConstantPathWriteNode = rb_define_class_under(rb_cYARP, "ConstantPathWriteNode", rb_cYARPNode);
3588
3182
  rb_cYARPConstantReadNode = rb_define_class_under(rb_cYARP, "ConstantReadNode", rb_cYARPNode);
3589
3183
  rb_cYARPConstantWriteNode = rb_define_class_under(rb_cYARP, "ConstantWriteNode", rb_cYARPNode);
@@ -3595,14 +3189,12 @@ Init_yarp_api_node(void) {
3595
3189
  rb_cYARPEnsureNode = rb_define_class_under(rb_cYARP, "EnsureNode", rb_cYARPNode);
3596
3190
  rb_cYARPFalseNode = rb_define_class_under(rb_cYARP, "FalseNode", rb_cYARPNode);
3597
3191
  rb_cYARPFindPatternNode = rb_define_class_under(rb_cYARP, "FindPatternNode", rb_cYARPNode);
3192
+ rb_cYARPFlipFlopNode = rb_define_class_under(rb_cYARP, "FlipFlopNode", rb_cYARPNode);
3598
3193
  rb_cYARPFloatNode = rb_define_class_under(rb_cYARP, "FloatNode", rb_cYARPNode);
3599
3194
  rb_cYARPForNode = rb_define_class_under(rb_cYARP, "ForNode", rb_cYARPNode);
3600
3195
  rb_cYARPForwardingArgumentsNode = rb_define_class_under(rb_cYARP, "ForwardingArgumentsNode", rb_cYARPNode);
3601
3196
  rb_cYARPForwardingParameterNode = rb_define_class_under(rb_cYARP, "ForwardingParameterNode", rb_cYARPNode);
3602
3197
  rb_cYARPForwardingSuperNode = rb_define_class_under(rb_cYARP, "ForwardingSuperNode", rb_cYARPNode);
3603
- rb_cYARPGlobalVariableOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "GlobalVariableOperatorAndWriteNode", rb_cYARPNode);
3604
- rb_cYARPGlobalVariableOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "GlobalVariableOperatorOrWriteNode", rb_cYARPNode);
3605
- rb_cYARPGlobalVariableOperatorWriteNode = rb_define_class_under(rb_cYARP, "GlobalVariableOperatorWriteNode", rb_cYARPNode);
3606
3198
  rb_cYARPGlobalVariableReadNode = rb_define_class_under(rb_cYARP, "GlobalVariableReadNode", rb_cYARPNode);
3607
3199
  rb_cYARPGlobalVariableWriteNode = rb_define_class_under(rb_cYARP, "GlobalVariableWriteNode", rb_cYARPNode);
3608
3200
  rb_cYARPHashNode = rb_define_class_under(rb_cYARP, "HashNode", rb_cYARPNode);
@@ -3610,9 +3202,6 @@ Init_yarp_api_node(void) {
3610
3202
  rb_cYARPIfNode = rb_define_class_under(rb_cYARP, "IfNode", rb_cYARPNode);
3611
3203
  rb_cYARPImaginaryNode = rb_define_class_under(rb_cYARP, "ImaginaryNode", rb_cYARPNode);
3612
3204
  rb_cYARPInNode = rb_define_class_under(rb_cYARP, "InNode", rb_cYARPNode);
3613
- rb_cYARPInstanceVariableOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "InstanceVariableOperatorAndWriteNode", rb_cYARPNode);
3614
- rb_cYARPInstanceVariableOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "InstanceVariableOperatorOrWriteNode", rb_cYARPNode);
3615
- rb_cYARPInstanceVariableOperatorWriteNode = rb_define_class_under(rb_cYARP, "InstanceVariableOperatorWriteNode", rb_cYARPNode);
3616
3205
  rb_cYARPInstanceVariableReadNode = rb_define_class_under(rb_cYARP, "InstanceVariableReadNode", rb_cYARPNode);
3617
3206
  rb_cYARPInstanceVariableWriteNode = rb_define_class_under(rb_cYARP, "InstanceVariableWriteNode", rb_cYARPNode);
3618
3207
  rb_cYARPIntegerNode = rb_define_class_under(rb_cYARP, "IntegerNode", rb_cYARPNode);
@@ -3624,9 +3213,6 @@ Init_yarp_api_node(void) {
3624
3213
  rb_cYARPKeywordParameterNode = rb_define_class_under(rb_cYARP, "KeywordParameterNode", rb_cYARPNode);
3625
3214
  rb_cYARPKeywordRestParameterNode = rb_define_class_under(rb_cYARP, "KeywordRestParameterNode", rb_cYARPNode);
3626
3215
  rb_cYARPLambdaNode = rb_define_class_under(rb_cYARP, "LambdaNode", rb_cYARPNode);
3627
- rb_cYARPLocalVariableOperatorAndWriteNode = rb_define_class_under(rb_cYARP, "LocalVariableOperatorAndWriteNode", rb_cYARPNode);
3628
- rb_cYARPLocalVariableOperatorOrWriteNode = rb_define_class_under(rb_cYARP, "LocalVariableOperatorOrWriteNode", rb_cYARPNode);
3629
- rb_cYARPLocalVariableOperatorWriteNode = rb_define_class_under(rb_cYARP, "LocalVariableOperatorWriteNode", rb_cYARPNode);
3630
3216
  rb_cYARPLocalVariableReadNode = rb_define_class_under(rb_cYARP, "LocalVariableReadNode", rb_cYARPNode);
3631
3217
  rb_cYARPLocalVariableWriteNode = rb_define_class_under(rb_cYARP, "LocalVariableWriteNode", rb_cYARPNode);
3632
3218
  rb_cYARPMatchPredicateNode = rb_define_class_under(rb_cYARP, "MatchPredicateNode", rb_cYARPNode);
@@ -3638,8 +3224,10 @@ Init_yarp_api_node(void) {
3638
3224
  rb_cYARPNilNode = rb_define_class_under(rb_cYARP, "NilNode", rb_cYARPNode);
3639
3225
  rb_cYARPNoKeywordsParameterNode = rb_define_class_under(rb_cYARP, "NoKeywordsParameterNode", rb_cYARPNode);
3640
3226
  rb_cYARPNumberedReferenceReadNode = rb_define_class_under(rb_cYARP, "NumberedReferenceReadNode", rb_cYARPNode);
3227
+ rb_cYARPOperatorWriteNode = rb_define_class_under(rb_cYARP, "OperatorWriteNode", rb_cYARPNode);
3641
3228
  rb_cYARPOptionalParameterNode = rb_define_class_under(rb_cYARP, "OptionalParameterNode", rb_cYARPNode);
3642
3229
  rb_cYARPOrNode = rb_define_class_under(rb_cYARP, "OrNode", rb_cYARPNode);
3230
+ rb_cYARPOrWriteNode = rb_define_class_under(rb_cYARP, "OrWriteNode", rb_cYARPNode);
3643
3231
  rb_cYARPParametersNode = rb_define_class_under(rb_cYARP, "ParametersNode", rb_cYARPNode);
3644
3232
  rb_cYARPParenthesesNode = rb_define_class_under(rb_cYARP, "ParenthesesNode", rb_cYARPNode);
3645
3233
  rb_cYARPPinnedExpressionNode = rb_define_class_under(rb_cYARP, "PinnedExpressionNode", rb_cYARPNode);