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