diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java index 9b4b963429d62fac8895a37defd264e109ff1072..4bd48a15a743aaff1b327b67af887a2d02dc5712 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java @@ -96,18 +96,18 @@ public final class GridContext { public void openDefaultDevice() { String defaultDev = RGridGraphicsAdapter.getDefaultDevice(); if (defaultDev.equals("awt") || defaultDev.startsWith("X11")) { - if (!FastRConfig.InternalGridAwtSupport) { - throw awtNotSupported(); - } else { - setCurrentDevice(defaultDev, WindowDevice.createWindowDevice()); - } + ensureAwtSupport(); + setCurrentDevice(defaultDev, WindowDevice.createWindowDevice()); } else if (defaultDev.equals("svg")) { setCurrentDevice(defaultDev, new SVGDevice("Rplot.svg", GridDevice.DEFAULT_WIDTH, GridDevice.DEFAULT_HEIGHT)); } else if (defaultDev.equals("png")) { + ensureAwtSupport(); setCurrentDevice(defaultDev, safeOpenImageDev("Rplot.png", "png")); } else if (defaultDev.equals("bmp")) { + ensureAwtSupport(); setCurrentDevice(defaultDev, safeOpenImageDev("Rplot.bmp", "bmp")); } else if (defaultDev.equals("jpg") || defaultDev.equals("jpeg")) { + ensureAwtSupport(); setCurrentDevice("jpeg", safeOpenImageDev("Rplot.jpg", "jpeg")); } else { throw RError.error(RError.NO_CALLER, Message.GENERIC, "FastR does not support device '" + defaultDev + "'."); @@ -144,6 +144,12 @@ public final class GridContext { return RContext.getEngine().evalFunction(redrawAll, REnvironment.baseEnv().getFrame(), RCaller.topLevel, true, null, args); } + private static void ensureAwtSupport() { + if (!FastRConfig.InternalGridAwtSupport) { + throw awtNotSupported(); + } + } + private BufferedImageDevice safeOpenImageDev(String filename, String formatName) { try { return BufferedImageDevice.open(filename, formatName, GridDevice.DEFAULT_WIDTH, GridDevice.DEFAULT_HEIGHT); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java index 9825b273c127b2caef56c0d77c931e95285ec364..49d65f69802d492b841b9a78143d565b18b3e758 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java @@ -101,7 +101,7 @@ public final class InitWindowedDevice extends RExternalBuiltinNode { String filename = name.substring(name.lastIndexOf(':') + 1); try { BufferedImageDevice device = BufferedImageDevice.open(filename, formatName, width, height); - GridContext.getContext().setCurrentDevice(formatName, device); + GridContext.getContext().setCurrentDevice(formatName.toUpperCase(), device); } catch (NotSupportedImageFormatException e) { throw error(Message.GENERIC, String.format("Format '%s' is not supported.", formatName)); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java index bff8b3810fced4776421d6adc9092b6434ea3419..d0f5518a6e39bff1c18ac8d49218dc8a49cf56df 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java @@ -15,6 +15,7 @@ package com.oracle.truffle.r.library.fastrGrid.graphics; import com.oracle.truffle.r.library.fastrGrid.FastRGridExternalLookup; +import com.oracle.truffle.r.runtime.FastRConfig; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.ROptions; @@ -70,7 +71,7 @@ public final class RGridGraphicsAdapter { if (options.getValue(DEFAULT_DEVICE_OPTION) != RNull.instance) { return; } - String defaultDevice = ctx.isInteractive() ? "awt" : "svg"; + String defaultDevice = (ctx.isInteractive() && FastRConfig.InternalGridAwtSupport) ? "awt" : "svg"; try { options.setValue(DEFAULT_DEVICE_OPTION, defaultDevice); } catch (OptionsException e) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java index 1b7b81345c61a2dee531da2469918a904077780f..a906872082f8fb367e53f90a70af7c65a0b824ae 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java @@ -106,56 +106,56 @@ public final class CompleteCases extends RExternalBuiltinNode { if (arg instanceof RPairList) { for (Object t = ((RPairList) arg).car(); t != RNull.instance; t = ((RPairList) t).cdr()) { Object entry = ((RPairList) t).car(); - iterateAbstractVectorContents(len, result, i, entry); + iterateAbstractVectorContents(len, result, entry); } } else if (arg instanceof RList) { RList list = (RList) arg; for (int entry = 0; entry < list.getLength(); entry++) { - iterateAbstractVectorContents(len, result, i, list.getDataAt(entry)); + iterateAbstractVectorContents(len, result, list.getDataAt(entry)); } } else { - iterateAbstractVectorContents(len, result, i, arg); + iterateAbstractVectorContents(len, result, arg); } } return RDataFactory.createLogicalVector(result, true); } - private void iterateAbstractVectorContents(int len, byte[] result, int i, Object obj) { + private void iterateAbstractVectorContents(int len, byte[] result, Object obj) { Object entry = RRuntime.asAbstractVector(obj); if (entry instanceof RAbstractIntVector) { RAbstractIntVector v = (RAbstractIntVector) entry; for (int e = 0; e < v.getLength(); e++) { if (RRuntime.isNA(v.getDataAt(e))) { - result[i % len] = RRuntime.LOGICAL_FALSE; + result[e % len] = RRuntime.LOGICAL_FALSE; } } } else if (entry instanceof RAbstractLogicalVector) { RAbstractLogicalVector v = (RAbstractLogicalVector) entry; for (int e = 0; e < v.getLength(); e++) { if (RRuntime.isNA(v.getDataAt(e))) { - result[i % len] = RRuntime.LOGICAL_FALSE; + result[e % len] = RRuntime.LOGICAL_FALSE; } } } else if (entry instanceof RAbstractDoubleVector) { RAbstractDoubleVector v = (RAbstractDoubleVector) entry; for (int e = 0; e < v.getLength(); e++) { if (Double.isNaN(v.getDataAt(e))) { - result[i % len] = RRuntime.LOGICAL_FALSE; + result[e % len] = RRuntime.LOGICAL_FALSE; } } } else if (entry instanceof RAbstractComplexVector) { RAbstractComplexVector v = (RAbstractComplexVector) entry; for (int e = 0; e < v.getLength(); e++) { if (Double.isNaN(v.getDataAt(e).getRealPart()) || Double.isNaN(v.getDataAt(e).getImaginaryPart())) { - result[i % len] = RRuntime.LOGICAL_FALSE; + result[e % len] = RRuntime.LOGICAL_FALSE; } } } else if (entry instanceof RAbstractStringVector) { RAbstractStringVector v = (RAbstractStringVector) entry; for (int e = 0; e < v.getLength(); e++) { if (RRuntime.isNA(v.getDataAt(e))) { - result[i % len] = RRuntime.LOGICAL_FALSE; + result[e % len] = RRuntime.LOGICAL_FALSE; } } } else { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java index f966c9ab3c357134731cfa5fa331f6379f3c94ce..124bb99da5da931233b235f9194b6d6d45325802 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java @@ -576,14 +576,14 @@ public class IsTypeFunctions { @TruffleBoundary protected static RType typeFromMode(String mode) { - return RType.fromMode(mode); + return RType.fromMode(mode, true); } @Specialization(limit = "5", guards = "cachedMode == mode") protected byte isVectorCached(RAbstractVector x, @SuppressWarnings("unused") String mode, @Cached("mode") @SuppressWarnings("unused") String cachedMode, @Cached("typeFromMode(mode)") RType type) { - if (namesOnlyOrNoAttr(x) && (type == RType.Any || x.getRType() == type)) { + if (namesOnlyOrNoAttr(x) && (type == RType.Any || typesMatch(type, x.getRType()))) { return RRuntime.LOGICAL_TRUE; } else { return RRuntime.LOGICAL_FALSE; @@ -600,6 +600,10 @@ public class IsTypeFunctions { return RRuntime.LOGICAL_FALSE; } + private boolean typesMatch(RType expected, RType actual) { + return expected == RType.Numeric ? actual == RType.Integer || actual == RType.Double : actual == expected; + } + private boolean namesOnlyOrNoAttr(RAbstractVector x) { DynamicObject attributes = x.getAttributes(); if (attrNull.profile(attributes == null) || attrEmpty.profile(attributes.size() == 0)) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java index 46e2e5e452a9a350e6e4d73b9177116a9e89c650..c96c928113e469a5501ce6b7ead8667af62babcc 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java @@ -24,6 +24,7 @@ import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RComplex; +import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RTypedValue; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; @@ -62,8 +63,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 { CompilerDirectives.transferToInterpreterAndInvalidate(); prodRecursive = insert(ProdNodeGen.create()); } - Object ret = prodRecursive.executeObject(args.getArgument(0)); - if (argsLen != 1) { + Object ret = 1d; + if (argsLen > 0) { double prodReal; double prodImg; boolean complex; @@ -77,7 +78,7 @@ public abstract class Prod extends RBuiltinNode.Arg2 { prodImg = 0d; complex = false; } - for (int i = 1; i < argsLen; i++) { + for (int i = 0; i < argsLen; i++) { Object aProd = prodRecursive.executeObject(args.getArgument(i)); double aProdReal; double aProdImg; @@ -108,8 +109,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 { @Specialization protected double prod(RAbstractDoubleVector x) { RAbstractDoubleVector profiledVec = intVecProfile.profile(x); - double product = profiledVec.getDataAt(0); - for (int k = 1; k < profiledVec.getLength(); k++) { + double product = 1; + for (int k = 0; k < profiledVec.getLength(); k++) { product = prod.op(product, profiledVec.getDataAt(k)); } return product; @@ -118,8 +119,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 { @Specialization protected double prod(RAbstractIntVector x) { RAbstractIntVector profiledVec = intVecProfile.profile(x); - double product = profiledVec.getDataAt(0); - for (int k = 1; k < profiledVec.getLength(); k++) { + double product = 1; + for (int k = 0; k < profiledVec.getLength(); k++) { product = prod.op(product, profiledVec.getDataAt(k)); } return product; @@ -128,8 +129,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 { @Specialization protected double prod(RAbstractLogicalVector x) { RAbstractLogicalVector profiledVec = intVecProfile.profile(x); - double product = profiledVec.getDataAt(0); - for (int k = 1; k < profiledVec.getLength(); k++) { + double product = 1; + for (int k = 0; k < profiledVec.getLength(); k++) { product = prod.op(product, profiledVec.getDataAt(k)); } return product; @@ -138,8 +139,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 { @Specialization protected RComplex prod(RAbstractComplexVector x) { RAbstractComplexVector profiledVec = intVecProfile.profile(x); - RComplex product = profiledVec.getDataAt(0); - for (int k = 1; k < profiledVec.getLength(); k++) { + RComplex product = RDataFactory.createComplexRealOne(); + for (int k = 0; k < profiledVec.getLength(); k++) { RComplex a = profiledVec.getDataAt(k); product = prod.op(product.getRealPart(), product.getImaginaryPart(), a.getRealPart(), a.getImaginaryPart()); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java index 8233f4cc27ba2047cc64a0bf5e8ff340351c6144..ea692637ede82a350f5340d74e004d14157f6d00 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java @@ -405,6 +405,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS @Cached("create()") ClassHierarchyNode classHierarchyNodeY, @Cached("createWithException()") S3FunctionLookupNode dispatchLookupY, @Cached("createIdentityProfile()") ValueProfile builtinProfile, + @Cached("createBinaryProfile()") ConditionProfile emptyArgumentsProfile, @Cached("createBinaryProfile()") ConditionProfile implicitTypeProfileX, @Cached("createBinaryProfile()") ConditionProfile implicitTypeProfileY, @Cached("createBinaryProfile()") ConditionProfile mismatchProfile, @@ -420,6 +421,11 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS Object[] args = explicitArgs != null ? ((RArgsValuesAndNames) explicitArgs.execute(frame)).getArguments() : callArguments.evaluateFlattenObjects(frame, lookupVarArgs(frame)); ArgumentsSignature argsSignature = explicitArgs != null ? ((RArgsValuesAndNames) explicitArgs.execute(frame)).getSignature() : callArguments.flattenNames(lookupVarArgs(frame)); + if (emptyArgumentsProfile.profile(args.length == 0)) { + // nothing to dispatch on, this is a valid situation, e.g. prod() == 1 + return call.execute(frame, function, new RArgsValuesAndNames(args, argsSignature), null, null); + } + RBuiltinDescriptor builtin = builtinProfile.profile(function.getRBuiltin()); RDispatch dispatch = builtin.getDispatch(); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java index c4d03652bf2589339d29122b77bc67cd6709bc7d..58096f6025f86d97235ed5018532a3b3f1ada2e3 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java @@ -25,6 +25,7 @@ public enum RType { Logical("logical", 1), Integer("integer", 2), Double("double", "numeric", 3), + Numeric("numeric", 3), Complex("complex", 4), Character("character", 5), List("list", 6), @@ -112,6 +113,15 @@ public enum RType { } public static RType fromMode(String mode) { + return fromMode(mode, false); + } + + /** + * @param includeNumeric if {@code true}, then the method returns {@link #Numeric} for string + * "numeric". This may be useful for callers that need to distinguish "numeric" and + * "double" modes. + */ + public static RType fromMode(String mode, boolean includeNumeric) { switch (mode) { case "any": return Any; @@ -126,6 +136,7 @@ public enum RType { case "integer": return Integer; case "numeric": + return includeNumeric ? Numeric : Double; case "double": return Double; case "complex": 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 b1726a12cfb2df32babfc62ba312c5052b0d7ebd..075e99fff0f8ade7cfdd63b759aec9473a763fed 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 @@ -24861,6 +24861,14 @@ Error in get("x", inherits = FALSE) : object 'x' not found #{ x <- 33 ; f <- function() { if (FALSE) { x <- 22 } ; get("x", inherits = FALSE) } ; f() } Error in get("x", inherits = FALSE) : object 'x' not found +##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet# +#{x <- 1L; get('x', mode='double'); } +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet# +#{x <- 1L; get('x', mode='numeric'); } +[1] 1 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet# #{y<-function(){y<-2;get("y",mode="closure")};y();} function(){y<-2;get("y",mode="closure")} @@ -26521,6 +26529,14 @@ attr(,"Rd_tag") #argv <- structure(list(test = c(TRUE, TRUE, FALSE, TRUE, FALSE), yes = 'True', no = 'False'), .Names = c('test', 'yes', 'no'));do.call('ifelse', argv) [1] "True" "True" "False" "True" "False" +##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits# +#inherits(1L, 'double') +[1] FALSE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits# +#inherits(1L, 'numeric') +[1] FALSE + ##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits# #inherits(NULL, 'NULL') [1] TRUE @@ -29923,6 +29939,10 @@ Error in is.unsorted(x, strictly) : invalid 'strictly' argument #argv <- list(c(1L, 3L, 2L, 4L), TRUE); .Internal(is.unsorted(argv[[1]], argv[[2]])) [1] TRUE +##com.oracle.truffle.r.test.builtins.TestBuiltin_isvector.testIsVector# +#is.vector(1L, 'numeric'); +[1] TRUE + ##com.oracle.truffle.r.test.builtins.TestBuiltin_isvector.testIsVector# #{ is.vector(1) } [1] TRUE @@ -44965,6 +44985,22 @@ age 0.00561 0.012 0.00872 0.22 1.0 0.64000 sex -1.65487 0.483 0.38527 11.74 1.0 0.00061 frailty(id, dist = 't', c 20.33 13.9 0.12000 +##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd# +#prod() +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd# +#prod(complex()) +[1] 1+0i + +##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd# +#prod(numeric()) +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd# +#{ foo <- function(...) prod(...); foo(); } +[1] 1 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd# #{prod('a')} Error in prod("a") : invalid 'type' (character) of argument @@ -138258,6 +138294,27 @@ Error: argument 'files' must be character #.Call(tools:::Rmd5, c("abc","xyz")) [1] NA NA +##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases# +#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3))) +[1] TRUE TRUE FALSE + +##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases# +#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), c(1,NA,2)) +[1] TRUE FALSE FALSE + +##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases# +#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), data.frame(col1=c(1,NA,3), col2=c(1,2,3))) +[1] TRUE FALSE FALSE + +##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases# +#stats::complete.cases(data.frame(col1=c(1,NA), col2=c(2,3)), matrix(c(1,NA,2,NA), nrow=2)) +[1] TRUE FALSE + +##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCasesArgsValidation#Output.IgnoreErrorContext# +#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), list(NA,2,2)) +Error in stats::complete.cases(data.frame(col1 = c(1, 2, NA), col2 = c(1, : + not all arguments have the same length + ##com.oracle.truffle.r.test.library.stats.TestExternal_covcor.testCovcor# #.Call(stats:::C_cov, 1:5, 1:5, 4, FALSE) [1] 2.5 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java index 71ad84e6ef169c30f8eeb6d78d6cec134f20346e..d5064ed832423825d44cac15a7741064b96f12ca 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2016, Oracle and/or its affiliates + * Copyright (c) 2013, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -34,5 +34,8 @@ public class TestBuiltin_get extends TestBase { // behavior specific to RS4Object as environment: assertEval("setClass('foo', representation(x='numeric')); f <- new('foo'); e <- new.env(); e$x <- 1; attr(f, '.xData') <- e; get('x', envir=f)"); assertEval("setClass('foo', representation(x='numeric')); f <- new('foo'); e <- new.env(); e$x <- 1; attr(f, '.Data') <- e; get('x', envir=f)"); + + assertEval("{x <- 1L; get('x', mode='numeric'); }"); + assertEval("{x <- 1L; get('x', mode='double'); }"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java index 6bbed855deb3945f9858829de9e3eb46294c2859..dda9a52a128486e6d568566eb7f8a0b35ae2b1b4 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java @@ -213,5 +213,8 @@ public class TestBuiltin_inherits extends TestBase { assertEval("{x <- 10;class(x) <- c(\"a\", \"b\");inherits(x, \"a\", 1) ;}"); assertEval("inherits(NULL, 'NULL')"); + + assertEval("inherits(1L, 'numeric')"); + assertEval("inherits(1L, 'double')"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java index 372f103da4a9ef759bf22ef55ce7720bc45dd42f..5a67e9ae37a4a0b85bc1db012f56d7e1ff67f586 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java @@ -199,6 +199,7 @@ public class TestBuiltin_isvector extends TestBase { assertEval("{is.vector(c(TRUE,FALSE),\"logical\");}"); assertEval("{x<-1;class(x)<-\"a\";is.vector(x);}"); assertEval("{x<-1;names(x)<-\"a\";is.vector(x);}"); + assertEval("is.vector(1L, 'numeric');"); // FastR produces better error contexts assertEval(Output.IgnoreErrorContext, "{is.vector(c(1,2), c(\"sss\", \"dddd\"));}"); assertEval(Output.IgnoreErrorContext, "{is.vector(c(1,2), TRUE);}"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java index 7d0b9d0fddf7dfbc8d302c572ab70c8403083aa1..a31d73816c2f5602bf94c40391e595e3e1ebac35 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java @@ -92,6 +92,10 @@ public class TestBuiltin_prod extends TestBase { assertEval("{prod(42,2+3i)}"); assertEval("{prod('a')}"); assertEval("{prod(list())}"); + assertEval("prod()"); + assertEval("prod(numeric())"); + assertEval("prod(complex())"); + assertEval("{ foo <- function(...) prod(...); foo(); }"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java new file mode 100644 index 0000000000000000000000000000000000000000..a29b4977a7cc88634d440b2c2f75487c23256900 --- /dev/null +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, 2017, 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.test.library.stats; + +import org.junit.Test; + +import com.oracle.truffle.r.test.TestBase; + +public class TestExternal_completecases extends TestBase { + @Test + public void testCompleteCases() { + assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)))"); + assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), data.frame(col1=c(1,NA,3), col2=c(1,2,3)))"); + assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), c(1,NA,2))"); + assertEval("stats::complete.cases(data.frame(col1=c(1,NA), col2=c(2,3)), matrix(c(1,NA,2,NA), nrow=2))"); + } + + @Test + public void testCompleteCasesArgsValidation() { + assertEval(Output.IgnoreErrorContext, "stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), list(NA,2,2))"); + } +}