From fcd043f5bf0e6f20138062571b516b603d22ee90 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 16 Dec 2024 12:01:25 +0100 Subject: [PATCH] BuiltinObject guards cached builtin type with WeakReference to context --- .../runtime/builtin/BuiltinObject.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java index 9b3503de0a06..1d085735185c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java @@ -8,6 +8,7 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; +import java.lang.ref.WeakReference; import org.enso.interpreter.node.expression.builtin.Builtin; import org.enso.interpreter.runtime.EnsoContext; import org.enso.interpreter.runtime.data.EnsoObject; @@ -27,7 +28,15 @@ public abstract class BuiltinObject extends EnsoObject { private final String builtinName; - @CompilationFinal private Builtin cachedBuiltinType; + /** + * A weak reference to the context in which this node was last executed. + * + *

Inspired by {@link + * org.enso.interpreter.node.expression.builtin.meta.EnsoProjectNode#previousCtxRef} + */ + @CompilationFinal private WeakReference previousCtxRef = new WeakReference<>(null); + + private Builtin cachedBuiltinType; /** * @param builtinName Simple name of the builtin that should be contained in {@link @@ -44,9 +53,11 @@ public final boolean hasType() { @ExportMessage public final Type getType(@Bind("$node") Node node) { - if (cachedBuiltinType == null) { + var ctx = EnsoContext.get(node); + var previousCtx = previousCtxRef.get(); + if (previousCtx == null || cachedBuiltinType == null || previousCtx != ctx) { CompilerDirectives.transferToInterpreterAndInvalidate(); - var ctx = EnsoContext.get(node); + previousCtxRef = new WeakReference<>(ctx); cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); } return cachedBuiltinType.getType();