From 9633c2429c29400aa022c88e4df07794699722e2 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Fri, 17 Nov 2017 12:59:56 +0100 Subject: [PATCH] Fix: Allow NULL in builtin 'order'. --- .../com/oracle/truffle/r/nodes/builtin/base/Order.java | 10 ++++++++++ .../com/oracle/truffle/r/test/ExpectedTestOutput.test | 8 ++++++++ .../truffle/r/test/builtins/TestBuiltin_order.java | 3 +++ 3 files changed, 21 insertions(+) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java index ac41e8e535..a3aa04791e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java @@ -178,6 +178,12 @@ public abstract class Order extends RPrecedenceBuiltinNode { return RNull.instance; } + @SuppressWarnings("unused") + @Specialization(guards = {"oneVec(args)", "isNull(args)"}) + Object orderNull(byte naLast, boolean decreasing, RArgsValuesAndNames args) { + throw error(RError.Message.NOT_A_VECTOR, 1); + } + @Specialization(guards = {"oneVec(args)", "isFirstIntegerPrecedence(args)"}) Object orderInt(byte naLast, boolean decreasing, RArgsValuesAndNames args) { RAbstractIntVector v = (RAbstractIntVector) castVector(args.getArgument(0)); @@ -694,6 +700,10 @@ public abstract class Order extends RPrecedenceBuiltinNode { return isListPrecedence(args.getArgument(0)); } + protected boolean isNull(RArgsValuesAndNames args) { + return args.getArgument(0) == RNull.instance; + } + protected boolean noVec(RArgsValuesAndNames args) { return args.isEmpty(); } 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 73654eed63..ea87c1d8a9 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 @@ -46123,6 +46123,10 @@ Error in options(list(NULL)) : list argument has no valid names 'data.frame': 3 obs. of 1 variable: $ a: Factor w/ 3 levels "A wo","Far ",..: 1 2 3 +##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# +#order(NULL) +Error in order(NULL) : argument 1 is not a vector + ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# #order(c('40 50', '405', '40 51', '4028', '40 20', '40 30', '404')) [1] 5 6 1 3 4 7 2 @@ -46132,6 +46136,10 @@ Error in options(list(NULL)) : list argument has no valid names Error in order(c(1, 2, 0), decreasing = NA) : 'decreasing' elements must be TRUE or FALSE +##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# +#order(c(NULL, c(1,2,0))) +[1] 3 1 2 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# #{ order() } NULL diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java index 5763cc90d5..a6b41ccc50 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java @@ -166,5 +166,8 @@ public class TestBuiltin_order extends TestBase { assertEval("order(c(1,2,0), decreasing=NA)"); assertEval("invisible(Sys.setlocale('LC_COLLATE', 'EN_us')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); invisible(Sys.setlocale('LC_COLLATE', 'C')); str(as.data.frame(list(a=c('A wo','Far ','abc '))));"); + + assertEval("order(NULL)"); + assertEval("order(c(NULL, c(1,2,0)))"); } } -- GitLab