prism 0.13.0 → 0.15.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.
- 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);
|