From 16222dca82f4df7bf080663cb2787dcce2cbe7a9 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Thu, 8 Dec 2016 14:19:20 +0100 Subject: [PATCH] rawToBits buildin implementation --- .../r/nodes/builtin/base/BasePackage.java | 1 + .../r/nodes/builtin/base/RawToBits.java | 60 ++++++++++++++++++ .../test/builtins/TestBuiltin_rawToBits.java | 61 +++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RawToBits.java create mode 100644 com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rawToBits.java 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 d3871d27be..77e3ee4c8f 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 @@ -552,6 +552,7 @@ public class BasePackage extends RBuiltinPackage { add(RawFunctions.CharToRaw.class, RawFunctionsFactory.CharToRawNodeGen::create); add(RawFunctions.RawToChar.class, RawFunctionsFactory.RawToCharNodeGen::create); add(RawFunctions.RawShift.class, RawFunctionsFactory.RawShiftNodeGen::create); + add(RawToBits.class, RawToBitsNodeGen::create); add(NumericalFunctions.Re.class, NumericalFunctionsFactory.ReNodeGen::create); add(ReadDCF.class, ReadDCFNodeGen::create); add(ReadREnviron.class, ReadREnvironNodeGen::create); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RawToBits.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RawToBits.java new file mode 100644 index 0000000000..d903415e93 --- /dev/null +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RawToBits.java @@ -0,0 +1,60 @@ +/* + * 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.nodes.builtin.base; + +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.instanceOf; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.builtins.RBuiltin; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RRawVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; + +@RBuiltin(name = "rawToBits", kind = INTERNAL, parameterNames = {"x"}, behavior = PURE) +public abstract class RawToBits extends RBuiltinNode { + + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("x").mustNotBeNull(RError.SHOW_CALLER, RError.Message.ARGUMENT_MUST_BE_RAW_VECTOR, "x").mustBe(instanceOf(RAbstractRawVector.class), RError.SHOW_CALLER, + RError.Message.ARGUMENT_MUST_BE_RAW_VECTOR, "x"); + } + + @Specialization + protected RAbstractRawVector rawToBits(RRawVector x) { + byte[] result = new byte[8 * x.getLength()]; + int pos = 0; + for (int j = 0; j < x.getLength(); j++) { + byte temp = x.getRawDataAt(j); + for (int i = 0; i < 8; i++) { + result[pos++] = (byte) (temp & 1); + temp >>= 1; + } + } + return RDataFactory.createRawVector(result); + } +} diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rawToBits.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rawToBits.java new file mode 100644 index 0000000000..34a5538dbb --- /dev/null +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_rawToBits.java @@ -0,0 +1,61 @@ +/* + * 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_rawToBits extends TestBase { + + @Test + public void testRawToBits() { + assertEval("rawToBits(raw(0))"); + assertEval("rawToBits(raw(10))"); + assertEval("rawToBits(as.raw(0))"); + assertEval("rawToBits(as.raw(1))"); + assertEval("rawToBits(as.raw(255))"); + assertEval("rawToBits(c(as.raw(1), as.raw(255)))"); + assertEval("rawToBits(raw(0), raw(1))"); + assertEval("rawToBits(as.raw(0:255))"); + assertEval("rawToBits(as.raw(c(0,1,255)))"); + + assertEval("rawToBits(0:255)"); + assertEval("rawToBits(NA)"); + assertEval("rawToBits(NULL)"); + assertEval("rawToBits(list(list()))"); + assertEval("rawToBits(list(NULL))"); + assertEval("rawToBits(c(NULL))"); + + assertEval("rawToBits(integer(0))"); + assertEval("rawToBits(double(0))"); + + assertEval("rawToBits(01)"); + assertEval("rawToBits('a')"); + + assertEval("rawToBits(new.env())"); + assertEval("rawToBits(environment)"); + assertEval("rawToBits(stdout())"); + } +} -- GitLab