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 c94ad969ea97e4931365d03143a56eab8c5a8e93..4b795471d4427658e9c5ea5a0f73e1015fcdf12d 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 {