Skip to content
Snippets Groups Projects
Commit 2a63ec7a authored by Lukas Stadler's avatar Lukas Stadler
Browse files

do not produce optimized promises in RCallNode generic case

parent 3350292a
Branches
No related tags found
No related merge requests found
...@@ -162,10 +162,11 @@ public final class AccessArgumentNode extends RNode { ...@@ -162,10 +162,11 @@ public final class AccessArgumentNode extends RNode {
private boolean checkInsertOptDefaultArg() { private boolean checkInsertOptDefaultArg() {
if (optDefaultArgNode == null) { if (optDefaultArgNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
RNode defaultArg = formals.getDefaultArgument(index); RNode defaultArg = formals.getDefaultArgument(index);
RNode arg = (RNode) RASTUtils.unwrap(defaultArg); RNode arg = (RNode) RASTUtils.unwrap(defaultArg);
CompilerDirectives.transferToInterpreterAndInvalidate();
// TODO: all tests pass without it but perhaps we should "re-wrap" promises here? // TODO: all tests pass without it but perhaps we should "re-wrap" promises here?
if (isOptimizableDefault(arg)) { if (isOptimizableDefault(arg)) {
optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) RASTUtils.cloneNode(arg), ArgumentStatePush.INVALID_INDEX); optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) RASTUtils.cloneNode(arg), ArgumentStatePush.INVALID_INDEX);
......
...@@ -794,15 +794,19 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal ...@@ -794,15 +794,19 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal
} }
} }
protected PrepareArguments createArguments(RFunction function) { protected PrepareArguments createArguments(RFunction function, boolean noOpt) {
if (explicitArgs) { if (explicitArgs) {
return PrepareArguments.createExplicit(function); return PrepareArguments.createExplicit(function);
} else { } else {
CallArgumentsNode args = originalCall.createArguments(dispatchTempIdentifiers, !function.isBuiltin(), true); CallArgumentsNode args = originalCall.createArguments(dispatchTempIdentifiers, !function.isBuiltin(), true);
return PrepareArguments.create(function, args); return PrepareArguments.create(function, args, noOpt);
} }
} }
protected PrepareArguments createArguments(RFunction function) {
return createArguments(function, false);
}
@Specialization(limit = "CACHE_SIZE", guards = "function == cachedFunction") @Specialization(limit = "CACHE_SIZE", guards = "function == cachedFunction")
protected Object dispatch(VirtualFrame frame, @SuppressWarnings("unused") RFunction function, Object varArgs, Object s3Args, // protected Object dispatch(VirtualFrame frame, @SuppressWarnings("unused") RFunction function, Object varArgs, Object s3Args, //
@Cached("function") RFunction cachedFunction, // @Cached("function") RFunction cachedFunction, //
...@@ -826,7 +830,7 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal ...@@ -826,7 +830,7 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal
public Object execute(MaterializedFrame materializedFrame, RFunction function, Object varArgs, Object s3Args) { public Object execute(MaterializedFrame materializedFrame, RFunction function, Object varArgs, Object s3Args) {
if (cachedFunction != function) { if (cachedFunction != function) {
leafCall = insert(createCacheNode(function)); leafCall = insert(createCacheNode(function));
prepareArguments = insert(createArguments(function)); prepareArguments = insert(createArguments(function, true));
} }
VirtualFrame frame = SubstituteVirtualFrame.create(materializedFrame); VirtualFrame frame = SubstituteVirtualFrame.create(materializedFrame);
Object[] orderedArguments = prepareArguments.execute(frame, (RArgsValuesAndNames) varArgs, originalCall); Object[] orderedArguments = prepareArguments.execute(frame, (RArgsValuesAndNames) varArgs, originalCall);
......
...@@ -50,8 +50,8 @@ public abstract class PrepareArguments extends Node { ...@@ -50,8 +50,8 @@ public abstract class PrepareArguments extends Node {
public abstract Object[] execute(VirtualFrame frame, RArgsValuesAndNames varArgs, RCallNode call); public abstract Object[] execute(VirtualFrame frame, RArgsValuesAndNames varArgs, RCallNode call);
public static PrepareArguments create(RFunction function, CallArgumentsNode args) { public static PrepareArguments create(RFunction function, CallArgumentsNode args, boolean noOpt) {
return new UninitializedPrepareArguments(function, args); return new UninitializedPrepareArguments(function, args, noOpt);
} }
public static PrepareArguments createExplicit(RFunction function) { public static PrepareArguments createExplicit(RFunction function) {
...@@ -62,11 +62,13 @@ public abstract class PrepareArguments extends Node { ...@@ -62,11 +62,13 @@ public abstract class PrepareArguments extends Node {
private final RFunction function; private final RFunction function;
private final CallArgumentsNode sourceArguments; // not used as a node private final CallArgumentsNode sourceArguments; // not used as a node
private final boolean noOpt;
private int depth = CACHE_SIZE; private int depth = CACHE_SIZE;
UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments) { UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments, boolean noOpt) {
this.function = function; this.function = function;
this.sourceArguments = sourceArguments; this.sourceArguments = sourceArguments;
this.noOpt = noOpt;
} }
@Override @Override
...@@ -74,7 +76,7 @@ public abstract class PrepareArguments extends Node { ...@@ -74,7 +76,7 @@ public abstract class PrepareArguments extends Node {
CompilerDirectives.transferToInterpreterAndInvalidate(); CompilerDirectives.transferToInterpreterAndInvalidate();
PrepareArguments next; PrepareArguments next;
if (depth-- > 0) { if (depth-- > 0) {
next = new CachedPrepareArguments(this, function, call, sourceArguments, varArgs == null ? null : varArgs.getSignature()); next = new CachedPrepareArguments(this, function, call, sourceArguments, varArgs == null ? null : varArgs.getSignature(), noOpt);
} else { } else {
next = new GenericPrepareArguments(function, sourceArguments); next = new GenericPrepareArguments(function, sourceArguments);
} }
...@@ -88,10 +90,10 @@ public abstract class PrepareArguments extends Node { ...@@ -88,10 +90,10 @@ public abstract class PrepareArguments extends Node {
@Children private final RNode[] matchedArguments; @Children private final RNode[] matchedArguments;
private final ArgumentsSignature cachedVarArgSignature; private final ArgumentsSignature cachedVarArgSignature;
CachedPrepareArguments(PrepareArguments next, RFunction function, RCallNode call, CallArgumentsNode args, ArgumentsSignature varArgSignature) { CachedPrepareArguments(PrepareArguments next, RFunction function, RCallNode call, CallArgumentsNode args, ArgumentsSignature varArgSignature, boolean noOpt) {
this.next = next; this.next = next;
cachedVarArgSignature = varArgSignature; cachedVarArgSignature = varArgSignature;
matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, false); matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, noOpt);
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment