From bb62d4d7f7fff15aba836525f22126b0f85157b8 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Mon, 12 Dec 2016 10:59:59 +0100 Subject: [PATCH] simplifications in RContext, use new DSL layout in Tilde, fast path in RSerialize, more precise TruffleBoundary in RRuntime --- .../oracle/truffle/r/nodes/builtin/base/Warning.java | 6 +++--- .../truffle/r/nodes/builtin/base/infix/Tilde.java | 3 +++ .../oracle/truffle/r/nodes/unary/FirstBooleanNode.java | 2 +- .../src/com/oracle/truffle/r/runtime/RRuntime.java | 8 ++++++-- .../src/com/oracle/truffle/r/runtime/RSerialize.java | 8 ++++++-- .../com/oracle/truffle/r/runtime/context/RContext.java | 10 ++-------- 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java index 64b2b539db..19b63fbff0 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java @@ -22,12 +22,13 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.notEmpty; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean; import static com.oracle.truffle.r.runtime.RVisibility.OFF; import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.builtin.CastBuilder; @@ -51,7 +52,6 @@ public abstract class Warning extends RBuiltinNode { @Specialization @TruffleBoundary protected String warning(boolean call, boolean immediate, boolean noBreakWarning, String message) { - CompilerDirectives.transferToInterpreter(); RErrorHandling.warningcallInternal(call, message, immediate, noBreakWarning); return message; } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java index 1918c7c744..aa56519590 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java @@ -27,7 +27,9 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.r.nodes.EmptyTypeSystemFlatLayout; import com.oracle.truffle.r.nodes.attributes.SetFixedAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetClassAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; @@ -48,6 +50,7 @@ import com.oracle.truffle.r.runtime.nodes.RBaseNode; * argument is missing, i.e. {@code ~ x} result in {@code `~`(x)}. */ @RBuiltin(name = "~", kind = PRIMITIVE, parameterNames = {"x", "y"}, nonEvalArgs = {0, 1}, behavior = READS_FRAME) +@TypeSystemReference(EmptyTypeSystemFlatLayout.class) public abstract class Tilde extends RBuiltinNode { private static final RStringVector FORMULA_CLASS = RDataFactory.createStringVectorFromScalar(RRuntime.FORMULA_CLASS); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/FirstBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/FirstBooleanNode.java index 969af883b5..6a9e9306fc 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/FirstBooleanNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/FirstBooleanNode.java @@ -58,7 +58,7 @@ public abstract class FirstBooleanNode extends CastNode { protected boolean firstScalar(byte argument) { if (RRuntime.isNA(argument)) { CompilerDirectives.transferToInterpreter(); - RError.error(this, invalidValueName == null ? Message.NA_UNEXP : Message.INVALID_VALUE, invalidValueName); + throw RError.error(this, invalidValueName == null ? Message.NA_UNEXP : Message.INVALID_VALUE, invalidValueName); } return RRuntime.fromLogical(argument); } 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 8bda754072..ea4b1ef78e 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 @@ -512,15 +512,19 @@ public class RRuntime { return isNA(i) ? createComplexNA() : int2complexNoCheck(i); } - @TruffleBoundary public static String intToStringNoCheck(int operand) { if (operand >= MIN_CACHED_NUMBER && operand <= MAX_CACHED_NUMBER) { return numberStringCache[operand - MIN_CACHED_NUMBER]; } else { - return String.valueOf(operand); + return intToStringInternal(operand); } } + @TruffleBoundary + private static String intToStringInternal(int operand) { + return String.valueOf(operand); + } + public static boolean isCachedNumberString(int value) { return value >= MIN_CACHED_NUMBER && value <= MAX_CACHED_NUMBER; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java index 88c9bc23ee..3cfaeb8f1e 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java @@ -458,8 +458,12 @@ public class RSerialize { * only used in a warning message in the unlikely event that the namespace * cannot be found. */ - Object r = RContext.getEngine().evalFunction(contextState.getDotDotFindNamespace(), null, null, null, s, ""); - return checkResult(addReadRef(r)); + // fast path through getRegisteredNamespace + Object namespace = REnvironment.getRegisteredNamespace(s.getDataAt(0)); + if (namespace == null) { + namespace = RContext.getEngine().evalFunction(contextState.getDotDotFindNamespace(), null, null, null, s, ""); + } + return checkResult(addReadRef(namespace)); } case PERSISTSXP: { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java index 2067774aaf..b1564503a0 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java @@ -41,7 +41,6 @@ import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.instrumentation.Instrumenter; import com.oracle.truffle.api.interop.ForeignAccess; import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.nodes.InvalidAssumptionException; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.vm.PolyglotEngine; import com.oracle.truffle.r.runtime.ExitException; @@ -648,13 +647,8 @@ public final class RContext extends ExecutionContext implements TruffleObject { public static RContext getInstance() { RContext context = singleContext; - if (context != null) { - try { - singleContextAssumption.check(); - return context; - } catch (InvalidAssumptionException e) { - // fallback to slow case - } + if (singleContextAssumption.isValid() && context != null) { + return context; } Thread current = Thread.currentThread(); -- GitLab