From 82a19107b3284d87734c47022540f160a9e4a688 Mon Sep 17 00:00:00 2001 From: stepan <stepan.sindelar@oracle.com> Date: Fri, 23 Feb 2018 14:52:45 +0100 Subject: [PATCH] RfEvalNode can handle RSymbol in pairlist (looks up the function) --- .../oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java index c94ad969ea..4b795471d4 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java @@ -99,20 +99,24 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 { Object handlePairList(RPairList l, Object envArg, @Cached("createBinaryProfile()") ConditionProfile isPromiseProfile, @Cached("createBinaryProfile()") ConditionProfile noArgsProfile) { + REnvironment env = getEnv(envArg); Object car = l.car(); - RFunction f; + RFunction f = null; if (isPromiseProfile.profile(car instanceof RPromise)) { car = getPromiseHelper().evaluate(null, (RPromise) car); } if (car instanceof RFunction) { f = (RFunction) car; - } else { + } else if (car instanceof RSymbol) { + f = ReadVariableNode.lookupFunction(((RSymbol) car).getName(), env.getFrame()); + } + + if (f == null) { throw RError.error(RError.NO_CALLER, ARGUMENT_NOT_FUNCTION); } Object args = l.cdr(); - REnvironment env = getEnv(envArg); if (noArgsProfile.profile(args == RNull.instance)) { return evalFunction(f, env, null); } else { -- GitLab