diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/argument/ReadArgumentCheckNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/argument/ReadArgumentCheckNode.java index 743e0eda3a96b..b353b105e5bb4 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/argument/ReadArgumentCheckNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/argument/ReadArgumentCheckNode.java @@ -46,6 +46,7 @@ import org.enso.interpreter.runtime.error.PanicSentinel; import org.enso.interpreter.runtime.library.dispatch.TypeOfNode; import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.util.CachingSupplier; import org.graalvm.collections.Pair; public abstract class ReadArgumentCheckNode extends Node { @@ -165,7 +166,8 @@ public static ReadArgumentCheckNode build(EnsoContext ctx, String comment, Type public static ReadArgumentCheckNode meta( String comment, Supplier metaObjectSupplier) { - return ReadArgumentCheckNodeFactory.MetaCheckNodeGen.create(comment, metaObjectSupplier); + var cachingSupplier = CachingSupplier.wrap(metaObjectSupplier); + return ReadArgumentCheckNodeFactory.MetaCheckNodeGen.create(comment, cachingSupplier); } public static boolean isWrappedThunk(Function fn) { @@ -477,10 +479,10 @@ String expectedTypeMessage() { } abstract static class MetaCheckNode extends ReadArgumentCheckNode { - private final Supplier expectedSupplier; + private final CachingSupplier expectedSupplier; @CompilerDirectives.CompilationFinal private String expectedTypeMessage; - MetaCheckNode(String name, Supplier expectedMetaSupplier) { + MetaCheckNode(String name, CachingSupplier expectedMetaSupplier) { super(name); this.expectedSupplier = expectedMetaSupplier; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/LazyObjectNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/LazyObjectNode.java index 956a6e92ac334..0c7dda52705da 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/LazyObjectNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/LazyObjectNode.java @@ -15,11 +15,11 @@ public final class LazyObjectNode extends ExpressionNode { private final String error; - private final Supplier supply; + private final CachingSupplier supply; private LazyObjectNode(String error, Supplier supply) { this.error = error; - this.supply = supply; + this.supply = CachingSupplier.wrap(supply); } /** @@ -30,7 +30,7 @@ private LazyObjectNode(String error, Supplier supply) { * errorMessage} error is created */ public static ExpressionNode build(String errorMessage, Supplier supplier) { - return new LazyObjectNode(errorMessage, new CachingSupplier<>(supplier)); + return new LazyObjectNode(errorMessage, supplier); } @Override diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java index 7224e103e6245..746908d52d3a7 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java @@ -244,7 +244,7 @@ private Map>> registerBuiltinM constr -> { Map> atomNodes = getOrUpdate(builtinMethodNodes, constr.getName()); - atomNodes.put(builtinMethodName, new CachingSupplier<>(() -> meta.toMethod())); + atomNodes.put(builtinMethodName, CachingSupplier.wrap(() -> meta.toMethod())); Map atomNodesMeta = getOrUpdate(builtinMetaMethods, constr.getName()); @@ -253,7 +253,7 @@ private Map>> registerBuiltinM () -> { Map> atomNodes = getOrUpdate(builtinMethodNodes, builtinMethodOwner); - atomNodes.put(builtinMethodName, new CachingSupplier<>(() -> meta.toMethod())); + atomNodes.put(builtinMethodName, CachingSupplier.wrap(() -> meta.toMethod())); Map atomNodesMeta = getOrUpdate(builtinMetaMethods, builtinMethodOwner); @@ -420,12 +420,12 @@ private Map>> readBuiltinMetho constr -> { Map> atomNodes = getOrUpdate(methodNodes, constr.getName()); - atomNodes.put(builtinMethodName, new CachingSupplier<>(builtin)); + atomNodes.put(builtinMethodName, CachingSupplier.forValue(builtin)); }, () -> { Map> atomNodes = getOrUpdate(methodNodes, builtinMethodOwner); - atomNodes.put(builtinMethodName, new CachingSupplier<>(builtin)); + atomNodes.put(builtinMethodName, CachingSupplier.forValue(builtin)); }); }); return methodNodes; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/ModuleScope.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/ModuleScope.java index 89160dd0bfad8..d704546caf51e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/ModuleScope.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/ModuleScope.java @@ -370,7 +370,7 @@ public void registerMethod(Type type, String method, Function function) { if (methodMap.containsKey(method) && !type.isBuiltin()) { throw new RedefinedMethodException(type.getName(), method); } else { - methodMap.put(method, new CachingSupplier<>(function)); + methodMap.put(method, CachingSupplier.forValue(function)); } } @@ -390,7 +390,7 @@ public void registerMethod(Type type, String method, Supplier supply) if (methodMap.containsKey(method) && !type.isBuiltin()) { throw new RedefinedMethodException(type.getName(), method); } else { - methodMap.put(method, new CachingSupplier<>(supply)); + methodMap.put(method, CachingSupplier.wrap(supply)); } } @@ -419,7 +419,7 @@ public void registerConversionMethod(Type toType, Type fromType, Function functi */ public void registerPolyglotSymbol(String name, Supplier symbolFactory) { assert moduleScope == null; - polyglotSymbols.put(name, new CachingSupplier<>(symbolFactory)); + polyglotSymbols.put(name, CachingSupplier.wrap(symbolFactory)); } /** diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/util/CachingSupplier.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/util/CachingSupplier.java index de1094aaf6f97..33b460b1d5182 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/util/CachingSupplier.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/util/CachingSupplier.java @@ -11,13 +11,26 @@ public final class CachingSupplier implements Supplier { @CompilerDirectives.CompilationFinal private boolean memoComputed; @CompilerDirectives.CompilationFinal private T memo; - public CachingSupplier(Supplier supply) { + private CachingSupplier(Supplier supply) { this.supply = supply; } - public CachingSupplier(T memo) { + private CachingSupplier(T memo) { this.supply = null; this.memo = memo; + this.memoComputed = true; + } + + public static CachingSupplier wrap(Supplier supply) { + if (supply instanceof CachingSupplier cs) { + return cs; + } else { + return new CachingSupplier<>(supply); + } + } + + public static CachingSupplier forValue(V value) { + return new CachingSupplier<>(value); } @Override