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