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 64b2b539db2bc7035e609b4a8ef40b3d31008094..19b63fbff07f76ef87fccae9c5038fd70c4ad9e8 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 1918c7c7447a23370355b722e6bcf4ba139faeb0..aa565195905cc4af852dcf237e0dfbf9e6d2adaf 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 969af883b5f41bfc44117671d807b1dab9d0d91e..6a9e9306fce88892407eada830dfde694a26588e 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 8bda754072cca500331e96578fc6d16d533b4073..ea4b1ef78ecb089c201293265209f913f7c82dd5 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 88c9bc23ee170a940db7ad22673a263e0f771b9d..3cfaeb8f1ef3c197eae8b310ac86663dfdf6365a 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 2067774aaf7ea5aefc56dfe42a2138cae2177b61..b1564503a07ba5c8c0f57fe63d872dfa0d2f448c 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();