diff --git a/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java b/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java index 4a4298db4632..240a12cd7794 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java @@ -1,21 +1,11 @@ package org.enso.interpreter; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.Option; -import com.oracle.truffle.api.TruffleLanguage; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.debug.DebuggerTags; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.instrumentation.ProvidedTags; -import com.oracle.truffle.api.instrumentation.StandardTags; -import com.oracle.truffle.api.nodes.ExecutableNode; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.List; import java.util.Objects; import java.util.function.Consumer; + import org.enso.compiler.Compiler; import org.enso.compiler.context.InlineContext; import org.enso.compiler.data.CompilerConfig; @@ -50,6 +40,18 @@ import org.graalvm.options.OptionKey; import org.graalvm.options.OptionType; +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.Option; +import com.oracle.truffle.api.TruffleLanguage; +import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.debug.DebuggerTags; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.instrumentation.ProvidedTags; +import com.oracle.truffle.api.instrumentation.StandardTags; +import com.oracle.truffle.api.nodes.ExecutableNode; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; + /** * The root of the Enso implementation. * @@ -66,7 +68,7 @@ version = LanguageInfo.VERSION, defaultMimeType = LanguageInfo.MIME_TYPE, characterMimeTypes = {LanguageInfo.MIME_TYPE}, - contextPolicy = TruffleLanguage.ContextPolicy.SHARED, + contextPolicy = TruffleLanguage.ContextPolicy.EXCLUSIVE, dependentLanguages = {EpbLanguage.ID}, fileTypeDetectors = FileDetector.class, services= { Timer.class, NotificationHandler.Forwarder.class, LockManager.class } @@ -278,9 +280,15 @@ protected ExecutableNode parse(InlineParsingRequest request) throws InlineParsin if (exprNode.isDefined()) { var language = EnsoLanguage.get(exprNode.get()); return new ExecutableNode(language) { + @Child + private ExpressionNode expr; + @Override public Object execute(VirtualFrame frame) { - return exprNode.get().executeGeneric(frame); + if (expr == null) { + expr = insert(exprNode.get()); + } + return expr.executeGeneric(frame); } }; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java index 0cd70d133a70..4008b8124306 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java @@ -1,27 +1,19 @@ package org.enso.interpreter.runtime; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.TruffleLanguage; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnknownIdentifierException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.object.Shape; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicLong; + import org.enso.compiler.Compiler; import org.enso.compiler.PackageRepository; import org.enso.compiler.PackageRepositoryUtils; @@ -32,6 +24,7 @@ import org.enso.interpreter.EnsoLanguage; import org.enso.interpreter.OptionsHelper; import org.enso.interpreter.instrument.NotificationHandler; +import org.enso.interpreter.runtime.Module; import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.data.Type; import org.enso.interpreter.runtime.scope.TopLevelScope; @@ -45,6 +38,22 @@ import org.enso.polyglot.LanguageInfo; import org.enso.polyglot.RuntimeOptions; import org.graalvm.options.OptionKey; + +import com.oracle.truffle.api.Assumption; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.TruffleFile; +import com.oracle.truffle.api.TruffleLanguage; +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.object.Shape; + import scala.jdk.javaapi.OptionConverters; /** @@ -179,7 +188,35 @@ public void initialize() { * com.oracle.truffle.api.TruffleContext}. */ public static EnsoContext get(Node node) { - return REFERENCE.get(node); + var ctx = REFERENCE.get(node); + if (checkNodes.isValid() && !CompilerDirectives.isPartialEvaluationConstant(ctx)) { + reportSlowContextAccess(node); + } + return ctx; + } + + private static final Assumption checkNodes = Truffle.getRuntime().createAssumption("context check"); + private static final Set reportedNulllRootNodes = new HashSet<>(); + private static long checkUntil = Long.MAX_VALUE; + + @TruffleBoundary + private static void reportSlowContextAccess(Node n) { + if (System.currentTimeMillis() > checkUntil) { + checkNodes.invalidate(); + } + if (reportedNulllRootNodes.add(n)) { + var ex = new Exception(""" + no root node for {n} + with section: {s} + with root nodes: {r} + """ + .replace("{n}", "" + n) + .replace("{s}", "" + n.getEncapsulatingSourceSection()) + .replace("{r}", "" + n.getRootNode()) + ); + ex.printStackTrace(); + checkUntil = System.currentTimeMillis() + 10000; + } } public static TruffleLanguage.ContextReference getReference() { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/atom/AtomConstructor.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/atom/AtomConstructor.java index 8647d7675d63..6705b6e0cee1 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/atom/AtomConstructor.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/atom/AtomConstructor.java @@ -3,6 +3,7 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; @@ -347,7 +348,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().function(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/function/Function.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/function/Function.java index 1052c0ee5082..77619ca93247 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/function/Function.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/callable/function/Function.java @@ -7,7 +7,11 @@ import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.MaterializedFrame; -import com.oracle.truffle.api.interop.*; +import com.oracle.truffle.api.interop.ArityException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -380,7 +384,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached(value = "1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().function(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Array.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Array.java index 9fad5a078b40..3939bd273c19 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Array.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Array.java @@ -242,7 +242,7 @@ boolean isLimitReached(@Shared("warnsLib") @CachedLibrary(limit = "3") WarningsL } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().array(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ArrayProxy.java index ec5d882825ef..513d9a8373bf 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ArrayProxy.java @@ -116,7 +116,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().array(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDate.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDate.java index 9b981ea340d0..9a47ba474feb 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDate.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDate.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -94,7 +95,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().date(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDateTime.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDateTime.java index bd726f3e77ef..7568c8869c85 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDateTime.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDateTime.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -220,7 +221,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().dateTime(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDuration.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDuration.java index 3d530f4e22ea..345744e5a9ce 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDuration.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoDuration.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -35,7 +36,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().duration(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java index 94dfaaa22a25..a041bc8a964b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java @@ -10,7 +10,9 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; + import java.util.function.IntFunction; + import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; import org.enso.interpreter.runtime.error.PanicException; @@ -29,6 +31,8 @@ import java.time.ZonedDateTime; import java.util.Set; +import com.oracle.truffle.api.dsl.Cached; + /** * A wrapper for {@link TruffleFile} objects exposed to the language. For methods documentation * please refer to {@link TruffleFile}. @@ -340,7 +344,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().file(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeOfDay.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeOfDay.java index 41407f522fcd..344b3f1a75ef 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeOfDay.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeOfDay.java @@ -2,6 +2,7 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -159,7 +160,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().timeOfDay(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeZone.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeZone.java index 07eff8f731cb..7186835cd431 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeZone.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoTimeZone.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.library.CachedLibrary; @@ -99,7 +100,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().timeZone(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java index c288c9d08026..d0fd4f644ce0 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.data; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.library.CachedLibrary; @@ -84,7 +85,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().managedResource(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Ref.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Ref.java index 553c7e871c51..a1bc65dc78ee 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Ref.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Ref.java @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.data; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.library.CachedLibrary; @@ -60,7 +61,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().ref(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Vector.java index a966d47a5d99..a75e48056a06 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/Vector.java @@ -196,7 +196,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().vector(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/hash/EnsoHashMap.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/hash/EnsoHashMap.java index c07a405b9933..fc95c9e5e29f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/hash/EnsoHashMap.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/hash/EnsoHashMap.java @@ -149,7 +149,7 @@ boolean hasType() { } @ExportMessage(library = TypesLibrary.class) - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().map(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java index fd920193c5da..a54645c52ff3 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java @@ -1,5 +1,17 @@ package org.enso.interpreter.runtime.data.text; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.enso.interpreter.dsl.Builtin; +import org.enso.interpreter.node.expression.builtin.text.util.ToJavaStringNode; +import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.polyglot.common_utils.Core_Text_Utils; + import com.ibm.icu.text.Normalizer2; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Cached; @@ -8,17 +20,6 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import java.util.ArrayDeque; -import java.util.Deque; -import org.enso.interpreter.node.expression.builtin.text.util.ToJavaStringNode; -import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import org.enso.interpreter.dsl.Builtin; -import org.enso.polyglot.common_utils.Core_Text_Utils; /** The main runtime type for Enso's Text. */ @ExportLibrary(InteropLibrary.class) @@ -229,7 +230,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached(value="1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().text(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java index de64f4562fca..5ca69cda536f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java @@ -2,6 +2,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleStackTrace; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -136,7 +137,7 @@ boolean hasSpecialDispatch() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().dataflowError(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java index 6a7549bf595e..13712ed27538 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java @@ -144,7 +144,7 @@ Object getExceptionMessage( } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().panic(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/Warning.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/Warning.java index 11900ed6c437..d9e71fb4a701 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/Warning.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/Warning.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.error; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; import com.oracle.truffle.api.interop.TruffleObject; @@ -240,7 +241,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().warning(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultBooleanExports.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultBooleanExports.java index 490c2d9876a3..66af16b6a9e0 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultBooleanExports.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultBooleanExports.java @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.library.dispatch; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -14,7 +15,10 @@ static boolean hasType(Boolean receiver) { } @ExportMessage - static Type getType(Boolean receiver, @CachedLibrary("receiver") TypesLibrary thisLib) { + static Type getType( + Boolean receiver, + @CachedLibrary("receiver") TypesLibrary thisLib, + @Cached(value = "1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().bool().getType(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultDoubleExports.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultDoubleExports.java index c0a6b4a32f5d..fba3a51aaa35 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultDoubleExports.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultDoubleExports.java @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.library.dispatch; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -14,7 +15,10 @@ static boolean hasType(Double receiver) { } @ExportMessage - static Type getType(Double receiver, @CachedLibrary("receiver") TypesLibrary thisLib) { + static Type getType( + Double receiver, + @CachedLibrary("receiver") TypesLibrary thisLib, + @Cached(value = "1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().number().getDecimal(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultLongExports.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultLongExports.java index 564c1f950db1..1b9888014e02 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultLongExports.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/library/dispatch/DefaultLongExports.java @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.library.dispatch; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -14,7 +15,8 @@ static boolean hasType(Long receiver) { } @ExportMessage - static Type getType(Long receiver, @CachedLibrary("receiver") TypesLibrary thisLib) { + static Type getType( + Long receiver, @CachedLibrary("receiver") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().number().getSmallInteger(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/number/EnsoBigInteger.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/number/EnsoBigInteger.java index 1bb093696b27..d9a3f513011d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/number/EnsoBigInteger.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/number/EnsoBigInteger.java @@ -7,6 +7,7 @@ import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -144,7 +145,7 @@ boolean hasType() { } @ExportMessage - Type getType(@CachedLibrary("this") TypesLibrary thisLib) { + Type getType(@CachedLibrary("this") TypesLibrary thisLib, @Cached("1") int ignore) { return EnsoContext.get(thisLib).getBuiltins().number().getBigInteger(); } diff --git a/engine/runtime/src/test/java/org/enso/interpreter/test/SharedEngineTest.java b/engine/runtime/src/test/java/org/enso/interpreter/test/SharedEngineTest.java new file mode 100644 index 000000000000..22db92511579 --- /dev/null +++ b/engine/runtime/src/test/java/org/enso/interpreter/test/SharedEngineTest.java @@ -0,0 +1,60 @@ +package org.enso.interpreter.test; + +import java.io.ByteArrayOutputStream; +import java.nio.file.Paths; + +import org.enso.polyglot.RuntimeOptions; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; +import org.graalvm.polyglot.Source; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class SharedEngineTest extends TestBase { + private static Engine sharedEngine; + private Context ctx; + + @BeforeClass + public static void initializeSharedEngine() { + var out = new ByteArrayOutputStream(); + sharedEngine = Engine.newBuilder() + .allowExperimentalOptions(true) + .logHandler(out) + .option(RuntimeOptions.STRICT_ERRORS, "true") + .option( + RuntimeOptions.LANGUAGE_HOME_OVERRIDE, + Paths.get("../../test/micro-distribution/component").toFile().getAbsolutePath() + ).build(); + } + + @Before + public void initializeContext() { + this.ctx = defaultContextBuilder().engine(sharedEngine).build(); + } + + private final Source typeCase = Source.newBuilder("enso", """ + from Standard.Base import Vector, Text, Number + + check x = case x of + _ : Vector -> 1 + _ : Text -> 2 + _ : Number -> 3 + _ -> 4 + """, + "type_case.enso" + ).buildLiteral(); + + @Test + public void typeCaseFirstRun() { + var fn = this.ctx.eval(typeCase).invokeMember("eval_expression", "check"); + var r = fn.execute("Hi"); + assertEquals(2, r.asInt()); + } + + @Test + public void typeCaseSecondRun() { + typeCaseFirstRun(); + } +} diff --git a/engine/runtime/src/test/java/org/enso/interpreter/test/TestBase.java b/engine/runtime/src/test/java/org/enso/interpreter/test/TestBase.java index d26f3d5138ea..ff92b96be3da 100644 --- a/engine/runtime/src/test/java/org/enso/interpreter/test/TestBase.java +++ b/engine/runtime/src/test/java/org/enso/interpreter/test/TestBase.java @@ -39,7 +39,7 @@ protected static Context createDefaultContext(OutputStream out) { return context; } - private static Context.Builder defaultContextBuilder() { + protected static Context.Builder defaultContextBuilder() { return Context.newBuilder() .allowExperimentalOptions(true) .allowIO(IOAccess.ALL)