diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java index 8b3b8edcc9c2ef5dc130f5364527aae53d600f33..f6f78ccaa1d9b849bbfa008dd783be086d4b02d0 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java @@ -277,6 +277,7 @@ public class BasePackage extends RBuiltinPackage { add(Contributors.class, ContributorsNodeGen::create); add(CopyDFAttr.class, CopyDFAttrNodeGen::create); add(Crossprod.class, CrossprodNodeGen::create); + add(CRC64.class, CRC64NodeGen::create); add(CumMax.class, CumMaxNodeGen::create); add(CumMin.class, CumMinNodeGen::create); add(CumProd.class, CumProdNodeGen::create); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CRC64.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CRC64.java new file mode 100644 index 0000000000000000000000000000000000000000..c4a29770e6ed51657735ce8b9077e9e4990673ba --- /dev/null +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CRC64.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, 2016, 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.CompilerDirectives.TruffleBoundary; +import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; +import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RError.Message; +import com.oracle.truffle.r.runtime.builtins.RBuiltin; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; + +@RBuiltin(name = "crc64", kind = INTERNAL, parameterNames = {"x"}, behavior = PURE) +public abstract class CRC64 extends RBuiltinNode { + + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("x").conf(x -> x.mustNotBeMissing(RError.SHOW_CALLER2, Message.ARGUMENTS_PASSED_INTERNAL_0_1, getRBuiltin().name())).mustNotBeNull(RError.NO_CALLER, + Message.INPUT_MUST_BE_STRING).mustBe(stringValue(), RError.NO_CALLER, Message.INPUT_MUST_BE_STRING); + } + + @Specialization + protected RAbstractStringVector crc64(RAbstractStringVector x) { + final String string = x.getDataAt(0); + byte[] bytes = string.getBytes(); + bytes = crc64(bytes); + long l = 0; + for (int i = 0; i < bytes.length; i++) { + l += ((long) bytes[i] & 0xffL) << (8 * i); + } + return RDataFactory.createStringVector(Long.toHexString(l)); + } + + @TruffleBoundary + private byte[] crc64(byte[] bytes) { + org.tukaani.xz.check.CRC64 crc = new org.tukaani.xz.check.CRC64(); + crc.update(bytes); + return crc.finish(); + } + +} diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index 9337e810d8a898aa8f6c1257525fdbbbdce62cdb..39504baf8e90020ba7d51c19460d27a600f91e3e 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -281,6 +281,7 @@ public final class RError extends RuntimeException { LINE_ELEMENTS("line %d did not have %d elements"), ITEMS_NOT_MULTIPLE("number of items read is not a multiple of the number of columns"), TRACEMEM_NOT_NULL("cannot trace NULL"), + INPUT_MUST_BE_STRING("input must be a character string"), // below: GNU R gives also expression for the argument NOT_FUNCTION("'%s' is not a function, character or symbol"), NOT_A_FUNCTION("'%s' is not a function"), @@ -565,6 +566,7 @@ public final class RError extends RuntimeException { RECURSIVE_INDEXING_FAILED("recursive indexing failed at level %d"), ARGUMENTS_PASSED("%d arguments passed to '%s' which requires %d"), ARGUMENTS_PASSED_0_1("0 arguments passed to '%s' which requires 1"), + ARGUMENTS_PASSED_INTERNAL_0_1("0 arguments passed to .Internal(%s) which requires 1"), ARGUMENT_IGNORED("argument '%s' will be ignored"), NOT_CHARACTER_VECTOR("'%s' must be a character vector"), WRONG_WINSLASH("'winslash' must be '/' or '\\\\\\\\'"), 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 71f1784301243b7a76d79cad999efb22a031ffe7..8ceadd73e895f2be154390df61a544787cf96a18 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 @@ -14910,6 +14910,86 @@ Error in cospi(argv[[1]]) : unimplemented complex function Warning message: In cospi(argv[[1]]) : NaNs produced +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64('a')) +[1] "330284772e652b05" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64#Ignored.ImplementationError# +#.Internal(crc64('a', 'b')) +Error: 2 arguments passed to .Internal(crc64) which requires 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64()) +Error: 0 arguments passed to .Internal(crc64) which requires 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(01)) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(NA)) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(NULL)) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(c('a'))) +[1] "330284772e652b05" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(c('a', 'b'))) +[1] "330284772e652b05" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(c(1, 2))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(c(NULL))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(double(0))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(environment)) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(integer(0))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(list(NULL))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(list(list()))) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(new.env())) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(paste(c(letters, LETTERS, 0:9), collapse=""))) +[1] "90db9ccd9021d2d7" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#.Internal(crc64(stdout())) +Error: input must be a character string + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#crc64('a') +Error: could not find function "crc64" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_crc64.testCrc64# +#crc64() +Error: could not find function "crc64" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_crossprod.testCrossprod# #{ crossprod(1:3, matrix(1:6, ncol=2)) } [,1] [,2] diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java new file mode 100644 index 0000000000000000000000000000000000000000..46a350685807ec058e04582969772e62009ac049 --- /dev/null +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016, 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.builtins; + +import org.junit.Test; + +import com.oracle.truffle.r.test.TestBase; + +// Checkstyle: stop line length check +public class TestBuiltin_crc64 extends TestBase { + + @Test + public void testCrc64() { + + assertEval("crc64()"); + assertEval("crc64('a')"); + assertEval(".Internal(crc64())"); + assertEval(".Internal(crc64('a'))"); + assertEval(".Internal(crc64(paste(c(letters, LETTERS, 0:9), collapse=\"\")))"); + assertEval(".Internal(crc64(c('a')))"); + + // Expression: .Internal(crc64('a', 'b')) + // Expected output: Error: 2 arguments passed to .Internal(crc64) which requires 1 + // FastR output: Error in crc64("a", "b") : unused argument ('b') + // should be handled in .Internal-s impl ? + assertEval(Ignored.ImplementationError, ".Internal(crc64('a', 'b'))"); + + assertEval(".Internal(crc64(c(1, 2)))"); + + assertEval(".Internal(crc64(c('a', 'b')))"); + + assertEval(".Internal(crc64(NA))"); + assertEval(".Internal(crc64(NULL))"); + assertEval(".Internal(crc64(list(list())))"); + assertEval(".Internal(crc64(list(NULL)))"); + assertEval(".Internal(crc64(c(NULL)))"); + + assertEval(".Internal(crc64(integer(0)))"); + assertEval(".Internal(crc64(double(0)))"); + + assertEval(".Internal(crc64(01))"); + + assertEval(".Internal(crc64(new.env()))"); + assertEval(".Internal(crc64(environment))"); + assertEval(".Internal(crc64(stdout()))"); + } + +} diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py index 4003efe2cde967c8fb499814c73639ad8a24837c..a27f13a384330cec954bb79607a2f9ddc5825583 100644 --- a/mx.fastr/suite.py +++ b/mx.fastr/suite.py @@ -90,6 +90,12 @@ suite = { "sha1" : "ebb4b995fd67a9b291ea5b19379509160f56e154", }, + "XZ-1.5" : { + "path" : "libdownloads/xz-1.5.jar", + "urls" : ["http://central.maven.org/maven2/org/tukaani/xz/1.5/xz-1.5.jar"], + "sha1" : "9c64274b7dbb65288237216e3fae7877fd3f2bee", + }, + }, "projects" : { @@ -136,6 +142,7 @@ suite = { "sourceDirs" : ["src"], "dependencies" : [ "com.oracle.truffle.r.library", + "XZ-1.5" ], "checkstyle" : "com.oracle.truffle.r.runtime", "javaCompliance" : "1.8",