From 3e6906d4403b90e9de92a62eb5996dabda321293 Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Sun, 26 Jan 2014 21:24:57 -0800
Subject: [PATCH] Implemented the non-replacement form of the "dimnames"
 function, enabled the replacement form, and added tests.

---
 .../r/nodes/builtin/base/BasePackage.java     |  2 +
 .../r/nodes/builtin/base/DimNames.java        | 52 +++++++++++++++++++
 .../r/nodes/builtin/base/UpdateDimNames.java  |  2 +-
 .../truffle/r/test/ExpectedTestOutput.test    | 30 +++++++++++
 .../oracle/truffle/r/test/all/AllTests.java   | 40 ++++++++++++++
 .../r/test/simple/TestSimpleBuiltins.java     | 11 +++-
 6 files changed, 135 insertions(+), 2 deletions(-)
 create mode 100644 com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/DimNames.java

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
index 568a837e40..5f695cded9 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
@@ -85,6 +85,7 @@ public class BasePackage extends RPackage {
         load(CumSum.class);
         load(Diag.class);
         load(Dim.class);
+        load(DimNames.class);
         load(DoubleBuiltin.class);
         load(EmptyEnv.class);
         load(Exists.class);
@@ -167,6 +168,7 @@ public class BasePackage extends RPackage {
         load(UpdateAttributes.class);
         load(UpdateDiag.class);
         load(UpdateDim.class);
+        load(UpdateDimNames.class);
         load(UpdateLength.class);
         load(UpdateNames.class);
         load(UpperTri.class);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/DimNames.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/DimNames.java
new file mode 100644
index 0000000000..2b81dd39e7
--- /dev/null
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/DimNames.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.nodes.builtin.base;
+
+import com.oracle.truffle.api.dsl.*;
+import com.oracle.truffle.r.nodes.builtin.*;
+import com.oracle.truffle.r.runtime.data.*;
+import com.oracle.truffle.r.runtime.data.model.*;
+
+@RBuiltin("dimnames")
+public abstract class DimNames extends RBuiltinNode {
+
+    @Specialization
+    public RNull getDimNames(RNull operand) {
+        return operand;
+    }
+
+    @Specialization(guards = "!isNull")
+    public RList getDimNames(RAbstractVector vector) {
+        return vector.getDimNames();
+    }
+
+    @Specialization(guards = "isNull")
+    public RNull getDimNamesNull(@SuppressWarnings("unused") RAbstractVector vector) {
+        return RNull.instance;
+    }
+
+    protected boolean isNull(RAbstractVector vector) {
+        return vector.getDimNames() == null;
+    }
+
+}
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
index abeb341174..e58d4689d0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
@@ -33,7 +33,7 @@ import com.oracle.truffle.r.runtime.*;
 import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 
-@RBuiltin("dimnnames<-")
+@RBuiltin("dimnames<-")
 @SuppressWarnings("unused")
 public abstract class UpdateDimNames extends RBuiltinNode {
 
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 7883a6d092..20a60666f0 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
@@ -3328,6 +3328,14 @@ NULL
 #{ dim(1:3) }
 NULL
 
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ dimnames(1) }
+NULL
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ dimnames(NULL) }
+NULL
+
 ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
 #{ m <- matrix(1:6, nrow=3) ; dim(m) }
 [1] 3 2
@@ -3457,6 +3465,24 @@ attr(,"foo")
 #{ x<-1:4; y<-c(2, 2); dim(x)<-y; y[1]=4; dim(x) }
 [1] 2 2
 
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dim(x)<-1; attr(x, "dimnames")<-1 }
+Error in attr(x, "dimnames") <- 1 : 'dimnames' must be a list
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dim(x)<-1; dimnames(x)<-1; dimnames(x) }
+Error in dimnames(x) <- 1 : 'dimnames' must be a list
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dim(x)<-1; dimnames(x)<-list("a"); dimnames(x); dimnames(x)<-list(); dimnames(x) }
+NULL
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dim(x)<-1; dimnames(x)<-list() }
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dim(x)<-1; dimnames(x)<-list(0) }
+
 ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
 #{ x<-1; dim(x)=1; attr(x, "foo")<-"foo"; dim(x)<-NULL; attributes(x) }
 $foo
@@ -3471,6 +3497,10 @@ NULL
 #{ x<-1; dim(x)=1; names(x)<-"a"; dim(x)<-NULL; attributes(x) }
 NULL
 
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
+#{ x<-1; dimnames(x) }
+NULL
+
 ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
 #{ x<-42; y<-(dim(x)<-1); y }
 [1] 1
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
index 3bd952a47a..a9ea3c4f64 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
@@ -5868,6 +5868,36 @@ public class AllTests extends TestBase {
         assertEval("{ x<-list(1,2,3); names(x)<-c(21:23); attr(x, \"dim\")<-c(3); attr(x, \"foo\")<-\"foo\"; x }");
     }
 
+    @Test
+    public void TestSimpleBuiltins_testDimensions_23b7e792972c66f8f798088f2e2db517() {
+        assertEval("{ x<-1; dimnames(x) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_25559c72545218e5904f029d31043341() {
+        assertEval("{ dimnames(1) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_94c1f6362cb75ccb566992ddbb86b57f() {
+        assertEval("{ dimnames(NULL) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_fa944f6fbbd53435e7ee6de00c6e156d() {
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list() }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_2979e5a89355ac34e701f6b1d6910468() {
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list(0) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_2dc914e1fb3582f18a062c4d58f30902() {
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list(\"a\"); dimnames(x); dimnames(x)<-list(); dimnames(x) }");
+    }
+
     @Test
     public void TestSimpleBuiltins_testDimensions_d23f468ff3aa03426d65d05b9ae6bd9b() {
         assertEvalError("{ x <- 1:2 ; dim(x) <- c(1,3) ; x }");
@@ -5903,6 +5933,16 @@ public class AllTests extends TestBase {
         assertEvalError("{ x<-1:4; attr(x, \"dimnames\")<-list(101, 102, 103, 104) }");
     }
 
+    @Test
+    public void TestSimpleBuiltins_testDimensions_b89fca3316a99a6fae82c3f731c89989() {
+        assertEvalError("{ x<-1; dim(x)<-1; dimnames(x)<-1; dimnames(x) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDimensions_741ea80b0aaaf4ab255749f44075a2f7() {
+        assertEvalError("{ x<-1; dim(x)<-1; attr(x, \"dimnames\")<-1 }");
+    }
+
     @Test
     public void TestSimpleBuiltins_testDimensions_b5baee88565f3b36d5026bad6cc5e60a() {
         assertEvalWarning("{ x<-1:12; dim(x)<-c(12+10i); x }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
index 478fc06236..6871746a87 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
@@ -793,7 +793,7 @@ public class TestSimpleBuiltins extends TestBase {
         assertEval("{ x<-c(42); names(x)<-\"a\"; attr(x, \"dim\")<-1; names(x)<-\"z\"; names(x)<-NULL; attr(x, \"dimnames\")<-NULL; attributes(x) }");
         assertEvalError("{ x<-1:4; attr(x, \"dimnames\")<-list(101, 102, 103, 104) }");
         // assigning an "invisible" list returned by "attr(y, dimnames)<-" as dimnames attribute for
-// x
+        // x
         assertEval("{ x<-c(1); y<-c(1); dim(x)<-1; dim(y)<-1; attr(x, \"dimnames\")<-(attr(y, \"dimnames\")<-list(\"b\")); attributes(x) }");
 
         // there should be no output
@@ -807,6 +807,15 @@ public class TestSimpleBuiltins extends TestBase {
         assertEval("{ x<-1:2; dim(x)=c(1,2); names(x)<-c(\"a\", \"b\"); attr(x, \"foo\")<-\"foo\"; dim(x)<-NULL; attributes(x) }");
         assertEval("{ x<-1:4; names(x)<-c(21:24); attr(x, \"dim\")<-c(4); attr(x, \"foo\")<-\"foo\"; x }");
         assertEval("{ x<-list(1,2,3); names(x)<-c(21:23); attr(x, \"dim\")<-c(3); attr(x, \"foo\")<-\"foo\"; x }");
+
+        assertEval("{ x<-1; dimnames(x) }");
+        assertEval("{ dimnames(1) }");
+        assertEval("{ dimnames(NULL) }");
+        assertEvalError("{ x<-1; dim(x)<-1; dimnames(x)<-1; dimnames(x) }");
+        assertEvalError("{ x<-1; dim(x)<-1; attr(x, \"dimnames\")<-1 }");
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list() }");
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list(0) }");
+        assertEval("{ x<-1; dim(x)<-1; dimnames(x)<-list(\"a\"); dimnames(x); dimnames(x)<-list(); dimnames(x) }");
     }
 
     @Test
-- 
GitLab