diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java index 1a429c573ebff80811f76d01390c7ddaec2dd03e..6abe44bf87025ba374fdee50f41b3416ea4e6f31 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java @@ -162,10 +162,11 @@ public final class AccessArgumentNode extends RNode { private boolean checkInsertOptDefaultArg() { if (optDefaultArgNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + RNode defaultArg = formals.getDefaultArgument(index); RNode arg = (RNode) RASTUtils.unwrap(defaultArg); - CompilerDirectives.transferToInterpreterAndInvalidate(); // TODO: all tests pass without it but perhaps we should "re-wrap" promises here? if (isOptimizableDefault(arg)) { optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) RASTUtils.cloneNode(arg), ArgumentStatePush.INVALID_INDEX); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java index 06593f0cd3b723173cda71c2377d482b23d90489..1e125cf6708eea51419ec0629fbffc4e4095c368 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java @@ -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) { return PrepareArguments.createExplicit(function); } else { 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") protected Object dispatch(VirtualFrame frame, @SuppressWarnings("unused") RFunction function, Object varArgs, Object s3Args, // @Cached("function") RFunction cachedFunction, // @@ -826,7 +830,7 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal public Object execute(MaterializedFrame materializedFrame, RFunction function, Object varArgs, Object s3Args) { if (cachedFunction != function) { leafCall = insert(createCacheNode(function)); - prepareArguments = insert(createArguments(function)); + prepareArguments = insert(createArguments(function, true)); } VirtualFrame frame = SubstituteVirtualFrame.create(materializedFrame); Object[] orderedArguments = prepareArguments.execute(frame, (RArgsValuesAndNames) varArgs, originalCall); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java index 2630a51f78a5d5e4a28cf2878fe0a7cdaaa1872c..d7bd5e7ee3c82cb6e62f2602a9b1e265b690dc1c 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java @@ -50,8 +50,8 @@ public abstract class PrepareArguments extends Node { public abstract Object[] execute(VirtualFrame frame, RArgsValuesAndNames varArgs, RCallNode call); - public static PrepareArguments create(RFunction function, CallArgumentsNode args) { - return new UninitializedPrepareArguments(function, args); + public static PrepareArguments create(RFunction function, CallArgumentsNode args, boolean noOpt) { + return new UninitializedPrepareArguments(function, args, noOpt); } public static PrepareArguments createExplicit(RFunction function) { @@ -62,11 +62,13 @@ public abstract class PrepareArguments extends Node { private final RFunction function; private final CallArgumentsNode sourceArguments; // not used as a node + private final boolean noOpt; private int depth = CACHE_SIZE; - UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments) { + UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments, boolean noOpt) { this.function = function; this.sourceArguments = sourceArguments; + this.noOpt = noOpt; } @Override @@ -74,7 +76,7 @@ public abstract class PrepareArguments extends Node { CompilerDirectives.transferToInterpreterAndInvalidate(); PrepareArguments next; 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 { next = new GenericPrepareArguments(function, sourceArguments); } @@ -88,10 +90,10 @@ public abstract class PrepareArguments extends Node { @Children private final RNode[] matchedArguments; 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; cachedVarArgSignature = varArgSignature; - matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, false); + matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, noOpt); } @Override