diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java index 1c285abc055ca078db13f624a67bfba1b2a70202..ab2b4c006230fb741e1bfb08cffdf2a5eca09059 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java @@ -48,7 +48,6 @@ import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.api.source.SourceSection; import com.oracle.truffle.r.nodes.RASTUtils; import com.oracle.truffle.r.nodes.function.PromiseHelperNode; -import com.oracle.truffle.r.runtime.AnonymousFrameVariable; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.FastROptions; import com.oracle.truffle.r.runtime.RArguments; @@ -173,7 +172,7 @@ public final class ReadVariableNode extends RSourceSectionNode implements RSynta @Override public boolean isSyntax() { - return identifier instanceof String && !AnonymousFrameVariable.isAnonymous(identifierAsString); + return identifier instanceof String; } @Override diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java index 73dded63d284599fb6fdd1606af7dd5c288d10da..b8344ee25ab1045b6bf7252beb3c11bf68d23007 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java @@ -37,6 +37,7 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.nodes.RRootNode; import com.oracle.truffle.r.nodes.access.ConstantNode; import com.oracle.truffle.r.nodes.function.PromiseNode.VarArgNode; +import com.oracle.truffle.r.parser.tools.EvaluatedArgumentsVisitor; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RArguments; import com.oracle.truffle.r.runtime.RBuiltinKind; @@ -404,7 +405,7 @@ public class ArgumentMatcher { return PromiseNode.createInlined(suppliedArg, formals.getInternalDefaultArgumentAt(formalIndex), builtin == null || builtin.getKind() == RBuiltinKind.PRIMITIVE); } else { Closure closure = closureCache.getOrCreateClosure(suppliedArg); - boolean forcedEager = fastPath != null && fastPath.forcedEagerPromise(formalIndex); + boolean forcedEager = fastPath != null && fastPath.forcedEagerPromise(formalIndex) && EvaluatedArgumentsVisitor.isSimpleArgument(suppliedArg.asRSyntaxNode()); return PromiseNode.create(RPromiseFactory.create(PromiseType.ARG_SUPPLIED, closure), noOpt, forcedEager); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java index 587e2b44b7ab8da7e0c26ec99177935995efd9df..6ac7ddfe4ce481d5338754363a36094085fdc0e0 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java @@ -43,6 +43,7 @@ import com.oracle.truffle.r.nodes.function.PromiseHelperNode.PromiseCheckHelperN import com.oracle.truffle.r.nodes.function.opt.OptConstantPromiseNode; import com.oracle.truffle.r.nodes.function.opt.OptForcedEagerPromiseNode; import com.oracle.truffle.r.nodes.function.opt.OptVariablePromiseBaseNode; +import com.oracle.truffle.r.parser.tools.EvaluatedArgumentsVisitor; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RSerialize.State; @@ -108,7 +109,7 @@ public abstract class PromiseNode extends RNode { if (arg instanceof WrapArgumentNode && ((WrapArgumentNode) arg).modeChange()) { wrapIndex = ((WrapArgumentNode) arg).getIndex(); } - if (forcedEager) { + if (forcedEager && EvaluatedArgumentsVisitor.isSimpleArgument(expr.asRSyntaxNode())) { return new OptForcedEagerPromiseNode(factory, wrapIndex); } else { Object optimizableConstant = getOptimizableConstant(expr); diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java index ea785a9f2be2a0a841e1a26eb3b4212e1ed80682..e247d0d082ad8f2005ffbdae7823ac6fdc357c02 100644 --- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java +++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java @@ -190,4 +190,26 @@ public final class EvaluatedArgumentsVisitor extends RSyntaxVisitor<Info> { return new EvaluatedArgumentsFastPath(forcedArguments); } } + + public static boolean isSimpleArgument(RSyntaxElement node) { + if (node instanceof RSyntaxCall) { + RSyntaxCall call = (RSyntaxCall) node; + RSyntaxElement lhs = call.getSyntaxLHS(); + if (lhs instanceof RSyntaxLookup) { + if (wellKnownFunctions.contains(((RSyntaxLookup) lhs).getIdentifier())) { + for (RSyntaxElement arg : call.getSyntaxArguments()) { + if (!isSimpleArgument(arg)) { + return false; + } + } + return true; + } + } + } else if (node instanceof RSyntaxLookup) { + return true; + } else if (node instanceof RSyntaxConstant) { + return true; + } + return false; + } }