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