From 28e296820ec84c3a67e177986ce451b2bc97a5f8 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Sat, 6 Jun 2015 10:56:08 -0700
Subject: [PATCH] add logical specialization for Order

---
 .../truffle/r/nodes/builtin/base/Order.java   | 24 +++++++++++++++++++
 .../truffle/r/test/ExpectedTestOutput.test    |  4 ++++
 .../r/test/builtins/TestBuiltin_order.java    |  1 +
 3 files changed, 29 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 a2f9f24870..e68c67738e 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
@@ -575,6 +575,30 @@ public abstract class Order extends RPrecedenceBuiltinNode {
 
         public abstract int executeInt(VirtualFrame frame, Object v, int i, int j, byte naLast);
 
+        @Specialization
+        protected int lcmp(RAbstractLogicalVector v, int i, int j, byte naLast) {
+            byte x = v.getDataAt(i);
+            byte y = v.getDataAt(j);
+            boolean nax = RRuntime.isNA(x);
+            boolean nay = RRuntime.isNA(y);
+            if (nax && nay) {
+                return 0;
+            }
+            if (nax) {
+                return naLast == RRuntime.LOGICAL_TRUE ? 1 : -1;
+            }
+            if (nay) {
+                return naLast == RRuntime.LOGICAL_TRUE ? -1 : 1;
+            }
+            if (x < y) {
+                return -1;
+            }
+            if (x > y) {
+                return 1;
+            }
+            return 0;
+        }
+
         @Specialization
         protected int icmp(RAbstractIntVector v, int i, int j, byte naLast) {
             int x = v.getDataAt(i);
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 b12913ea87..cc9bab4b2e 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
@@ -34322,6 +34322,10 @@ NULL
 #{ order(c(NA,NA,1), c(2,1,3)) }
 [1] 3 2 1
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder
+#{ order(c(TRUE, FALSE)) }
+[1] 2 1
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder
 #{ order(character()) }
 integer(0)
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 20fbe94487..056d35a41b 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
@@ -152,6 +152,7 @@ public class TestBuiltin_order extends TestBase {
         assertEval("{ order(c(1,2,3,NA), na.last=FALSE) }");
         assertEval("{ order(c(1,2,3,NA), na.last=FALSE, decreasing=TRUE) }");
         assertEval("{ order(c(0/0, -1/0, 2)) }");
+        assertEval("{ order(c(TRUE, FALSE)) }");
 
         assertEval("{ x<-c(40, 40,  1, 40,  1, 20, 40, 10, 40, 10, 16, 40, 10, 26, 40, 10, 39, 40, 11, 40, 12, 40, 12, 20); order(x, decreasing=TRUE) }");
         assertEval("{ x<-c(40, 40,  1, 40,  1, 20, 40, 10, 40, 10, 16, 40, 10, 26, 40, 10, 39, 40, 11, 40, 12, 40, 12, 20); order(x, decreasing=FALSE) }");
-- 
GitLab