@@ -713,20 +713,11 @@ private ArgumentsAndBlockTranslation translateArgumentsAndBlock(Nodes.ArgumentsN
713
713
frameOnStackMarkerSlotStack .pop ();
714
714
}
715
715
} else if (block instanceof Nodes .BlockArgumentNode blockArgument ) {
716
- // def a(&) b(&) end
717
- assert blockArgument .expression != null ; // Ruby 3.1's anonymous block parameter, that we don't support yet
718
-
719
716
// a(&:b)
720
- blockNode = ToProcNodeGen . create ( blockArgument .expression . accept (this ) );
717
+ blockNode = blockArgument .accept (this );
721
718
frameOnStackMarkerSlot = NO_FRAME_ON_STACK_MARKER ;
722
719
} else {
723
- // throw CompilerDirectives.shouldNotReachHere();
724
-
725
- // If CallNode is manually created then a block argument could be anything,
726
- // e.g. reading a local variable with cached block.
727
- // Treat it like it is Nodes.BlockArgumentNode#expression.
728
- blockNode = ToProcNodeGen .create (block .accept (this ));
729
- frameOnStackMarkerSlot = NO_FRAME_ON_STACK_MARKER ;
720
+ throw CompilerDirectives .shouldNotReachHere ();
730
721
}
731
722
} else {
732
723
blockNode = null ;
@@ -1646,15 +1637,17 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
1646
1637
1647
1638
// block argument
1648
1639
final RubyNode writeBlockNode ;
1649
- final Nodes .Node readBlock ;
1640
+ final Nodes .BlockArgumentNode blockArgument ;
1650
1641
1651
1642
if (node .block != null ) {
1652
1643
var expression = new YARPExecutedOnceExpression ("value" , node .block , this );
1653
1644
writeBlockNode = expression .getWriteNode ();
1654
- readBlock = expression .getReadYARPNode ();
1645
+ Nodes .Node readBlock = expression .getReadYARPNode ();
1646
+ // imitate Nodes.CallNode structure with &block argument
1647
+ blockArgument = new Nodes .BlockArgumentNode (readBlock , 0 , 0 );
1655
1648
} else {
1656
1649
writeBlockNode = null ;
1657
- readBlock = null ;
1650
+ blockArgument = null ;
1658
1651
}
1659
1652
1660
1653
final RubyNode [] writeArgumentsNodes = new RubyNode [argumentsCount ];
@@ -1666,7 +1659,7 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
1666
1659
}
1667
1660
1668
1661
final Nodes .Node read = new Nodes .CallNode (readReceiver , "[]" ,
1669
- new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1662
+ new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1670
1663
final RubyNode readNode = read .accept (this );
1671
1664
1672
1665
final Nodes .Node [] readArgumentsAndValue = new Nodes .Node [argumentsCount + 1 ];
@@ -1676,7 +1669,7 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
1676
1669
readArgumentsAndValue [argumentsCount ] = node .value ;
1677
1670
1678
1671
final Nodes .Node write = new Nodes .CallNode (readReceiver , "[]=" ,
1679
- new Nodes .ArgumentsNode (readArgumentsAndValue , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1672
+ new Nodes .ArgumentsNode (readArgumentsAndValue , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1680
1673
final RubyNode writeNode = write .accept (this );
1681
1674
final RubyNode andNode = AndNodeGen .create (readNode , writeNode );
1682
1675
final RubyNode writeArgumentsNode = sequence (Arrays .asList (writeArgumentsNodes ));
@@ -1716,15 +1709,17 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
1716
1709
1717
1710
// block argument
1718
1711
final RubyNode writeBlockNode ;
1719
- final Nodes .Node readBlock ;
1712
+ final Nodes .BlockArgumentNode blockArgument ;
1720
1713
1721
1714
if (node .block != null ) {
1722
- final var expression = new YARPExecutedOnceExpression ("value" , node .block , this );
1715
+ var expression = new YARPExecutedOnceExpression ("value" , node .block , this );
1723
1716
writeBlockNode = expression .getWriteNode ();
1724
- readBlock = expression .getReadYARPNode ();
1717
+ Nodes .Node readBlock = expression .getReadYARPNode ();
1718
+ // imitate Nodes.CallNode structure with &block argument
1719
+ blockArgument = new Nodes .BlockArgumentNode (readBlock , 0 , 0 );
1725
1720
} else {
1726
1721
writeBlockNode = null ;
1727
- readBlock = null ;
1722
+ blockArgument = null ;
1728
1723
}
1729
1724
1730
1725
final RubyNode [] writeArgumentsNodes = new RubyNode [argumentsCount ];
@@ -1736,7 +1731,7 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
1736
1731
}
1737
1732
1738
1733
final Nodes .Node read = new Nodes .CallNode (readReceiver , "[]" ,
1739
- new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1734
+ new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1740
1735
final Nodes .Node executeOperator = callNode (node , read , node .operator , node .value );
1741
1736
1742
1737
final Nodes .Node [] readArgumentsAndResult = new Nodes .Node [argumentsCount + 1 ];
@@ -1746,7 +1741,7 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
1746
1741
readArgumentsAndResult [argumentsCount ] = executeOperator ;
1747
1742
1748
1743
final Nodes .Node write = new Nodes .CallNode (readReceiver , "[]=" ,
1749
- new Nodes .ArgumentsNode (readArgumentsAndResult , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1744
+ new Nodes .ArgumentsNode (readArgumentsAndResult , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1750
1745
final RubyNode writeNode = write .accept (this );
1751
1746
final RubyNode writeArgumentsNode = sequence (Arrays .asList (writeArgumentsNodes ));
1752
1747
final RubyNode rubyNode ;
@@ -1793,19 +1788,21 @@ public RubyNode visitIndexOrWriteNode(Nodes.IndexOrWriteNode node) {
1793
1788
1794
1789
// block argument
1795
1790
final RubyNode writeBlockNode ;
1796
- final Nodes .Node readBlock ;
1791
+ final Nodes .BlockArgumentNode blockArgument ;
1797
1792
1798
1793
if (node .block != null ) {
1799
- final var expression = new YARPExecutedOnceExpression ("value" , node .block , this );
1794
+ var expression = new YARPExecutedOnceExpression ("value" , node .block , this );
1800
1795
writeBlockNode = expression .getWriteNode ();
1801
- readBlock = expression .getReadYARPNode ();
1796
+ Nodes .Node readBlock = expression .getReadYARPNode ();
1797
+ // imitate Nodes.CallNode structure with &block argument
1798
+ blockArgument = new Nodes .BlockArgumentNode (readBlock , 0 , 0 );
1802
1799
} else {
1803
1800
writeBlockNode = null ;
1804
- readBlock = null ;
1801
+ blockArgument = null ;
1805
1802
}
1806
1803
1807
1804
final Nodes .Node read = new Nodes .CallNode (readReceiver , "[]" ,
1808
- new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1805
+ new Nodes .ArgumentsNode (readArguments , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1809
1806
final RubyNode readNode = read .accept (this );
1810
1807
1811
1808
final Nodes .Node [] readArgumentsAndValue = new Nodes .Node [argumentsCount + 1 ];
@@ -1815,7 +1812,7 @@ public RubyNode visitIndexOrWriteNode(Nodes.IndexOrWriteNode node) {
1815
1812
readArgumentsAndValue [argumentsCount ] = node .value ;
1816
1813
1817
1814
final Nodes .Node write = new Nodes .CallNode (readReceiver , "[]=" ,
1818
- new Nodes .ArgumentsNode (readArgumentsAndValue , (short ) 0 , 0 , 0 ), readBlock , (short ) 0 , 0 , 0 );
1815
+ new Nodes .ArgumentsNode (readArgumentsAndValue , (short ) 0 , 0 , 0 ), blockArgument , (short ) 0 , 0 , 0 );
1819
1816
final RubyNode writeNode = write .accept (this );
1820
1817
final RubyNode orNode = OrNodeGen .create (readNode , writeNode );
1821
1818
final RubyNode writeArgumentsNode = sequence (Arrays .asList (writeArgumentsNodes ));
0 commit comments