Skip to content

Commit 760ac1e

Browse files
committed
Refactor block argument handling when assignment operators are used with element referencing
1 parent 4083907 commit 760ac1e

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

src/main/java/org/truffleruby/parser/YARPTranslator.java

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -713,20 +713,11 @@ private ArgumentsAndBlockTranslation translateArgumentsAndBlock(Nodes.ArgumentsN
713713
frameOnStackMarkerSlotStack.pop();
714714
}
715715
} 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-
719716
// a(&:b)
720-
blockNode = ToProcNodeGen.create(blockArgument.expression.accept(this));
717+
blockNode = blockArgument.accept(this);
721718
frameOnStackMarkerSlot = NO_FRAME_ON_STACK_MARKER;
722719
} 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();
730721
}
731722
} else {
732723
blockNode = null;
@@ -1646,15 +1637,17 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
16461637

16471638
// block argument
16481639
final RubyNode writeBlockNode;
1649-
final Nodes.Node readBlock;
1640+
final Nodes.BlockArgumentNode blockArgument;
16501641

16511642
if (node.block != null) {
16521643
var expression = new YARPExecutedOnceExpression("value", node.block, this);
16531644
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);
16551648
} else {
16561649
writeBlockNode = null;
1657-
readBlock = null;
1650+
blockArgument = null;
16581651
}
16591652

16601653
final RubyNode[] writeArgumentsNodes = new RubyNode[argumentsCount];
@@ -1666,7 +1659,7 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
16661659
}
16671660

16681661
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);
16701663
final RubyNode readNode = read.accept(this);
16711664

16721665
final Nodes.Node[] readArgumentsAndValue = new Nodes.Node[argumentsCount + 1];
@@ -1676,7 +1669,7 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
16761669
readArgumentsAndValue[argumentsCount] = node.value;
16771670

16781671
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);
16801673
final RubyNode writeNode = write.accept(this);
16811674
final RubyNode andNode = AndNodeGen.create(readNode, writeNode);
16821675
final RubyNode writeArgumentsNode = sequence(Arrays.asList(writeArgumentsNodes));
@@ -1716,15 +1709,17 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
17161709

17171710
// block argument
17181711
final RubyNode writeBlockNode;
1719-
final Nodes.Node readBlock;
1712+
final Nodes.BlockArgumentNode blockArgument;
17201713

17211714
if (node.block != null) {
1722-
final var expression = new YARPExecutedOnceExpression("value", node.block, this);
1715+
var expression = new YARPExecutedOnceExpression("value", node.block, this);
17231716
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);
17251720
} else {
17261721
writeBlockNode = null;
1727-
readBlock = null;
1722+
blockArgument = null;
17281723
}
17291724

17301725
final RubyNode[] writeArgumentsNodes = new RubyNode[argumentsCount];
@@ -1736,7 +1731,7 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
17361731
}
17371732

17381733
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);
17401735
final Nodes.Node executeOperator = callNode(node, read, node.operator, node.value);
17411736

17421737
final Nodes.Node[] readArgumentsAndResult = new Nodes.Node[argumentsCount + 1];
@@ -1746,7 +1741,7 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
17461741
readArgumentsAndResult[argumentsCount] = executeOperator;
17471742

17481743
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);
17501745
final RubyNode writeNode = write.accept(this);
17511746
final RubyNode writeArgumentsNode = sequence(Arrays.asList(writeArgumentsNodes));
17521747
final RubyNode rubyNode;
@@ -1793,19 +1788,21 @@ public RubyNode visitIndexOrWriteNode(Nodes.IndexOrWriteNode node) {
17931788

17941789
// block argument
17951790
final RubyNode writeBlockNode;
1796-
final Nodes.Node readBlock;
1791+
final Nodes.BlockArgumentNode blockArgument;
17971792

17981793
if (node.block != null) {
1799-
final var expression = new YARPExecutedOnceExpression("value", node.block, this);
1794+
var expression = new YARPExecutedOnceExpression("value", node.block, this);
18001795
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);
18021799
} else {
18031800
writeBlockNode = null;
1804-
readBlock = null;
1801+
blockArgument = null;
18051802
}
18061803

18071804
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);
18091806
final RubyNode readNode = read.accept(this);
18101807

18111808
final Nodes.Node[] readArgumentsAndValue = new Nodes.Node[argumentsCount + 1];
@@ -1815,7 +1812,7 @@ public RubyNode visitIndexOrWriteNode(Nodes.IndexOrWriteNode node) {
18151812
readArgumentsAndValue[argumentsCount] = node.value;
18161813

18171814
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);
18191816
final RubyNode writeNode = write.accept(this);
18201817
final RubyNode orNode = OrNodeGen.create(readNode, writeNode);
18211818
final RubyNode writeArgumentsNode = sequence(Arrays.asList(writeArgumentsNodes));

0 commit comments

Comments
 (0)