From 007d74ce1d9e74decd2211a66fff774f2841abdd Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:43:06 +0100 Subject: [PATCH 01/34] All builtin types extend BuiltinObject --- .../runtime/builtin/BuiltinObject.java | 85 +++++++++++++++++++ .../interpreter/runtime/data/EnsoDate.java | 35 ++------ .../runtime/data/EnsoDateTime.java | 33 ++----- .../runtime/data/EnsoDuration.java | 34 ++------ .../interpreter/runtime/data/EnsoFile.java | 30 ++----- .../runtime/data/EnsoTimeOfDay.java | 32 ++----- .../runtime/data/EnsoTimeZone.java | 32 ++----- .../runtime/data/ManagedResource.java | 32 ++----- .../enso/interpreter/runtime/data/Ref.java | 32 ++----- .../runtime/data/hash/EnsoHashMap.java | 33 ++----- .../interpreter/runtime/data/text/Text.java | 32 +------ .../runtime/data/vector/Array.java | 33 ++----- .../runtime/data/vector/ArrayLikeHelpers.java | 19 ++++- .../runtime/data/vector/ArrayProxy.java | 31 +------ .../runtime/data/vector/Vector.java | 43 +++------- .../runtime/number/EnsoBigInteger.java | 32 +------ .../interpreter/runtime/warning/Warning.java | 23 ++--- 17 files changed, 186 insertions(+), 405 deletions(-) create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java 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 new file mode 100644 index 000000000000..e49a23a12a88 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/BuiltinObject.java @@ -0,0 +1,85 @@ +package org.enso.interpreter.runtime.builtin; + +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.node.expression.builtin.Builtin; +import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.data.EnsoObject; +import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; + +/** + * Base class for every Enso builtin object. Not type. Note that base class for a builtin type is + * {@link Builtin}. + * + *

The {@link InteropLibrary interop} protocol roughly corresponds to the implementation of the + * protocol inside {@link org.enso.interpreter.runtime.data.atom.Atom}. + * + *

Note that extension methods are not resolved, because they are not defined in builtins module + * scope. In other words, extension methods are not reported as members via interop. + */ +@ExportLibrary(InteropLibrary.class) +@ExportLibrary(TypesLibrary.class) +public abstract class BuiltinObject extends EnsoObject { + + private final String builtinName; + + @CompilationFinal private Builtin cachedBuiltinType; + + /** + * @param builtinName Simple name of the builtin that should be contained in {@link + * org.enso.interpreter.runtime.builtin.Builtins#builtinsByName}. + */ + protected BuiltinObject(String builtinName) { + this.builtinName = builtinName; + } + + @ExportMessage + public final boolean hasType() { + return true; + } + + @ExportMessage + public final Type getType(@Bind("$node") Node node) { + if (cachedBuiltinType == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + var ctx = EnsoContext.get(node); + cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); + } + return cachedBuiltinType.getType(); + } + + /** + * Must return false, otherwise if a builtin object is passed to a host method that has a single + * {@code Object} argument, host interop would convert the builtin object to a {@code Map} with + * all its members. Even if the builtin object is, e.g., a number of a date. + * + *

Must return false as long as all our stdlib Java methods accept {@code Object} and not + * {@link org.graalvm.polyglot.Value} as arguments comming from Enso. + */ + @ExportMessage + public final boolean hasMembers() { + return false; + } + + @ExportMessage + public final Object getMembers(boolean includeInternal) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + + @ExportMessage + public final boolean hasMetaObject() { + return true; + } + + @ExportMessage + public final Type getMetaObject(@Bind("$node") Node node) { + return getType(node); + } +} 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 87d54ad80b7b..8579d8b317f4 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,27 +1,28 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalTime; import org.enso.interpreter.dsl.Builtin; -import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.polyglot.common_utils.Core_Date_Utils; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "date", name = "Date", stdlibName = "Standard.Base.Data.Time.Date.Date") -public final class EnsoDate extends EnsoObject { +@Builtin( + pkg = "date", + name = EnsoDate.builtinName, + stdlibName = "Standard.Base.Data.Time.Date.Date") +public final class EnsoDate extends BuiltinObject { + static final String builtinName = "Date"; private final LocalDate date; public EnsoDate(LocalDate date) { + super(builtinName); this.date = date; } @@ -77,26 +78,6 @@ LocalTime asTime() throws UnsupportedMessageException { throw UnsupportedMessageException.create(); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().date(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().date(); - } - @CompilerDirectives.TruffleBoundary @ExportMessage @Override 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 637626e3c938..18b206eeeb83 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,34 +1,31 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import org.enso.interpreter.dsl.Builtin; -import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.text.Text; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; import org.enso.polyglot.common_utils.Core_Date_Utils; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) @Builtin( pkg = "date", - name = "DateTime", + name = EnsoDateTime.builtinName, stdlibName = "Standard.Base.Data.Time.Date_Time.Date_Time") -public final class EnsoDateTime extends EnsoObject { +public final class EnsoDateTime extends BuiltinObject { + static final String builtinName = "Date_Time"; private final ZonedDateTime dateTime; public EnsoDateTime(ZonedDateTime dateTime) { + super(builtinName); this.dateTime = dateTime; } @@ -205,26 +202,6 @@ ZoneId asTimeZone() { return dateTime.getZone(); } - @ExportMessage - Type getMetaObject(@CachedLibrary("this") InteropLibrary thisLib) { - return EnsoContext.get(thisLib).getBuiltins().dateTime(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().dateTime(); - } - @ExportMessage @CompilerDirectives.TruffleBoundary @Override 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 ef441702d61e..787ea8d66ce6 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,12 +1,10 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -16,39 +14,23 @@ import java.time.temporal.Temporal; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.error.PanicException; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "date", name = "Duration", stdlibName = "Standard.Base.Data.Time.Duration.Duration") -public final class EnsoDuration extends EnsoObject { +@Builtin( + pkg = "date", + name = EnsoDuration.builtinName, + stdlibName = "Standard.Base.Data.Time.Duration.Duration") +public final class EnsoDuration extends BuiltinObject { private final Duration duration; + static final String builtinName = "Duration"; public EnsoDuration(Duration duration) { + super(builtinName); this.duration = duration; } - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().duration(); - } - - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().duration(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - @Builtin.Method( name = "new_builtin", description = 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 c99a6e067370..a5d5c01925d3 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 @@ -3,7 +3,6 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.InteropLibrary; @@ -38,25 +37,26 @@ import java.util.function.Function; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.data.vector.ArrayLikeAtNode; import org.enso.interpreter.runtime.data.vector.ArrayLikeHelpers; import org.enso.interpreter.runtime.data.vector.ArrayLikeLengthNode; import org.enso.interpreter.runtime.error.DataflowError; import org.enso.interpreter.runtime.error.PanicException; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; /** * A wrapper for {@link TruffleFile} objects exposed to the language. For methods documentation * please refer to {@link TruffleFile}. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "io", name = "File", stdlibName = "Standard.Base.System.File.File") -public final class EnsoFile extends EnsoObject { +@Builtin(pkg = "io", name = EnsoFile.builtinName, stdlibName = "Standard.Base.System.File.File") +public final class EnsoFile extends BuiltinObject { + static final String builtinName = "File"; private final TruffleFile truffleFile; public EnsoFile(TruffleFile truffleFile) { + super(builtinName); if (truffleFile == null) { throw CompilerDirectives.shouldNotReachHere(); } @@ -797,26 +797,6 @@ public String toString() { return toDisplayString(false); } - @ExportMessage - Type getMetaObject(@CachedLibrary("this") InteropLibrary thisLib) { - return EnsoContext.get(thisLib).getBuiltins().file(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().file(); - } - static RuntimeException raiseIOException(Node where, IOException ex) { var ctx = EnsoContext.get(where); var guestEx = ctx.asGuestValue(ex); 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 29da641fe54c..86db62dbcf93 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,31 +2,29 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import org.enso.interpreter.dsl.Builtin; -import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.text.Text; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) @Builtin( pkg = "date", - name = "TimeOfDay", + name = EnsoTimeOfDay.builtinName, stdlibName = "Standard.Base.Data.Time.Time_Of_Day.Time_Of_Day") -public final class EnsoTimeOfDay extends EnsoObject { +public final class EnsoTimeOfDay extends BuiltinObject { + static final String builtinName = "Time_Of_Day"; private final LocalTime localTime; public EnsoTimeOfDay(LocalTime localTime) { + super(builtinName); this.localTime = localTime; } @@ -143,26 +141,6 @@ LocalDate asDate() throws UnsupportedMessageException { throw UnsupportedMessageException.create(); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().timeOfDay(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().timeOfDay(); - } - @CompilerDirectives.TruffleBoundary @ExportMessage @Override 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 3f9da89a3797..c16a71d6998e 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 @@ -2,32 +2,30 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.time.DateTimeException; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.zone.ZoneRulesException; import org.enso.interpreter.dsl.Builtin; -import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.text.Text; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; import org.enso.polyglot.common_utils.Core_Date_Utils; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) @Builtin( pkg = "date", - name = "TimeZone", + name = EnsoTimeZone.builtinName, stdlibName = "Standard.Base.Data.Time.Time_Zone.Time_Zone") -public final class EnsoTimeZone extends EnsoObject { +public final class EnsoTimeZone extends BuiltinObject { + static final String builtinName = "Time_Zone"; private final ZoneId zone; public EnsoTimeZone(ZoneId zone) { + super(builtinName); this.zone = zone; } @@ -100,24 +98,4 @@ boolean isTimeZone() { ZoneId asTimeZone() { return zone; } - - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().timeZone(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).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 e931f8bf01f7..3d3078a20a99 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 @@ -10,8 +10,8 @@ import java.lang.ref.PhantomReference; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.callable.function.Function; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; /** * An Enso runtime representation of a managed resource. @@ -35,9 +35,12 @@ * ProcessItems} processor. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "resource", stdlibName = "Standard.Base.Runtime.Managed_Resource.Managed_Resource") -public final class ManagedResource extends EnsoObject { +@Builtin( + pkg = "resource", + stdlibName = "Standard.Base.Runtime.Managed_Resource.Managed_Resource", + name = ManagedResource.builtinName) +public final class ManagedResource extends BuiltinObject { + static final String builtinName = "Managed_Resource"; private final Object resource; private final PhantomReference phantomReference; @@ -50,6 +53,7 @@ public final class ManagedResource extends EnsoObject { public ManagedResource( Object resource, java.util.function.Function> factory) { + super(builtinName); this.resource = resource; this.phantomReference = factory.apply(this); } @@ -97,26 +101,6 @@ public void close(EnsoContext context) { context.getResourceManager().close(this); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().managedResource(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().managedResource(); - } - @ExportMessage @TruffleBoundary public String toDisplayString(boolean allowSideEffects, @Bind("$node") Node node) { 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 e9e1728cacc0..453c8c7ef20f 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,21 +1,18 @@ package org.enso.interpreter.runtime.data; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import org.enso.interpreter.dsl.Builtin; -import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.builtin.BuiltinObject; /** A mutable reference type. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref") -public final class Ref extends EnsoObject { +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref", name = Ref.builtinName) +public final class Ref extends BuiltinObject { + static final String builtinName = "Ref"; private volatile Object value; /** @@ -25,6 +22,7 @@ public final class Ref extends EnsoObject { */ @Builtin.Method(description = "Creates a new Ref", autoRegister = false) public Ref(Object value) { + super(builtinName); this.value = value; } @@ -51,26 +49,6 @@ public Object setValue(Object value) { return old; } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().ref(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().ref(); - } - @ExportMessage Object toDisplayString( boolean allowSideEffects, @CachedLibrary(limit = "3") InteropLibrary interop) { 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 65261cebf96e..f8c029d9e32d 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 @@ -1,7 +1,6 @@ package org.enso.interpreter.runtime.data.hash; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.frame.VirtualFrame; @@ -11,17 +10,14 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.ConditionProfile; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.node.expression.builtin.meta.EqualsNode; import org.enso.interpreter.node.expression.builtin.meta.HashCodeNode; import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.hash.EnsoHashMapBuilder.StorageEntry; import org.enso.interpreter.runtime.data.vector.ArrayLikeHelpers; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; /** * Implementation of a hash map structure, capable of holding any types of keys and values. The @@ -33,10 +29,10 @@ *

Users should not use Enso objects as keys to Java maps, because equals won't work the same way * as it works in Enso. */ -@ExportLibrary(TypesLibrary.class) @ExportLibrary(InteropLibrary.class) -@Builtin(stdlibName = "Standard.Base.Data.Dictionary.Dictionary", name = "Dictionary") -public final class EnsoHashMap extends EnsoObject { +@Builtin(stdlibName = "Standard.Base.Data.Dictionary.Dictionary", name = EnsoHashMap.builtinName) +public final class EnsoHashMap extends BuiltinObject { + static final String builtinName = "Dictionary"; private final EnsoHashMapBuilder mapBuilder; private final int generation; private final int size; @@ -44,6 +40,7 @@ public final class EnsoHashMap extends EnsoObject { private Object cachedVectorRepresentation; private EnsoHashMap(EnsoHashMapBuilder mapBuilder) { + super(builtinName); this.mapBuilder = mapBuilder; this.generation = mapBuilder.generation(); this.size = mapBuilder.size(); @@ -144,26 +141,6 @@ Object getHashEntriesIterator(@CachedLibrary(limit = "3") InteropLibrary interop } } - @ExportMessage(library = TypesLibrary.class) - boolean hasType() { - return true; - } - - @ExportMessage(library = TypesLibrary.class) - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().dictionary(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().dictionary(); - } - @ExportMessage @TruffleBoundary @Override 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 7ae2fac6fbc1..8408b1db703d 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 @@ -2,12 +2,10 @@ import com.ibm.icu.text.Normalizer2; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.Encoding; import java.util.ArrayDeque; @@ -16,16 +14,12 @@ 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.EnsoObject; -import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.polyglot.common_utils.Core_Text_Utils; /** The main runtime type for Enso's Text. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -public final class Text extends EnsoObject { +public final class Text extends BuiltinObject { private static final Lock LOCK = new ReentrantLock(); private static final Text EMPTY = new Text(""); private volatile Object contents; @@ -39,10 +33,12 @@ private enum FcdNormalized { } private Text(String string) { + super("Text"); this.contents = string; } private Text(ConcatRope contents) { + super("Text"); this.contents = contents; } @@ -212,16 +208,6 @@ String toDisplayString( return Core_Text_Utils.prettyPrint(str); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().text(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - private void setContents(String contents) { assert length == -1 || length == contents.length(); this.contents = contents; @@ -245,16 +231,6 @@ public String toString() { } } - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().text(); - } - /** * Converts text to a Java String. For use outside of Truffle Nodes. * diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java index d70ad6b44fda..c3d63f8dd8de 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java @@ -2,7 +2,6 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.interop.InteropLibrary; @@ -11,29 +10,26 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.BranchProfile; import java.util.Arrays; import java.util.Comparator; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.hash.EnsoHashMap; import org.enso.interpreter.runtime.data.hash.HashMapInsertAllNode; import org.enso.interpreter.runtime.data.hash.HashMapInsertNode; import org.enso.interpreter.runtime.data.hash.HashMapSizeNode; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; import org.enso.interpreter.runtime.warning.AppendWarningNode; import org.enso.interpreter.runtime.warning.Warning; import org.enso.interpreter.runtime.warning.WarningsLibrary; /** A primitive boxed array type for use in the runtime. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) @ExportLibrary(WarningsLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array") -final class Array extends EnsoObject { +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array", name = Array.builtinName) +final class Array extends BuiltinObject { + static final String builtinName = "Array"; private final Object[] items; /** If true, some elements contain warning, and thus, this Array contains warning. */ @@ -49,6 +45,7 @@ final class Array extends EnsoObject { * @param items the element values */ private Array(Object... items) { + super(builtinName); this.items = items; } @@ -159,27 +156,12 @@ public String toDisplayString(boolean b) { return toString(); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().array(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - @Override @CompilerDirectives.TruffleBoundary public String toString() { return Arrays.toString(items); } - @ExportMessage - boolean hasType() { - return true; - } - private boolean hasWarningElements(Object[] items, WarningsLibrary warnings) { for (Object item : items) { if (warnings.hasWarnings(item)) { @@ -306,9 +288,4 @@ boolean isLimitReached( return false; } } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().array(); - } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java index 75255bb9abd9..b5e17e2d511c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java @@ -5,12 +5,20 @@ import com.oracle.truffle.api.library.CachedLibrary; import java.nio.ByteBuffer; import org.enso.interpreter.dsl.Builtin; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.EnsoObject; /** Publicly available operations on array-like classes. */ -@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Internal.Array_Like_Helpers") -public final class ArrayLikeHelpers { - private ArrayLikeHelpers() {} +@Builtin( + pkg = "immutable", + stdlibName = "Standard.Base.Internal.Array_Like_Helpers", + name = ArrayLikeHelpers.builtinName) +public final class ArrayLikeHelpers extends BuiltinObject { + static final String builtinName = "Array_Like_Helpers"; + + private ArrayLikeHelpers() { + super(builtinName); + } @Builtin.Method( name = "new_array_proxy_builtin", @@ -121,4 +129,9 @@ public static EnsoObject asVectorEnsoObjects(EnsoObject... arr) { public static EnsoObject asVectorEmpty() { return Vector.fromEnsoOnlyArray(null); } + + @Override + public Object toDisplayString(boolean allowSideEffects) { + return "Array_Like_Helpers"; + } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java index 0aca184e7e45..5ec5305d1ee9 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java @@ -2,7 +2,6 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.interop.ArityException; @@ -13,12 +12,8 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.BranchProfile; -import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.builtin.BuiltinObject; /** * A wrapper that allows to turn an Enso callback providing elements into a polyglot Array. @@ -27,13 +22,13 @@ * example exposing rows of a Table without copying any data. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) @ImportStatic(BranchProfile.class) -final class ArrayProxy extends EnsoObject { +final class ArrayProxy extends BuiltinObject { private final long length; private final Object at; private ArrayProxy(long length, Object at) { + super("Array"); assert length >= 0; assert InteropLibrary.getUncached().isExecutable(at); this.length = length; @@ -83,29 +78,9 @@ public String toDisplayString(boolean b) { return toString(); } - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().array(); - } - @Override @CompilerDirectives.TruffleBoundary public String toString() { return "(Array_Proxy " + length + " " + at + ")"; } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().array(); - } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index 9893427ad676..ab55ed86978e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -1,7 +1,6 @@ package org.enso.interpreter.runtime.data.vector; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; @@ -9,25 +8,29 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.node.expression.foreign.HostValueToEnsoNode; import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.hash.EnsoHashMap; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; import org.enso.interpreter.runtime.warning.AppendWarningNode; import org.enso.interpreter.runtime.warning.WarningsLibrary; @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector") -abstract class Vector extends EnsoObject { +@Builtin( + pkg = "immutable", + stdlibName = "Standard.Base.Data.Vector.Vector", + name = Vector.builtinName) +abstract class Vector extends BuiltinObject { + static final String builtinName = "Vector"; private static final Vector EMPTY_LONG = new Long(new long[0]); private static final Vector EMPTY_DOUBLE = new Double(new double[0]); private static final Vector EMPTY_VECTOR = new EnsoOnly(new Object[0]); + protected Vector() { + super(builtinName); + } + @ExportMessage boolean hasArrayElements() { return true; @@ -78,30 +81,6 @@ public String toDisplayString(boolean allowSideEffects) { return DisplayArrayUtils.toDisplayString(this, allowSideEffects, iop); } - @ExportMessage - Type getMetaObject(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().vector(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - // - // methods for TypesLibrary - // - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().vector(); - } - // // helper methods // 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 961d31e88027..440ab7139a77 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 @@ -1,23 +1,16 @@ package org.enso.interpreter.runtime.number; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import java.math.BigInteger; -import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; +import org.enso.interpreter.runtime.builtin.BuiltinObject; /** Internal wrapper for a {@link BigInteger}. */ @ExportLibrary(InteropLibrary.class) -@ExportLibrary(TypesLibrary.class) -public final class EnsoBigInteger extends EnsoObject { +public final class EnsoBigInteger extends BuiltinObject { private final BigInteger value; /** @@ -26,6 +19,7 @@ public final class EnsoBigInteger extends EnsoObject { * @param value the value to wrap. */ public EnsoBigInteger(BigInteger value) { + super("Integer"); assert (value.bitLength() > 63) : "Too small BigInteger: " + value; this.value = value; } @@ -125,26 +119,6 @@ public final BigInteger asBigInteger() { return value; } - @ExportMessage - Type getMetaObject(@CachedLibrary("this") InteropLibrary thisLib) { - return EnsoContext.get(thisLib).getBuiltins().number().getInteger(); - } - - @ExportMessage - boolean hasMetaObject() { - return true; - } - - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().number().getInteger(); - } - @Override public boolean equals(Object obj) { if (obj instanceof EnsoBigInteger otherBigInt) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java index 27096e7881f5..5d064e0e8f3c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java @@ -2,31 +2,28 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.StopIterationException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; -import org.enso.interpreter.runtime.data.EnsoObject; -import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.builtin.BuiltinObject; import org.enso.interpreter.runtime.data.hash.EnsoHashMap; import org.enso.interpreter.runtime.data.hash.HashMapInsertNode; -import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; -@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning") -@ExportLibrary(TypesLibrary.class) +@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning", name = Warning.builtinName) @ExportLibrary(value = InteropLibrary.class, delegateTo = "value") -public final class Warning extends EnsoObject { +public final class Warning extends BuiltinObject { + static final String builtinName = "Warning"; final Object value; private final Object origin; private final long sequenceId; private Warning(Object value, Object origin, long sequenceId) { + super(builtinName); this.value = value; this.origin = origin; this.sequenceId = sequenceId; @@ -129,16 +126,6 @@ public long getSequenceId() { return sequenceId; } - @ExportMessage - boolean hasType() { - return true; - } - - @ExportMessage - Type getType(@Bind("$node") Node node) { - return EnsoContext.get(node).getBuiltins().warning(); - } - public static Warning wrapMapError(WarningsLibrary warningsLib, Warning warning, long index) { var ctx = EnsoContext.get(warningsLib); var error = warning.getValue(); From dc01c8e6b462025ca854d78f633bb6595ce9b2b6 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:43:18 +0100 Subject: [PATCH 02/34] Fix names in Builtins --- .../org/enso/interpreter/runtime/builtin/Builtins.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 306c3758d07f..e8678a041a70 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 @@ -45,7 +45,7 @@ import org.enso.interpreter.node.expression.builtin.ordering.Comparable; import org.enso.interpreter.node.expression.builtin.ordering.DefaultComparator; import org.enso.interpreter.node.expression.builtin.ordering.Ordering; -import org.enso.interpreter.node.expression.builtin.resource.ManagedResource; +import org.enso.interpreter.node.expression.builtin.resource.Managed_Resource; import org.enso.interpreter.node.expression.builtin.runtime.Context; import org.enso.interpreter.node.expression.builtin.text.Text; import org.enso.interpreter.runtime.EnsoContext; @@ -163,15 +163,15 @@ public Builtins(EnsoContext context) { dictionary = builtins.get(org.enso.interpreter.node.expression.builtin.Dictionary.class); dataflowError = builtins.get(org.enso.interpreter.node.expression.builtin.Error.class); ref = builtins.get(Ref.class); - managedResource = builtins.get(ManagedResource.class); + managedResource = builtins.get(Managed_Resource.class); debug = builtins.get(Debug.class); projectDescription = getBuiltinType(ProjectDescription.class); file = builtins.get(File.class); date = builtins.get(org.enso.interpreter.node.expression.builtin.date.Date.class); - dateTime = builtins.get(org.enso.interpreter.node.expression.builtin.date.DateTime.class); + dateTime = builtins.get(org.enso.interpreter.node.expression.builtin.date.Date_Time.class); duration = builtins.get(org.enso.interpreter.node.expression.builtin.date.Duration.class); - timeOfDay = builtins.get(org.enso.interpreter.node.expression.builtin.date.TimeOfDay.class); - timeZone = builtins.get(org.enso.interpreter.node.expression.builtin.date.TimeZone.class); + timeOfDay = builtins.get(org.enso.interpreter.node.expression.builtin.date.Time_Of_Day.class); + timeZone = builtins.get(org.enso.interpreter.node.expression.builtin.date.Time_Zone.class); warning = builtins.get(Warning.class); noWrap = getBuiltinType(NoWrap.class); problemBehavior = getBuiltinType(ProblemBehavior.class); From 1fe2f3e2c032308810573126799a66033eb90010 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:43:42 +0100 Subject: [PATCH 03/34] Builtin annotation processor enforces subclassing BuiltinObject --- .../interpreter/dsl/BuiltinsProcessor.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinsProcessor.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinsProcessor.java index 17806a3d297d..6d9a4322ece3 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinsProcessor.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinsProcessor.java @@ -90,6 +90,7 @@ public final boolean process(Set annotations, RoundEnviro */ public void handleClassElement(Element element, RoundEnvironment roundEnv) throws IOException { TypeElement elt = (TypeElement) element; + ensureBuiltinClassExtendsBuiltinObject(elt); Builtin annotation = element.getAnnotation(Builtin.class); String clazzName = annotation.name().isEmpty() ? element.getSimpleName().toString() : annotation.name(); @@ -347,6 +348,31 @@ private int specializationsCount(Element owner, String builtinMethodName) { .count(); } + /** + * @param builtinClass Class annotated with {@link Builtin}. + */ + private void ensureBuiltinClassExtendsBuiltinObject(TypeElement builtinClass) { + var builtinObjectBinName = "org.enso.interpreter.runtime.builtin.BuiltinObject"; + if (!isSubtype(builtinClass, builtinObjectBinName)) { + processingEnv + .getMessager() + .printMessage( + Kind.ERROR, "Builtin class must extend " + builtinObjectBinName, builtinClass); + } + } + + /** + * Returns true if the given {@code clazz} is a subtype of class with binary name {@code + * binaryName}. + * + * @param clazz class to check + * @param binaryName binary name of the class to check against + */ + private boolean isSubtype(TypeElement clazz, String binaryName) { + var superType = processingEnv.getElementUtils().getTypeElement(binaryName); + return processingEnv.getTypeUtils().isSubtype(clazz.asType(), superType.asType()); + } + private final List typeNecessaryImports = Arrays.asList( "org.enso.interpreter.dsl.BuiltinType", From 60d854b074fbf1c43e47eb97ef388fa8e6142d1b Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:43:49 +0100 Subject: [PATCH 04/34] fix typo --- .../main/java/org/enso/interpreter/runtime/data/atom/Atom.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/atom/Atom.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/atom/Atom.java index 0666db5fdecf..abbd9694f29a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/atom/Atom.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/atom/Atom.java @@ -155,7 +155,7 @@ boolean hasMembers() { /** * Returns list of fields of the Atom. If {@code includeInternal} is true, all methods, including - * project-private, are included. Fields are returned as filed getters, i.e., methods. Only fields + * project-private, are included. Fields are returned as field getters, i.e., methods. Only fields * for the constructor that was used to construct this atom are returned. */ @ExportMessage From 0d92891b8eecd3071f0f4f1d8c55524b637d14a8 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:49:36 +0100 Subject: [PATCH 05/34] Add BuiltinsJavaInteropTest --- .../org/enso/example/PolyglotTestClass.java | 18 ++++ .../builtins/BuiltinsJavaInteropTest.java | 88 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java create mode 100644 engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/builtins/BuiltinsJavaInteropTest.java diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java new file mode 100644 index 000000000000..928163f894db --- /dev/null +++ b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java @@ -0,0 +1,18 @@ +package org.enso.example; + +import java.time.LocalDate; +import org.graalvm.polyglot.Value; + +public class PolyglotTestClass { + public static boolean isPolyglotDate_Object(Object obj) { + return obj instanceof Value polyglotVal && polyglotVal.isDate(); + } + + public static boolean isPolyglotDate_LocalDate(LocalDate date) { + return date != null; + } + + public static boolean isPolyglotDate_Value(Value val) { + return val != null && val.isDate(); + } +} diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/builtins/BuiltinsJavaInteropTest.java b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/builtins/BuiltinsJavaInteropTest.java new file mode 100644 index 000000000000..06b15f606dec --- /dev/null +++ b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/builtins/BuiltinsJavaInteropTest.java @@ -0,0 +1,88 @@ +package org.enso.interpreter.test.builtins; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import java.io.ByteArrayOutputStream; +import org.enso.test.utils.ContextUtils; +import org.graalvm.polyglot.Context; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * In these tests, we call Java methods from Enso. Java methods have different signatures that + * accept Enso values in different ways. + */ +public class BuiltinsJavaInteropTest { + private static Context ctx; + private static final ByteArrayOutputStream out = new ByteArrayOutputStream(); + + @BeforeClass + public static void prepareCtx() { + ctx = ContextUtils.createDefaultContext(out); + } + + @AfterClass + public static void disposeCtx() { + ctx.close(); + ctx = null; + } + + @After + public void resetOutput() { + out.reset(); + } + + /** + * This test reflects the state of many Java methods in stdlibs that accept Enso values as {@link + * java.lang.Object}. If the Java method has a single argument of type {@link java.lang.Object}, + * and we pass {@code Date_Time} in it, we expect the host interop conversion to convert it to + * {@link java.time.LocalDateTime}. + */ + @Test + public void javaMethodAcceptsEnsoTimeOfDay_AsObject() { + var src = + """ + from Standard.Base import Date_Time + polyglot java import org.enso.example.PolyglotTestClass + + main = + dt = Date_Time.now + PolyglotTestClass.isPolyglotDate_Object dt + """; + var result = ContextUtils.evalModule(ctx, src); + assertThat(result.asBoolean(), is(true)); + } + + @Test + public void javaMethodAcceptsEnsoTimeOfDay_AsLocalDate() { + var src = + """ + from Standard.Base import Date_Time + polyglot java import org.enso.example.PolyglotTestClass + + main = + dt = Date_Time.now + PolyglotTestClass.isPolyglotDate_LocalDate dt + """; + var result = ContextUtils.evalModule(ctx, src); + assertThat(result.asBoolean(), is(true)); + } + + @Test + public void javaMethodAcceptsEnsoTimeOfDay_AsValue() { + var src = + """ + from Standard.Base import Date_Time + polyglot java import org.enso.example.PolyglotTestClass + + main = + dt = Date_Time.now + PolyglotTestClass.isPolyglotDate_Value dt + """; + var result = ContextUtils.evalModule(ctx, src); + assertThat(result.asBoolean(), is(true)); + } +} From 8feab15290c45a485815619972a93ab69f34e78a Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 13 Dec 2024 14:53:15 +0100 Subject: [PATCH 06/34] Update docs --- .../enso/interpreter/runtime/builtin/BuiltinObject.java | 7 ++----- 1 file changed, 2 insertions(+), 5 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 e49a23a12a88..9b3503de0a06 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 @@ -18,11 +18,8 @@ * Base class for every Enso builtin object. Not type. Note that base class for a builtin type is * {@link Builtin}. * - *

The {@link InteropLibrary interop} protocol roughly corresponds to the implementation of the - * protocol inside {@link org.enso.interpreter.runtime.data.atom.Atom}. - * - *

Note that extension methods are not resolved, because they are not defined in builtins module - * scope. In other words, extension methods are not reported as members via interop. + *

In other words, this class represents an object of builtin type in a similar way that {@link + * org.enso.interpreter.runtime.data.atom.Atom} represents an object of a non-builtin type. */ @ExportLibrary(InteropLibrary.class) @ExportLibrary(TypesLibrary.class) From 75109063c5ca5084d2de8734594dc2ae06402a20 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 16 Dec 2024 11:00:39 +0100 Subject: [PATCH 07/34] [WIP] Try to remove builtin type caching in BuiltinObject Maybe this will fix the invalid polyglot layer sharing assertion errors. --- .../interpreter/runtime/builtin/BuiltinObject.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 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..5f27550bdeef 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 @@ -2,6 +2,7 @@ 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.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -27,8 +28,6 @@ public abstract class BuiltinObject extends EnsoObject { private final String builtinName; - @CompilationFinal private Builtin cachedBuiltinType; - /** * @param builtinName Simple name of the builtin that should be contained in {@link * org.enso.interpreter.runtime.builtin.Builtins#builtinsByName}. @@ -43,13 +42,11 @@ public final boolean hasType() { } @ExportMessage + @TruffleBoundary public final Type getType(@Bind("$node") Node node) { - if (cachedBuiltinType == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - var ctx = EnsoContext.get(node); - cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); - } - return cachedBuiltinType.getType(); + var ctx = EnsoContext.get(node); + var builtinType = ctx.getBuiltins().getBuiltinType(builtinName); + return builtinType.getType(); } /** @@ -76,6 +73,7 @@ public final boolean hasMetaObject() { } @ExportMessage + @TruffleBoundary public final Type getMetaObject(@Bind("$node") Node node) { return getType(node); } From 78002d1c49df5f67f276ee7b56e094e534d6771d Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 16 Dec 2024 11:37:46 +0100 Subject: [PATCH 08/34] Revert "[WIP] Try to remove builtin type caching in BuiltinObject" This reverts commit 75109063c5ca5084d2de8734594dc2ae06402a20. --- .../interpreter/runtime/builtin/BuiltinObject.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 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 5f27550bdeef..9b3503de0a06 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 @@ -2,7 +2,6 @@ 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.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -28,6 +27,8 @@ public abstract class BuiltinObject extends EnsoObject { private final String builtinName; + @CompilationFinal private Builtin cachedBuiltinType; + /** * @param builtinName Simple name of the builtin that should be contained in {@link * org.enso.interpreter.runtime.builtin.Builtins#builtinsByName}. @@ -42,11 +43,13 @@ public final boolean hasType() { } @ExportMessage - @TruffleBoundary public final Type getType(@Bind("$node") Node node) { - var ctx = EnsoContext.get(node); - var builtinType = ctx.getBuiltins().getBuiltinType(builtinName); - return builtinType.getType(); + if (cachedBuiltinType == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + var ctx = EnsoContext.get(node); + cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); + } + return cachedBuiltinType.getType(); } /** @@ -73,7 +76,6 @@ public final boolean hasMetaObject() { } @ExportMessage - @TruffleBoundary public final Type getMetaObject(@Bind("$node") Node node) { return getType(node); } From fcd043f5bf0e6f20138062571b516b603d22ee90 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 16 Dec 2024 12:01:25 +0100 Subject: [PATCH 09/34] 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(); From 78b1832830c6cdeb03026be7a08ddaceaf39fcb3 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 17 Dec 2024 12:13:25 +0100 Subject: [PATCH 10/34] Utility class has private constructor --- .../src/test/java/org/enso/example/PolyglotTestClass.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java index 928163f894db..3abaa40169e2 100644 --- a/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java +++ b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java @@ -3,7 +3,8 @@ import java.time.LocalDate; import org.graalvm.polyglot.Value; -public class PolyglotTestClass { +public final class PolyglotTestClass { + private PolyglotTestClass() {} public static boolean isPolyglotDate_Object(Object obj) { return obj instanceof Value polyglotVal && polyglotVal.isDate(); } From b310f6c3277863c88a04062510a9cdf249fdebae Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 17 Dec 2024 12:23:52 +0100 Subject: [PATCH 11/34] Revert "BuiltinObject guards cached builtin type with WeakReference to context" This reverts commit fcd043f5bf0e6f20138062571b516b603d22ee90. --- .../runtime/builtin/BuiltinObject.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 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 1d085735185c..9b3503de0a06 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,7 +8,6 @@ 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; @@ -28,15 +27,7 @@ public abstract class BuiltinObject extends EnsoObject { private final String builtinName; - /** - * 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; + @CompilationFinal private Builtin cachedBuiltinType; /** * @param builtinName Simple name of the builtin that should be contained in {@link @@ -53,11 +44,9 @@ public final boolean hasType() { @ExportMessage public final Type getType(@Bind("$node") Node node) { - var ctx = EnsoContext.get(node); - var previousCtx = previousCtxRef.get(); - if (previousCtx == null || cachedBuiltinType == null || previousCtx != ctx) { + if (cachedBuiltinType == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - previousCtxRef = new WeakReference<>(ctx); + var ctx = EnsoContext.get(node); cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); } return cachedBuiltinType.getType(); From b58a29db2451c7a20df4864f415944111ebf37b8 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 17 Dec 2024 12:38:30 +0100 Subject: [PATCH 12/34] [WIP] Throw AssertionError on context mismatch in cached builtin type. --- .../runtime/builtin/BuiltinObject.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 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..2ccbf40f538d 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 @@ -1,13 +1,14 @@ package org.enso.interpreter.runtime.builtin; 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.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; +import java.lang.System; import org.enso.interpreter.node.expression.builtin.Builtin; import org.enso.interpreter.runtime.EnsoContext; import org.enso.interpreter.runtime.data.EnsoObject; @@ -27,7 +28,7 @@ public abstract class BuiltinObject extends EnsoObject { private final String builtinName; - @CompilationFinal private Builtin cachedBuiltinType; + private BuiltinWithContext cachedBuiltinType; /** * @param builtinName Simple name of the builtin that should be contained in {@link @@ -43,13 +44,48 @@ public final boolean hasType() { } @ExportMessage + @TruffleBoundary public final Type getType(@Bind("$node") Node node) { if (cachedBuiltinType == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); var ctx = EnsoContext.get(node); - cachedBuiltinType = ctx.getBuiltins().getBuiltinType(builtinName); + cachedBuiltinType = new BuiltinWithContext( + ctx.getBuiltins().getBuiltinType(builtinName), + ctx); + } else { + assert assertCorrectCachedBuiltin(node); + } + return cachedBuiltinType.builtin.getType(); + } + + private boolean assertCorrectCachedBuiltin(Node node) { + assert cachedBuiltinType != null; + var curCtx = EnsoContext.get(node); + var curBuiltinType = curCtx.getBuiltins().getBuiltinType(builtinName); + var prevCtx = cachedBuiltinType.ctx; + var errMsgSb = new StringBuilder(); + if (curCtx != prevCtx) { + errMsgSb.append("Context mismatch: ") + .append("previous context: ") + .append(hex(prevCtx)) + .append(", current context: ") + .append(hex(curCtx)) + .append(System.lineSeparator()); + } + var prevBuiltinType = cachedBuiltinType.builtin; + if (curBuiltinType != prevBuiltinType) { + errMsgSb.append("Builtin type mismatch: ") + .append("previous builtin type: ") + .append(hex(prevBuiltinType)) + .append(", current builtin type: ") + .append(hex(curBuiltinType)) + .append(System.lineSeparator()); + } + if (errMsgSb.isEmpty()) { + return true; + } else { + throw new AssertionError(errMsgSb.toString()); } - return cachedBuiltinType.getType(); } /** @@ -79,4 +115,10 @@ public final boolean hasMetaObject() { public final Type getMetaObject(@Bind("$node") Node node) { return getType(node); } + + private static final String hex(Object obj) { + return Integer.toHexString(System.identityHashCode(obj)); + } + + private record BuiltinWithContext(Builtin builtin, EnsoContext ctx) {} } From 8bfea5db26b0b2313551f4f85e9eee7c1c2ee6da Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 17 Dec 2024 13:31:10 +0100 Subject: [PATCH 13/34] [WIP] Append name of the builtin to the assertion error --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 2ccbf40f538d..81654691e4cd 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 @@ -74,7 +74,9 @@ private boolean assertCorrectCachedBuiltin(Node node) { } var prevBuiltinType = cachedBuiltinType.builtin; if (curBuiltinType != prevBuiltinType) { - errMsgSb.append("Builtin type mismatch: ") + errMsgSb.append("Builtin type '") + .append(curBuiltinType.getType().getQualifiedName()) + .append("' mismatch: ") .append("previous builtin type: ") .append(hex(prevBuiltinType)) .append(", current builtin type: ") From 0f5dcc9b1583e038239e8dda076ef5753753789c Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 17 Dec 2024 17:40:29 +0100 Subject: [PATCH 14/34] [WIP] Record stack trace of cached builtin type --- .../runtime/builtin/BuiltinObject.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 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 81654691e4cd..a21f2eac2a12 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 @@ -2,6 +2,7 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -9,10 +10,14 @@ import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; import java.lang.System; +import java.util.ArrayList; +import java.util.List; import org.enso.interpreter.node.expression.builtin.Builtin; import org.enso.interpreter.runtime.EnsoContext; import org.enso.interpreter.runtime.data.EnsoObject; import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; /** @@ -43,6 +48,22 @@ public final boolean hasType() { return true; } + private static List truffleStack() { + var stack = new ArrayList(); + Truffle.getRuntime().iterateFrames((frameInstance) -> { + var callNode = frameInstance.getCallNode(); + if (callNode != null) { + var rootNode = callNode.getRootNode(); + if (rootNode != null) { + var fqn = rootNode.getQualifiedName(); + stack.add(fqn); + } + } + return null; + }); + return stack; + } + @ExportMessage @TruffleBoundary public final Type getType(@Bind("$node") Node node) { @@ -51,7 +72,9 @@ public final Type getType(@Bind("$node") Node node) { var ctx = EnsoContext.get(node); cachedBuiltinType = new BuiltinWithContext( ctx.getBuiltins().getBuiltinType(builtinName), - ctx); + ctx, + new RuntimeException(), + truffleStack()); } else { assert assertCorrectCachedBuiltin(node); } @@ -86,6 +109,13 @@ private boolean assertCorrectCachedBuiltin(Node node) { if (errMsgSb.isEmpty()) { return true; } else { + // Print stack trace of when the builtin type was cached + System.out.println("Truffle stack of cached builtin type: "); + cachedBuiltinType.truffleStack.forEach( + (frame) -> System.out.println(" " + frame)); + System.out.println(); + System.out.println("RuntimeException stack of cached builtin type: "); + cachedBuiltinType.ex.printStackTrace(System.out); throw new AssertionError(errMsgSb.toString()); } } @@ -122,5 +152,5 @@ private static final String hex(Object obj) { return Integer.toHexString(System.identityHashCode(obj)); } - private record BuiltinWithContext(Builtin builtin, EnsoContext ctx) {} + private record BuiltinWithContext(Builtin builtin, EnsoContext ctx, RuntimeException ex, List truffleStack) {} } From 4dbfdb6ab88d4e293dd810e12eb1d6e5a06ef959 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 12:20:38 +0100 Subject: [PATCH 15/34] builtin name is fetched from annotation --- .../interpreter/runtime/builtin/BuiltinObject.java | 10 +--------- .../org/enso/interpreter/runtime/data/EnsoDate.java | 7 +------ .../enso/interpreter/runtime/data/EnsoDateTime.java | 4 +--- .../enso/interpreter/runtime/data/EnsoDuration.java | 7 +------ .../org/enso/interpreter/runtime/data/EnsoFile.java | 5 ++--- .../enso/interpreter/runtime/data/EnsoTimeOfDay.java | 5 ++--- .../enso/interpreter/runtime/data/EnsoTimeZone.java | 5 ++--- .../enso/interpreter/runtime/data/ManagedResource.java | 4 +--- .../java/org/enso/interpreter/runtime/data/Ref.java | 4 +--- .../interpreter/runtime/data/hash/EnsoHashMap.java | 4 +--- .../enso/interpreter/runtime/data/vector/Array.java | 4 +--- .../runtime/data/vector/ArrayLikeHelpers.java | 7 ++----- .../enso/interpreter/runtime/data/vector/Vector.java | 10 ++-------- .../org/enso/interpreter/runtime/warning/Warning.java | 4 +--- .../main/java/org/enso/interpreter/dsl/Builtin.java | 2 +- 15 files changed, 20 insertions(+), 62 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 a21f2eac2a12..ae2b093335b0 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 @@ -31,17 +31,9 @@ @ExportLibrary(TypesLibrary.class) public abstract class BuiltinObject extends EnsoObject { - private final String builtinName; - private BuiltinWithContext cachedBuiltinType; - /** - * @param builtinName Simple name of the builtin that should be contained in {@link - * org.enso.interpreter.runtime.builtin.Builtins#builtinsByName}. - */ - protected BuiltinObject(String builtinName) { - this.builtinName = builtinName; - } + protected BuiltinObject() {} @ExportMessage public final boolean hasType() { 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 8579d8b317f4..c86db7151e5d 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 @@ -13,16 +13,11 @@ import org.enso.polyglot.common_utils.Core_Date_Utils; @ExportLibrary(InteropLibrary.class) -@Builtin( - pkg = "date", - name = EnsoDate.builtinName, - stdlibName = "Standard.Base.Data.Time.Date.Date") +@Builtin(pkg = "date", name = "Date", stdlibName = "Standard.Base.Data.Time.Date.Date") public final class EnsoDate extends BuiltinObject { - static final String builtinName = "Date"; private final LocalDate date; public EnsoDate(LocalDate date) { - super(builtinName); this.date = 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 18b206eeeb83..e3df2b103c97 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 @@ -18,14 +18,12 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = EnsoDateTime.builtinName, + name = "Date_Time", stdlibName = "Standard.Base.Data.Time.Date_Time.Date_Time") public final class EnsoDateTime extends BuiltinObject { - static final String builtinName = "Date_Time"; private final ZonedDateTime dateTime; public EnsoDateTime(ZonedDateTime dateTime) { - super(builtinName); this.dateTime = 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 787ea8d66ce6..4f5f6033a78c 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 @@ -18,16 +18,11 @@ import org.enso.interpreter.runtime.error.PanicException; @ExportLibrary(InteropLibrary.class) -@Builtin( - pkg = "date", - name = EnsoDuration.builtinName, - stdlibName = "Standard.Base.Data.Time.Duration.Duration") +@Builtin(pkg = "date", name = "Duration", stdlibName = "Standard.Base.Data.Time.Duration.Duration") public final class EnsoDuration extends BuiltinObject { private final Duration duration; - static final String builtinName = "Duration"; public EnsoDuration(Duration duration) { - super(builtinName); this.duration = 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 a5d5c01925d3..027e7bcdad79 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 @@ -50,13 +50,12 @@ * please refer to {@link TruffleFile}. */ @ExportLibrary(InteropLibrary.class) -@Builtin(pkg = "io", name = EnsoFile.builtinName, stdlibName = "Standard.Base.System.File.File") +@Builtin(pkg = "io", name = "File", stdlibName = "Standard.Base.System.File.File") public final class EnsoFile extends BuiltinObject { - static final String builtinName = "File"; + private final TruffleFile truffleFile; public EnsoFile(TruffleFile truffleFile) { - super(builtinName); if (truffleFile == null) { throw CompilerDirectives.shouldNotReachHere(); } 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 86db62dbcf93..a461738bf193 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 @@ -17,14 +17,13 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = EnsoTimeOfDay.builtinName, + name = "Time_Of_Day", stdlibName = "Standard.Base.Data.Time.Time_Of_Day.Time_Of_Day") public final class EnsoTimeOfDay extends BuiltinObject { - static final String builtinName = "Time_Of_Day"; + private final LocalTime localTime; public EnsoTimeOfDay(LocalTime localTime) { - super(builtinName); this.localTime = localTime; } 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 c16a71d6998e..9b8be40adcfe 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 @@ -18,14 +18,13 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = EnsoTimeZone.builtinName, + name = "Time_Zone", stdlibName = "Standard.Base.Data.Time.Time_Zone.Time_Zone") public final class EnsoTimeZone extends BuiltinObject { - static final String builtinName = "Time_Zone"; + private final ZoneId zone; public EnsoTimeZone(ZoneId zone) { - super(builtinName); this.zone = zone; } 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 3d3078a20a99..69874aec19a4 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 @@ -38,9 +38,8 @@ @Builtin( pkg = "resource", stdlibName = "Standard.Base.Runtime.Managed_Resource.Managed_Resource", - name = ManagedResource.builtinName) + name = "Managed_Resource") public final class ManagedResource extends BuiltinObject { - static final String builtinName = "Managed_Resource"; private final Object resource; private final PhantomReference phantomReference; @@ -53,7 +52,6 @@ public final class ManagedResource extends BuiltinObject { public ManagedResource( Object resource, java.util.function.Function> factory) { - super(builtinName); this.resource = resource; this.phantomReference = factory.apply(this); } 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 453c8c7ef20f..94f8a63529d2 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 @@ -10,9 +10,8 @@ /** A mutable reference type. */ @ExportLibrary(InteropLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref", name = Ref.builtinName) +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref", name = "Ref") public final class Ref extends BuiltinObject { - static final String builtinName = "Ref"; private volatile Object value; /** @@ -22,7 +21,6 @@ public final class Ref extends BuiltinObject { */ @Builtin.Method(description = "Creates a new Ref", autoRegister = false) public Ref(Object value) { - super(builtinName); this.value = value; } 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 f8c029d9e32d..8e37545f12df 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 @@ -30,9 +30,8 @@ * as it works in Enso. */ @ExportLibrary(InteropLibrary.class) -@Builtin(stdlibName = "Standard.Base.Data.Dictionary.Dictionary", name = EnsoHashMap.builtinName) +@Builtin(stdlibName = "Standard.Base.Data.Dictionary.Dictionary", name = "Dictionary") public final class EnsoHashMap extends BuiltinObject { - static final String builtinName = "Dictionary"; private final EnsoHashMapBuilder mapBuilder; private final int generation; private final int size; @@ -40,7 +39,6 @@ public final class EnsoHashMap extends BuiltinObject { private Object cachedVectorRepresentation; private EnsoHashMap(EnsoHashMapBuilder mapBuilder) { - super(builtinName); this.mapBuilder = mapBuilder; this.generation = mapBuilder.generation(); this.size = mapBuilder.size(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java index c3d63f8dd8de..4cc85235511a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java @@ -27,9 +27,8 @@ /** A primitive boxed array type for use in the runtime. */ @ExportLibrary(InteropLibrary.class) @ExportLibrary(WarningsLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array", name = Array.builtinName) +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array", name = "Array") final class Array extends BuiltinObject { - static final String builtinName = "Array"; private final Object[] items; /** If true, some elements contain warning, and thus, this Array contains warning. */ @@ -45,7 +44,6 @@ final class Array extends BuiltinObject { * @param items the element values */ private Array(Object... items) { - super(builtinName); this.items = items; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java index b5e17e2d511c..7dc6dd071123 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java @@ -12,13 +12,10 @@ @Builtin( pkg = "immutable", stdlibName = "Standard.Base.Internal.Array_Like_Helpers", - name = ArrayLikeHelpers.builtinName) + name = "Array_Like_Helpers") public final class ArrayLikeHelpers extends BuiltinObject { - static final String builtinName = "Array_Like_Helpers"; - private ArrayLikeHelpers() { - super(builtinName); - } + private ArrayLikeHelpers() {} @Builtin.Method( name = "new_array_proxy_builtin", diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index ab55ed86978e..697898208a60 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -17,19 +17,13 @@ import org.enso.interpreter.runtime.warning.WarningsLibrary; @ExportLibrary(InteropLibrary.class) -@Builtin( - pkg = "immutable", - stdlibName = "Standard.Base.Data.Vector.Vector", - name = Vector.builtinName) +@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector", name = "Vector") abstract class Vector extends BuiltinObject { - static final String builtinName = "Vector"; private static final Vector EMPTY_LONG = new Long(new long[0]); private static final Vector EMPTY_DOUBLE = new Double(new double[0]); private static final Vector EMPTY_VECTOR = new EnsoOnly(new Object[0]); - protected Vector() { - super(builtinName); - } + protected Vector() {} @ExportMessage boolean hasArrayElements() { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java index 5d064e0e8f3c..5b0dc3e006e4 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java @@ -14,16 +14,14 @@ import org.enso.interpreter.runtime.data.hash.EnsoHashMap; import org.enso.interpreter.runtime.data.hash.HashMapInsertNode; -@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning", name = Warning.builtinName) +@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning", name = "Warning") @ExportLibrary(value = InteropLibrary.class, delegateTo = "value") public final class Warning extends BuiltinObject { - static final String builtinName = "Warning"; final Object value; private final Object origin; private final long sequenceId; private Warning(Object value, Object origin, long sequenceId) { - super(builtinName); this.value = value; this.origin = origin; this.sequenceId = sequenceId; diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java index 850b90f4cbf6..17ceec7779b6 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java @@ -35,7 +35,7 @@ * org.enso.interpreter.node.expression.builtin.example}. */ @Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.RUNTIME) public @interface Builtin { /** * @return the name of the subpackage for the generated method node. From fab5b901dc19725e1d5a956e958f531bc8f177cc Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 12:21:10 +0100 Subject: [PATCH 16/34] Add unnecessary Builtin annotations --- .../main/java/org/enso/interpreter/runtime/data/text/Text.java | 3 +-- .../org/enso/interpreter/runtime/data/vector/ArrayProxy.java | 3 ++- .../org/enso/interpreter/runtime/number/EnsoBigInteger.java | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) 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 8408b1db703d..f204a98ab67b 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 @@ -19,6 +19,7 @@ /** The main runtime type for Enso's Text. */ @ExportLibrary(InteropLibrary.class) +@Builtin(stdlibName = "Standard.Base.Data.Text.Text", name = "Text") public final class Text extends BuiltinObject { private static final Lock LOCK = new ReentrantLock(); private static final Text EMPTY = new Text(""); @@ -33,12 +34,10 @@ private enum FcdNormalized { } private Text(String string) { - super("Text"); this.contents = string; } private Text(ConcatRope contents) { - super("Text"); this.contents = contents; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java index 5ec5305d1ee9..661566b236b1 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java @@ -13,6 +13,7 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.profiles.BranchProfile; +import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.builtin.BuiltinObject; /** @@ -23,12 +24,12 @@ */ @ExportLibrary(InteropLibrary.class) @ImportStatic(BranchProfile.class) +@Builtin(stdlibName = "Standard.Base.Data.Array.Array", name = "Array") final class ArrayProxy extends BuiltinObject { private final long length; private final Object at; private ArrayProxy(long length, Object at) { - super("Array"); assert length >= 0; assert InteropLibrary.getUncached().isExecutable(at); this.length = length; 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 440ab7139a77..e5c13122f869 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 @@ -6,10 +6,12 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import java.math.BigInteger; +import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.builtin.BuiltinObject; /** Internal wrapper for a {@link BigInteger}. */ @ExportLibrary(InteropLibrary.class) +@Builtin(stdlibName = "Standard.Base.Data.Number.Integer", name = "Integer") public final class EnsoBigInteger extends BuiltinObject { private final BigInteger value; @@ -19,7 +21,6 @@ public final class EnsoBigInteger extends BuiltinObject { * @param value the value to wrap. */ public EnsoBigInteger(BigInteger value) { - super("Integer"); assert (value.bitLength() > 63) : "Too small BigInteger: " + value; this.value = value; } From d9f733e3c0219f431dc57c02f396091c595555ab Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 12:36:00 +0100 Subject: [PATCH 17/34] Buil;tinObject contains no fields and caches receiver class --- .../runtime/builtin/BuiltinObject.java | 128 ++++++------------ .../runtime/data/ManagedResource.java | 14 +- 2 files changed, 42 insertions(+), 100 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 ae2b093335b0..22b62b847aa0 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 @@ -1,23 +1,19 @@ package org.enso.interpreter.runtime.builtin; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Idempotent; +import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; -import java.lang.System; -import java.util.ArrayList; -import java.util.List; import org.enso.interpreter.node.expression.builtin.Builtin; import org.enso.interpreter.runtime.EnsoContext; import org.enso.interpreter.runtime.data.EnsoObject; import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.data.text.Text; -import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; /** @@ -30,9 +26,6 @@ @ExportLibrary(InteropLibrary.class) @ExportLibrary(TypesLibrary.class) public abstract class BuiltinObject extends EnsoObject { - - private BuiltinWithContext cachedBuiltinType; - protected BuiltinObject() {} @ExportMessage @@ -40,76 +33,8 @@ public final boolean hasType() { return true; } - private static List truffleStack() { - var stack = new ArrayList(); - Truffle.getRuntime().iterateFrames((frameInstance) -> { - var callNode = frameInstance.getCallNode(); - if (callNode != null) { - var rootNode = callNode.getRootNode(); - if (rootNode != null) { - var fqn = rootNode.getQualifiedName(); - stack.add(fqn); - } - } - return null; - }); - return stack; - } - - @ExportMessage - @TruffleBoundary - public final Type getType(@Bind("$node") Node node) { - if (cachedBuiltinType == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - var ctx = EnsoContext.get(node); - cachedBuiltinType = new BuiltinWithContext( - ctx.getBuiltins().getBuiltinType(builtinName), - ctx, - new RuntimeException(), - truffleStack()); - } else { - assert assertCorrectCachedBuiltin(node); - } - return cachedBuiltinType.builtin.getType(); - } - - private boolean assertCorrectCachedBuiltin(Node node) { - assert cachedBuiltinType != null; - var curCtx = EnsoContext.get(node); - var curBuiltinType = curCtx.getBuiltins().getBuiltinType(builtinName); - var prevCtx = cachedBuiltinType.ctx; - var errMsgSb = new StringBuilder(); - if (curCtx != prevCtx) { - errMsgSb.append("Context mismatch: ") - .append("previous context: ") - .append(hex(prevCtx)) - .append(", current context: ") - .append(hex(curCtx)) - .append(System.lineSeparator()); - } - var prevBuiltinType = cachedBuiltinType.builtin; - if (curBuiltinType != prevBuiltinType) { - errMsgSb.append("Builtin type '") - .append(curBuiltinType.getType().getQualifiedName()) - .append("' mismatch: ") - .append("previous builtin type: ") - .append(hex(prevBuiltinType)) - .append(", current builtin type: ") - .append(hex(curBuiltinType)) - .append(System.lineSeparator()); - } - if (errMsgSb.isEmpty()) { - return true; - } else { - // Print stack trace of when the builtin type was cached - System.out.println("Truffle stack of cached builtin type: "); - cachedBuiltinType.truffleStack.forEach( - (frame) -> System.out.println(" " + frame)); - System.out.println(); - System.out.println("RuntimeException stack of cached builtin type: "); - cachedBuiltinType.ex.printStackTrace(System.out); - throw new AssertionError(errMsgSb.toString()); - } + protected final Type getBuiltinType() { + return GetType.uncached(this); } /** @@ -135,14 +60,39 @@ public final boolean hasMetaObject() { return true; } - @ExportMessage - public final Type getMetaObject(@Bind("$node") Node node) { - return getType(node); - } + @ExportMessage(name = "getType", library = TypesLibrary.class) + @ExportMessage(name = "getMetaObject", library = InteropLibrary.class) + public static class GetType { + @Specialization( + guards = {"cachedReceiverClass == receiver.getClass()", "getCtx(node) == cachedCtx"}, + limit = "1") + public static Type doItCached( + BuiltinObject receiver, + @Bind("$node") Node node, + @Cached("receiver.getClass()") Class cachedReceiverClass, + @Cached(value = "getCtx(node)", allowUncached = true) EnsoContext cachedCtx, + @Cached(value = "getBuiltinType(cachedReceiverClass, cachedCtx)", allowUncached = true) + Builtin cachedBuiltinType) { + return cachedBuiltinType.getType(); + } - private static final String hex(Object obj) { - return Integer.toHexString(System.identityHashCode(obj)); - } + @Fallback + public static Type uncached(BuiltinObject receiver) { + var receiverClass = receiver.getClass(); + var ctx = getCtx(null); + return getBuiltinType(receiverClass, ctx).getType(); + } + + public static Builtin getBuiltinType(Class builtinClass, EnsoContext ctx) { + var anot = builtinClass.getAnnotation(org.enso.interpreter.dsl.Builtin.class); + assert anot != null : "Builtin annotation is missing on class" + builtinClass; + var builtinName = anot.name(); + return ctx.getBuiltins().getBuiltinType(builtinName); + } - private record BuiltinWithContext(Builtin builtin, EnsoContext ctx, RuntimeException ex, List truffleStack) {} + @Idempotent + public static EnsoContext getCtx(Node node) { + return EnsoContext.get(node); + } + } } 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 69874aec19a4..960f949f14ca 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,12 +1,9 @@ package org.enso.interpreter.runtime.data; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; 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.PhantomReference; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; @@ -101,16 +98,11 @@ public void close(EnsoContext context) { @ExportMessage @TruffleBoundary - public String toDisplayString(boolean allowSideEffects, @Bind("$node") Node node) { - var type = getType(node); + @Override + public String toDisplayString(boolean allowSideEffects) { + var type = getBuiltinType(); return type.getName() + " " + InteropLibrary.getUncached().toDisplayString(resource, allowSideEffects); } - - @ExportMessage.Ignore - @Override - public Object toDisplayString(boolean allowSideEffects) { - throw CompilerDirectives.shouldNotReachHere(); - } } From 08136c4452122f8d31d3fa301c06fa4ac8ebc724 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 12:36:47 +0100 Subject: [PATCH 18/34] builtin anot processor does not hardcode switch for Text --- .../src/main/java/org/enso/interpreter/dsl/TypeProcessor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java index 7cc5ab8fc49b..f3fb1330cc63 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java @@ -147,7 +147,6 @@ protected void storeMetadata(Writer writer, Map pastE out.println(" return switch (builtinName) {"); out.println(" case \"Long\" -> " + ConstantsGenClass + ".INTEGER;"); out.println(" case \"Double\" -> " + ConstantsGenClass + ".FLOAT;"); - out.println(" case \"Text\" -> " + ConstantsGenClass + ".TEXT;"); lookup.forEach( (k, v) -> out.println(" case \"" + k + "\" -> " + ConstantsGenClass + "." + v + ";")); From bd8ff6675de79d268773fede0232bc806c72d285 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 12:37:42 +0100 Subject: [PATCH 19/34] fmt --- .../src/test/java/org/enso/example/PolyglotTestClass.java | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java index 3abaa40169e2..1118c5a73cd7 100644 --- a/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java +++ b/engine/runtime-integration-tests/src/test/java/org/enso/example/PolyglotTestClass.java @@ -5,6 +5,7 @@ public final class PolyglotTestClass { private PolyglotTestClass() {} + public static boolean isPolyglotDate_Object(Object obj) { return obj instanceof Value polyglotVal && polyglotVal.isDate(); } From 322111586da88866d8dc57bf2fc87f39804db0e5 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 13:50:27 +0100 Subject: [PATCH 20/34] Revert "builtin anot processor does not hardcode switch for Text" This reverts commit 08136c4452122f8d31d3fa301c06fa4ac8ebc724. --- .../src/main/java/org/enso/interpreter/dsl/TypeProcessor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java index f3fb1330cc63..7cc5ab8fc49b 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/TypeProcessor.java @@ -147,6 +147,7 @@ protected void storeMetadata(Writer writer, Map pastE out.println(" return switch (builtinName) {"); out.println(" case \"Long\" -> " + ConstantsGenClass + ".INTEGER;"); out.println(" case \"Double\" -> " + ConstantsGenClass + ".FLOAT;"); + out.println(" case \"Text\" -> " + ConstantsGenClass + ".TEXT;"); lookup.forEach( (k, v) -> out.println(" case \"" + k + "\" -> " + ConstantsGenClass + "." + v + ";")); From ce17f5f90f5a5508147eefa995d2659baad20c94 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 13:56:16 +0100 Subject: [PATCH 21/34] BuiltinObject has abstract builtinName method --- .../interpreter/runtime/builtin/BuiltinObject.java | 7 +++++++ .../enso/interpreter/runtime/data/EnsoDate.java | 5 +++++ .../interpreter/runtime/data/EnsoDateTime.java | 5 +++++ .../interpreter/runtime/data/EnsoDuration.java | 5 +++++ .../enso/interpreter/runtime/data/EnsoFile.java | 5 +++++ .../interpreter/runtime/data/EnsoTimeOfDay.java | 5 +++++ .../interpreter/runtime/data/EnsoTimeZone.java | 5 +++++ .../interpreter/runtime/data/ManagedResource.java | 5 +++++ .../org/enso/interpreter/runtime/data/Ref.java | 6 ++++++ .../interpreter/runtime/data/hash/EnsoHashMap.java | 5 +++++ .../enso/interpreter/runtime/data/text/Text.java | 5 +++++ .../interpreter/runtime/data/vector/Array.java | 5 +++++ .../runtime/data/vector/ArrayLikeHelpers.java | 5 +++++ .../runtime/data/vector/ArrayProxy.java | 5 +++++ .../interpreter/runtime/data/vector/Vector.java | 14 ++++++++------ .../interpreter/runtime/number/EnsoBigInteger.java | 5 +++++ .../enso/interpreter/runtime/warning/Warning.java | 5 +++++ 17 files changed, 91 insertions(+), 6 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 22b62b847aa0..032367513ce7 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 @@ -33,6 +33,13 @@ public final boolean hasType() { return true; } + /** + * Returns the name of the builtin as saved inside {@link Builtins#builtinsByName}. + * Not fully qualified. + * @return + */ + protected abstract String builtinName(); + protected final Type getBuiltinType() { return GetType.uncached(this); } 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 c86db7151e5d..1c7872096879 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 @@ -21,6 +21,11 @@ public EnsoDate(LocalDate date) { this.date = date; } + @Override + protected String builtinName() { + return "Date"; + } + @Builtin.Method(description = "Return current Date", autoRegister = false) @CompilerDirectives.TruffleBoundary public static EnsoDate today() { 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 e3df2b103c97..0bf8ad49bf29 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 @@ -27,6 +27,11 @@ public EnsoDateTime(ZonedDateTime dateTime) { this.dateTime = dateTime; } + @Override + protected String builtinName() { + return "Date_Time"; + } + @Builtin.Method( name = "epoch_start", description = "Return the Enso start of the Epoch", 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 4f5f6033a78c..d96397962d05 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 @@ -26,6 +26,11 @@ public EnsoDuration(Duration duration) { this.duration = duration; } + @Override + protected String builtinName() { + return "Duration"; + } + @Builtin.Method( name = "new_builtin", description = 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 027e7bcdad79..335cd65d4ff4 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 @@ -62,6 +62,11 @@ public EnsoFile(TruffleFile truffleFile) { this.truffleFile = truffleFile; } + @Override + protected String builtinName() { + return "File"; + } + @Builtin.Method(name = "output_stream_builtin") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize 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 a461738bf193..962bdebd529d 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 @@ -27,6 +27,11 @@ public EnsoTimeOfDay(LocalTime localTime) { this.localTime = localTime; } + @Override + protected String builtinName() { + return "Time_Of_Day"; + } + @Builtin.Method( name = "new_builtin", description = "Constructs a new Time_OF_Day from an hour", 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 9b8be40adcfe..ed1bed33594c 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 @@ -28,6 +28,11 @@ public EnsoTimeZone(ZoneId zone) { this.zone = zone; } + @Override + protected String builtinName() { + return "Time_Zone"; + } + @Builtin.Method(description = "Get the unique identifier for your system's current timezone.") @CompilerDirectives.TruffleBoundary public Text zoneId() { 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 960f949f14ca..36c02b199397 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 @@ -53,6 +53,11 @@ public ManagedResource( this.phantomReference = factory.apply(this); } + @Override + protected String builtinName() { + return "Managed_Resource"; + } + /** * @return the underlying resource */ 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 94f8a63529d2..283554646a39 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 @@ -14,6 +14,12 @@ public final class Ref extends BuiltinObject { private volatile Object value; + @Override + protected String builtinName() { + return "Ref"; + } + + /** * Creates a new reference. * 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 8e37545f12df..bb9cfef1924c 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 @@ -52,6 +52,11 @@ static EnsoHashMap createEmpty() { return new EnsoHashMap(EnsoHashMapBuilder.create()); } + @Override + protected String builtinName() { + return "Dictionary"; + } + EnsoHashMapBuilder getMapBuilder( VirtualFrame frame, boolean readOnly, HashCodeNode hashCodeNode, EqualsNode equalsNode) { if (readOnly) { 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 f204a98ab67b..4db1def648ee 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 @@ -41,6 +41,11 @@ private Text(ConcatRope contents) { this.contents = contents; } + @Override + protected String builtinName() { + return "Text"; + } + @Builtin.Method( description = """ diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java index 4cc85235511a..b6cf3adbcc32 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java @@ -73,6 +73,11 @@ final Object[] getItems() { return items; } + @Override + protected String builtinName() { + return "Array"; + } + /** * Marks the object as array-like for Polyglot APIs. * diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java index 7dc6dd071123..d53b1c7807f8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java @@ -17,6 +17,11 @@ public final class ArrayLikeHelpers extends BuiltinObject { private ArrayLikeHelpers() {} + @Override + protected String builtinName() { + return "Array_Like_Helpers"; + } + @Builtin.Method( name = "new_array_proxy_builtin", description = "Creates an array backed by a proxy object.") diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java index 661566b236b1..01ec0144fd6a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java @@ -40,6 +40,11 @@ static ArrayProxy create(long length, Object at) { return new ArrayProxy(length, at); } + @Override + protected String builtinName() { + return "Array"; + } + @ExportMessage public boolean hasArrayElements() { return true; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index 697898208a60..2c8115923740 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -19,12 +19,14 @@ @ExportLibrary(InteropLibrary.class) @Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector", name = "Vector") abstract class Vector extends BuiltinObject { - private static final Vector EMPTY_LONG = new Long(new long[0]); - private static final Vector EMPTY_DOUBLE = new Double(new double[0]); - private static final Vector EMPTY_VECTOR = new EnsoOnly(new Object[0]); protected Vector() {} + @Override + protected String builtinName() { + return "Vector"; + } + @ExportMessage boolean hasArrayElements() { return true; @@ -91,7 +93,7 @@ static Vector fromInteropArray(Object arr) { static Vector fromLongArray(long[] arr) { if (arr == null || arr.length == 0) { - return EMPTY_LONG; + return new Long(new long[0]); } else { return new Long(arr); } @@ -99,7 +101,7 @@ static Vector fromLongArray(long[] arr) { static Vector fromDoubleArray(double[] arr) { if (arr == null || arr.length == 0) { - return EMPTY_DOUBLE; + return new Double(new double[0]); } else { return new Double(arr); } @@ -107,7 +109,7 @@ static Vector fromDoubleArray(double[] arr) { static Vector fromEnsoOnlyArray(Object[] arr) { if (arr == null || arr.length == 0) { - return EMPTY_VECTOR; + return new EnsoOnly(new Object[0]); } else { return new EnsoOnly(arr); } 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 e5c13122f869..673839978338 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 @@ -32,6 +32,11 @@ public BigInteger getValue() { return value; } + @Override + protected String builtinName() { + return "Integer"; + } + @Override @CompilerDirectives.TruffleBoundary public String toString() { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java index 5b0dc3e006e4..7d023bedc427 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java @@ -27,6 +27,11 @@ private Warning(Object value, Object origin, long sequenceId) { this.sequenceId = sequenceId; } + @Override + protected String builtinName() { + return "Warning"; + } + @Builtin.Method(name = "value", description = "Gets the payload of the warning.") @SuppressWarnings("generic-enso-builtin-type") public Object getValue() { From 0de40996f6f3274e3b798ede57928f69c61d08ce Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 13:56:28 +0100 Subject: [PATCH 22/34] Revert Builtin annotation --- .../src/main/java/org/enso/interpreter/dsl/Builtin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java index 17ceec7779b6..850b90f4cbf6 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/Builtin.java @@ -35,7 +35,7 @@ * org.enso.interpreter.node.expression.builtin.example}. */ @Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) +@Retention(RetentionPolicy.SOURCE) public @interface Builtin { /** * @return the name of the subpackage for the generated method node. From 8eae88ca944d5058d0434f346dbb2d953abbb694 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 13:57:47 +0100 Subject: [PATCH 23/34] Revert fab5b901dc19725e1d5a956e958f531bc8f177cc --- .../main/java/org/enso/interpreter/runtime/data/text/Text.java | 1 - .../org/enso/interpreter/runtime/data/vector/ArrayProxy.java | 1 - .../java/org/enso/interpreter/runtime/number/EnsoBigInteger.java | 1 - 3 files changed, 3 deletions(-) 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 4db1def648ee..4bfabb1b33f8 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 @@ -19,7 +19,6 @@ /** The main runtime type for Enso's Text. */ @ExportLibrary(InteropLibrary.class) -@Builtin(stdlibName = "Standard.Base.Data.Text.Text", name = "Text") public final class Text extends BuiltinObject { private static final Lock LOCK = new ReentrantLock(); private static final Text EMPTY = new Text(""); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java index 01ec0144fd6a..2f0d907c5ba4 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java @@ -24,7 +24,6 @@ */ @ExportLibrary(InteropLibrary.class) @ImportStatic(BranchProfile.class) -@Builtin(stdlibName = "Standard.Base.Data.Array.Array", name = "Array") final class ArrayProxy extends BuiltinObject { private final long length; private final Object at; 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 673839978338..f2988dbb739a 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 @@ -11,7 +11,6 @@ /** Internal wrapper for a {@link BigInteger}. */ @ExportLibrary(InteropLibrary.class) -@Builtin(stdlibName = "Standard.Base.Data.Number.Integer", name = "Integer") public final class EnsoBigInteger extends BuiltinObject { private final BigInteger value; From a28f50d0e3e7e200a7fd2fd11e932542c42cb9bf Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:02:49 +0100 Subject: [PATCH 24/34] Revert Builtin.name values to develop --- .../java/org/enso/interpreter/runtime/data/EnsoDateTime.java | 2 +- .../org/enso/interpreter/runtime/data/EnsoTimeOfDay.java | 2 +- .../java/org/enso/interpreter/runtime/data/EnsoTimeZone.java | 2 +- .../org/enso/interpreter/runtime/data/ManagedResource.java | 5 +---- .../src/main/java/org/enso/interpreter/runtime/data/Ref.java | 3 +-- .../java/org/enso/interpreter/runtime/data/vector/Array.java | 2 +- .../interpreter/runtime/data/vector/ArrayLikeHelpers.java | 5 +---- .../org/enso/interpreter/runtime/data/vector/Vector.java | 2 +- .../java/org/enso/interpreter/runtime/warning/Warning.java | 2 +- 9 files changed, 9 insertions(+), 16 deletions(-) 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 0bf8ad49bf29..e9f1ccc2c710 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 @@ -18,7 +18,7 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = "Date_Time", + name = "DateTime", stdlibName = "Standard.Base.Data.Time.Date_Time.Date_Time") public final class EnsoDateTime extends BuiltinObject { private final ZonedDateTime dateTime; 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 962bdebd529d..331849c5f938 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 @@ -17,7 +17,7 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = "Time_Of_Day", + name = "TimeOfDay", stdlibName = "Standard.Base.Data.Time.Time_Of_Day.Time_Of_Day") public final class EnsoTimeOfDay extends BuiltinObject { 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 ed1bed33594c..5c29c4e5e70d 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 @@ -18,7 +18,7 @@ @ExportLibrary(InteropLibrary.class) @Builtin( pkg = "date", - name = "Time_Zone", + name = "TimeZone", stdlibName = "Standard.Base.Data.Time.Time_Zone.Time_Zone") public final class EnsoTimeZone extends BuiltinObject { 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 36c02b199397..3649a0751570 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 @@ -32,10 +32,7 @@ * ProcessItems} processor. */ @ExportLibrary(InteropLibrary.class) -@Builtin( - pkg = "resource", - stdlibName = "Standard.Base.Runtime.Managed_Resource.Managed_Resource", - name = "Managed_Resource") +@Builtin(pkg = "resource", stdlibName = "Standard.Base.Runtime.Managed_Resource.Managed_Resource") public final class ManagedResource extends BuiltinObject { private final Object resource; private final PhantomReference phantomReference; 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 283554646a39..f25c510dee59 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 @@ -10,7 +10,7 @@ /** A mutable reference type. */ @ExportLibrary(InteropLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref", name = "Ref") +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Runtime.Ref.Ref") public final class Ref extends BuiltinObject { private volatile Object value; @@ -19,7 +19,6 @@ protected String builtinName() { return "Ref"; } - /** * Creates a new reference. * diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java index b6cf3adbcc32..09ef29401c5a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Array.java @@ -27,7 +27,7 @@ /** A primitive boxed array type for use in the runtime. */ @ExportLibrary(InteropLibrary.class) @ExportLibrary(WarningsLibrary.class) -@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array", name = "Array") +@Builtin(pkg = "mutable", stdlibName = "Standard.Base.Data.Array.Array") final class Array extends BuiltinObject { private final Object[] items; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java index d53b1c7807f8..8a54ad68aad8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayLikeHelpers.java @@ -9,10 +9,7 @@ import org.enso.interpreter.runtime.data.EnsoObject; /** Publicly available operations on array-like classes. */ -@Builtin( - pkg = "immutable", - stdlibName = "Standard.Base.Internal.Array_Like_Helpers", - name = "Array_Like_Helpers") +@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Internal.Array_Like_Helpers") public final class ArrayLikeHelpers extends BuiltinObject { private ArrayLikeHelpers() {} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index 2c8115923740..ab5e60cb5a91 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -17,7 +17,7 @@ import org.enso.interpreter.runtime.warning.WarningsLibrary; @ExportLibrary(InteropLibrary.class) -@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector", name = "Vector") +@Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector") abstract class Vector extends BuiltinObject { protected Vector() {} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java index 7d023bedc427..14ede3705e1c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/warning/Warning.java @@ -14,7 +14,7 @@ import org.enso.interpreter.runtime.data.hash.EnsoHashMap; import org.enso.interpreter.runtime.data.hash.HashMapInsertNode; -@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning", name = "Warning") +@Builtin(pkg = "error", stdlibName = "Standard.Base.Warning.Warning") @ExportLibrary(value = InteropLibrary.class, delegateTo = "value") public final class Warning extends BuiltinObject { final Object value; From 73fafc05b9d9d45d6492a1f717bea6186a713e4d Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:03:19 +0100 Subject: [PATCH 25/34] fmt --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 5 +++-- .../org/enso/interpreter/runtime/data/vector/ArrayProxy.java | 1 - .../org/enso/interpreter/runtime/number/EnsoBigInteger.java | 1 - 3 files changed, 3 insertions(+), 4 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 032367513ce7..c3391107285f 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 @@ -34,8 +34,9 @@ public final boolean hasType() { } /** - * Returns the name of the builtin as saved inside {@link Builtins#builtinsByName}. - * Not fully qualified. + * Returns the name of the builtin as saved inside {@link Builtins#builtinsByName}. Not fully + * qualified. + * * @return */ protected abstract String builtinName(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java index 2f0d907c5ba4..be94c9e0430f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/ArrayProxy.java @@ -13,7 +13,6 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.profiles.BranchProfile; -import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.builtin.BuiltinObject; /** 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 f2988dbb739a..2e7892b34a9f 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 @@ -6,7 +6,6 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import java.math.BigInteger; -import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.builtin.BuiltinObject; /** Internal wrapper for a {@link BigInteger}. */ From a58012cd997f88281fe6ebcdcced8ce8179a5feb Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:04:31 +0100 Subject: [PATCH 26/34] Revert "Fix names in Builtins" This reverts commit dc01c8e6b462025ca854d78f633bb6595ce9b2b6. --- .../org/enso/interpreter/runtime/builtin/Builtins.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 e8678a041a70..306c3758d07f 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 @@ -45,7 +45,7 @@ import org.enso.interpreter.node.expression.builtin.ordering.Comparable; import org.enso.interpreter.node.expression.builtin.ordering.DefaultComparator; import org.enso.interpreter.node.expression.builtin.ordering.Ordering; -import org.enso.interpreter.node.expression.builtin.resource.Managed_Resource; +import org.enso.interpreter.node.expression.builtin.resource.ManagedResource; import org.enso.interpreter.node.expression.builtin.runtime.Context; import org.enso.interpreter.node.expression.builtin.text.Text; import org.enso.interpreter.runtime.EnsoContext; @@ -163,15 +163,15 @@ public Builtins(EnsoContext context) { dictionary = builtins.get(org.enso.interpreter.node.expression.builtin.Dictionary.class); dataflowError = builtins.get(org.enso.interpreter.node.expression.builtin.Error.class); ref = builtins.get(Ref.class); - managedResource = builtins.get(Managed_Resource.class); + managedResource = builtins.get(ManagedResource.class); debug = builtins.get(Debug.class); projectDescription = getBuiltinType(ProjectDescription.class); file = builtins.get(File.class); date = builtins.get(org.enso.interpreter.node.expression.builtin.date.Date.class); - dateTime = builtins.get(org.enso.interpreter.node.expression.builtin.date.Date_Time.class); + dateTime = builtins.get(org.enso.interpreter.node.expression.builtin.date.DateTime.class); duration = builtins.get(org.enso.interpreter.node.expression.builtin.date.Duration.class); - timeOfDay = builtins.get(org.enso.interpreter.node.expression.builtin.date.Time_Of_Day.class); - timeZone = builtins.get(org.enso.interpreter.node.expression.builtin.date.Time_Zone.class); + timeOfDay = builtins.get(org.enso.interpreter.node.expression.builtin.date.TimeOfDay.class); + timeZone = builtins.get(org.enso.interpreter.node.expression.builtin.date.TimeZone.class); warning = builtins.get(Warning.class); noWrap = getBuiltinType(NoWrap.class); problemBehavior = getBuiltinType(ProblemBehavior.class); From 9092a0a6a76f301ec1aed8d69ad332d2ed43616e Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:14:06 +0100 Subject: [PATCH 27/34] BuiltinObject.GetType does not access annotation for builtin name --- .../runtime/builtin/BuiltinObject.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 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 c3391107285f..b52af11836a1 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 @@ -71,31 +71,34 @@ public final boolean hasMetaObject() { @ExportMessage(name = "getType", library = TypesLibrary.class) @ExportMessage(name = "getMetaObject", library = InteropLibrary.class) public static class GetType { + + /** + * Caching on class of the receiver - as long as there is the same class, its {@link + * #builtinName()} method will return the same value. Note that we don't want to cache on the + * builtin name, as that would create a separate polymorph cache for every instance of the + * receiver. + */ @Specialization( guards = {"cachedReceiverClass == receiver.getClass()", "getCtx(node) == cachedCtx"}, limit = "1") public static Type doItCached( BuiltinObject receiver, @Bind("$node") Node node, - @Cached("receiver.getClass()") Class cachedReceiverClass, + @Cached("receiver.getClass()") Class cachedReceiverClass, @Cached(value = "getCtx(node)", allowUncached = true) EnsoContext cachedCtx, - @Cached(value = "getBuiltinType(cachedReceiverClass, cachedCtx)", allowUncached = true) + @Cached(value = "getBuiltinType(receiver, cachedCtx)", allowUncached = true) Builtin cachedBuiltinType) { return cachedBuiltinType.getType(); } @Fallback public static Type uncached(BuiltinObject receiver) { - var receiverClass = receiver.getClass(); var ctx = getCtx(null); - return getBuiltinType(receiverClass, ctx).getType(); + return getBuiltinType(receiver, ctx).getType(); } - public static Builtin getBuiltinType(Class builtinClass, EnsoContext ctx) { - var anot = builtinClass.getAnnotation(org.enso.interpreter.dsl.Builtin.class); - assert anot != null : "Builtin annotation is missing on class" + builtinClass; - var builtinName = anot.name(); - return ctx.getBuiltins().getBuiltinType(builtinName); + public static Builtin getBuiltinType(BuiltinObject receiver, EnsoContext ctx) { + return ctx.getBuiltins().getBuiltinType(receiver.builtinName()); } @Idempotent From 99a62c3190b4d465fe33103ce6059cbfba4b431f Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:18:10 +0100 Subject: [PATCH 28/34] Reintroduce static singleton vectors in Vector --- .../org/enso/interpreter/runtime/data/vector/Vector.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index ab5e60cb5a91..d7e7030e39c1 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -19,6 +19,9 @@ @ExportLibrary(InteropLibrary.class) @Builtin(pkg = "immutable", stdlibName = "Standard.Base.Data.Vector.Vector") abstract class Vector extends BuiltinObject { + private static final Vector EMPTY_LONG = new Long(new long[0]); + private static final Vector EMPTY_DOUBLE = new Double(new double[0]); + private static final Vector EMPTY_VECTOR = new EnsoOnly(new Object[0]); protected Vector() {} @@ -93,7 +96,7 @@ static Vector fromInteropArray(Object arr) { static Vector fromLongArray(long[] arr) { if (arr == null || arr.length == 0) { - return new Long(new long[0]); + return EMPTY_LONG; } else { return new Long(arr); } @@ -101,7 +104,7 @@ static Vector fromLongArray(long[] arr) { static Vector fromDoubleArray(double[] arr) { if (arr == null || arr.length == 0) { - return new Double(new double[0]); + return EMPTY_DOUBLE; } else { return new Double(arr); } @@ -109,7 +112,7 @@ static Vector fromDoubleArray(double[] arr) { static Vector fromEnsoOnlyArray(Object[] arr) { if (arr == null || arr.length == 0) { - return new EnsoOnly(new Object[0]); + return EMPTY_VECTOR; } else { return new EnsoOnly(arr); } From 2854937fbcd5e74614cb29aa16a6d5f1b5d61506 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 18 Dec 2024 14:21:15 +0100 Subject: [PATCH 29/34] Remove unnecessary empty protected constructors --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 1 - .../java/org/enso/interpreter/runtime/data/vector/Vector.java | 2 -- 2 files changed, 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 b52af11836a1..cdb2cdfb2367 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 @@ -26,7 +26,6 @@ @ExportLibrary(InteropLibrary.class) @ExportLibrary(TypesLibrary.class) public abstract class BuiltinObject extends EnsoObject { - protected BuiltinObject() {} @ExportMessage public final boolean hasType() { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java index d7e7030e39c1..2fad7a282ae8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/vector/Vector.java @@ -23,8 +23,6 @@ abstract class Vector extends BuiltinObject { private static final Vector EMPTY_DOUBLE = new Double(new double[0]); private static final Vector EMPTY_VECTOR = new EnsoOnly(new Object[0]); - protected Vector() {} - @Override protected String builtinName() { return "Vector"; From 7a2ea7c0a5ecb45c3b6130ca82b39bd9054f8b97 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 23 Dec 2024 18:10:08 +0100 Subject: [PATCH 30/34] BuiltinObject is final and has package-protected constructor --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 cdb2cdfb2367..92214a2c22db 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 @@ -69,7 +69,9 @@ public final boolean hasMetaObject() { @ExportMessage(name = "getType", library = TypesLibrary.class) @ExportMessage(name = "getMetaObject", library = InteropLibrary.class) - public static class GetType { + public static final class GetType { + + GetType() {} /** * Caching on class of the receiver - as long as there is the same class, its {@link From 32bd04218411feba46055640b2248e0e2c59f9b1 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 23 Dec 2024 18:19:36 +0100 Subject: [PATCH 31/34] Do not call `EnsoContext.get(null)`. --- .../interpreter/runtime/builtin/BuiltinObject.java | 8 ++++---- .../interpreter/runtime/data/ManagedResource.java | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 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 92214a2c22db..964af16dbf99 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 @@ -40,8 +40,8 @@ public final boolean hasType() { */ protected abstract String builtinName(); - protected final Type getBuiltinType() { - return GetType.uncached(this); + protected final Type getBuiltinType(Node node) { + return GetType.uncached(this, node); } /** @@ -93,8 +93,8 @@ public static Type doItCached( } @Fallback - public static Type uncached(BuiltinObject receiver) { - var ctx = getCtx(null); + public static Type uncached(BuiltinObject receiver, @Bind("$node") Node node) { + var ctx = getCtx(node); return getBuiltinType(receiver, ctx).getType(); } 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 3649a0751570..f5d3d5cffd88 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,9 +1,12 @@ package org.enso.interpreter.runtime.data; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.interop.InteropLibrary; 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.PhantomReference; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; @@ -100,11 +103,16 @@ public void close(EnsoContext context) { @ExportMessage @TruffleBoundary - @Override - public String toDisplayString(boolean allowSideEffects) { - var type = getBuiltinType(); + public String toDisplayString(boolean allowSideEffects, @Bind("$node") Node node) { + var type = getBuiltinType(node); return type.getName() + " " + InteropLibrary.getUncached().toDisplayString(resource, allowSideEffects); } + + @ExportMessage.Ignore + @Override + public Object toDisplayString(boolean allowSideEffects) { + throw CompilerDirectives.shouldNotReachHere(); + } } From 36e39c2e2e3893bf36d69d9092f227b676fdede6 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Mon, 23 Dec 2024 18:20:19 +0100 Subject: [PATCH 32/34] Add TruffleBoundary. --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 2 ++ 1 file changed, 2 insertions(+) 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 964af16dbf99..cd42ef354f63 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 @@ -1,5 +1,6 @@ package org.enso.interpreter.runtime.builtin; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -98,6 +99,7 @@ public static Type uncached(BuiltinObject receiver, @Bind("$node") Node node) { return getBuiltinType(receiver, ctx).getType(); } + @TruffleBoundary public static Builtin getBuiltinType(BuiltinObject receiver, EnsoContext ctx) { return ctx.getBuiltins().getBuiltinType(receiver.builtinName()); } From 7969907da39bcb886220b8a3c102f1943c08cd52 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 24 Dec 2024 13:24:44 +0100 Subject: [PATCH 33/34] Replace Fallback with Specialization with replaces --- .../org/enso/interpreter/runtime/builtin/BuiltinObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cd42ef354f63..c6e5382b207e 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 @@ -93,7 +93,7 @@ public static Type doItCached( return cachedBuiltinType.getType(); } - @Fallback + @Specialization(replaces = "doItCached") public static Type uncached(BuiltinObject receiver, @Bind("$node") Node node) { var ctx = getCtx(node); return getBuiltinType(receiver, ctx).getType(); From b8111b0c21c86f8989176e361072e79c7c5b348f Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 24 Dec 2024 20:27:05 +0100 Subject: [PATCH 34/34] fmt --- .../java/org/enso/interpreter/runtime/builtin/BuiltinObject.java | 1 - 1 file changed, 1 deletion(-) 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 c6e5382b207e..3c3693d0660d 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 @@ -3,7 +3,6 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary;