From 61248b9e051046d80660c0b7e06d097d5d2eaafc Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Thu, 31 Dec 2015 11:12:49 -0800
Subject: [PATCH] A fix to accessing language objects as vectors.

---
 .../oracle/truffle/r/nodes/function/RCallNode.java  | 13 ++++++++++---
 .../r/test/library/base/TestSimpleVectors.java      |  2 ++
 2 files changed, 12 insertions(+), 3 deletions(-)

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 1e540bf587..03d3c514ba 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
@@ -56,6 +56,7 @@ import com.oracle.truffle.r.nodes.RASTUtils;
 import com.oracle.truffle.r.nodes.RRootNode;
 import com.oracle.truffle.r.nodes.access.ConstantNode;
 import com.oracle.truffle.r.nodes.access.FrameSlotNode;
+import com.oracle.truffle.r.nodes.access.variables.NamedRNode;
 import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinRootNode;
@@ -85,6 +86,7 @@ import com.oracle.truffle.r.runtime.data.RPromise;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTypedValue;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.gnur.SEXPTYPE;
 import com.oracle.truffle.r.runtime.nodes.RBaseNode;
@@ -541,10 +543,15 @@ public final class RCallNode extends RNode implements RSyntaxNode {
             if (RASTUtils.isNamedFunctionNode(this)) {
                 return RASTUtils.findFunctionName(this);
             } else {
-                if (functionNode instanceof ConstantNode && ((ConstantNode) functionNode).getValue() instanceof RSymbol) {
-                    return ((ConstantNode) functionNode).getValue();
+                RNode newFunctionNode = functionNode;
+                if (newFunctionNode instanceof NamedRNode) {
+                    newFunctionNode = ((NamedRNode) newFunctionNode).original;
+                }
+                if (newFunctionNode instanceof ConstantNode &&
+                                (((ConstantNode) newFunctionNode).getValue() instanceof RSymbol || ((ConstantNode) newFunctionNode).getValue() instanceof RAbstractVector)) {
+                    return ((ConstantNode) newFunctionNode).getValue();
                 } else {
-                    return RDataFactory.createLanguage(functionNode);
+                    return RDataFactory.createLanguage(newFunctionNode);
                 }
             }
         } else {
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java
index ceb4c192a2..d446a58c0e 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java
@@ -674,6 +674,8 @@ public class TestSimpleVectors extends TestBase {
         assertEval("{ f<-function() 42; y<-list(); y[[1]]<-f; y[[1]] }");
         assertEval("{ x<-as.symbol(\"foo\"); y<-list(); y[[1]]<-x; y[[1]] }");
         assertEval("{ x<-getClass(\"ClassUnionRepresentation\"); y<-list(); y[[1]]<-x; y[[1]]@virtual }");
+
+        assertEval("{ sigList<-list(object=c(\"foo\", \"\")); fcall<-do.call(\"call\", c(\"fun\", sigList)); x<-fcall[-1]; x[[1]] }");
     }
 
     @Test
-- 
GitLab