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 a7a57f523a4f14412abb09f5440eb82abaf47a1a..9406bba633e9b0a0b82a76b24cd23f9b3ab7a653 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 f2273c956a2b99acddb1c45321d2fe090d31a357..45868f9bc35459c11522e2c64d4925d28007fe92 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 62dee27127dced946709a9b53cb034dd31b42166..d03f279dee4133967964c619cefcf45ba45a898d 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); }"); } }