From ef3fd0dce704202a4cf3e4318c821e035ceb3307 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Mon, 10 Jul 2017 14:53:19 +0200
Subject: [PATCH] Fix: MatrixFastPath handles REmpty like RMissing

---
 .../r/nodes/builtin/base/fastpaths/MatrixFastPath.java     | 5 +++--
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test  | 7 +++++++
 .../oracle/truffle/r/test/builtins/TestBuiltin_matrix.java | 5 +++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/fastpaths/MatrixFastPath.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/fastpaths/MatrixFastPath.java
index 1be6fc9e6c..48f97b147f 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/fastpaths/MatrixFastPath.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/fastpaths/MatrixFastPath.java
@@ -32,6 +32,7 @@ import com.oracle.truffle.r.nodes.builtin.base.MatrixNodeGen;
 import com.oracle.truffle.r.nodes.unary.CastIntegerNode;
 import com.oracle.truffle.r.nodes.unary.FirstIntNode;
 import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.data.REmpty;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -58,8 +59,8 @@ public abstract class MatrixFastPath extends RFastPathNode {
                     @Cached("createBinaryProfile()") ConditionProfile dimMissingProfile,
                     @Cached("createMatrix()") Matrix matrix,
                     @Cached("createClassProfile()") ValueProfile classProfile) {
-        boolean rowMissing = rowMissingProfile.profile(nrow == RMissing.instance);
-        boolean colMissing = colMissingProfile.profile(ncol == RMissing.instance);
+        boolean rowMissing = rowMissingProfile.profile(nrow == RMissing.instance || nrow == REmpty.instance);
+        boolean colMissing = colMissingProfile.profile(ncol == RMissing.instance || ncol == REmpty.instance);
         int row = rowMissing ? 1 : firstRow.executeInt(castRow.doCast(nrow));
         int col = colMissing ? 1 : firstCol.executeInt(castCol.doCast(ncol));
         Object dim = dimMissingProfile.profile(dimnames == RMissing.instance) ? RNull.instance : dimnames;
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 24df590080..406e40f87f 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
@@ -34977,6 +34977,13 @@ c  33
 2    2
 3    3
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_matrix.testMatrixFastPath#
+#matrix(1:9,,3)
+     [,1] [,2] [,3]
+[1,]    1    4    7
+[2,]    2    5    8
+[3,]    3    6    9
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_matrix.testmatrix1#
 #argv <- list(NA_real_, 1L, 5L, FALSE, list('Residuals', c('Df', 'Sum Sq', 'Mean Sq', 'F value', 'Pr(>F)')), FALSE, FALSE); .Internal(matrix(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]]))
           Df Sum Sq Mean Sq F value Pr(>F)
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_matrix.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_matrix.java
index 5881b9f0dd..52ea31129b 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_matrix.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_matrix.java
@@ -251,4 +251,9 @@ public class TestBuiltin_matrix extends TestBase {
     public void testmatrix44() {
         assertEval("argv <- list(structure(list(a1 = 1:3, a2 = 4:6, a3 = 3.14159265358979, a4 = c('a', 'b', 'c')), .Names = c('a1', 'a2', 'a3', 'a4')), 2, 2, FALSE, NULL, FALSE, FALSE); .Internal(matrix(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]]))");
     }
+
+    @Test
+    public void testMatrixFastPath() {
+        assertEval("matrix(1:9,,3)");
+    }
 }
-- 
GitLab