Skip to content

Commit ea3f1fe

Browse files
committed
Remove loop from special variable lookup
1 parent 6c37b06 commit ea3f1fe

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

src/main/java/org/truffleruby/language/SpecialVariablesSendingNode.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import org.truffleruby.core.kernel.TruffleKernelNodes.GetSpecialVariableStorage;
1717
import org.truffleruby.language.arguments.ReadCallerVariablesNode;
1818

19-
import org.truffleruby.language.locals.FindDeclarationVariableNodes;
2019
import org.truffleruby.language.threadlocal.SpecialVariableStorage;
20+
import org.truffleruby.parser.BlockFrameDescriptorInfo;
2121

2222
/** Some Ruby methods need access to the caller special variables: see usages of {@link ReadCallerVariablesNode}. This
2323
* is used for methods which need to access the last regexp MatchData or the last IO line.
@@ -45,10 +45,12 @@ protected Assumption getSpecialVariableAssumption(Frame frame) {
4545
return Assumption.ALWAYS_VALID;
4646
}
4747

48-
var outerFrameDescriptor = FindDeclarationVariableNodes.getOuterFrameDescriptor(frame.getFrameDescriptor());
48+
var descriptor = frame.getFrameDescriptor();
4949

50-
if (SpecialVariableStorage.hasSpecialVariableAssumption(outerFrameDescriptor)) {
51-
return SpecialVariableStorage.getAssumption(outerFrameDescriptor);
50+
if (SpecialVariableStorage.hasSpecialVariableAssumption(descriptor)) {
51+
return SpecialVariableStorage.getAssumption(descriptor);
52+
} else if (descriptor.getInfo() instanceof BlockFrameDescriptorInfo blockFrameDescriptorInfo) {
53+
return blockFrameDescriptorInfo.getSpecialVariableAssumption();
5254
} else {
5355
return Assumption.ALWAYS_VALID;
5456
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
*/
1010
package org.truffleruby.parser;
1111

12+
import com.oracle.truffle.api.Assumption;
1213
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
1314
import com.oracle.truffle.api.frame.FrameDescriptor;
1415
import com.oracle.truffle.api.nodes.ExplodeLoop;
16+
import org.truffleruby.language.threadlocal.SpecialVariableStorage;
17+
18+
import static org.truffleruby.language.threadlocal.SpecialVariableStorage.ASSUMPTION_NAME;
1519

1620
public final class BlockFrameDescriptorInfo {
1721

@@ -26,13 +30,25 @@ public static FrameDescriptor getDeclarationFrameDescriptor(FrameDescriptor topD
2630
}
2731

2832
@CompilationFinal private FrameDescriptor descriptor;
33+
private final Assumption specialVariableAssumption;
2934

30-
public BlockFrameDescriptorInfo() {
35+
public BlockFrameDescriptorInfo(Assumption specialVariableAssumption) {
36+
assert specialVariableAssumption != null && specialVariableAssumption.getName() == ASSUMPTION_NAME;
37+
this.specialVariableAssumption = specialVariableAssumption;
3138
}
3239

3340
public BlockFrameDescriptorInfo(FrameDescriptor descriptor) {
34-
assert descriptor != null;
41+
assert descriptor != null && descriptor.getInfo() != null;
3542
this.descriptor = descriptor;
43+
this.specialVariableAssumption = getSpecialVariableAssumptionFromDescriptor(descriptor);
44+
}
45+
46+
private Assumption getSpecialVariableAssumptionFromDescriptor(FrameDescriptor descriptor) {
47+
if (descriptor.getInfo() instanceof BlockFrameDescriptorInfo blockFrameDescriptorInfo) {
48+
return blockFrameDescriptorInfo.getSpecialVariableAssumption();
49+
} else {
50+
return SpecialVariableStorage.getAssumption(descriptor);
51+
}
3652
}
3753

3854
public FrameDescriptor getDescriptor() {
@@ -44,4 +60,9 @@ void set(FrameDescriptor descriptor) {
4460
assert this.descriptor == null;
4561
this.descriptor = descriptor;
4662
}
63+
64+
public Assumption getSpecialVariableAssumption() {
65+
assert specialVariableAssumption != null;
66+
return specialVariableAssumption;
67+
}
4768
}

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,13 @@ public TranslatorEnvironment(
8585
BlockFrameDescriptorInfo parentBlockDescriptor = Objects
8686
.requireNonNull(parent.blockFrameDescriptorInfo);
8787
this.frameDescriptorBuilder = newFrameDescriptorBuilderForBlock(parentBlockDescriptor);
88+
this.blockFrameDescriptorInfo = new BlockFrameDescriptorInfo(
89+
parentBlockDescriptor.getSpecialVariableAssumption());
8890
} else {
89-
this.frameDescriptorBuilder = newFrameDescriptorBuilderForMethod();
91+
var specialVariableAssumption = createSpecialVariableAssumption();
92+
this.frameDescriptorBuilder = newFrameDescriptorBuilderForMethod(specialVariableAssumption);
93+
this.blockFrameDescriptorInfo = new BlockFrameDescriptorInfo(specialVariableAssumption);
9094
}
91-
this.blockFrameDescriptorInfo = new BlockFrameDescriptorInfo();
9295
} else {
9396
this.frameDescriptor = descriptor;
9497
this.blockFrameDescriptorInfo = new BlockFrameDescriptorInfo(descriptor);
@@ -163,15 +166,16 @@ public static FrameDescriptor.Builder newFrameDescriptorBuilderForBlock(BlockFra
163166
return builder;
164167
}
165168

166-
public static FrameDescriptor.Builder newFrameDescriptorBuilderForMethod() {
169+
private static Assumption createSpecialVariableAssumption() {
170+
return Assumption.create(SpecialVariableStorage.ASSUMPTION_NAME);
171+
}
167172

173+
private static FrameDescriptor.Builder newFrameDescriptorBuilderForMethod(Assumption specialVariableAssumption) {
168174
var builder = FrameDescriptor.newBuilder().defaultValue(Nil.INSTANCE);
169175
// We need to access this Assumption from the FrameDescriptor,
170176
// and there is no way to get a RootNode from a FrameDescriptor, so we store it in the descriptor info.
171177
// We do not store it as slot info for footprint, to avoid needing an info array per FrameDescriptor.
172-
final Assumption doesNotNeedSpecialVariableStorageAssumption = Assumption
173-
.create(SpecialVariableStorage.ASSUMPTION_NAME);
174-
builder.info(doesNotNeedSpecialVariableStorageAssumption);
178+
builder.info(specialVariableAssumption);
175179

176180

177181
int selfIndex = builder.addSlot(FrameSlotKind.Illegal, SelfNode.SELF_IDENTIFIER, null);
@@ -187,6 +191,12 @@ public static FrameDescriptor.Builder newFrameDescriptorBuilderForMethod() {
187191
return builder;
188192
}
189193

194+
195+
public static FrameDescriptor.Builder newFrameDescriptorBuilderForMethod() {
196+
var specialVariableAssumption = createSpecialVariableAssumption();
197+
return newFrameDescriptorBuilderForMethod(specialVariableAssumption);
198+
}
199+
190200
public int declareVar(Object name) {
191201
assert name != null && !(name instanceof String && ((String) name).isEmpty());
192202

0 commit comments

Comments
 (0)