Skip to content
Snippets Groups Projects
Commit 924fcbf7 authored by stepan's avatar stepan
Browse files

Use ClosureCache in DoCall

parent 028e32c3
No related branches found
No related tags found
No related merge requests found
......@@ -68,6 +68,9 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.builtins.RBuiltinKind;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.Closure;
import com.oracle.truffle.r.runtime.data.ClosureCache;
import com.oracle.truffle.r.runtime.data.ClosureCache.RNodeClosureCache;
import com.oracle.truffle.r.runtime.data.ClosureCache.SymbolClosureCache;
import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.REmpty;
......@@ -127,6 +130,8 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta
@Child private GetNamesAttributeNode getNamesNode;
@Child private SetVisibilityNode setVisibilityNode;
private final ValueProfile frameAccessProfile = ValueProfile.createClassProfile();
private final RNodeClosureCache languagesClosureCache = new RNodeClosureCache();
private final SymbolClosureCache symbolsClosureCache = new SymbolClosureCache();
public static DoCallInternal create() {
return DoCallInternalNodeGen.create();
......@@ -217,10 +222,10 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta
if (symbol.getName().isEmpty()) {
argValues[i] = REmpty.instance;
} else {
argValues[i] = createLookupPromise(promiseFrame, symbol);
argValues[i] = createLookupPromise(promiseFrame, symbol.getName());
}
} else if (arg instanceof RLanguage) {
argValues[i] = RDataFactory.createPromise(PromiseState.Default, Closure.createPromiseClosure(((RLanguage) arg).getRep()), promiseFrame);
argValues[i] = createLanguagePromise(promiseFrame, (RLanguage) arg);
}
}
}
......@@ -228,6 +233,18 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta
return new RArgsValuesAndNames(argValues, signature);
}
@TruffleBoundary
private RPromise createLanguagePromise(MaterializedFrame promiseFrame, RLanguage arg) {
Closure closure = languagesClosureCache.getOrCreatePromiseClosure(arg.getRep());
return RDataFactory.createPromise(PromiseState.Default, closure, promiseFrame);
}
@TruffleBoundary
private RPromise createLookupPromise(MaterializedFrame callerFrame, String name) {
Closure closure = symbolsClosureCache.getOrCreatePromiseClosure(name);
return RDataFactory.createPromise(PromiseState.Supplied, closure, callerFrame);
}
private void setVisibility(VirtualFrame frame, boolean value) {
if (setVisibilityNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
......@@ -245,12 +262,6 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta
return signature == null ? ArgumentsSignature.empty(argsAsList.getLength()) : signature;
}
@TruffleBoundary
private static RPromise createLookupPromise(MaterializedFrame callerFrame, RSymbol symbol) {
Closure closure = Closure.createPromiseClosure(RContext.getASTBuilder().lookup(RSyntaxNode.SOURCE_UNAVAILABLE, symbol.getName(), false).asRNode());
return RDataFactory.createPromise(PromiseState.Supplied, closure, callerFrame);
}
@TruffleBoundary
private static boolean getVisibilitySlowPath(MaterializedFrame envFrame) {
FrameSlot envVisibilitySlot = FrameSlotChangeMonitor.findOrAddFrameSlot(envFrame.getFrameDescriptor(), RFrameSlot.Visibility, FrameSlotKind.Boolean);
......
......@@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
import com.oracle.truffle.r.runtime.nodes.RNode;
import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
......@@ -50,7 +51,7 @@ public abstract class ClosureCache<K> {
return getOrCreateClosure(Closure.LANGUAGE_CLOSURE_WRAPPER_NAME, key);
}
protected abstract RNode keyToNode(K key);
protected abstract RBaseNode keyToNode(K key);
@TruffleBoundary
private Closure getOrCreateClosure(String name, K key) {
......@@ -69,9 +70,9 @@ public abstract class ClosureCache<K> {
}
}
public static final class RNodeClosureCache extends ClosureCache<RNode> {
public static final class RNodeClosureCache extends ClosureCache<RBaseNode> {
@Override
protected RNode keyToNode(RNode key) {
protected RBaseNode keyToNode(RBaseNode key) {
return key;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment