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