Skip to content

Commit 355c1f8

Browse files
committed
Extract InstanceExecBlockNode so it can be uncached
1 parent ab15c46 commit 355c1f8

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/main/java/org/truffleruby/core/basicobject/BasicObjectNodes.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@
4242
import org.truffleruby.language.LexicalScope;
4343
import org.truffleruby.language.Nil;
4444
import org.truffleruby.language.NotProvided;
45+
import org.truffleruby.language.RubyBaseNode;
4546
import org.truffleruby.language.RubyDynamicObject;
4647
import org.truffleruby.language.RubyGuards;
4748
import org.truffleruby.language.RubyNode;
4849
import org.truffleruby.language.RubySourceNode;
4950
import org.truffleruby.language.Visibility;
51+
import org.truffleruby.language.arguments.ArgumentsDescriptor;
52+
import org.truffleruby.language.arguments.EmptyArgumentsDescriptor;
5053
import org.truffleruby.language.arguments.RubyArguments;
5154
import org.truffleruby.language.control.RaiseException;
5255
import org.truffleruby.language.dispatch.DispatchNode;
@@ -324,7 +327,7 @@ public abstract static class InstanceEvalNode extends AlwaysInlinedMethodNode {
324327

325328
@Specialization(guards = "isBlockProvided(rubyArgs)")
326329
protected Object evalWithBlock(Frame callerFrame, Object self, Object[] rubyArgs, RootCallTarget target,
327-
@Cached(allowUncached = true) InstanceExecNode instanceExecNode,
330+
@Cached InstanceExecBlockNode instanceExecNode,
328331
@Cached BranchProfile errorProfile) {
329332
final int count = RubyArguments.getPositionalArgumentsCount(rubyArgs, false);
330333

@@ -334,7 +337,7 @@ protected Object evalWithBlock(Frame callerFrame, Object self, Object[] rubyArgs
334337
}
335338

336339
final Object block = RubyArguments.getBlock(rubyArgs);
337-
return instanceExecNode.executeInstanceExec(callerFrame.materialize(), self, new Object[]{ self },
340+
return instanceExecNode.execute(EmptyArgumentsDescriptor.INSTANCE, self, new Object[]{ self },
338341
(RubyProc) block);
339342
}
340343

@@ -440,6 +443,25 @@ protected Object instanceExec(Object receiver, Object[] arguments, Nil block) {
440443

441444
}
442445

446+
@GenerateUncached
447+
public abstract static class InstanceExecBlockNode extends RubyBaseNode {
448+
449+
public abstract Object execute(ArgumentsDescriptor descriptor, Object self, Object[] args, RubyProc block);
450+
451+
@Specialization
452+
protected Object instanceExec(ArgumentsDescriptor descriptor, Object self, Object[] arguments, RubyProc block,
453+
@Cached CallBlockNode callBlockNode) {
454+
final DeclarationContext declarationContext = new DeclarationContext(
455+
Visibility.PUBLIC,
456+
new SingletonClassOfSelfDefaultDefinee(self),
457+
block.declarationContext.getRefinements());
458+
459+
return callBlockNode.executeCallBlock(
460+
declarationContext, block, self, nil, descriptor, arguments, null);
461+
}
462+
463+
}
464+
443465
@CoreMethod(names = "method_missing", needsBlock = true, rest = true, optional = 1, visibility = Visibility.PRIVATE,
444466
split = Split.NEVER)
445467
public abstract static class MethodMissingNode extends CoreMethodArrayArgumentsNode {

0 commit comments

Comments
 (0)