From 691807bf84e00cf85405c7155f162a07c621525a Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Wed, 15 Apr 2015 13:16:22 +0200 Subject: [PATCH] read arguments from the frame in NextMethod --- .../builtin/base/S3DispatchFunctions.java | 15 ++-- .../function/signature/ArgumentsNode.java | 3 +- .../signature/ArgumentsTypeSystem.java | 2 +- .../signature/CollectArgumentsNode.java | 84 +++++++++++++++++++ .../signature/CombineSignaturesNode.java | 4 +- .../oracle/truffle/r/runtime/RArguments.java | 9 +- .../truffle/r/test/ExpectedTestOutput.test | 3 + .../test/library/base/TestSimpleBuiltins.java | 1 + .../test/testrgen/TestrGenBuiltinformat.java | 3 +- .../TestrGenBuiltinisnaassign_default.java | 2 +- .../testrgen/TestrGenBuiltinoperators.java | 8 +- .../testrgen/TestrGenBuiltinprintAsIs.java | 4 +- .../test/testrgen/TestrGenBuiltinsubset2.java | 9 +- 13 files changed, 114 insertions(+), 33 deletions(-) create mode 100644 com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CollectArgumentsNode.java diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/S3DispatchFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/S3DispatchFunctions.java index 2620a949d0..22e4b2d3ea 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/S3DispatchFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/S3DispatchFunctions.java @@ -12,6 +12,8 @@ package com.oracle.truffle.r.nodes.builtin.base; import static com.oracle.truffle.r.runtime.RBuiltinKind.*; +import java.util.*; + import com.oracle.truffle.api.*; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.dsl.*; @@ -140,6 +142,7 @@ public abstract class S3DispatchFunctions extends RBuiltinNode { @Child private ReadVariableNode rvnDef = ReadVariableNode.create(RRuntime.RDotGenericDefEnv, RType.Any, ReadKind.SilentLocal); @Child private CombineSignaturesNode combineSignatures; + @Child private CollectArgumentsNode collectArguments = CollectArgumentsNodeGen.create(null); @CompilationFinal private RAttributeProfiles attrProfiles; @Child private PromiseHelperNode promiseHelper; @@ -180,11 +183,10 @@ public abstract class S3DispatchFunctions extends RBuiltinNode { String group = (String) rvnGroup.execute(frame); ArgumentsSignature suppliedSignature; - Object[] suppliedArguments; ArgumentsSignature parameterSignature = parameterSignatureProfile.profile(RArguments.getSignature(frame)); + Object[] suppliedArguments = collectArguments.execute(frame, parameterSignature); if (emptyArgsProfile.profile(args == RArgsValuesAndNames.EMPTY)) { suppliedSignature = parameterSignature; - suppliedArguments = RArguments.getArguments(frame); } else { if (combineSignatures == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -192,13 +194,8 @@ public abstract class S3DispatchFunctions extends RBuiltinNode { } suppliedSignature = combineSignatures.execute(parameterSignature, args.getSignature()); - suppliedArguments = new Object[suppliedSignature.getLength()]; - for (int i = 0; i < parameterSignature.getLength(); i++) { - suppliedArguments[i] = RArguments.getArgument(frame, i); - } - for (int i = 0; i < args.getSignature().getLength(); i++) { - suppliedArguments[parameterSignature.getLength() + i] = args.getValues()[i]; - } + suppliedArguments = Arrays.copyOf(suppliedArguments, suppliedSignature.getLength()); + System.arraycopy(args.getValues(), 0, suppliedArguments, parameterSignature.getLength(), suppliedSignature.getLength() - parameterSignature.getLength()); } return dispatch(frame, generic, readType(frame), group, genericCallFrame, genericDefFrame, suppliedSignature, suppliedArguments); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsNode.java index 6b16c66570..487cadf9d8 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsNode.java @@ -25,10 +25,9 @@ package com.oracle.truffle.r.nodes.function.signature; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; -import com.oracle.truffle.r.runtime.*; @TypeSystemReference(ArgumentsTypeSystem.class) public abstract class ArgumentsNode extends Node { - public abstract ArgumentsSignature execute(VirtualFrame frame); + public abstract Object execute(VirtualFrame frame); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsTypeSystem.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsTypeSystem.java index 2dd8a33e22..6bfe58de13 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsTypeSystem.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/ArgumentsTypeSystem.java @@ -25,7 +25,7 @@ package com.oracle.truffle.r.nodes.function.signature; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.r.runtime.*; -@TypeSystem(ArgumentsSignature.class) +@TypeSystem({ArgumentsSignature.class, Object[].class}) public class ArgumentsTypeSystem { } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CollectArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CollectArgumentsNode.java new file mode 100644 index 0000000000..c38e487766 --- /dev/null +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CollectArgumentsNode.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, 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.function.signature; + +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.utilities.*; +import com.oracle.truffle.r.nodes.access.variables.*; +import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode.ReadKind; +import com.oracle.truffle.r.runtime.*; +import com.oracle.truffle.r.runtime.data.*; + +@NodeChildren({@NodeChild("signature")}) +public abstract class CollectArgumentsNode extends ArgumentsNode { + + protected static final int CACHE_LIMIT = 3; + + private final ConditionProfile valueMissingProfile = ConditionProfile.createBinaryProfile(); + + public abstract Object[] execute(VirtualFrame frame, ArgumentsSignature signature); + + protected ReadVariableNode[] createReads(ArgumentsSignature signature) { + ReadVariableNode[] reads = new ReadVariableNode[signature.getLength()]; + for (int i = 0; i < signature.getLength(); i++) { + reads[i] = ReadVariableNode.create(signature.getName(i), RType.Any, ReadKind.SilentLocal); + } + return reads; + } + + @SuppressWarnings("unused") + @ExplodeLoop + @Specialization(limit = "CACHE_LIMIT", guards = {"cachedSignature == signature"}) + protected Object[] combineCached(VirtualFrame frame, ArgumentsSignature signature, @Cached("signature") ArgumentsSignature cachedSignature, + @Cached("createReads(signature)") ReadVariableNode[] reads) { + Object[] result = new Object[reads.length]; + for (int i = 0; i < reads.length; i++) { + Object value = reads[i].execute(frame); + result[i] = valueMissingProfile.profile(value == null) ? RMissing.instance : value; + } + return result; + } + + @Specialization + protected Object[] combine(VirtualFrame frame, ArgumentsSignature signature) { + return readFromMaterialized(frame.materialize(), signature); + } + + @TruffleBoundary + private static Object[] readFromMaterialized(MaterializedFrame frame, ArgumentsSignature signature) { + Object[] result = new Object[signature.getLength()]; + FrameDescriptor desc = frame.getFrameDescriptor(); + for (int i = 0; i < signature.getLength(); i++) { + FrameSlot slot = desc.findFrameSlot(signature.getName(i)); + if (slot == null) { + result[i] = RMissing.instance; + } else { + result[i] = frame.getValue(slot); + } + } + return result; + } +} diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CombineSignaturesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CombineSignaturesNode.java index 88d0d88e30..16d66c14f5 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CombineSignaturesNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/CombineSignaturesNode.java @@ -29,10 +29,12 @@ import com.oracle.truffle.r.runtime.*; @NodeChildren({@NodeChild("left"), @NodeChild("right")}) public abstract class CombineSignaturesNode extends ArgumentsNode { + protected static final int CACHE_LIMIT = 3; + public abstract ArgumentsSignature execute(ArgumentsSignature left, ArgumentsSignature right); @SuppressWarnings("unused") - @Specialization(guards = {"left == leftCached", "right == rightCached"}) + @Specialization(limit = "CACHE_LIMIT", guards = {"left == leftCached", "right == rightCached"}) protected ArgumentsSignature combineCached(ArgumentsSignature left, ArgumentsSignature right, @Cached("left") ArgumentsSignature leftCached, @Cached("right") ArgumentsSignature rightCached, @Cached("combine(left, right)") ArgumentsSignature resultCached) { return resultCached; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java index 584c23f341..e8fb3eb49e 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java @@ -252,10 +252,6 @@ public final class RArguments { return (boolean) getArgumentsWithEvalCheck(frame)[INDEX_IS_IRREGULAR]; } - public static void copyArgumentsInto(Frame frame, Object[] target) { - System.arraycopy(getArgumentsWithEvalCheck(frame), INDEX_ARGUMENTS, target, 0, getNArgs(frame)); - } - public static Object getArgument(Frame frame, int argIndex) { assert (argIndex >= 0 && argIndex < getNArgs(frame)); return getArgumentsWithEvalCheck(frame)[INDEX_ARGUMENTS + argIndex]; @@ -266,6 +262,11 @@ public final class RArguments { return Arrays.copyOfRange(args, INDEX_ARGUMENTS, INDEX_ARGUMENTS + ((ArgumentsSignature) args[INDEX_SIGNATURE]).getLength()); } + public static void copyArguments(Frame frame, Object[] dest, int pos) { + Object[] args = getArgumentsWithEvalCheck(frame); + System.arraycopy(args, INDEX_ARGUMENTS, dest, pos, ((ArgumentsSignature) args[INDEX_SIGNATURE]).getLength()); + } + /** * <b>Only to be called from AccessArgumentNode!</b> * 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 7194f37209..cc52af6946 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 @@ -13323,6 +13323,9 @@ Error in k() : argument "y" is missing, with no default #{ f<-function(x, ..., y=TRUE) { nargs() }; f(1, 2, 3) } [1] 3 +##com.oracle.truffle.r.test.library.base.TestSimpleBuiltins.testNextMethod +#{ foo <- function(x,y) UseMethod('foo'); foo.bar <- function(x, y) { y <- 10; NextMethod() }; foo.default <- function(x,y) cat(x,y); v <- c(1,2,3); class(v) <- 'bar'; foo(v,5) } +1 2 3 10 ##com.oracle.truffle.r.test.library.base.TestSimpleBuiltins.testNextMethod #{ g<-function(){ x<-1; class(x)<-c("a","b","c"); f<-function(x){UseMethod("f")}; f.a<-function(x){cat("a");NextMethod("f",x)}; f.b<-function(x){cat("b")}; f(x); }; g() } ab diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java index bc23226a9e..d8ac877e5a 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java @@ -3408,6 +3408,7 @@ public class TestSimpleBuiltins extends TestBase { assertEval("{ g<-function(){ x<-1; class(x)<-c(\"a\",\"b\",\"c\"); f<-function(x){UseMethod(\"f\")}; f.a<-function(x){cat(\"a\");NextMethod(\"f\",x, 42)}; f.b<-function(x, y=7){cat(\"b\", y)}; f(x); }; g(); }"); assertEval("{ g<-function(){ x<-1; class(x)<-c(\"a\",\"b\",\"c\"); f<-function(x){UseMethod(\"f\")}; f.a<-function(x){cat(\"a\");NextMethod(\"f\",x,\"m\",\"n\")}; f.b<-function(x, y=\"h\", z=\"i\"){cat(\"b\", y, z)}; f(x); }; g() }"); assertEval("{ g<-function(){ x<-1; class(x)<-c(\"a\",\"b\",\"c\"); f<-function(x){UseMethod(\"f\")}; f.a<-function(x){cat(\"a\");NextMethod(\"f\",x,z=\"m\",y=\"n\")}; f.b<-function(x, y=\"h\", z=\"i\"){cat(\"b\", y, z)}; f(x); }; g() }"); + assertEval("{ foo <- function(x,y) UseMethod('foo'); foo.bar <- function(x, y) { y <- 10; NextMethod() }; foo.default <- function(x,y) cat(x,y); v <- c(1,2,3); class(v) <- 'bar'; foo(v,5) }"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinformat.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinformat.java index aaaea11757..662ce0dc9a 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinformat.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinformat.java @@ -284,8 +284,7 @@ public class TestrGenBuiltinformat extends TestBase { @Test public void testformat52() { - assertEval(Ignored.Unknown, - "argv <- list(structure('def\\\'gh', class = 'AsIs'), FALSE, NULL, 0L, NULL, 3L, TRUE, NA); .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]]))"); + assertEval("argv <- list(structure('def\\\'gh', class = 'AsIs'), FALSE, NULL, 0L, NULL, 3L, TRUE, NA); .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]]))"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinisnaassign_default.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinisnaassign_default.java index e3a56420a6..23868232e9 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinisnaassign_default.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinisnaassign_default.java @@ -24,7 +24,7 @@ public class TestrGenBuiltinisnaassign_default extends TestBase { @Test public void testisnaassign_default2() { - assertEval(Ignored.Unknown, "argv <- structure(list(x = structure(c('A', '3', 'C'), class = 'AsIs'), value = 2), .Names = c('x', 'value'));do.call('is.na<-.default', argv)"); + assertEval("argv <- structure(list(x = structure(c('A', '3', 'C'), class = 'AsIs'), value = 2), .Names = c('x', 'value'));do.call('is.na<-.default', argv)"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinoperators.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinoperators.java index e69eae3159..214f27a856 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinoperators.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinoperators.java @@ -483,8 +483,7 @@ public class TestrGenBuiltinoperators extends TestBase { @Test public void testoperators91() { - assertEval(Ignored.Unknown, - "argv <- list(structure(list(c(3L, 0L, 1L)), class = c('R_system_version', 'package_version', 'numeric_version')), structure('3.1', .Names = 'gridSVG2'));`<`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(c(3L, 0L, 1L)), class = c('R_system_version', 'package_version', 'numeric_version')), structure('3.1', .Names = 'gridSVG2'));`<`(argv[[1]],argv[[2]]);"); } @Test @@ -746,8 +745,7 @@ public class TestrGenBuiltinoperators extends TestBase { @Test public void testoperators142() { - assertEval(Ignored.Unknown, - "argv <- list(structure(list(c(3L, 0L, 1L)), class = c('R_system_version', 'package_version', 'numeric_version')), structure('2.13.2', .Names = 'SweaveListingUtils'));`>`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(c(3L, 0L, 1L)), class = c('R_system_version', 'package_version', 'numeric_version')), structure('2.13.2', .Names = 'SweaveListingUtils'));`>`(argv[[1]],argv[[2]]);"); } @Test @@ -803,7 +801,7 @@ public class TestrGenBuiltinoperators extends TestBase { @Test public void testoperators153() { - assertEval(Ignored.Unknown, "argv <- list(structure(list(2L), class = 'numeric_version'), '2');`>=`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(2L), class = 'numeric_version'), '2');`>=`(argv[[1]],argv[[2]]);"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinprintAsIs.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinprintAsIs.java index b41719ebb1..e5e0d4a417 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinprintAsIs.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinprintAsIs.java @@ -2,7 +2,7 @@ * This material is distributed under the GNU General Public License * Version 2. You may review the terms of this license at * http://www.gnu.org/licenses/gpl-2.0.html - * + * * Copyright (c) 2014, Purdue University * Copyright (c) 2014, Oracle and/or its affiliates * All rights reserved. @@ -19,7 +19,7 @@ public class TestrGenBuiltinprintAsIs extends TestBase { @Test public void testprintAsIs1() { - assertEval(Ignored.Unknown, "argv <- structure(list(x = structure(c(2L, 5L), .Dim = 1:2, class = 'AsIs')), .Names = 'x');do.call('print.AsIs', argv)"); + assertEval("argv <- structure(list(x = structure(c(2L, 5L), .Dim = 1:2, class = 'AsIs')), .Names = 'x');do.call('print.AsIs', argv)"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinsubset2.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinsubset2.java index 57d9e826a5..3de8c26f31 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinsubset2.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/testrgen/TestrGenBuiltinsubset2.java @@ -49,8 +49,7 @@ public class TestrGenBuiltinsubset2 extends TestBase { @Test public void testsubset27() { - assertEval(Ignored.Unknown, - "argv <- list(structure(list(surname = structure(c('Tukey', 'Venables', 'Tierney', 'Ripley', 'McNeil'), class = 'AsIs')), .Names = 'surname'), 1L);.subset2(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(surname = structure(c('Tukey', 'Venables', 'Tierney', 'Ripley', 'McNeil'), class = 'AsIs')), .Names = 'surname'), 1L);.subset2(argv[[1]],argv[[2]]);"); } @Test @@ -61,8 +60,7 @@ public class TestrGenBuiltinsubset2 extends TestBase { @Test public void testsubset29() { - assertEval(Ignored.Unknown, - "argv <- list(structure(list(z = structure(c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'), .Dim = c(3L, 3L), class = 'AsIs')), .Names = 'z'), 1L);.subset2(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(z = structure(c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'), .Dim = c(3L, 3L), class = 'AsIs')), .Names = 'z'), 1L);.subset2(argv[[1]],argv[[2]]);"); } @Test @@ -78,8 +76,7 @@ public class TestrGenBuiltinsubset2 extends TestBase { @Test public void testsubset213() { - assertEval(Ignored.Unknown, - "argv <- list(structure(list(a = structure('abc', class = 'AsIs'), b = structure('def\\\'gh', class = 'AsIs')), .Names = c('a', 'b'), row.names = '1', class = 'data.frame'), 1L);.subset2(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(list(a = structure('abc', class = 'AsIs'), b = structure('def\\\'gh', class = 'AsIs')), .Names = c('a', 'b'), row.names = '1', class = 'data.frame'), 1L);.subset2(argv[[1]],argv[[2]]);"); } @Test -- GitLab