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