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 a2f9f24870ae2a875bc3e746e164a04c93049937..e68c67738e1883d87e03fee26ada8cdad948f779 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 b12913ea87cdcd36b38b11b7524050a3cc0ef1ae..cc9bab4b2ebd28ab9e5ebf5b4e037c9a54c99a4d 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 20fbe944875b6d699668b50c63f627905fb3a936..056d35a41b38d53eb4086c666483077a6ab33845 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) }");