From 9e73f8791d9b461d5a84b59a955ffa53339c94b1 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Tue, 3 Oct 2017 12:13:06 +0200 Subject: [PATCH] Added missing specialization for 'RS4Object' to function 'length'. --- .../oracle/truffle/r/nodes/control/RLengthNode.java | 12 ++++++++++++ .../oracle/truffle/r/test/ExpectedTestOutput.test | 4 ++++ .../truffle/r/test/builtins/TestBuiltin_length.java | 1 + 3 files changed, 17 insertions(+) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java index f1e7dce2b6..3d9a66f76f 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java @@ -39,8 +39,10 @@ import com.oracle.truffle.r.nodes.profile.VectorLengthProfile; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; +import com.oracle.truffle.r.runtime.data.RExternalPtr; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RS4Object; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.env.REnvironment; @@ -131,6 +133,16 @@ public abstract class RLengthNode extends RBaseNode { return 1; } + @Specialization + protected int getLength(@SuppressWarnings("unused") RS4Object obj) { + return 1; + } + + @Specialization + protected int getLength(@SuppressWarnings("unused") RExternalPtr ptr) { + return 1; + } + protected static Node createGetSize() { return Message.GET_SIZE.createNode(); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 1c56e534ad..191186f0e9 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -31392,6 +31392,10 @@ NULL #{ length(d<-dim(1:3)) } [1] 0 +##com.oracle.truffle.r.test.builtins.TestBuiltin_length.testLength# +#{ setClass('LengthTestClass', representation(a = 'numeric'), where=e); obj <- new('LengthTestClass', a = 1:100); length(obj) } +Error in getClassDef(Class, where) : object 'e' not found + ##com.oracle.truffle.r.test.builtins.TestBuiltin_length.testlength1# #argv <- list('~ . + Soft+M.user:Temp');length(argv[[1]]); [1] 1 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_length.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_length.java index d03f279dee..3178c54b85 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_length.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_length.java @@ -211,5 +211,6 @@ public class TestBuiltin_length extends TestBase { assertEval("length(quote(x))"); assertEval("length(as.symbol('x'))"); assertEval("{ foo <- function(...) length(get('...')); foo(a=1, b=2, c=3, d=4); }"); + assertEval("{ setClass('LengthTestClass', representation(a = 'numeric'), where=e); obj <- new('LengthTestClass', a = 1:100); length(obj) }"); } } -- GitLab