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