Skip to content

Commit f02358e

Browse files
committed
Refactor LocalVariableGetNode node to support DSL inlining
1 parent b700e40 commit f02358e

File tree

4 files changed

+57
-40
lines changed

4 files changed

+57
-40
lines changed

src/main/java/org/truffleruby/core/binding/BindingNodes.java

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.truffleruby.language.arguments.RubyArguments;
4242
import org.truffleruby.language.control.RaiseException;
4343
import org.truffleruby.language.locals.FindDeclarationVariableNodes;
44-
import org.truffleruby.language.locals.FindDeclarationVariableNodes.FindAndReadDeclarationVariableNode;
4544
import org.truffleruby.language.locals.FindDeclarationVariableNodes.FrameSlotAndDepth;
4645
import org.truffleruby.language.locals.FrameDescriptorNamesIterator;
4746
import org.truffleruby.language.locals.WriteFrameSlotNode;
@@ -278,24 +277,12 @@ public RubyNode cloneUninitialized() {
278277

279278
}
280279

281-
@GenerateUncached
282280
@GenerateNodeFactory
283281
@CoreMethod(names = "local_variable_get", required = 1)
284282
@NodeChild(value = "bindingNode", type = RubyNode.class)
285283
@NodeChild(value = "nameNode", type = RubyBaseNodeWithExecute.class)
286284
@ImportStatic(BindingNodes.class)
287-
public abstract static class LocalVariableGetNode extends RubySourceNode {
288-
289-
@NeverDefault
290-
public static LocalVariableGetNode create() {
291-
return BindingNodesFactory.LocalVariableGetNodeFactory.create(null, null);
292-
}
293-
294-
public static LocalVariableGetNode create(RubyNode bindingNode, RubyBaseNodeWithExecute nameNode) {
295-
return BindingNodesFactory.LocalVariableGetNodeFactory.create(bindingNode, nameNode);
296-
}
297-
298-
public abstract Object execute(RubyBinding binding, String name);
285+
public abstract static class BindingLocalVariableGetNode extends RubySourceNode {
299286

300287
abstract RubyNode getBindingNode();
301288

@@ -306,29 +293,10 @@ protected RubyBaseNodeWithExecute coerceToString(RubyBaseNodeWithExecute name) {
306293
return NameToJavaStringNode.create(name);
307294
}
308295

309-
@Specialization(guards = "!isHiddenVariable(name)")
296+
@Specialization
310297
protected Object localVariableGet(RubyBinding binding, String name,
311-
@Cached FindAndReadDeclarationVariableNode readNode) {
312-
MaterializedFrame frame = binding.getFrame();
313-
Object result = readNode.execute(frame, name, null);
314-
if (result == null) {
315-
throw new RaiseException(
316-
getContext(),
317-
coreExceptions().nameErrorLocalVariableNotDefined(name, binding, this));
318-
}
319-
return result;
320-
}
321-
322-
@TruffleBoundary
323-
@Specialization(guards = "isHiddenVariable(name)")
324-
protected Object localVariableGetLastLine(RubyBinding binding, String name) {
325-
throw new RaiseException(
326-
getContext(),
327-
coreExceptions().nameError("Bad local variable name", binding, name, this));
328-
}
329-
330-
protected int getCacheLimit() {
331-
return getLanguage().options.BINDING_LOCAL_VARIABLE_CACHE;
298+
@Cached LocalVariableGetNode localVariableGetNode) {
299+
return localVariableGetNode.execute(binding, name);
332300
}
333301

334302
private RubyBaseNodeWithExecute getNameNodeBeforeCasting() {
@@ -337,11 +305,10 @@ private RubyBaseNodeWithExecute getNameNodeBeforeCasting() {
337305

338306
@Override
339307
public RubyNode cloneUninitialized() {
340-
return create(
308+
return BindingNodesFactory.BindingLocalVariableGetNodeFactory.create(
341309
getBindingNode().cloneUninitialized(),
342310
getNameNodeBeforeCasting().cloneUninitialized()).copyFlags(this);
343311
}
344-
345312
}
346313

347314
@ReportPolymorphism
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved. This
3+
* code is released under a tri EPL/GPL/LGPL license. You can use it,
4+
* redistribute it and/or modify it under the terms of the:
5+
*
6+
* Eclipse Public License version 2.0, or
7+
* GNU General Public License version 2, or
8+
* GNU Lesser General Public License version 2.1.
9+
*/
10+
package org.truffleruby.core.binding;
11+
12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.GenerateUncached;
14+
import com.oracle.truffle.api.dsl.ImportStatic;
15+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
16+
import com.oracle.truffle.api.dsl.Specialization;
17+
import com.oracle.truffle.api.frame.MaterializedFrame;
18+
import org.truffleruby.language.RubyBaseNode;
19+
import org.truffleruby.language.control.RaiseException;
20+
import org.truffleruby.language.locals.FindDeclarationVariableNodes;
21+
22+
@GenerateUncached
23+
@ImportStatic(BindingNodes.class)
24+
public abstract class LocalVariableGetNode extends RubyBaseNode {
25+
26+
public abstract Object execute(RubyBinding binding, String name);
27+
28+
@Specialization(guards = "!isHiddenVariable(name)")
29+
protected Object localVariableGet(RubyBinding binding, String name,
30+
@Cached FindDeclarationVariableNodes.FindAndReadDeclarationVariableNode readNode) {
31+
MaterializedFrame frame = binding.getFrame();
32+
Object result = readNode.execute(frame, name, null);
33+
if (result == null) {
34+
throw new RaiseException(
35+
getContext(),
36+
coreExceptions().nameErrorLocalVariableNotDefined(name, binding, this));
37+
}
38+
return result;
39+
}
40+
41+
@TruffleBoundary
42+
@Specialization(guards = "isHiddenVariable(name)")
43+
protected Object localVariableGetLastLine(RubyBinding binding, String name) {
44+
throw new RaiseException(
45+
getContext(),
46+
coreExceptions().nameError("Bad local variable name", binding, name, this));
47+
}
48+
}

src/main/java/org/truffleruby/debug/BindingLocalVariablesObject.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
1313
import com.oracle.truffle.api.library.CachedLibrary;
1414
import org.truffleruby.core.binding.BindingNodes;
15+
import org.truffleruby.core.binding.LocalVariableGetNode;
1516
import org.truffleruby.core.binding.RubyBinding;
1617
import org.truffleruby.core.string.StringUtils;
1718
import org.truffleruby.language.control.RaiseException;
@@ -55,7 +56,7 @@ protected Object getMembers(boolean includeInternal) {
5556

5657
@ExportMessage
5758
protected Object readMember(String member,
58-
@Cached @Exclusive BindingNodes.LocalVariableGetNode localVariableGetNode)
59+
@Cached @Exclusive LocalVariableGetNode localVariableGetNode)
5960
throws UnknownIdentifierException {
6061
try {
6162
return localVariableGetNode.execute(binding, member);

src/main/java/org/truffleruby/debug/RubyScope.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.truffleruby.RubyContext;
2828
import org.truffleruby.RubyLanguage;
2929
import org.truffleruby.core.binding.BindingNodes;
30+
import org.truffleruby.core.binding.LocalVariableGetNode;
3031
import org.truffleruby.core.binding.RubyBinding;
3132
import org.truffleruby.core.string.StringUtils;
3233
import org.truffleruby.language.RubyNode;
@@ -125,7 +126,7 @@ protected static Object readSelf(RubyScope scope, String member) {
125126

126127
@Specialization(guards = "!RECEIVER_MEMBER.equals(member)")
127128
protected static Object read(RubyScope scope, String member,
128-
@Cached @Exclusive BindingNodes.LocalVariableGetNode localVariableGetNode)
129+
@Cached @Exclusive LocalVariableGetNode localVariableGetNode)
129130
throws UnknownIdentifierException {
130131
try {
131132
return localVariableGetNode.execute(scope.binding, member);

0 commit comments

Comments
 (0)