prism 0.13.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -1
- data/README.md +4 -1
- data/config.yml +96 -35
- data/docs/fuzzing.md +5 -10
- data/docs/prism.png +0 -0
- data/docs/serialization.md +10 -0
- data/ext/prism/api_node.c +239 -86
- data/ext/prism/extension.c +35 -48
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +170 -118
- data/include/prism/diagnostic.h +1 -0
- data/include/prism/node.h +8 -0
- data/include/prism/parser.h +26 -0
- data/include/prism/util/pm_buffer.h +3 -0
- data/include/prism/util/pm_constant_pool.h +21 -2
- data/include/prism/util/pm_string.h +2 -1
- data/include/prism/version.h +2 -2
- data/include/prism.h +1 -2
- data/lib/prism/compiler.rb +150 -141
- data/lib/prism/debug.rb +30 -26
- data/lib/prism/dispatcher.rb +42 -0
- data/lib/prism/dsl.rb +23 -8
- data/lib/prism/ffi.rb +4 -4
- data/lib/prism/lex_compat.rb +42 -8
- data/lib/prism/mutation_compiler.rb +18 -3
- data/lib/prism/node.rb +2061 -191
- data/lib/prism/node_ext.rb +44 -0
- data/lib/prism/parse_result.rb +32 -5
- data/lib/prism/pattern.rb +1 -1
- data/lib/prism/serialize.rb +95 -87
- data/lib/prism/visitor.rb +9 -0
- data/prism.gemspec +2 -3
- data/src/diagnostic.c +2 -1
- data/src/node.c +99 -32
- data/src/prettyprint.c +137 -80
- data/src/prism.c +1960 -843
- data/src/serialize.c +140 -79
- data/src/util/pm_buffer.c +9 -7
- data/src/util/pm_constant_pool.c +25 -11
- metadata +3 -4
- data/include/prism/unescape.h +0 -48
- data/src/unescape.c +0 -637
data/ext/prism/api_node.c
CHANGED
@@ -82,6 +82,9 @@ static VALUE rb_cPrismIfNode;
|
|
82
82
|
static VALUE rb_cPrismImaginaryNode;
|
83
83
|
static VALUE rb_cPrismImplicitNode;
|
84
84
|
static VALUE rb_cPrismInNode;
|
85
|
+
static VALUE rb_cPrismIndexAndWriteNode;
|
86
|
+
static VALUE rb_cPrismIndexOperatorWriteNode;
|
87
|
+
static VALUE rb_cPrismIndexOrWriteNode;
|
85
88
|
static VALUE rb_cPrismInstanceVariableAndWriteNode;
|
86
89
|
static VALUE rb_cPrismInstanceVariableOperatorWriteNode;
|
87
90
|
static VALUE rb_cPrismInstanceVariableOrWriteNode;
|
@@ -358,7 +361,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
358
361
|
case PM_CALL_AND_WRITE_NODE: {
|
359
362
|
pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
|
360
363
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
361
|
-
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
362
364
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
363
365
|
break;
|
364
366
|
}
|
@@ -374,7 +376,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
374
376
|
case PM_CALL_OPERATOR_WRITE_NODE: {
|
375
377
|
pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
|
376
378
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
377
|
-
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
378
379
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
379
380
|
break;
|
380
381
|
}
|
@@ -382,7 +383,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
382
383
|
case PM_CALL_OR_WRITE_NODE: {
|
383
384
|
pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
|
384
385
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
385
|
-
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
386
386
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
387
387
|
break;
|
388
388
|
}
|
@@ -640,6 +640,33 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
640
640
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
|
641
641
|
break;
|
642
642
|
}
|
643
|
+
#line 108 "api_node.c.erb"
|
644
|
+
case PM_INDEX_AND_WRITE_NODE: {
|
645
|
+
pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
|
646
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
647
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
648
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
|
649
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
650
|
+
break;
|
651
|
+
}
|
652
|
+
#line 108 "api_node.c.erb"
|
653
|
+
case PM_INDEX_OPERATOR_WRITE_NODE: {
|
654
|
+
pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
|
655
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
656
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
657
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
|
658
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
659
|
+
break;
|
660
|
+
}
|
661
|
+
#line 108 "api_node.c.erb"
|
662
|
+
case PM_INDEX_OR_WRITE_NODE: {
|
663
|
+
pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
|
664
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
|
665
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
|
666
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
|
667
|
+
pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
|
668
|
+
break;
|
669
|
+
}
|
643
670
|
#line 108 "api_node.c.erb"
|
644
671
|
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
|
645
672
|
pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
|
@@ -1222,12 +1249,18 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1222
1249
|
}
|
1223
1250
|
#line 134 "api_node.c.erb"
|
1224
1251
|
case PM_BACK_REFERENCE_READ_NODE: {
|
1225
|
-
|
1252
|
+
pm_back_reference_read_node_t *cast = (pm_back_reference_read_node_t *) node;
|
1253
|
+
VALUE argv[2];
|
1254
|
+
|
1255
|
+
// name
|
1256
|
+
#line 157 "api_node.c.erb"
|
1257
|
+
assert(cast->name != 0);
|
1258
|
+
argv[0] = rb_id2sym(constants[cast->name - 1]);
|
1226
1259
|
|
1227
1260
|
// location
|
1228
|
-
argv[
|
1261
|
+
argv[1] = pm_location_new(parser, node->location.start, node->location.end, source);
|
1229
1262
|
|
1230
|
-
rb_ary_push(value_stack, rb_class_new_instance(
|
1263
|
+
rb_ary_push(value_stack, rb_class_new_instance(2, argv, rb_cPrismBackReferenceReadNode));
|
1231
1264
|
break;
|
1232
1265
|
}
|
1233
1266
|
#line 134 "api_node.c.erb"
|
@@ -1409,7 +1442,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1409
1442
|
#line 134 "api_node.c.erb"
|
1410
1443
|
case PM_CALL_AND_WRITE_NODE: {
|
1411
1444
|
pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
|
1412
|
-
VALUE argv[
|
1445
|
+
VALUE argv[9];
|
1413
1446
|
|
1414
1447
|
// receiver
|
1415
1448
|
#line 145 "api_node.c.erb"
|
@@ -1423,42 +1456,32 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1423
1456
|
#line 173 "api_node.c.erb"
|
1424
1457
|
argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
|
1425
1458
|
|
1426
|
-
// opening_loc
|
1427
|
-
#line 173 "api_node.c.erb"
|
1428
|
-
argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
1429
|
-
|
1430
|
-
// arguments
|
1431
|
-
#line 145 "api_node.c.erb"
|
1432
|
-
argv[4] = rb_ary_pop(value_stack);
|
1433
|
-
|
1434
|
-
// closing_loc
|
1435
|
-
#line 173 "api_node.c.erb"
|
1436
|
-
argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
1437
|
-
|
1438
1459
|
// flags
|
1439
1460
|
#line 179 "api_node.c.erb"
|
1440
|
-
argv[
|
1461
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
1441
1462
|
|
1442
1463
|
// read_name
|
1443
|
-
#line
|
1444
|
-
|
1464
|
+
#line 157 "api_node.c.erb"
|
1465
|
+
assert(cast->read_name != 0);
|
1466
|
+
argv[4] = rb_id2sym(constants[cast->read_name - 1]);
|
1445
1467
|
|
1446
1468
|
// write_name
|
1447
|
-
#line
|
1448
|
-
|
1469
|
+
#line 157 "api_node.c.erb"
|
1470
|
+
assert(cast->write_name != 0);
|
1471
|
+
argv[5] = rb_id2sym(constants[cast->write_name - 1]);
|
1449
1472
|
|
1450
1473
|
// operator_loc
|
1451
1474
|
#line 170 "api_node.c.erb"
|
1452
|
-
argv[
|
1475
|
+
argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
1453
1476
|
|
1454
1477
|
// value
|
1455
1478
|
#line 145 "api_node.c.erb"
|
1456
|
-
argv[
|
1479
|
+
argv[7] = rb_ary_pop(value_stack);
|
1457
1480
|
|
1458
1481
|
// location
|
1459
|
-
argv[
|
1482
|
+
argv[8] = pm_location_new(parser, node->location.start, node->location.end, source);
|
1460
1483
|
|
1461
|
-
rb_ary_push(value_stack, rb_class_new_instance(
|
1484
|
+
rb_ary_push(value_stack, rb_class_new_instance(9, argv, rb_cPrismCallAndWriteNode));
|
1462
1485
|
break;
|
1463
1486
|
}
|
1464
1487
|
#line 134 "api_node.c.erb"
|
@@ -1496,11 +1519,12 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1496
1519
|
|
1497
1520
|
// flags
|
1498
1521
|
#line 179 "api_node.c.erb"
|
1499
|
-
argv[7] = ULONG2NUM(node->flags
|
1522
|
+
argv[7] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
1500
1523
|
|
1501
1524
|
// name
|
1502
|
-
#line
|
1503
|
-
|
1525
|
+
#line 157 "api_node.c.erb"
|
1526
|
+
assert(cast->name != 0);
|
1527
|
+
argv[8] = rb_id2sym(constants[cast->name - 1]);
|
1504
1528
|
|
1505
1529
|
// location
|
1506
1530
|
argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -1511,7 +1535,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1511
1535
|
#line 134 "api_node.c.erb"
|
1512
1536
|
case PM_CALL_OPERATOR_WRITE_NODE: {
|
1513
1537
|
pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
|
1514
|
-
VALUE argv[
|
1538
|
+
VALUE argv[10];
|
1515
1539
|
|
1516
1540
|
// receiver
|
1517
1541
|
#line 145 "api_node.c.erb"
|
@@ -1525,53 +1549,43 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1525
1549
|
#line 173 "api_node.c.erb"
|
1526
1550
|
argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
|
1527
1551
|
|
1528
|
-
// opening_loc
|
1529
|
-
#line 173 "api_node.c.erb"
|
1530
|
-
argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
1531
|
-
|
1532
|
-
// arguments
|
1533
|
-
#line 145 "api_node.c.erb"
|
1534
|
-
argv[4] = rb_ary_pop(value_stack);
|
1535
|
-
|
1536
|
-
// closing_loc
|
1537
|
-
#line 173 "api_node.c.erb"
|
1538
|
-
argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
1539
|
-
|
1540
1552
|
// flags
|
1541
1553
|
#line 179 "api_node.c.erb"
|
1542
|
-
argv[
|
1554
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
1543
1555
|
|
1544
1556
|
// read_name
|
1545
|
-
#line
|
1546
|
-
|
1557
|
+
#line 157 "api_node.c.erb"
|
1558
|
+
assert(cast->read_name != 0);
|
1559
|
+
argv[4] = rb_id2sym(constants[cast->read_name - 1]);
|
1547
1560
|
|
1548
1561
|
// write_name
|
1549
|
-
#line
|
1550
|
-
|
1562
|
+
#line 157 "api_node.c.erb"
|
1563
|
+
assert(cast->write_name != 0);
|
1564
|
+
argv[5] = rb_id2sym(constants[cast->write_name - 1]);
|
1551
1565
|
|
1552
1566
|
// operator
|
1553
1567
|
#line 157 "api_node.c.erb"
|
1554
1568
|
assert(cast->operator != 0);
|
1555
|
-
argv[
|
1569
|
+
argv[6] = rb_id2sym(constants[cast->operator - 1]);
|
1556
1570
|
|
1557
1571
|
// operator_loc
|
1558
1572
|
#line 170 "api_node.c.erb"
|
1559
|
-
argv[
|
1573
|
+
argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
1560
1574
|
|
1561
1575
|
// value
|
1562
1576
|
#line 145 "api_node.c.erb"
|
1563
|
-
argv[
|
1577
|
+
argv[8] = rb_ary_pop(value_stack);
|
1564
1578
|
|
1565
1579
|
// location
|
1566
|
-
argv[
|
1580
|
+
argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
|
1567
1581
|
|
1568
|
-
rb_ary_push(value_stack, rb_class_new_instance(
|
1582
|
+
rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismCallOperatorWriteNode));
|
1569
1583
|
break;
|
1570
1584
|
}
|
1571
1585
|
#line 134 "api_node.c.erb"
|
1572
1586
|
case PM_CALL_OR_WRITE_NODE: {
|
1573
1587
|
pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
|
1574
|
-
VALUE argv[
|
1588
|
+
VALUE argv[9];
|
1575
1589
|
|
1576
1590
|
// receiver
|
1577
1591
|
#line 145 "api_node.c.erb"
|
@@ -1585,42 +1599,32 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
1585
1599
|
#line 173 "api_node.c.erb"
|
1586
1600
|
argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
|
1587
1601
|
|
1588
|
-
// opening_loc
|
1589
|
-
#line 173 "api_node.c.erb"
|
1590
|
-
argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
1591
|
-
|
1592
|
-
// arguments
|
1593
|
-
#line 145 "api_node.c.erb"
|
1594
|
-
argv[4] = rb_ary_pop(value_stack);
|
1595
|
-
|
1596
|
-
// closing_loc
|
1597
|
-
#line 173 "api_node.c.erb"
|
1598
|
-
argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
1599
|
-
|
1600
1602
|
// flags
|
1601
1603
|
#line 179 "api_node.c.erb"
|
1602
|
-
argv[
|
1604
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
1603
1605
|
|
1604
1606
|
// read_name
|
1605
|
-
#line
|
1606
|
-
|
1607
|
+
#line 157 "api_node.c.erb"
|
1608
|
+
assert(cast->read_name != 0);
|
1609
|
+
argv[4] = rb_id2sym(constants[cast->read_name - 1]);
|
1607
1610
|
|
1608
1611
|
// write_name
|
1609
|
-
#line
|
1610
|
-
|
1612
|
+
#line 157 "api_node.c.erb"
|
1613
|
+
assert(cast->write_name != 0);
|
1614
|
+
argv[5] = rb_id2sym(constants[cast->write_name - 1]);
|
1611
1615
|
|
1612
1616
|
// operator_loc
|
1613
1617
|
#line 170 "api_node.c.erb"
|
1614
|
-
argv[
|
1618
|
+
argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
1615
1619
|
|
1616
1620
|
// value
|
1617
1621
|
#line 145 "api_node.c.erb"
|
1618
|
-
argv[
|
1622
|
+
argv[7] = rb_ary_pop(value_stack);
|
1619
1623
|
|
1620
1624
|
// location
|
1621
|
-
argv[
|
1625
|
+
argv[8] = pm_location_new(parser, node->location.start, node->location.end, source);
|
1622
1626
|
|
1623
|
-
rb_ary_push(value_stack, rb_class_new_instance(
|
1627
|
+
rb_ary_push(value_stack, rb_class_new_instance(9, argv, rb_cPrismCallOrWriteNode));
|
1624
1628
|
break;
|
1625
1629
|
}
|
1626
1630
|
#line 134 "api_node.c.erb"
|
@@ -2415,7 +2419,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
2415
2419
|
|
2416
2420
|
// flags
|
2417
2421
|
#line 179 "api_node.c.erb"
|
2418
|
-
argv[3] = ULONG2NUM(node->flags
|
2422
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2419
2423
|
|
2420
2424
|
// location
|
2421
2425
|
argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -2801,6 +2805,152 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
2801
2805
|
rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cPrismInNode));
|
2802
2806
|
break;
|
2803
2807
|
}
|
2808
|
+
#line 134 "api_node.c.erb"
|
2809
|
+
case PM_INDEX_AND_WRITE_NODE: {
|
2810
|
+
pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
|
2811
|
+
VALUE argv[10];
|
2812
|
+
|
2813
|
+
// receiver
|
2814
|
+
#line 145 "api_node.c.erb"
|
2815
|
+
argv[0] = rb_ary_pop(value_stack);
|
2816
|
+
|
2817
|
+
// call_operator_loc
|
2818
|
+
#line 173 "api_node.c.erb"
|
2819
|
+
argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
|
2820
|
+
|
2821
|
+
// opening_loc
|
2822
|
+
#line 170 "api_node.c.erb"
|
2823
|
+
argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
2824
|
+
|
2825
|
+
// arguments
|
2826
|
+
#line 145 "api_node.c.erb"
|
2827
|
+
argv[3] = rb_ary_pop(value_stack);
|
2828
|
+
|
2829
|
+
// closing_loc
|
2830
|
+
#line 170 "api_node.c.erb"
|
2831
|
+
argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
2832
|
+
|
2833
|
+
// block
|
2834
|
+
#line 145 "api_node.c.erb"
|
2835
|
+
argv[5] = rb_ary_pop(value_stack);
|
2836
|
+
|
2837
|
+
// flags
|
2838
|
+
#line 179 "api_node.c.erb"
|
2839
|
+
argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2840
|
+
|
2841
|
+
// operator_loc
|
2842
|
+
#line 170 "api_node.c.erb"
|
2843
|
+
argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
2844
|
+
|
2845
|
+
// value
|
2846
|
+
#line 145 "api_node.c.erb"
|
2847
|
+
argv[8] = rb_ary_pop(value_stack);
|
2848
|
+
|
2849
|
+
// location
|
2850
|
+
argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
|
2851
|
+
|
2852
|
+
rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismIndexAndWriteNode));
|
2853
|
+
break;
|
2854
|
+
}
|
2855
|
+
#line 134 "api_node.c.erb"
|
2856
|
+
case PM_INDEX_OPERATOR_WRITE_NODE: {
|
2857
|
+
pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
|
2858
|
+
VALUE argv[11];
|
2859
|
+
|
2860
|
+
// receiver
|
2861
|
+
#line 145 "api_node.c.erb"
|
2862
|
+
argv[0] = rb_ary_pop(value_stack);
|
2863
|
+
|
2864
|
+
// call_operator_loc
|
2865
|
+
#line 173 "api_node.c.erb"
|
2866
|
+
argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
|
2867
|
+
|
2868
|
+
// opening_loc
|
2869
|
+
#line 170 "api_node.c.erb"
|
2870
|
+
argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
2871
|
+
|
2872
|
+
// arguments
|
2873
|
+
#line 145 "api_node.c.erb"
|
2874
|
+
argv[3] = rb_ary_pop(value_stack);
|
2875
|
+
|
2876
|
+
// closing_loc
|
2877
|
+
#line 170 "api_node.c.erb"
|
2878
|
+
argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
2879
|
+
|
2880
|
+
// block
|
2881
|
+
#line 145 "api_node.c.erb"
|
2882
|
+
argv[5] = rb_ary_pop(value_stack);
|
2883
|
+
|
2884
|
+
// flags
|
2885
|
+
#line 179 "api_node.c.erb"
|
2886
|
+
argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2887
|
+
|
2888
|
+
// operator
|
2889
|
+
#line 157 "api_node.c.erb"
|
2890
|
+
assert(cast->operator != 0);
|
2891
|
+
argv[7] = rb_id2sym(constants[cast->operator - 1]);
|
2892
|
+
|
2893
|
+
// operator_loc
|
2894
|
+
#line 170 "api_node.c.erb"
|
2895
|
+
argv[8] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
2896
|
+
|
2897
|
+
// value
|
2898
|
+
#line 145 "api_node.c.erb"
|
2899
|
+
argv[9] = rb_ary_pop(value_stack);
|
2900
|
+
|
2901
|
+
// location
|
2902
|
+
argv[10] = pm_location_new(parser, node->location.start, node->location.end, source);
|
2903
|
+
|
2904
|
+
rb_ary_push(value_stack, rb_class_new_instance(11, argv, rb_cPrismIndexOperatorWriteNode));
|
2905
|
+
break;
|
2906
|
+
}
|
2907
|
+
#line 134 "api_node.c.erb"
|
2908
|
+
case PM_INDEX_OR_WRITE_NODE: {
|
2909
|
+
pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
|
2910
|
+
VALUE argv[10];
|
2911
|
+
|
2912
|
+
// receiver
|
2913
|
+
#line 145 "api_node.c.erb"
|
2914
|
+
argv[0] = rb_ary_pop(value_stack);
|
2915
|
+
|
2916
|
+
// call_operator_loc
|
2917
|
+
#line 173 "api_node.c.erb"
|
2918
|
+
argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
|
2919
|
+
|
2920
|
+
// opening_loc
|
2921
|
+
#line 170 "api_node.c.erb"
|
2922
|
+
argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
|
2923
|
+
|
2924
|
+
// arguments
|
2925
|
+
#line 145 "api_node.c.erb"
|
2926
|
+
argv[3] = rb_ary_pop(value_stack);
|
2927
|
+
|
2928
|
+
// closing_loc
|
2929
|
+
#line 170 "api_node.c.erb"
|
2930
|
+
argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
|
2931
|
+
|
2932
|
+
// block
|
2933
|
+
#line 145 "api_node.c.erb"
|
2934
|
+
argv[5] = rb_ary_pop(value_stack);
|
2935
|
+
|
2936
|
+
// flags
|
2937
|
+
#line 179 "api_node.c.erb"
|
2938
|
+
argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2939
|
+
|
2940
|
+
// operator_loc
|
2941
|
+
#line 170 "api_node.c.erb"
|
2942
|
+
argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
|
2943
|
+
|
2944
|
+
// value
|
2945
|
+
#line 145 "api_node.c.erb"
|
2946
|
+
argv[8] = rb_ary_pop(value_stack);
|
2947
|
+
|
2948
|
+
// location
|
2949
|
+
argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
|
2950
|
+
|
2951
|
+
rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismIndexOrWriteNode));
|
2952
|
+
break;
|
2953
|
+
}
|
2804
2954
|
#line 134 "api_node.c.erb"
|
2805
2955
|
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
|
2806
2956
|
pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
|
@@ -2956,7 +3106,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
2956
3106
|
|
2957
3107
|
// flags
|
2958
3108
|
#line 179 "api_node.c.erb"
|
2959
|
-
argv[0] = ULONG2NUM(node->flags
|
3109
|
+
argv[0] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2960
3110
|
|
2961
3111
|
// location
|
2962
3112
|
argv[1] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -2986,7 +3136,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
2986
3136
|
|
2987
3137
|
// flags
|
2988
3138
|
#line 179 "api_node.c.erb"
|
2989
|
-
argv[3] = ULONG2NUM(node->flags
|
3139
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
2990
3140
|
|
2991
3141
|
// location
|
2992
3142
|
argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -3016,7 +3166,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
3016
3166
|
|
3017
3167
|
// flags
|
3018
3168
|
#line 179 "api_node.c.erb"
|
3019
|
-
argv[3] = ULONG2NUM(node->flags
|
3169
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
3020
3170
|
|
3021
3171
|
// location
|
3022
3172
|
argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -3401,7 +3551,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
3401
3551
|
|
3402
3552
|
// flags
|
3403
3553
|
#line 179 "api_node.c.erb"
|
3404
|
-
argv[4] = ULONG2NUM(node->flags
|
3554
|
+
argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
3405
3555
|
|
3406
3556
|
// location
|
3407
3557
|
argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -3918,7 +4068,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
3918
4068
|
|
3919
4069
|
// flags
|
3920
4070
|
#line 179 "api_node.c.erb"
|
3921
|
-
argv[3] = ULONG2NUM(node->flags
|
4071
|
+
argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
3922
4072
|
|
3923
4073
|
// location
|
3924
4074
|
argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -3973,7 +4123,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
3973
4123
|
|
3974
4124
|
// flags
|
3975
4125
|
#line 179 "api_node.c.erb"
|
3976
|
-
argv[4] = ULONG2NUM(node->flags
|
4126
|
+
argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
3977
4127
|
|
3978
4128
|
// location
|
3979
4129
|
argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -4281,7 +4431,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
4281
4431
|
|
4282
4432
|
// flags
|
4283
4433
|
#line 179 "api_node.c.erb"
|
4284
|
-
argv[0] = ULONG2NUM(node->flags
|
4434
|
+
argv[0] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
4285
4435
|
|
4286
4436
|
// opening_loc
|
4287
4437
|
#line 173 "api_node.c.erb"
|
@@ -4449,7 +4599,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
4449
4599
|
|
4450
4600
|
// flags
|
4451
4601
|
#line 179 "api_node.c.erb"
|
4452
|
-
argv[4] = ULONG2NUM(node->flags
|
4602
|
+
argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
4453
4603
|
|
4454
4604
|
// location
|
4455
4605
|
argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -4506,7 +4656,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) {
|
|
4506
4656
|
|
4507
4657
|
// flags
|
4508
4658
|
#line 179 "api_node.c.erb"
|
4509
|
-
argv[4] = ULONG2NUM(node->flags
|
4659
|
+
argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
4510
4660
|
|
4511
4661
|
// location
|
4512
4662
|
argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
|
@@ -4649,6 +4799,9 @@ Init_prism_api_node(void) {
|
|
4649
4799
|
rb_cPrismImaginaryNode = rb_define_class_under(rb_cPrism, "ImaginaryNode", rb_cPrismNode);
|
4650
4800
|
rb_cPrismImplicitNode = rb_define_class_under(rb_cPrism, "ImplicitNode", rb_cPrismNode);
|
4651
4801
|
rb_cPrismInNode = rb_define_class_under(rb_cPrism, "InNode", rb_cPrismNode);
|
4802
|
+
rb_cPrismIndexAndWriteNode = rb_define_class_under(rb_cPrism, "IndexAndWriteNode", rb_cPrismNode);
|
4803
|
+
rb_cPrismIndexOperatorWriteNode = rb_define_class_under(rb_cPrism, "IndexOperatorWriteNode", rb_cPrismNode);
|
4804
|
+
rb_cPrismIndexOrWriteNode = rb_define_class_under(rb_cPrism, "IndexOrWriteNode", rb_cPrismNode);
|
4652
4805
|
rb_cPrismInstanceVariableAndWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableAndWriteNode", rb_cPrismNode);
|
4653
4806
|
rb_cPrismInstanceVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOperatorWriteNode", rb_cPrismNode);
|
4654
4807
|
rb_cPrismInstanceVariableOrWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOrWriteNode", rb_cPrismNode);
|