Skip to content

Commit f404b95

Browse files
committed
Convert WithoutVisibilityNode to DSL inlinable node + BlockDefinitionNode converted to DSL node
1 parent b8e88cd commit f404b95

File tree

3 files changed

+22
-22
lines changed

3 files changed

+22
-22
lines changed

src/main/java/org/truffleruby/language/methods/BlockDefinitionNode.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
package org.truffleruby.language.methods;
1111

12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.Specialization;
1214
import org.truffleruby.core.kernel.TruffleKernelNodes.GetSpecialVariableStorage;
1315
import org.truffleruby.core.proc.ProcOperations;
1416
import org.truffleruby.core.proc.ProcCallTargets;
@@ -20,23 +22,19 @@
2022
import org.truffleruby.language.control.BreakID;
2123
import org.truffleruby.language.control.FrameOnStackMarker;
2224

23-
import com.oracle.truffle.api.CompilerDirectives;
2425
import com.oracle.truffle.api.frame.VirtualFrame;
2526
import org.truffleruby.parser.BodyTranslator;
2627

2728
/** Create a Ruby Proc to pass as a block to the called method. The literal block is represented as call targets and a
2829
* SharedMethodInfo. This is executed at the call site just before dispatch. */
29-
public final class BlockDefinitionNode extends RubyContextSourceNode {
30+
public abstract class BlockDefinitionNode extends RubyContextSourceNode {
3031

3132
private final ProcType type;
3233
private final SharedMethodInfo sharedMethodInfo;
3334
private final ProcCallTargets callTargets;
3435
private final BreakID breakID;
3536
private final int frameOnStackMarkerSlot;
3637

37-
@Child private GetSpecialVariableStorage readSpecialVariableStorageNode;
38-
@Child private WithoutVisibilityNode withoutVisibilityNode;
39-
4038
public BlockDefinitionNode(
4139
ProcType type,
4240
SharedMethodInfo sharedMethodInfo,
@@ -50,15 +48,18 @@ public BlockDefinitionNode(
5048
this.breakID = breakID;
5149

5250
this.frameOnStackMarkerSlot = frameOnStackMarkerSlot;
53-
readSpecialVariableStorageNode = GetSpecialVariableStorage.create();
5451
}
5552

5653
public BreakID getBreakID() {
5754
return breakID;
5855
}
5956

60-
@Override
61-
public RubyProc execute(VirtualFrame frame) {
57+
public abstract RubyProc execute(VirtualFrame virtualFrame);
58+
59+
@Specialization
60+
RubyProc doBlockDefinition(VirtualFrame frame,
61+
@Cached GetSpecialVariableStorage readSpecialVariableStorageNode,
62+
@Cached WithoutVisibilityNode withoutVisibilityNode) {
6263
final FrameOnStackMarker frameOnStackMarker;
6364
if (frameOnStackMarkerSlot != BodyTranslator.NO_FRAME_ON_STACK_MARKER) {
6465
frameOnStackMarker = (FrameOnStackMarker) frame.getObject(frameOnStackMarkerSlot);
@@ -74,23 +75,16 @@ public RubyProc execute(VirtualFrame frame) {
7475
sharedMethodInfo,
7576
callTargets,
7677
frame.materialize(),
77-
readSpecialVariableStorageNode.executeCached(frame),
78+
readSpecialVariableStorageNode.execute(frame, this),
7879
RubyArguments.getMethod(frame),
7980
frameOnStackMarker,
80-
executeWithoutVisibility(RubyArguments.getDeclarationContext(frame)));
81+
withoutVisibilityNode.executeWithoutVisibility(this, RubyArguments.getDeclarationContext(frame)));
8182
}
8283

83-
private DeclarationContext executeWithoutVisibility(DeclarationContext ctxIn) {
84-
if (withoutVisibilityNode == null) {
85-
CompilerDirectives.transferToInterpreterAndInvalidate();
86-
withoutVisibilityNode = insert(WithoutVisibilityNodeGen.create());
87-
}
88-
return withoutVisibilityNode.executeWithoutVisibility(ctxIn);
89-
}
9084

9185
@Override
9286
public RubyNode cloneUninitialized() {
93-
var copy = new BlockDefinitionNode(type, sharedMethodInfo, callTargets, breakID, frameOnStackMarkerSlot);
87+
var copy = BlockDefinitionNodeGen.create(type, sharedMethodInfo, callTargets, breakID, frameOnStackMarkerSlot);
9488
return copy.copyFlags(this);
9589
}
9690

src/main/java/org/truffleruby/language/methods/WithoutVisibilityNode.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,30 @@
99
*/
1010
package org.truffleruby.language.methods;
1111

12+
import com.oracle.truffle.api.dsl.GenerateCached;
13+
import com.oracle.truffle.api.dsl.GenerateInline;
14+
import com.oracle.truffle.api.nodes.Node;
1215
import org.truffleruby.language.RubyBaseNode;
1316

1417
import com.oracle.truffle.api.dsl.Cached;
1518
import com.oracle.truffle.api.dsl.Specialization;
1619

20+
@GenerateCached(false)
21+
@GenerateInline
1722
public abstract class WithoutVisibilityNode extends RubyBaseNode {
1823

19-
public abstract DeclarationContext executeWithoutVisibility(DeclarationContext declarationContext);
24+
public abstract DeclarationContext executeWithoutVisibility(Node node, DeclarationContext declarationContext);
2025

2126
@Specialization(guards = { "isSingleContext()", "declarationContext == cachedContext" },
2227
limit = "getDefaultCacheLimit()")
23-
DeclarationContext cached(DeclarationContext declarationContext,
28+
static DeclarationContext cached(DeclarationContext declarationContext,
2429
@Cached("declarationContext") DeclarationContext cachedContext,
2530
@Cached("uncached(cachedContext)") DeclarationContext without) {
2631
return without;
2732
}
2833

2934
@Specialization(replaces = "cached")
30-
DeclarationContext uncached(DeclarationContext declarationContext) {
35+
static DeclarationContext uncached(DeclarationContext declarationContext) {
3136
return declarationContext.withVisibility(null);
3237
}
3338

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.truffleruby.language.control.IfElseNodeGen;
1818
import org.truffleruby.language.control.NotNodeGen;
1919
import org.truffleruby.language.locals.FindDeclarationVariableNodes.FrameSlotAndDepth;
20+
import org.truffleruby.language.methods.BlockDefinitionNodeGen;
2021
import org.truffleruby.language.methods.CachedLazyCallTargetSupplier;
2122
import org.truffleruby.core.IsNilNode;
2223
import org.truffleruby.core.cast.SplatCastNode;
@@ -178,7 +179,7 @@ public BlockDefinitionNode compileBlockNode(SourceIndexLength sourceSection, Par
178179
callTargets = new ProcCallTargets(procCompiler.get(), null, lambdaCompiler);
179180
}
180181

181-
final BlockDefinitionNode ret = new BlockDefinitionNode(
182+
final BlockDefinitionNode ret = BlockDefinitionNodeGen.create(
182183
emitLambda ? ProcType.LAMBDA : ProcType.PROC,
183184
environment.getSharedMethodInfo(),
184185
callTargets,

0 commit comments

Comments
 (0)