From 09b13a2d3564aa40195ecb6cc929a3387ff21f6d Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Fri, 21 Jul 2017 13:11:31 +0200
Subject: [PATCH] length builtin can handle '...'

---
 .../src/com/oracle/truffle/r/nodes/control/RLengthNode.java | 6 ++++++
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test   | 4 ++++
 .../oracle/truffle/r/test/builtins/TestBuiltin_length.java  | 3 ++-
 3 files changed, 12 insertions(+), 1 deletion(-)

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 a7a57f523a..9406bba633 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
@@ -34,6 +34,7 @@ import com.oracle.truffle.api.nodes.Node;
 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.RFunction;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RSymbol;
@@ -118,6 +119,11 @@ public abstract class RLengthNode extends RNode {
         return lengthProfile.profile(env.ls(true, null, false).getLength());
     }
 
+    @Specialization
+    protected int getLength(RArgsValuesAndNames vargs) {
+        return vargs.getLength();
+    }
+
     @Specialization
     protected int getLength(@SuppressWarnings("unused") RFunction func) {
         return 1;
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 f2273c956a..45868f9bc3 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
@@ -30975,6 +30975,10 @@ NULL
 #length(quote(x))
 [1] 1
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_length.testLength#
+#{ foo <- function(...) length(get('...')); foo(a=1, b=2, c=3, d=4); }
+[1] 4
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_length.testLength#
 #{ length(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 62dee27127..d03f279dee 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
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -210,5 +210,6 @@ public class TestBuiltin_length extends TestBase {
         assertEval("{ length(1:3) }");
         assertEval("length(quote(x))");
         assertEval("length(as.symbol('x'))");
+        assertEval("{ foo <- function(...) length(get('...')); foo(a=1, b=2, c=3, d=4); }");
     }
 }
-- 
GitLab