From 02f6cadf3bc9e67c0e1e0411c4b1f8756ded3e75 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Mon, 23 Oct 2017 15:04:02 +0200 Subject: [PATCH] pre-created Strings for raw-to-string operations --- .../r/nodes/builtin/base/foreign/WriteTable.java | 4 ++-- .../src/com/oracle/truffle/r/runtime/RRuntime.java | 10 ++++++---- .../runtime/data/closures/RToStringVectorClosure.java | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/WriteTable.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/WriteTable.java index 06ab7c3d94..801e09494b 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/WriteTable.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/WriteTable.java @@ -236,7 +236,7 @@ public abstract class WriteTable extends RExternalBuiltinNode.Arg11 { return RRuntime.isNA(v) ? cna : ComplexVectorPrinter.encodeComplex(v); } else if (o instanceof RRaw) { RRaw v = (RRaw) o; - return RRuntime.rawToHexString(v); + return RRuntime.rawToHexString(v.getValue()); } throw RInternalError.unimplemented(); } @@ -278,7 +278,7 @@ public abstract class WriteTable extends RExternalBuiltinNode.Arg11 { } if (x instanceof RAbstractRawVector) { RAbstractRawVector v = (RAbstractRawVector) x; - return RRuntime.rawToHexString(v.getDataAt(indx)); + return RRuntime.rawToHexString(v.getRawDataAt(indx)); } throw RInternalError.unimplemented(); } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java index fde2672e65..8cc095f317 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java @@ -182,11 +182,15 @@ public class RRuntime { public static final RSymbol PSEUDO_NULL = new RSymbol("\u0001NULL\u0001"); public static final String UNBOUND = "UNBOUND"; + @CompilationFinal(dimensions = 1) private static final String[] rawStringCache = new String[256]; @CompilationFinal(dimensions = 1) private static final String[] numberStringCache = new String[4096]; private static final int MIN_CACHED_NUMBER = -numberStringCache.length / 2; private static final int MAX_CACHED_NUMBER = numberStringCache.length / 2 - 1; static { + for (int i = 0; i < rawStringCache.length; i++) { + rawStringCache[i] = Utils.intern(new String(new char[]{Character.forDigit((i & 0xF0) >> 4, 16), Character.forDigit(i & 0x0F, 16)})); + } for (int i = 0; i < numberStringCache.length; i++) { numberStringCache[i] = String.valueOf(i + MIN_CACHED_NUMBER); } @@ -347,10 +351,8 @@ public class RRuntime { return int2complex(raw2int(r)); } - public static String rawToHexString(RRaw operand) { - int value = raw2int(operand); - char[] digits = new char[]{Character.forDigit((value & 0xF0) >> 4, 16), Character.forDigit(value & 0x0F, 16)}; - return new String(digits); + public static String rawToHexString(byte operand) { + return rawStringCache[raw2int(operand)]; } @TruffleBoundary diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java index 2ca9d8a581..cb13243709 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java @@ -245,7 +245,7 @@ final class RRawToStringVectorClosure extends RToStringVectorClosure { @Override public String getDataAt(int index) { - return RRuntime.rawToHexString(vector.getDataAt(index)); + return RRuntime.rawToHexString(vector.getRawDataAt(index)); } } -- GitLab