From 29a092058b9941666b6e18430b40744191bb2e4c Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 10:31:16 +0200 Subject: [PATCH 01/57] Try to run the whole test/Base_Tests --- build/build/src/engine/context.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build/src/engine/context.rs b/build/build/src/engine/context.rs index eaa17546d2df..7c670c1df94b 100644 --- a/build/build/src/engine/context.rs +++ b/build/build/src/engine/context.rs @@ -651,7 +651,7 @@ pub async fn runner_sanity_test( ); if enso_java.is_none() { let test_base = Command::new(&repo_root.runner) - .args(["--run", repo_root.test.join("Base_Tests").as_str(), "^Text"]) + .args(["--run", repo_root.test.join("Base_Tests").as_str()]) .set_env_opt(ENSO_JAVA, enso_java)? .set_env(ENSO_DATA_DIRECTORY, engine_package)? .run_stdout() From 51bc3215e5b7e5c58fe717a4ff8d810db45b8ab0 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 10:31:32 +0200 Subject: [PATCH 02/57] Catch NI error --- .../callable/resolver/HostMethodCallNode.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/resolver/HostMethodCallNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/resolver/HostMethodCallNode.java index 4752d1126125..cab2c0456df0 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/resolver/HostMethodCallNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/resolver/HostMethodCallNode.java @@ -183,13 +183,17 @@ public static PolyglotCallType getPolyglotCallType( return PolyglotCallType.CONVERT_TO_HASH_MAP; } - String methodName = symbol.getName(); - if (library.isMemberInvocable(self, methodName)) { - return PolyglotCallType.CALL_METHOD; - } else if (library.isMemberReadable(self, methodName)) { - return PolyglotCallType.GET_MEMBER; - } else if (library.isInstantiable(self) && methodName.equals(NEW_NAME)) { - return PolyglotCallType.INSTANTIATE; + try { + String methodName = symbol.getName(); + if (library.isMemberInvocable(self, methodName)) { + return PolyglotCallType.CALL_METHOD; + } else if (library.isMemberReadable(self, methodName)) { + return PolyglotCallType.GET_MEMBER; + } else if (library.isInstantiable(self) && methodName.equals(NEW_NAME)) { + return PolyglotCallType.INSTANTIATE; + } + } catch (TypeNotPresentException ex) { + // no call, get or instantiate is possible } return PolyglotCallType.NOT_SUPPORTED; } From 2aa81cd0b92fd3561426aeb4d0ed8e6898211b03 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 12:42:31 +0200 Subject: [PATCH 03/57] Instance methods on Decoder and Encoder are being called --- distribution/lib/Standard/Base/0.0.0-dev/src/Data/Base_64.enso | 2 ++ 1 file changed, 2 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Base_64.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Base_64.enso index e97b04c71233..f0b09db02756 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Base_64.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Base_64.enso @@ -4,6 +4,8 @@ import project.Errors.Encoding_Error.Encoding_Error from project.Data.Text.Extensions import all polyglot java import java.util.Base64 +polyglot java import java.util.Base64.Decoder +polyglot java import java.util.Base64.Encoder ## A helper utility for handling base64 encoding. type Base_64 From 354808a04de03f43d822154b1d9efd65527f3d43 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 12:43:08 +0200 Subject: [PATCH 04/57] java.util.ArrayList is often used in tests - register it for reflection --- .../Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso index 581045287f98..d42bd29ea9e0 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso @@ -29,6 +29,9 @@ from project.Data.Index_Sub_Range import drop_helper, Index_Sub_Range, take_help from project.Data.Ordering import Comparable from project.Data.Range.Extensions import all +# often used in tests +polyglot java import java.util.ArrayList + new_array_proxy_builtin : Integer -> (Integer -> Any) -> Array new_array_proxy_builtin length at = @Builtin_Method "Array_Like_Helpers.new_array_proxy_builtin" @@ -78,7 +81,7 @@ slice vector start end = @Builtin_Method "Array_Like_Helpers.slice" `Map_Error`. - No_Wrap: The first error is thrown, and is not wrapped in `Map_Error`. - - Report_Warning: The result for that element is `Nothing`, + - Report_Warning: The result for that element is `Nothing`, the error is attached as a warning. Currently unimplemented. - Ignore: The result is `Nothing`, and the error is ignored. From 20f9589a35bb3d362493370c10ed9862791ccf07 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 13:08:31 +0200 Subject: [PATCH 05/57] Allow access to instance methods of these classes --- distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso | 3 +++ 1 file changed, 3 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso index afe7039d3dcb..51295e8a589e 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso @@ -29,13 +29,16 @@ polyglot java import java.io.StringReader polyglot java import java.lang.Exception as JException polyglot java import javax.xml.parsers.DocumentBuilder polyglot java import javax.xml.parsers.DocumentBuilderFactory +polyglot java import javax.xml.xpath.XPath polyglot java import javax.xml.xpath.XPathConstants polyglot java import javax.xml.xpath.XPathFactory polyglot java import org.enso.base.XML_Utils +polyglot java import org.w3c.dom.Attr polyglot java import org.w3c.dom.Document polyglot java import org.w3c.dom.Element polyglot java import org.w3c.dom.Node polyglot java import org.w3c.dom.NodeList +polyglot java import org.w3c.dom.NamedNodeMap polyglot java import org.w3c.dom.Text as Java_Text polyglot java import org.xml.sax.InputSource polyglot java import org.xml.sax.SAXException From d636711af8d212c17cfb5ea2d6974722383e868f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 15:45:26 +0200 Subject: [PATCH 06/57] Need reflective access to AdjustOp nested class --- distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date.enso index 217f0a24ad59..c09f93072bab 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date.enso @@ -34,6 +34,7 @@ polyglot java import java.time.DateTimeException polyglot java import java.time.temporal.ChronoField polyglot java import java.time.temporal.IsoFields polyglot java import org.enso.base.Time_Utils +polyglot java import org.enso.base.Time_Utils.AdjustOp ## PRIVATE Constructs a new Date from a year, month, and day. From c3a97c1479c6d5f31b2d061387f7e1270e0bfe67 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 15:48:26 +0200 Subject: [PATCH 07/57] Need to call instance methods on LinearModel --- .../lib/Standard/Base/0.0.0-dev/src/Data/Regression.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Regression.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Regression.enso index 2bff31d18a26..b844d2de3959 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Regression.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Regression.enso @@ -9,6 +9,7 @@ import project.Nothing.Nothing import project.Panic.Panic polyglot java import org.enso.base.statistics.FitError +polyglot java import org.enso.base.statistics.LinearModel polyglot java import org.enso.base.statistics.Regression type Model From d61e5d23d2d56882025a2de54a9f186331e91315 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 15:51:48 +0200 Subject: [PATCH 08/57] Need access to nested classes --- .../Standard/Base/0.0.0-dev/src/Enso_Cloud/Enso_Secret.enso | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Enso_Cloud/Enso_Secret.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Enso_Cloud/Enso_Secret.enso index ee838109d095..fd0f8133990b 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Enso_Cloud/Enso_Secret.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Enso_Cloud/Enso_Secret.enso @@ -24,6 +24,10 @@ from project.Metadata import make_single_choice polyglot java import org.enso.base.enso_cloud.EnsoSecretHelper polyglot java import org.enso.base.enso_cloud.HideableValue +polyglot java import org.enso.base.enso_cloud.HideableValue.PlainValue +polyglot java import org.enso.base.enso_cloud.HideableValue.SecretValue +polyglot java import org.enso.base.enso_cloud.HideableValue.ConcatValues +polyglot java import org.enso.base.enso_cloud.HideableValue.Base64EncodeValue ## A reference to a secret stored in the Enso Cloud. type Enso_Secret From dc383710b5b901808d53a8a5c0b23317b67f718e Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 16:14:14 +0200 Subject: [PATCH 09/57] Put all extra files to Extra_Imports.enso --- .../Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso | 3 --- .../Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso index d42bd29ea9e0..599a5e4a6663 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso @@ -29,9 +29,6 @@ from project.Data.Index_Sub_Range import drop_helper, Index_Sub_Range, take_help from project.Data.Ordering import Comparable from project.Data.Range.Extensions import all -# often used in tests -polyglot java import java.util.ArrayList - new_array_proxy_builtin : Integer -> (Integer -> Any) -> Array new_array_proxy_builtin length at = @Builtin_Method "Array_Like_Helpers.new_array_proxy_builtin" diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index 4981b39243ae..520da20b7638 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -14,3 +14,6 @@ polyglot java import org.enso.base.text.CaseFoldedString.Grapheme # needed by Comparator_Spec: polyglot java import org.enso.base.ObjectComparator + +# often used in tests +polyglot java import java.util.ArrayList From 4a7a5df04d1e8099bc6044328142716d0fd54c72 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 16:21:26 +0200 Subject: [PATCH 10/57] locate enso_parser library even in ./runner mode --- .../java/org/enso/syntax2/Parser.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java index 8e355c2dd375..2895a4fb0e74 100644 --- a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java +++ b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java @@ -24,26 +24,28 @@ private static void initializeLibraries() { name = "libenso_parser.so"; } - File parser = null; + var whereAmI = Parser.class.getProtectionDomain().getCodeSource().getLocation(); + File root; try { - var whereAmI = Parser.class.getProtectionDomain().getCodeSource().getLocation(); - var d = new File(whereAmI.toURI()).getParentFile(); + root = new File(whereAmI.toURI()).getParentFile(); + } catch (URISyntaxException ex) { + root = new File(".").getAbsoluteFile(); + } + try { + var d = root; File path = null; while (d != null) { path = new File(d, name); if (path.exists()) break; d = d.getParentFile(); } - if (d == null) { - throw new LinkageError( - "Cannot find parser in " + new File(whereAmI.toURI()).getParentFile()); + if (d == null || path == null) { + throw new LinkageError("Cannot find parser in " + root); } - parser = path; - System.load(parser.getAbsolutePath()); - } catch (IllegalArgumentException | URISyntaxException | LinkageError e) { - File root = new File(".").getAbsoluteFile(); + System.load(path.getAbsolutePath()); + } catch (NullPointerException | IllegalArgumentException | LinkageError e) { if (!searchFromDirToTop(e, root, "target", "rust", "debug", name)) { - throw new IllegalStateException("Cannot load parser from " + parser, e); + throw new IllegalStateException("Cannot load parser from " + whereAmI, e); } } } From 6efc514a2e42f15e0da52f6acd6bd949a3c4126f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 17:00:19 +0200 Subject: [PATCH 11/57] Need to access message method --- .../src/System/Internal/Reporting_Stream_Decoder_Helper.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Internal/Reporting_Stream_Decoder_Helper.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Internal/Reporting_Stream_Decoder_Helper.enso index 83ee49e76226..dc49ec2a3ab3 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Internal/Reporting_Stream_Decoder_Helper.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Internal/Reporting_Stream_Decoder_Helper.enso @@ -13,6 +13,7 @@ from project.Data.Boolean import Boolean, False, True from project.Runtime import assert polyglot java import org.enso.base.encoding.DecodingProblemAggregator +polyglot java import org.enso.base.encoding.DecodingProblem polyglot java import org.enso.base.encoding.Encoding_Utils polyglot java import org.enso.base.encoding.ReportingStreamDecoder From 3f0206001748f588d96a2b57dc69fdd395c16826 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 17:05:59 +0200 Subject: [PATCH 12/57] Execute ./runner --run --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 86ced2f1ac0a..8c6d1f8bede4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -33,7 +33,7 @@ "request": "launch", "name": "Launch Native Image", "nativeImagePath": "${workspaceFolder}/runner", - "args": "--help" + "args": "--run ${file}" } ] } \ No newline at end of file From 35ca49c591c6862cb6f20fe3143f34aa6006d8da Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 17:06:33 +0200 Subject: [PATCH 13/57] ./runner must embed all locales --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index e2d91e239508..9e96371b1f83 100644 --- a/build.sbt +++ b/build.sbt @@ -2610,6 +2610,7 @@ lazy val `engine-runner` = project additionalOptions = Seq( "-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog", "-H:IncludeResources=.*Main.enso$", + "-H:+IncludeAllLocales", // useful perf & debug switches: // "-g", // "-H:+SourceLevelDebug", From 501c07d376588564eba1a8e9dcbb9fbf3927194b Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 17 Jun 2024 17:07:08 +0200 Subject: [PATCH 14/57] Making sure more missing symbols is accesible --- .../lib/Standard/Base/0.0.0-dev/src/Data/Text/Extensions.enso | 2 +- .../Standard/Base/0.0.0-dev/src/Data/Time/Date_Period.enso | 3 +++ .../Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Extensions.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Extensions.enso index 3b1469053e4f..b691cd8e2b24 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Extensions.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Extensions.enso @@ -544,7 +544,7 @@ Text.replace self term:(Text | Regex) replacement:Text (case_sensitivity:Case_Se Applies the specified cleansings to the text. Arguments: - - remove: A vector of the named patterns to cleanse from the text. The named patterns are + - remove: A vector of the named patterns to cleanse from the text. The named patterns are applied in the order they are provided. The same named pattern can be used multiple times. The named patterns are: - ..Leading_Whitespace: Removes all whitespace from the start of the string. diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Period.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Period.enso index 27416f46dbab..99067fd360ca 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Period.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Period.enso @@ -11,7 +11,10 @@ polyglot java import java.time.temporal.TemporalAdjuster polyglot java import java.time.temporal.TemporalAdjusters polyglot java import java.time.temporal.TemporalUnit polyglot java import org.enso.base.time.CustomTemporalUnits +polyglot java import org.enso.base.time.Date_Utils polyglot java import org.enso.base.time.Date_Period_Utils +polyglot java import org.enso.base.time.Date_Time_Utils +polyglot java import org.enso.base.time.Time_Of_Day_Utils polyglot java import org.enso.base.Time_Utils ## Represents a unit of time longer on the scale of days (longer than a day). diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index 520da20b7638..386aed845fa7 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -17,3 +17,7 @@ polyglot java import org.enso.base.ObjectComparator # often used in tests polyglot java import java.util.ArrayList +polyglot java import java.util.Map +polyglot java import java.nio.file.Path +polyglot java import java.math.BigInteger +polyglot java import java.time.LocalDate From 377bd2a28d204dbd9ecadf8df6790990a06a2fbf Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 10:29:12 +0200 Subject: [PATCH 15/57] Replacing usage of asGuestObject in EnsoFile by own TruffleObject implementations --- .../Base/0.0.0-dev/src/System/File.enso | 4 +- .../src/System/File/File_Access.enso | 26 +- .../src/System/File/File_Permissions.enso | 5 +- .../interpreter/runtime/data/EnsoFile.java | 241 ++++++++++++++---- .../runtime/error/PanicException.java | 6 +- .../org/enso/interpreter/dsl/Builtin.java | 42 --- .../interpreter/dsl/BuiltinsProcessor.java | 4 - .../dsl/builtins/MethodGenerator.java | 3 +- .../builtins/MethodNodeClassGenerator.java | 3 +- .../NoSpecializationClassGenerator.java | 4 +- .../builtins/SpecializedMethodsGenerator.java | 4 +- 11 files changed, 227 insertions(+), 115 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso index 5310ad036fe0..ef6607ef2787 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso @@ -894,11 +894,11 @@ Writable_File.from (that : File) = if Data_Link.is_data_link that then Data_Link ## PRIVATE local_file_copy (source : File) (destination : File) (replace_existing : Boolean) -> Nothing = File_Error.handle_java_exceptions source <| - copy_options = if replace_existing then [StandardCopyOption.REPLACE_EXISTING] else [] + copy_options = if replace_existing then [StandardCopyOption.REPLACE_EXISTING.to_text] else [] source.copy_builtin destination copy_options ## PRIVATE local_file_move (source : File) (destination : File) (replace_existing : Boolean) -> Nothing = File_Error.handle_java_exceptions source <| - copy_options = if replace_existing then [StandardCopyOption.REPLACE_EXISTING] else [] + copy_options = if replace_existing then [StandardCopyOption.REPLACE_EXISTING.to_text] else [] source.move_builtin destination copy_options diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Access.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Access.enso index 3f5527c8de97..ed1d7c39a8df 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Access.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Access.enso @@ -49,18 +49,20 @@ type File_Access ## PRIVATE Convert this object into a representation understandable by the JVM. - to_java : StandardOpenOption - to_java self = case self of - File_Access.Append -> StandardOpenOption.APPEND - File_Access.Create -> StandardOpenOption.CREATE - File_Access.Create_New -> StandardOpenOption.CREATE_NEW - File_Access.Delete_On_Close -> StandardOpenOption.DELETE_ON_CLOSE - File_Access.Dsync -> StandardOpenOption.DSYNC - File_Access.Read -> StandardOpenOption.READ - File_Access.Sparse -> StandardOpenOption.SPARSE - File_Access.Sync -> StandardOpenOption.SYNC - File_Access.Truncate_Existing -> StandardOpenOption.TRUNCATE_EXISTING - File_Access.Write -> StandardOpenOption.WRITE + to_java : Text + to_java self = + java_option = case self of + File_Access.Append -> StandardOpenOption.APPEND + File_Access.Create -> StandardOpenOption.CREATE + File_Access.Create_New -> StandardOpenOption.CREATE_NEW + File_Access.Delete_On_Close -> StandardOpenOption.DELETE_ON_CLOSE + File_Access.Dsync -> StandardOpenOption.DSYNC + File_Access.Read -> StandardOpenOption.READ + File_Access.Sparse -> StandardOpenOption.SPARSE + File_Access.Sync -> StandardOpenOption.SYNC + File_Access.Truncate_Existing -> StandardOpenOption.TRUNCATE_EXISTING + File_Access.Write -> StandardOpenOption.WRITE + java_option.to_text ## PRIVATE ensure_only_allowed_options (operation_name : Text) (allowed_options : Vector) (got_options : Vector) ~action = diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Permissions.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Permissions.enso index 8c247f78daf2..791e4add9052 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Permissions.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File/File_Permissions.enso @@ -3,6 +3,8 @@ import project.Data.Text.Text import project.Data.Vector.Vector polyglot java import java.nio.file.attribute.PosixFilePermission +polyglot java import java.nio.file.attribute.PosixFilePermissions +polyglot java import java.util.Set type Permission ## Permission for read access for a given entity. @@ -101,7 +103,8 @@ type File_Permissions ## PRIVATE ADVANCED Converts a Java `Set` of Java `PosixFilePermission` to `File_Permissions`. - from_java_set java_set = + from_java_set permissions:Text = + java_set = PosixFilePermissions.fromString permissions vecs = Vector.build_multiple 3 builders-> owner = builders.at 0 group = builders.at 1 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 d80c8cb71aab..9cc5c4f6947c 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 @@ -4,8 +4,11 @@ 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; import com.oracle.truffle.api.interop.InvalidArrayIndexException; +import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; @@ -22,16 +25,22 @@ import java.nio.file.NoSuchFileException; import java.nio.file.NotDirectoryException; import java.nio.file.OpenOption; +import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; -import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; import java.time.ZoneOffset; import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Set; -import java.util.function.IntFunction; +import java.util.function.Function; import org.enso.interpreter.dsl.Builtin; import org.enso.interpreter.runtime.EnsoContext; 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.PanicException; import org.enso.interpreter.runtime.library.dispatch.TypesLibrary; @@ -54,53 +63,190 @@ public EnsoFile(TruffleFile truffleFile) { @Builtin.Method(name = "output_stream_builtin") @Builtin.WrapException(from = IOException.class) - @Builtin.ReturningGuestObject @Builtin.Specialize @CompilerDirectives.TruffleBoundary - public OutputStream outputStream(Object opts, EnsoContext ctx) throws IOException { - OpenOption[] openOptions = - convertInteropArray(opts, InteropLibrary.getUncached(), ctx, OpenOption[]::new); - return this.truffleFile.newOutputStream(openOptions); + public EnsoObject outputStream( + Object opts, + @Cached ArrayLikeLengthNode lengthNode, + @Cached ArrayLikeAtNode atNode, + EnsoContext ctx) + throws IOException { + var options = namesToValues(opts, lengthNode, atNode, ctx, StandardOpenOption::valueOf); + var os = this.truffleFile.newOutputStream(options.toArray(OpenOption[]::new)); + return new EnsoOutputStream(os); + } + + @ExportLibrary(InteropLibrary.class) + static final class EnsoOutputStream implements EnsoObject { + private static final String[] MEMBERS = new String[] {"write", "flush", "close"}; + private final OutputStream os; + + EnsoOutputStream(OutputStream os) { + this.os = os; + } + + @ExportMessage + boolean hasMembers() { + return true; + } + + @TruffleBoundary + @ExportMessage + boolean isMemberInvocable(String member) { + return Arrays.asList(MEMBERS).contains(member); + } + + @ExportMessage + Object getMembers(boolean includeInternal) throws UnsupportedMessageException { + return ArrayLikeHelpers.wrapStrings(MEMBERS); + } + + @ExportMessage + Object invokeMember( + String name, + Object[] args, + @Cached ArrayLikeLengthNode lengthNode, + @Cached ArrayLikeAtNode atNode, + @CachedLibrary(limit = "3") InteropLibrary iop) + throws ArityException, UnsupportedMessageException, UnknownIdentifierException { + try { + return switch (name) { + case "write" -> { + long from; + long to; + switch (args.length) { + case 1 -> { + from = 0; + to = lengthNode.executeLength(args[0]); + } + case 3 -> { + from = iop.asLong(args[1]); + to = from + iop.asLong(args[2]); + } + default -> { + throw ArityException.create(1, 1, args.length); + } + } + for (long i = from; i < to; i++) { + var elem = atNode.executeAt(args[0], i); + var byt = iop.asInt(elem); + os.write(byt); + } + yield this; + } + case "flush" -> { + os.flush(); + yield this; + } + case "close" -> { + os.close(); + yield this; + } + default -> throw UnknownIdentifierException.create(name); + }; + } catch (InvalidArrayIndexException | IOException ex) { + var ctx = EnsoContext.get(iop); + throw ctx.raiseAssertionPanic(iop, name, ex); + } + } } @Builtin.Method(name = "input_stream_builtin") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize - @Builtin.ReturningGuestObject @CompilerDirectives.TruffleBoundary - public InputStream inputStream(Object opts, EnsoContext ctx) throws IOException { - OpenOption[] openOptions = - convertInteropArray(opts, InteropLibrary.getUncached(), ctx, OpenOption[]::new); - return this.truffleFile.newInputStream(openOptions); + public EnsoObject inputStream( + Object opts, + @Cached ArrayLikeLengthNode lengthNode, + @Cached ArrayLikeAtNode atNode, + EnsoContext ctx) + throws IOException { + var options = namesToValues(opts, lengthNode, atNode, ctx, StandardOpenOption::valueOf); + var is = this.truffleFile.newInputStream(options.toArray(OpenOption[]::new)); + return new EnsoInputStream(is); + } + + @ExportLibrary(InteropLibrary.class) + static final class EnsoInputStream implements EnsoObject { + private static final String[] MEMBERS = + new String[] {"read", "readAllBytes", "readNBytes", "close"}; + private final InputStream is; + + EnsoInputStream(InputStream is) { + this.is = is; + } + + @ExportMessage + boolean hasMembers() { + return true; + } + + @TruffleBoundary + @ExportMessage + boolean isMemberInvocable(String member) { + return Arrays.asList(MEMBERS).contains(member); + } + + @ExportMessage + Object getMembers(boolean includeInternal) throws UnsupportedMessageException { + return ArrayLikeHelpers.wrapStrings(MEMBERS); + } + + @ExportMessage + Object invokeMember(String name, Object[] args, @CachedLibrary(limit = "3") InteropLibrary iop) + throws UnknownIdentifierException, UnsupportedMessageException { + try { + return switch (name) { + case "read" -> is.read(); + case "readAllBytes" -> { + var arr = is.readAllBytes(); + var buf = ByteBuffer.wrap(arr); + yield ArrayLikeHelpers.wrapBuffer(buf); + } + case "readNBytes" -> { + var len = iop.asInt(args[0]); + var arr = is.readNBytes(len); + var buf = ByteBuffer.wrap(arr); + yield ArrayLikeHelpers.wrapBuffer(buf); + } + case "close" -> { + is.close(); + yield this; + } + default -> throw UnknownIdentifierException.create(name); + }; + } catch (IOException ex) { + var ctx = EnsoContext.get(iop); + throw ctx.raiseAssertionPanic(iop, name, ex); + } + } } @SuppressWarnings("unchecked") - private static T[] convertInteropArray( - Object arr, InteropLibrary interop, EnsoContext ctx, IntFunction hostArrayCtor) { - if (!interop.hasArrayElements(arr)) { - var vecType = ctx.getBuiltins().vector().getType(); - var typeError = ctx.getBuiltins().error().makeTypeError(vecType, arr, "opts"); - throw new PanicException(typeError, interop); - } - T[] hostArr; + @TruffleBoundary + private static List namesToValues( + Object arr, + ArrayLikeLengthNode lengthNode, + ArrayLikeAtNode atNode, + EnsoContext ctx, + Function convertor) { + var size = (int) lengthNode.executeLength(arr); + List hostArr = new ArrayList<>(); try { - int size = Math.toIntExact(interop.getArraySize(arr)); - hostArr = hostArrayCtor.apply(size); - for (int i = 0; i < size; i++) { - Object elem = interop.readArrayElement(arr, i); - if (!ctx.isJavaPolyglotObject(elem)) { + for (var i = 0; i < size; i++) { + var elem = atNode.executeAt(arr, i); + if (elem instanceof Text name) { + hostArr.add(convertor.apply(name.toString())); + } else { var err = ctx.getBuiltins() .error() - .makeUnsupportedArgumentsError( - new Object[] {arr}, - "Arguments to opts should be host objects from java.io package"); - throw new PanicException(err, interop); + .makeTypeError(ctx.getBuiltins().text(), elem, "File_Access permissions"); + throw new PanicException(err, lengthNode); } - hostArr[i] = (T) ctx.asJavaPolyglotObject(elem); } - } catch (ClassCastException | UnsupportedMessageException | InvalidArrayIndexException e) { - throw EnsoContext.get(interop).raiseAssertionPanic(interop, null, e); + } catch (ClassCastException | InvalidArrayIndexException e) { + throw EnsoContext.get(lengthNode).raiseAssertionPanic(lengthNode, null, e); } return hostArr; } @@ -152,10 +298,9 @@ public EnsoDateTime getLastModifiedTime() throws IOException { @Builtin.Method(name = "posix_permissions_builtin") @Builtin.WrapException(from = IOException.class) - @Builtin.ReturningGuestObject @CompilerDirectives.TruffleBoundary - public Set getPosixPermissions() throws IOException { - return truffleFile.getPosixPermissions(); + public Text getPosixPermissions() throws IOException { + return Text.create(PosixFilePermissions.toString(truffleFile.getPosixPermissions())); } @Builtin.Method(name = "parent") @@ -369,20 +514,30 @@ private void deleteRecursively(TruffleFile file) throws IOException { @Builtin.WrapException(from = IOException.class) @Builtin.Specialize @CompilerDirectives.TruffleBoundary - public void copy(EnsoFile target, Object options, EnsoContext ctx) throws IOException { - CopyOption[] copyOptions = - convertInteropArray(options, InteropLibrary.getUncached(), ctx, CopyOption[]::new); - truffleFile.copy(target.truffleFile, copyOptions); + public void copy( + EnsoFile target, + Object options, + @Cached ArrayLikeLengthNode lengthNode, + @Cached ArrayLikeAtNode atNode, + EnsoContext ctx) + throws IOException { + var copyOptions = namesToValues(options, lengthNode, atNode, ctx, StandardCopyOption::valueOf); + truffleFile.copy(target.truffleFile, copyOptions.toArray(CopyOption[]::new)); } @Builtin.Method(name = "move_builtin", description = "Move this file to a target destination") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize @CompilerDirectives.TruffleBoundary - public void move(EnsoFile target, Object options, EnsoContext ctx) throws IOException { - CopyOption[] copyOptions = - convertInteropArray(options, InteropLibrary.getUncached(), ctx, CopyOption[]::new); - truffleFile.move(target.truffleFile, copyOptions); + public void move( + EnsoFile target, + Object options, + @Cached ArrayLikeLengthNode lengthNode, + @Cached ArrayLikeAtNode atNode, + EnsoContext ctx) + throws IOException { + var copyOptions = namesToValues(options, lengthNode, atNode, ctx, StandardCopyOption::valueOf); + truffleFile.move(target.truffleFile, copyOptions.toArray(CopyOption[]::new)); } @Builtin.Method diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java index 9fc608c994a3..2493789d0066 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java @@ -111,8 +111,12 @@ boolean hasExceptionMessage() { } @NeverDefault - static UnresolvedSymbol toDisplayText(IndirectInvokeMethodNode payloads) { + static UnresolvedSymbol toDisplayText(IndirectInvokeMethodNode payloads) + throws UnsupportedMessageException { var ctx = EnsoContext.get(payloads); + if (ctx == null) { + throw UnsupportedMessageException.create(); + } var scope = ctx.getBuiltins().panic().getDefinitionScope(); return UnresolvedSymbol.build("to_display_text", scope); } 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 789f34aab785..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 @@ -289,48 +289,6 @@ WrapException[] value() default {}; } - /** - * Annotation approving implicit {@link - * com.oracle.truffle.api.TruffleLanguage#asGuestValue(Object)} translation done on the return - * object. The conversion is generated automatically, depending on the type of the value. - * - *

Note that while explicit translations to interop value are discouraged, we still want to - * occasionally support it to easy builtins-writing process. The presence of the {@link - * ReturningGuestObject} only ensures that it is intentional. - * - *

Consider a method returning an {@link java.io.OutputStream} which is not an interop value, - * for the sake of the example: - * - *

-   * class Foo {
-   *     {@link Builtin.Method @Builtin.Method}
-   *     {@link Builtin.ReturningGuestObject @Builtin.ReturningGuestObject}
-   *     java.lang.OutputStream foo(Object item) {
-   *         return // ...
-   *     }
-   * }
-   * 
- * - * The processor will detect the return type of method {@code foo} and perform an automatic - * conversion: - * - *
-   * {@link BuiltinMethod @BuiltinMethod}(type = "Foo", name = "create")
-   * public class CreateFooNode extends Node {
-   *   java.lang.Object execute(Foo self, Object item) {
-   *     return context
-   *           .asGuestValue(self.foo(item));
-   *   }
-   * }
-   * 
- * - * Without converting the object to the guest language value, it would crash during runtime. - * Without the presence of the annotation, the processor would detect the potential value - * requiring {@link com.oracle.truffle.api.TruffleLanguage#asGuestValue(Object)} translation but - * stop and report the error since it didn't seem to be intended by the user. - */ - @interface ReturningGuestObject {} - /** * A Method marked with {@link Builtin.Specialize} annotation will generate specializations for * overloaded and non-overloaded methods. The annotation requires presence of {@link 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 5ae0b2c458f5..17806a3d297d 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 @@ -180,10 +180,6 @@ public void handleMethodElement(Element element, RoundEnvironment roundEnv) thro OK: if (!TypeWithKind.isValidGuestType(processingEnv, method.getReturnType())) { - if (method.getAnnotation(Builtin.ReturningGuestObject.class) != null) { - // guest objects can be of any type - break OK; - } if (method.getAnnotation(SuppressWarnings.class) instanceof SuppressWarnings sw && Arrays.asList(sw.value()).contains("generic-enso-builtin-type")) { // assume the case was review diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodGenerator.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodGenerator.java index d844ea95f658..c6ef343d058d 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodGenerator.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodGenerator.java @@ -105,8 +105,7 @@ protected String targetReturnType(TypeWithKind tpe) { Kind.ERROR, "Automatic conversion of value of type " + tpe.baseType() - + " to guest value requires explicit '@Builtin.ReturningGuestObject'" - + " annotation"); + + " is no longer supported."); } return "Object"; } diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodNodeClassGenerator.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodNodeClassGenerator.java index ea8e2b3f31f2..4ac4505934f3 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodNodeClassGenerator.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/MethodNodeClassGenerator.java @@ -8,7 +8,6 @@ import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.tools.JavaFileObject; -import org.enso.interpreter.dsl.Builtin; public abstract class MethodNodeClassGenerator { ClassName builtinNode; @@ -29,7 +28,7 @@ public MethodNodeClassGenerator( * @return true if the annotation exists, false otherwise */ protected boolean needsGuestValueConversion(Element origin) { - return origin.getAnnotation(Builtin.ReturningGuestObject.class) != null; + return false; } public void generate( diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/NoSpecializationClassGenerator.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/NoSpecializationClassGenerator.java index 973b0761a414..64f80208ce96 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/NoSpecializationClassGenerator.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/NoSpecializationClassGenerator.java @@ -41,9 +41,7 @@ protected MethodGenerator methodsGen() { processingEnvironment .getMessager() .printMessage( - Kind.ERROR, - "Value is already TruffleObject, don't use @Builtin.ReturningGuestObject", - origin); + Kind.ERROR, "Value is already TruffleObject, don't need any conversions", origin); } return new ExecuteMethodImplGenerator( processingEnvironment, origin, asGuestValue, varArgExpansion); diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/SpecializedMethodsGenerator.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/SpecializedMethodsGenerator.java index f84e4e4ae2aa..fef6ddeb4803 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/SpecializedMethodsGenerator.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/builtins/SpecializedMethodsGenerator.java @@ -38,14 +38,12 @@ private SpecializedMethodsGenerator( elements, first.getModifiers().contains(Modifier.STATIC), first.getKind() == ElementKind.CONSTRUCTOR, - first.getAnnotation(Builtin.ReturningGuestObject.class) != null, + false, TypeWithKind.createFromTpe(first.getReturnType().toString())); // Make sure all methods were defined the same way, except for paramters' types assert (allEqual(elements.stream().map(e -> e.getModifiers().contains(Modifier.STATIC)))); assert (allEqual(elements.stream().map(e -> e.getKind() == ElementKind.CONSTRUCTOR))); - assert (allEqual( - elements.stream().map(e -> e.getAnnotation(Builtin.ReturningGuestObject.class) != null))); assert (allEqual( elements.stream().map(e -> TypeWithKind.createFromTpe(e.getReturnType().toString())))); } From 466f222b7fee5f4ddd57a10ca2787d1a0359eba9 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 12:08:52 +0200 Subject: [PATCH 16/57] Support reading into a byte[] --- .../interpreter/runtime/data/EnsoFile.java | 91 ++++++++++++++++++- 1 file changed, 86 insertions(+), 5 deletions(-) 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 9cc5c4f6947c..00eaf9fa2ea9 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/EnsoFile.java @@ -10,6 +10,7 @@ import com.oracle.truffle.api.interop.InvalidArrayIndexException; import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -124,7 +125,7 @@ Object invokeMember( to = from + iop.asLong(args[2]); } default -> { - throw ArityException.create(1, 1, args.length); + throw ArityException.create(1, 3, args.length); } } for (long i = from; i < to; i++) { @@ -144,11 +145,18 @@ Object invokeMember( } default -> throw UnknownIdentifierException.create(name); }; - } catch (InvalidArrayIndexException | IOException ex) { + } catch (IOException ex) { + throw raiseIOException(iop, ex); + } catch (InvalidArrayIndexException ex) { var ctx = EnsoContext.get(iop); throw ctx.raiseAssertionPanic(iop, name, ex); } } + + @Override + public String toString() { + return "EnsoOutputStream"; + } } @Builtin.Method(name = "input_stream_builtin") @@ -169,7 +177,9 @@ public EnsoObject inputStream( @ExportLibrary(InteropLibrary.class) static final class EnsoInputStream implements EnsoObject { private static final String[] MEMBERS = - new String[] {"read", "readAllBytes", "readNBytes", "close"}; + new String[] { + "read", "readAllBytes", "readNBytes", "skipNBytes", "markSupported", "available", "close" + }; private final InputStream is; EnsoInputStream(InputStream is) { @@ -192,34 +202,99 @@ Object getMembers(boolean includeInternal) throws UnsupportedMessageException { return ArrayLikeHelpers.wrapStrings(MEMBERS); } + @TruffleBoundary @ExportMessage Object invokeMember(String name, Object[] args, @CachedLibrary(limit = "3") InteropLibrary iop) - throws UnknownIdentifierException, UnsupportedMessageException { + throws UnknownIdentifierException, + UnsupportedMessageException, + ArityException, + UnsupportedTypeException { try { return switch (name) { - case "read" -> is.read(); + case "read" -> { + if (args.length == 0) { + yield is.read(); + } + long from; + long to; + switch (args.length) { + case 1 -> { + from = 0; + to = iop.getArraySize(args[0]); + } + case 3 -> { + from = iop.asLong(args[1]); + to = from + iop.asLong(args[2]); + } + default -> throw ArityException.create(0, 3, args.length); + } + for (var i = from; i < to; i++) { + var b = is.read(); + if (b == -1) { + yield i - from; + } + iop.writeArrayElement(args[0], i, (byte) b); + } + yield to - from; + } case "readAllBytes" -> { + if (args.length != 0) { + throw ArityException.create(0, 0, args.length); + } var arr = is.readAllBytes(); var buf = ByteBuffer.wrap(arr); yield ArrayLikeHelpers.wrapBuffer(buf); } case "readNBytes" -> { + if (args.length != 1) { + throw ArityException.create(1, 1, args.length); + } var len = iop.asInt(args[0]); var arr = is.readNBytes(len); var buf = ByteBuffer.wrap(arr); yield ArrayLikeHelpers.wrapBuffer(buf); } + case "skipNBytes" -> { + if (args.length != 1) { + throw ArityException.create(1, 1, args.length); + } + var len = iop.asInt(args[0]); + is.skipNBytes(len); + yield this; + } + case "markSupported" -> { + if (args.length != 0) { + throw ArityException.create(0, 0, args.length); + } + yield is.markSupported(); + } + case "available" -> { + if (args.length != 0) { + throw ArityException.create(0, 0, args.length); + } + yield is.available(); + } case "close" -> { + if (args.length != 0) { + throw ArityException.create(0, 0, args.length); + } is.close(); yield this; } default -> throw UnknownIdentifierException.create(name); }; } catch (IOException ex) { + throw raiseIOException(iop, ex); + } catch (InvalidArrayIndexException ex) { var ctx = EnsoContext.get(iop); throw ctx.raiseAssertionPanic(iop, name, ex); } } + + @Override + public String toString() { + return "EnsoInputStream"; + } } @SuppressWarnings("unchecked") @@ -604,4 +679,10 @@ boolean hasType() { 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); + throw new PanicException(guestEx, where); + } } From a9cda6fb0514bd0155e7df0b528d1a6562aba0a5 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 14:15:39 +0200 Subject: [PATCH 17/57] I/O needs to be hidden behind @TruffleBoundary --- .../interpreter/runtime/data/EnsoFile.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) 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 00eaf9fa2ea9..d260e0fa21c3 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 @@ -65,7 +65,7 @@ public EnsoFile(TruffleFile truffleFile) { @Builtin.Method(name = "output_stream_builtin") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoObject outputStream( Object opts, @Cached ArrayLikeLengthNode lengthNode, @@ -102,6 +102,7 @@ Object getMembers(boolean includeInternal) throws UnsupportedMessageException { return ArrayLikeHelpers.wrapStrings(MEMBERS); } + @TruffleBoundary @ExportMessage Object invokeMember( String name, @@ -162,7 +163,7 @@ public String toString() { @Builtin.Method(name = "input_stream_builtin") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoObject inputStream( Object opts, @Cached ArrayLikeLengthNode lengthNode, @@ -328,7 +329,7 @@ private static List namesToValues( @Builtin.Method(name = "read_last_bytes_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoObject readLastBytes(long n) throws IOException { try (SeekableByteChannel channel = this.truffleFile.newByteChannel(Set.of(StandardOpenOption.READ))) { @@ -357,7 +358,7 @@ public boolean exists() { @Builtin.Method(name = "creation_time_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoDateTime getCreationTime() throws IOException { return new EnsoDateTime( ZonedDateTime.ofInstant(truffleFile.getCreationTime().toInstant(), ZoneOffset.UTC)); @@ -365,7 +366,7 @@ public EnsoDateTime getCreationTime() throws IOException { @Builtin.Method(name = "last_modified_time_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoDateTime getLastModifiedTime() throws IOException { return new EnsoDateTime( ZonedDateTime.ofInstant(truffleFile.getLastModifiedTime().toInstant(), ZoneOffset.UTC)); @@ -373,13 +374,13 @@ public EnsoDateTime getLastModifiedTime() throws IOException { @Builtin.Method(name = "posix_permissions_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public Text getPosixPermissions() throws IOException { return Text.create(PosixFilePermissions.toString(truffleFile.getPosixPermissions())); } @Builtin.Method(name = "parent") - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoObject getParent() { // Normalization is needed to correctly handle paths containing `..` and `.`. var parentOrNull = this.normalize().truffleFile.getParent(); @@ -399,32 +400,32 @@ public EnsoObject getParent() { } @Builtin.Method(name = "absolute") - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoFile getAbsoluteFile() { return new EnsoFile(this.truffleFile.getAbsoluteFile()); } @Builtin.Method(name = "path") - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public Text getPath() { return Text.create(this.truffleFile.getPath()); } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public boolean isAbsolute() { return this.truffleFile.isAbsolute(); } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public boolean isDirectory() { return this.truffleFile.isDirectory(); } @Builtin.Method(name = "create_directory_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public void createDirectories() throws IOException { try { this.truffleFile.createDirectories(); @@ -502,32 +503,32 @@ private static FileSystemException replaceCreateDirectoriesGenericException( @Builtin.Method(name = "list_immediate_children_array") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoObject list() throws IOException { return ArrayLikeHelpers.wrapEnsoObjects( this.truffleFile.list().stream().map(EnsoFile::new).toArray(EnsoFile[]::new)); } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoFile relativize(EnsoFile other) { return new EnsoFile(this.truffleFile.relativize(other.truffleFile)); } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public boolean isRegularFile() { return this.truffleFile.isRegularFile(); } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public boolean isWritable() { return this.truffleFile.isWritable(); } @Builtin.Method(name = "name") - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public Text getName() { var name = this.normalize().truffleFile.getName(); return Text.create(name == null ? "/" : name); @@ -535,7 +536,7 @@ public Text getName() { @Builtin.Method(name = "size_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public long getSize() throws IOException { if (this.truffleFile.isDirectory()) { throw new IOException("size can only be called on files."); @@ -554,7 +555,7 @@ public boolean equals(Object obj) { } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public EnsoFile normalize() { TruffleFile simplyNormalized = truffleFile.normalize(); String name = simplyNormalized.getName(); @@ -567,7 +568,7 @@ public EnsoFile normalize() { @Builtin.Method(name = "delete_builtin") @Builtin.WrapException(from = IOException.class) - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public void delete(boolean recursive) throws IOException { if (recursive && truffleFile.isDirectory(LinkOption.NOFOLLOW_LINKS)) { deleteRecursively(truffleFile); @@ -588,7 +589,7 @@ private void deleteRecursively(TruffleFile file) throws IOException { @Builtin.Method(name = "copy_builtin", description = "Copy this file to a target destination") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public void copy( EnsoFile target, Object options, @@ -603,7 +604,7 @@ public void copy( @Builtin.Method(name = "move_builtin", description = "Move this file to a target destination") @Builtin.WrapException(from = IOException.class) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public void move( EnsoFile target, Object options, @@ -616,7 +617,7 @@ public void move( } @Builtin.Method - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public boolean startsWith(EnsoFile parent) { return truffleFile.startsWith(parent.truffleFile); } @@ -627,7 +628,7 @@ public boolean startsWith(EnsoFile parent) { "Takes the text representation of a path and returns a TruffleFile corresponding to it.", autoRegister = false) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public static EnsoFile fromString(EnsoContext context, String path) { TruffleFile file = context.getPublicTruffleFile(path); return new EnsoFile(file); @@ -638,7 +639,7 @@ public static EnsoFile fromString(EnsoContext context, String path) { description = "A file corresponding to the current working directory.", autoRegister = false) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public static EnsoFile currentDirectory(EnsoContext context) { TruffleFile file = context.getCurrentWorkingDirectory(); return new EnsoFile(file); @@ -649,13 +650,13 @@ public static EnsoFile currentDirectory(EnsoContext context) { description = "Gets the user's system-defined home directory.", autoRegister = false) @Builtin.Specialize - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public static EnsoFile userHome(EnsoContext context) { return fromString(context, System.getProperty("user.home")); } @Override - @CompilerDirectives.TruffleBoundary + @TruffleBoundary public String toString() { return "(File " + truffleFile.getPath() + ")"; } From 0d902b21089c4b1fd5fd23f13221ab35cddf06ba Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 14:17:44 +0200 Subject: [PATCH 18/57] Cannot be loaded from "root" --- lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java index 2895a4fb0e74..0447a154d73b 100644 --- a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java +++ b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java @@ -45,7 +45,7 @@ private static void initializeLibraries() { System.load(path.getAbsolutePath()); } catch (NullPointerException | IllegalArgumentException | LinkageError e) { if (!searchFromDirToTop(e, root, "target", "rust", "debug", name)) { - throw new IllegalStateException("Cannot load parser from " + whereAmI, e); + throw new IllegalStateException("Cannot load parser from " + root, e); } } } From 31e3798661bff57a41a8f3b4a94504c2bd12afad Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 16:15:00 +0200 Subject: [PATCH 19/57] XML.from_file requires -1 at the end of the file --- .../main/java/org/enso/interpreter/runtime/data/EnsoFile.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 d260e0fa21c3..5d2de7614117 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 @@ -232,7 +232,8 @@ Object invokeMember(String name, Object[] args, @CachedLibrary(limit = "3") Inte for (var i = from; i < to; i++) { var b = is.read(); if (b == -1) { - yield i - from; + var count = i - from; + yield count > 0 ? count : -1; } iop.writeArrayElement(args[0], i, (byte) b); } From cae2521faa6f13c1911427eb05b513219fb94674 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 18 Jun 2024 17:17:04 +0200 Subject: [PATCH 20/57] Include jdk.localedata to make I18N available --- build.sbt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 9e96371b1f83..0c620e2b59a6 100644 --- a/build.sbt +++ b/build.sbt @@ -2549,8 +2549,10 @@ lazy val `engine-runner` = project if (smallJdkDirectory.exists()) { IO.delete(smallJdkDirectory) } - val JS_MODULES = - "org.graalvm.nativeimage,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.base,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.objectfile,org.graalvm.nativeimage.pointsto,com.oracle.graal.graal_enterprise,com.oracle.svm.svm_enterprise,jdk.compiler.graal,jdk.httpserver,java.naming,java.net.http" + val NI_MODULES = + "org.graalvm.nativeimage,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.base,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.objectfile,org.graalvm.nativeimage.pointsto,com.oracle.graal.graal_enterprise,com.oracle.svm.svm_enterprise" + val JDK_MODULES = + "jdk.localedata,jdk.compiler.graal,jdk.httpserver,java.naming,java.net.http" val DEBUG_MODULES = "jdk.jdwp.agent" val PYTHON_MODULES = "jdk.security.auth,java.naming" @@ -2578,7 +2580,7 @@ lazy val `engine-runner` = project } val exec = - s"$jlink --module-path ${modules.mkString(":")} --output $smallJdkDirectory --add-modules $JS_MODULES,$DEBUG_MODULES,$PYTHON_MODULES" + s"$jlink --module-path ${modules.mkString(":")} --output $smallJdkDirectory --add-modules $NI_MODULES,$JDK_MODULES,$DEBUG_MODULES,$PYTHON_MODULES" val exitCode = scala.sys.process.Process(exec).! if (exitCode != 0) { From 30ce7c33db372f0d42a6dce5a8911f12f6232a55 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Wed, 19 Jun 2024 10:00:11 +0200 Subject: [PATCH 21/57] Less polyglot java imports in XML.enso --- .../Standard/Base/0.0.0-dev/src/Data/XML.enso | 22 +++------------ .../main/java/org/enso/base/XML_Utils.java | 27 ++++++++++++++++++- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso index 51295e8a589e..3f4ab46f7e19 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso @@ -25,10 +25,7 @@ from project.Data.Range.Extensions import all from project.Data.Text.Extensions import all from project.Metadata import Display, make_single_choice, Widget -polyglot java import java.io.StringReader polyglot java import java.lang.Exception as JException -polyglot java import javax.xml.parsers.DocumentBuilder -polyglot java import javax.xml.parsers.DocumentBuilderFactory polyglot java import javax.xml.xpath.XPath polyglot java import javax.xml.xpath.XPathConstants polyglot java import javax.xml.xpath.XPathFactory @@ -40,7 +37,6 @@ polyglot java import org.w3c.dom.Node polyglot java import org.w3c.dom.NodeList polyglot java import org.w3c.dom.NamedNodeMap polyglot java import org.w3c.dom.Text as Java_Text -polyglot java import org.xml.sax.InputSource polyglot java import org.xml.sax.SAXException polyglot java import org.xml.sax.SAXParseException @@ -78,7 +74,8 @@ type XML_Document from_stream : Input_Stream -> XML_Document ! XML_Error from_stream input_stream:Input_Stream = XML_Error.handle_java_exceptions <| - input_stream.with_java_stream java_stream-> XML_Document.from_source java_stream + input_stream.with_java_stream java_stream-> + XML_Document.Value (XML_Utils.parseStream java_stream) ## GROUP Conversions ICON convert @@ -96,20 +93,9 @@ type XML_Document from_text : Text -> XML_Document ! XML_Error from_text xml_string:Text = XML_Error.handle_java_exceptions <| - string_reader = StringReader.new xml_string - XML_Document.from_source (InputSource.new string_reader) + XML_Document.Value (XML_Utils.parseString xml_string) - ## PRIVATE - Read XML from an input source. - from_source : Any -> XML_Document ! XML_Error - from_source input_source = - document_builder_factory = DocumentBuilderFactory.newInstance - document_builder = document_builder_factory.newDocumentBuilder - XML_Utils.setCustomErrorHandler document_builder - XML_Document.Value (document_builder.parse input_source) - - ## PRIVATE - Value (java_document:Document) + private Value (java_document:Document) ## GROUP Metadata diff --git a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java index 8e4ba23adba2..392f4565eac3 100644 --- a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java @@ -1,8 +1,14 @@ package org.enso.base; import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.DOMConfiguration; +import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.bootstrap.DOMImplementationRegistry; @@ -10,6 +16,7 @@ import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @@ -62,7 +69,25 @@ public static String innerXML(Node element) return out.toString(); } - public static void setCustomErrorHandler(DocumentBuilder documentBuilder) { + public static Document parseStream(InputStream is) + throws ParserConfigurationException, SAXException, IOException { + return doParse(new InputSource(is)); + } + + public static Document parseString(String text) + throws ParserConfigurationException, SAXException, IOException { + return doParse(new InputSource(new StringReader(text))); + } + + private static Document doParse(InputSource is) + throws ParserConfigurationException, SAXException, IOException { + var factory = DocumentBuilderFactory.newInstance(); + var builder = factory.newDocumentBuilder(); + configureErrorHandler(builder); + return builder.parse(is); + } + + private static void configureErrorHandler(DocumentBuilder documentBuilder) { documentBuilder.setErrorHandler( new ErrorHandler() { @Override From 0695d1b5be4fa458e6e42c519dad641d2c04cd0f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Wed, 19 Jun 2024 11:23:50 +0200 Subject: [PATCH 22/57] InputStreamLike interface to 'view' EnsoFile's 'java' stream as having read(byte[], int, int) method --- .../Standard/Base/0.0.0-dev/src/Data/XML.enso | 1 + .../org/enso/runner/EnsoLibraryFeature.java | 4 +++ .../main/java/org/enso/base/XML_Utils.java | 31 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso index 3f4ab46f7e19..d46f3e20aa98 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso @@ -30,6 +30,7 @@ polyglot java import javax.xml.xpath.XPath polyglot java import javax.xml.xpath.XPathConstants polyglot java import javax.xml.xpath.XPathFactory polyglot java import org.enso.base.XML_Utils +polyglot java import org.enso.base.XML_Utils.InputStreamLike polyglot java import org.w3c.dom.Attr polyglot java import org.w3c.dom.Document polyglot java import org.w3c.dom.Element diff --git a/engine/runner/src/main/java/org/enso/runner/EnsoLibraryFeature.java b/engine/runner/src/main/java/org/enso/runner/EnsoLibraryFeature.java index 86a7cddadbb1..3463df945e2b 100644 --- a/engine/runner/src/main/java/org/enso/runner/EnsoLibraryFeature.java +++ b/engine/runner/src/main/java/org/enso/runner/EnsoLibraryFeature.java @@ -9,6 +9,7 @@ import org.enso.compiler.core.ir.module.scope.imports.Polyglot; import org.enso.pkg.PackageManager$; import org.graalvm.nativeimage.hosted.Feature; +import org.graalvm.nativeimage.hosted.RuntimeProxyCreation; import org.graalvm.nativeimage.hosted.RuntimeReflection; public final class EnsoLibraryFeature implements Feature { @@ -75,6 +76,9 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { RuntimeReflection.registerAllConstructors(clazz); RuntimeReflection.registerAllFields(clazz); RuntimeReflection.registerAllMethods(clazz); + if (clazz.isInterface()) { + RuntimeProxyCreation.register(clazz); + } } } } diff --git a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java index 392f4565eac3..d8cb00ccae11 100644 --- a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java @@ -69,8 +69,33 @@ public static String innerXML(Node element) return out.toString(); } - public static Document parseStream(InputStream is) + public static Document parseStream(InputStreamLike inputStreamLike) throws ParserConfigurationException, SAXException, IOException { + var is = + new InputStream() { + @Override + public int read(byte[] b, int off, int len) throws IOException { + return inputStreamLike.read(b, off, len); + } + + @Override + public int read() throws IOException { + byte[] arr = new byte[1]; + int read = read(arr, 0, 1); + if (read == -1) { + return -1; + } + if (read != 1) { + throw new IOException(); + } + return arr[0]; + } + + @Override + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + }; return doParse(new InputSource(is)); } @@ -104,4 +129,8 @@ public void error(SAXParseException e) throws SAXException { } }); } + + public static interface InputStreamLike { + public int read(byte[] arr, int off, int len) throws IOException; + } } From ec2ea1f9df9ac607b6bf7f4d05b5fa80079b042f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Wed, 19 Jun 2024 16:12:07 +0200 Subject: [PATCH 23/57] LocalDateTime and Function are used in Base_Tests --- .../Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso | 3 +++ 1 file changed, 3 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index 386aed845fa7..06ddcb8bf26d 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -21,3 +21,6 @@ polyglot java import java.util.Map polyglot java import java.nio.file.Path polyglot java import java.math.BigInteger polyglot java import java.time.LocalDate +polyglot java import java.time.LocalDateTime + +polyglot java import java.util.function.Function From d03ba231d6c218df0ac2a4ae37cf8728212b9a7a Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Wed, 19 Jun 2024 16:21:31 +0200 Subject: [PATCH 24/57] Add all Charsets --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index 0c620e2b59a6..097cb0cdd2a3 100644 --- a/build.sbt +++ b/build.sbt @@ -2612,6 +2612,7 @@ lazy val `engine-runner` = project additionalOptions = Seq( "-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog", "-H:IncludeResources=.*Main.enso$", + "-H:+AddAllCharsets", "-H:+IncludeAllLocales", // useful perf & debug switches: // "-g", From 3e5e0b0535841c20200932e3367ffd7228d219b4 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 06:25:19 +0200 Subject: [PATCH 25/57] Don't need index to runEngineDistribution --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 097cb0cdd2a3..a78b61e47cce 100644 --- a/build.sbt +++ b/build.sbt @@ -3571,7 +3571,7 @@ ThisBuild / buildEngineDistributionNoIndex := { lazy val runEngineDistribution = inputKey[Unit]("Run or --debug the engine distribution with arguments") runEngineDistribution := { - buildEngineDistribution.value + buildEngineDistributionNoIndex.value val args: Seq[String] = spaceDelimited("").parsed DistributionPackage.runEnginePackage( engineDistributionRoot.value, From 3c52ea7e03c121aeee705cb2aea4d7e552fb0657 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 06:27:15 +0200 Subject: [PATCH 26/57] Let the Stream_Utils handle asInputStream conversion --- .../Standard/Base/0.0.0-dev/src/Data/XML.enso | 1 - .../0.0.0-dev/src/System/Input_Stream.enso | 4 +- .../main/java/org/enso/base/Stream_Utils.java | 69 ++++++++++++++++++- .../main/java/org/enso/base/XML_Utils.java | 31 +-------- 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso index d46f3e20aa98..3f4ab46f7e19 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso @@ -30,7 +30,6 @@ polyglot java import javax.xml.xpath.XPath polyglot java import javax.xml.xpath.XPathConstants polyglot java import javax.xml.xpath.XPathFactory polyglot java import org.enso.base.XML_Utils -polyglot java import org.enso.base.XML_Utils.InputStreamLike polyglot java import org.w3c.dom.Attr polyglot java import org.w3c.dom.Document polyglot java import org.w3c.dom.Element diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso index 3fcbf7e15317..f0b57a0502da 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso @@ -23,6 +23,7 @@ polyglot java import java.io.InputStream as Java_Input_Stream polyglot java import org.enso.base.encoding.Encoding_Utils polyglot java import org.enso.base.encoding.ReportingStreamDecoder polyglot java import org.enso.base.Stream_Utils +polyglot java import org.enso.base.Stream_Utils.InputStreamLike ## PRIVATE An input stream, allowing for interactive reading of contents. @@ -113,7 +114,8 @@ type Input_Stream Arguments: - f: Applies a function over the internal java stream. with_java_stream : (Java_Input_Stream -> Any) -> Any - with_java_stream self f = self.stream_resource . with java_stream-> + with_java_stream self f = self.stream_resource . with java_like_stream-> + java_stream = Stream_Utils.asInputStream java_like_stream self.error_handler <| f java_stream ## PRIVATE diff --git a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java index d5fc7cfd41e2..6e6c3108734e 100644 --- a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java @@ -4,7 +4,43 @@ import java.io.InputStream; import java.util.Arrays; -public class Stream_Utils { +public final class Stream_Utils { + private Stream_Utils() {} + + /** + * Conversion interface. Any Enso/Truffle object with invocable {@read} member that takes three + * arguments is eligible for being treated as host Java {@link InputStream}. There are two + * overloaded {@link #asInputStream conversion methods}. The hosted Java interop system + * of Truffle will pick the more suitable one depending on the type of argument. + * + * @see #asInputStream + */ + public static interface InputStreamLike { + public int read(byte[] arr, int off, int len) throws IOException; + } + + /** + * No conversion conversion. When the argument is already {@link InputStream} there is no need for + * doing any further conversions. + * + * @param is + * @return the {@code is} itself + */ + public static InputStream asInputStream(InputStream is) { + return is; + } + + /** + * Conversion to {@link InputStream}. When the argument looks like an input stream, let's + * wrap it. + * + * @param inputStreamLike any guest object with {@code read} method + * @return proper + */ + public static InputStream asInputStream(InputStreamLike inputStreamLike) { + return new GuestInputStream(inputStreamLike); + } + public static byte[] peek(InputStream stream, int n) throws IOException { assert n >= 0; assert stream.markSupported(); @@ -25,4 +61,35 @@ public static byte[] peek(InputStream stream, int n) throws IOException { } return buffer; } + + private static class GuestInputStream extends InputStream { + private final InputStreamLike inputStreamLike; + + private GuestInputStream(InputStreamLike inputStreamLike) { + this.inputStreamLike = inputStreamLike; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + return inputStreamLike.read(b, off, len); + } + + @Override + public int read() throws IOException { + byte[] arr = new byte[1]; + int read = read(arr, 0, 1); + if (read == -1) { + return -1; + } + if (read != 1) { + throw new IOException(); + } + return arr[0]; + } + + @Override + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + } } diff --git a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java index d8cb00ccae11..392f4565eac3 100644 --- a/std-bits/base/src/main/java/org/enso/base/XML_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/XML_Utils.java @@ -69,33 +69,8 @@ public static String innerXML(Node element) return out.toString(); } - public static Document parseStream(InputStreamLike inputStreamLike) + public static Document parseStream(InputStream is) throws ParserConfigurationException, SAXException, IOException { - var is = - new InputStream() { - @Override - public int read(byte[] b, int off, int len) throws IOException { - return inputStreamLike.read(b, off, len); - } - - @Override - public int read() throws IOException { - byte[] arr = new byte[1]; - int read = read(arr, 0, 1); - if (read == -1) { - return -1; - } - if (read != 1) { - throw new IOException(); - } - return arr[0]; - } - - @Override - public int read(byte[] b) throws IOException { - return read(b, 0, b.length); - } - }; return doParse(new InputSource(is)); } @@ -129,8 +104,4 @@ public void error(SAXParseException e) throws SAXException { } }); } - - public static interface InputStreamLike { - public int read(byte[] arr, int off, int len) throws IOException; - } } From 07e77707ba128782efa978ff440d46c70ff805ff Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 06:27:45 +0200 Subject: [PATCH 27/57] Additional imports --- .../Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso | 5 ++++- .../lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index 06ddcb8bf26d..22013a0668b2 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -19,8 +19,11 @@ polyglot java import org.enso.base.ObjectComparator polyglot java import java.util.ArrayList polyglot java import java.util.Map polyglot java import java.nio.file.Path +polyglot java import java.io.FileOutputStream polyglot java import java.math.BigInteger polyglot java import java.time.LocalDate polyglot java import java.time.LocalDateTime - polyglot java import java.util.function.Function +polyglot java import java.lang.Thread +polyglot java import java.lang.Thread.State +polyglot java import java.lang.Float diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso index 7c56510c72fb..903d1ba4d535 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso @@ -32,6 +32,7 @@ polyglot java import java.lang.Exception as JException polyglot java import java.net.http.HttpClient polyglot java import java.net.http.HttpRequest polyglot java import java.net.http.HttpRequest.BodyPublisher +polyglot java import java.net.http.HttpRequest.BodyPublishers polyglot java import java.net.InetSocketAddress polyglot java import java.net.ProxySelector polyglot java import java.nio.file.Path From d59f6f70ad3b83723e14b13d3a98932dc2fa2dc2 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 07:05:34 +0200 Subject: [PATCH 28/57] Introducing File_Utils to encapsulate matcher --- .../0.0.0-dev/src/Internal/Extra_Imports.enso | 1 + .../Base/0.0.0-dev/src/Network/HTTP.enso | 1 + .../Base/0.0.0-dev/src/System/File.enso | 8 +++----- .../Base/0.0.0-dev/src/System/Input_Stream.enso | 3 ++- .../org/enso/base/file_system/File_Utils.java | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index 22013a0668b2..c7392df01ab3 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -18,6 +18,7 @@ polyglot java import org.enso.base.ObjectComparator # often used in tests polyglot java import java.util.ArrayList polyglot java import java.util.Map +polyglot java import java.nio.CharBuffer polyglot java import java.nio.file.Path polyglot java import java.io.FileOutputStream polyglot java import java.math.BigInteger diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso index 903d1ba4d535..cad3fee8e641 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso @@ -33,6 +33,7 @@ polyglot java import java.net.http.HttpClient polyglot java import java.net.http.HttpRequest polyglot java import java.net.http.HttpRequest.BodyPublisher polyglot java import java.net.http.HttpRequest.BodyPublishers +polyglot java import java.net.http.HttpRequest.Builder polyglot java import java.net.InetSocketAddress polyglot java import java.net.ProxySelector polyglot java import java.nio.file.Path diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso index ef6607ef2787..7f8249de9cbc 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso @@ -42,13 +42,12 @@ from project.System.File_Format import Auto_Detect, File_Format polyglot java import java.io.File as Java_File polyglot java import java.io.InputStream as Java_Input_Stream polyglot java import java.io.OutputStream as Java_Output_Stream -polyglot java import java.nio.file.FileSystems -polyglot java import java.nio.file.Path polyglot java import java.nio.file.StandardCopyOption polyglot java import java.nio.file.StandardOpenOption polyglot java import java.time.ZonedDateTime polyglot java import org.enso.base.DryRunFileManager polyglot java import org.enso.base.file_system.FileSystemSPI +polyglot java import org.enso.base.file_system.File_Utils ## PRIVATE file_types : Vector @@ -795,11 +794,10 @@ type File _ -> used_filter = if recursive.not || name_filter.contains "**" then name_filter else (if name_filter.starts_with "*" then "*" else "**/") + name_filter - fs = FileSystems.getDefault - matcher = fs.getPathMatcher "glob:"+used_filter + matcher = File_Utils.matchPath "glob:"+used_filter all_files.filter file-> pathStr = self.relativize file . path - matcher.matches (Path.of pathStr) + matcher.test pathStr ## GROUP Metadata ICON metadata diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso index f0b57a0502da..fb636a3873e3 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Input_Stream.enso @@ -160,7 +160,8 @@ type Input_Stream The current stream may be invalidated after the conversion, and it should no longer be used - only the returned stream should be used. as_peekable_stream self -> Input_Stream = if self.is_peekable then self else - raw_java_stream = self.stream_resource.take + raw_stream = self.stream_resource.take + raw_java_stream = Stream_Utils.asInputStream raw_stream buffered_stream = BufferedInputStream.new raw_java_stream Input_Stream.new buffered_stream self.error_handler self.associated_source diff --git a/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java new file mode 100644 index 000000000000..e130e369f0db --- /dev/null +++ b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java @@ -0,0 +1,17 @@ +package org.enso.base.file_system; + +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.util.function.Predicate; + +public final class File_Utils { + private File_Utils() {} + + public static Predicate matchPath(String filter) { + var fs = FileSystems.getDefault(); + var matcher = fs.getPathMatcher(filter); + return (pathStr) -> { + return matcher.matches(Path.of(pathStr)); + }; + } +} From 9f4569af304e815642e03030d7318c10e5d77c2d Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 07:29:10 +0200 Subject: [PATCH 29/57] Avoid Python None check when Python is missing --- test/Base_Tests/src/Data/Map_Spec.enso | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/Base_Tests/src/Data/Map_Spec.enso b/test/Base_Tests/src/Data/Map_Spec.enso index ea0f3662d4b7..730fce19c710 100644 --- a/test/Base_Tests/src/Data/Map_Spec.enso +++ b/test/Base_Tests/src/Data/Map_Spec.enso @@ -105,7 +105,7 @@ add_specs suite_builder = empty_map_fn = entry.get 1 pending = entry.get 2 add_common_specs suite_builder lang pending empty_map_fn - + suite_builder.group "Enso maps" group_builder-> @@ -464,14 +464,14 @@ add_common_specs suite_builder prefix:Text (pending : (Text | Nothing)) (empty_m suite_builder.group prefix+": Common polyglot Map operations" pending=pending group_builder-> group_builder.specify "should get the default comparator for polyglot maps" <| Comparable.from empty_map . should_equal Default_Comparator - + group_builder.specify "should compare two hash maps" <| (empty_map.insert "a" 1).should_equal (empty_map.insert "a" 1) (empty_map.insert "b" 2).should_not_equal (empty_map.insert "a" 1) empty_map.should_equal empty_map empty_map.should_not_equal (empty_map.insert "a" 1) (empty_map.insert "a" 1 . insert "b" 2).should_equal (empty_map.insert "b" 2 . insert "a" 1) - + group_builder.specify "should allow checking for non emptiness" <| non_empty = empty_map . insert "foo" 1234 empty_map.not_empty . should_be_false @@ -481,7 +481,7 @@ add_common_specs suite_builder prefix:Text (pending : (Text | Nothing)) (empty_m non_empty = empty_map.insert "a" "b" . insert "x" "y" empty_map.size . should_equal 0 non_empty.size . should_equal 2 - + group_builder.specify "should allow checking for emptiness" <| non_empty = empty_map . insert "foo" 1234 empty_map.is_empty . should_be_true @@ -558,7 +558,11 @@ add_common_specs suite_builder prefix:Text (pending : (Text | Nothing)) (empty_m empty_map.insert Nothing 1 . insert Nothing 2 . get Nothing . should_equal 2 empty_map.insert Nothing 1 . should_equal (empty_map.insert Nothing 1) empty_map.insert Nothing 1 . insert Nothing 2 . at Nothing . should_equal 2 + + group_builder.specify "should handle JavaScript null as keys" <| empty_map.insert js_null 1 . at Nothing . should_equal 1 + + group_builder.specify "should handle Python None as keys" pending=pending_python_missing <| empty_map.insert py_none 1 . at Nothing . should_equal 1 group_builder.specify "should define a well-defined text conversion" <| From b9d221f883cde16377c8b39a8091483675a2de2f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 07:30:26 +0200 Subject: [PATCH 30/57] asOutputStream wrapper --- .../0.0.0-dev/src/System/Output_Stream.enso | 9 ++- .../main/java/org/enso/base/Stream_Utils.java | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso index 2a847a64d55c..7acc0d1190e0 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso @@ -16,6 +16,7 @@ polyglot java import java.io.ByteArrayOutputStream polyglot java import java.io.OutputStream as Java_Output_Stream polyglot java import org.enso.base.encoding.ReportingStreamEncoder polyglot java import org.enso.base.encoding.Encoding_Utils +polyglot java import org.enso.base.Stream_Utils ## PRIVATE An output stream, allowing for interactive writing of contents. @@ -57,7 +58,7 @@ type Output_Stream - stream_resource: The internal resource that represents the underlying stream. - error_handler: An error handler for IOExceptions thrown when writing. - Value stream_resource error_handler + private Value stream_resource error_handler ## PRIVATE ADVANCED @@ -66,7 +67,8 @@ type Output_Stream Arguments: - contents: A vector of bytes to write. write_bytes : Vector Integer -> Nothing - write_bytes self contents = self.stream_resource . with java_stream-> + write_bytes self contents = self.stream_resource . with raw_stream-> + java_stream = Stream_Utils.asOutputStream raw_stream self.error_handler <| java_stream.write contents java_stream.flush @@ -80,7 +82,8 @@ type Output_Stream - input_stream: An Input_Stream to write to this stream. write_stream : Input_Stream -> Nothing write_stream self input_stream:Input_Stream = - self.stream_resource . with java_output_stream-> + self.stream_resource . with raw_stream-> + java_output_stream = Stream_Utils.asOutputStream raw_stream self.error_handler <| input_stream.with_java_stream java_input_stream-> java_input_stream.transferTo java_output_stream diff --git a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java index 6e6c3108734e..23d80b64c3d2 100644 --- a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; public final class Stream_Utils { @@ -41,6 +42,40 @@ public static InputStream asInputStream(InputStreamLike inputStreamLike) { return new GuestInputStream(inputStreamLike); } + /** + * Conversion interface. Any Enso/Truffle object with invocable {@write} member that takes three + * arguments is eligible for being treated as host Java {@link OutputStream}. There are two + * overloaded {@link #asOutputStream conversion methods}. The hosted Java interop system + * of Truffle will pick the more suitable one depending on the type of argument. + * + * @see #asOutputStream + */ + public static interface OutputStreamLike { + public void write(byte[] arr, int off, int len) throws IOException; + } + + /** + * No conversion conversion. When the argument is already {@link OutputStream} there is no need + * for doing any further conversions. + * + * @param os + * @return the {@code is} itself + */ + public static OutputStream asOutputStream(OutputStream os) { + return os; + } + + /** + * Conversion to {@link OutputStream}. When the argument looks like an output stream, + * let's wrap it. + * + * @param outputStreamLike any guest object with {@code write} method + * @return proper + */ + public static OutputStream asOutputStream(OutputStreamLike outputStreamLike) { + return new GuestOutputStream(outputStreamLike); + } + public static byte[] peek(InputStream stream, int n) throws IOException { assert n >= 0; assert stream.markSupported(); @@ -92,4 +127,24 @@ public int read(byte[] b) throws IOException { return read(b, 0, b.length); } } + + private static final class GuestOutputStream extends OutputStream { + + private final OutputStreamLike outputStreamLike; + + private GuestOutputStream(OutputStreamLike os) { + this.outputStreamLike = os; + } + + @Override + public void write(int b) throws IOException { + byte[] arr = new byte[] {(byte) b}; + write(arr, 0, 1); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + outputStreamLike.write(b, off, len); + } + } } From 5328f6675af13a82540a1acd5d550a1e83cbc6a2 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 07:44:32 +0200 Subject: [PATCH 31/57] Need to support available() to make Reporting_Stream_Decoder_Spec succeed --- .../src/main/java/org/enso/base/Stream_Utils.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java index 23d80b64c3d2..04bd9e3be0f9 100644 --- a/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/Stream_Utils.java @@ -18,6 +18,10 @@ private Stream_Utils() {} */ public static interface InputStreamLike { public int read(byte[] arr, int off, int len) throws IOException; + + public default int available() { + return 0; + } } /** @@ -126,6 +130,15 @@ public int read() throws IOException { public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + + @Override + public int available() throws IOException { + try { + return inputStreamLike.available(); + } catch (Error | Exception e) { + return 0; + } + } } private static final class GuestOutputStream extends OutputStream { From ec0918f417d5eb5700e4f6fcda0de911cc01b92e Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 07:50:55 +0200 Subject: [PATCH 32/57] Register OutputStreamLike for reflection --- .../lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso index 7acc0d1190e0..0fdb8f1f3d15 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso @@ -17,6 +17,7 @@ polyglot java import java.io.OutputStream as Java_Output_Stream polyglot java import org.enso.base.encoding.ReportingStreamEncoder polyglot java import org.enso.base.encoding.Encoding_Utils polyglot java import org.enso.base.Stream_Utils +polyglot java import org.enso.base.Stream_Utils.OutputStreamLike ## PRIVATE An output stream, allowing for interactive writing of contents. From c2f9eb5f590c365a30e67ebd543b29366efc11a5 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 08:17:45 +0200 Subject: [PATCH 33/57] Make HttpClient.Builder ready for reflective access --- distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso index cad3fee8e641..e1fc58f530b1 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso @@ -30,6 +30,7 @@ from project.Data.Json.Extensions import all polyglot java import java.lang.Exception as JException polyglot java import java.net.http.HttpClient +polyglot java import java.net.http.HttpClient.Builder as ClientBuilder polyglot java import java.net.http.HttpRequest polyglot java import java.net.http.HttpRequest.BodyPublisher polyglot java import java.net.http.HttpRequest.BodyPublishers From 04bfdcd402e1e1b41257b2fcd8d72b32c3d6a346 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 08:18:43 +0200 Subject: [PATCH 34/57] Survive when js_exception (provided via asGuestValue) doesn't have the necessary attributes in NI mode --- distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso index 2f0e7c0955f4..1fcec753fb5c 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso @@ -13,6 +13,7 @@ import project.Data.Time.Time_Of_Day.Time_Of_Day import project.Data.Vector.Vector import project.Error.Error import project.Errors.Common.No_Such_Conversion +import project.Errors.Common.No_Such_Method import project.Errors.Common.Type_Error import project.Errors.Illegal_Argument.Illegal_Argument import project.Errors.No_Such_Key.No_Such_Key @@ -60,8 +61,8 @@ type Json parse : Text -> Nothing | Boolean | Number | Text | Vector | Date | Date_Time | Time_Of_Day | JS_Object ! Invalid_JSON parse (json : Text) = error_handler js_exception = - line = js_exception.payload.getLocation.getLineNr.to_text - col = js_exception.payload.getLocation.getColumnNr.to_text + line = Panic.catch No_Such_Method js_exception.payload.getLocation.getLineNr.to_text (_->"...") + col = Panic.catch No_Such_Method js_exception.payload.getLocation.getColumnNr.to_text (_->"...") pos = '[line: '+line+', column: '+col+']' Error.throw (Invalid_JSON.Error js_exception.payload.getOriginalMessage+' at position '+pos) From 6ab352ef697fb11bc91435bba1f0a76d2a75e873 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 08:51:38 +0200 Subject: [PATCH 35/57] Rather call static method than Predicate.test --- .../lib/Standard/Base/0.0.0-dev/src/System/File.enso | 2 +- .../java/org/enso/base/file_system/File_Utils.java | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso index 7f8249de9cbc..791ca7086495 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/File.enso @@ -797,7 +797,7 @@ type File matcher = File_Utils.matchPath "glob:"+used_filter all_files.filter file-> pathStr = self.relativize file . path - matcher.test pathStr + File_Utils.matches matcher pathStr ## GROUP Metadata ICON metadata diff --git a/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java index e130e369f0db..da9368ba861a 100644 --- a/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java @@ -2,16 +2,18 @@ import java.nio.file.FileSystems; import java.nio.file.Path; -import java.util.function.Predicate; +import java.nio.file.PathMatcher; public final class File_Utils { private File_Utils() {} - public static Predicate matchPath(String filter) { + public static PathMatcher matchPath(String filter) { var fs = FileSystems.getDefault(); var matcher = fs.getPathMatcher(filter); - return (pathStr) -> { - return matcher.matches(Path.of(pathStr)); - }; + return matcher; + } + + public static boolean matches(PathMatcher matcher, String pathStr) { + return matcher.matches(Path.of(pathStr)); } } From 961c3ec83f5bb95c2b57b3fbb8d1505d8706d986 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 09:58:35 +0200 Subject: [PATCH 36/57] When XML_Document.Value is private, allocate with factory method --- .../Standard/Base/0.0.0-dev/src/Data/XML.enso | 4 ++++ .../lib/Standard/Table/0.0.0-dev/src/Table.enso | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso index 3f4ab46f7e19..5f6960f0a75b 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/XML.enso @@ -95,6 +95,10 @@ type XML_Document XML_Error.handle_java_exceptions <| XML_Document.Value (XML_Utils.parseString xml_string) + ## PRIVATE + Wrap Java's Document to XML_Document + new doc:Document = XML_Document.Value doc + private Value (java_document:Document) diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso index 332f384b7d76..eb56ba3d1a3d 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso @@ -2720,13 +2720,13 @@ type Table - root_name: The name of the root tag in the XML. - row_name: The name of the row tag in the XML. - on_problems: Specifies how to handle warnings if they occur, reporting - them as warnings by default. + them as warnings by default. ! Error Conditions - - If a column in `element_columns`, `attribute_columns` or `value_column` is not in + - If a column in `element_columns`, `attribute_columns` or `value_column` is not in the input table, a `Missing_Input_Columns` is raised as an error. - - If any incomming columns aree not specified in one of `element_columns`, + - If any incomming columns aree not specified in one of `element_columns`, `attribute_columns` or `value_column`, a `Unexpected_Extra_Columns` is reported according to the `on_problems` setting. @@ -2735,10 +2735,10 @@ type Table Input Table `table`: - Title | Author | Price | Year + Title | Author | Price | Year ------------------------+---------------------+-------+------ - A Tale Of Two Cities | Charles Dickens | 9.99 | 1859 - The Great Gatsby | F. Scott Fitzgerald | 5.99 | 1925 + A Tale Of Two Cities | Charles Dickens | 9.99 | 1859 + The Great Gatsby | F. Scott Fitzgerald | 5.99 | 1925 Result `r = t.to_xml ["Year"] ["Author", "Price"] "Title" "Books" "Book"`: @@ -2769,9 +2769,9 @@ type Table unused_columns = columns_helper.internal_columns.filter (Filter_Condition.Is_In resolved_element_columns+resolved_attribute_columns+[resolved_value_column] Filter_Action.Remove) . map .name if unused_columns.length > 0 then problem_builder.report_other_warning (Unexpected_Extra_Columns.Warning unused_columns) - + problem_builder.attach_problems_before on_problems <| - XML_Document.Value (Java_TableToXml.to_xml self.row_count java_element_columns java_attribute_column java_value_column root_name row_name) + XML_Document.new (Java_TableToXml.to_xml self.row_count java_element_columns java_attribute_column java_value_column root_name row_name) ## PRIVATE columns_helper : Table_Column_Helper From 7d73811d4f2ef6f70166d9beba954a174c079a84 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:25:06 +0200 Subject: [PATCH 37/57] Include org.enso.base_test_helpers on classpath when building native executable --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index a78b61e47cce..dcc89a8c051c 100644 --- a/build.sbt +++ b/build.sbt @@ -2664,6 +2664,7 @@ lazy val `engine-runner` = project .dependsOn(`logging-service`) .dependsOn(`logging-service-logback` % Runtime) .dependsOn(`polyglot-api`) + .dependsOn(`enso-test-java-helpers`) lazy val buildSmallJdk = taskKey[File]("Build a minimal JDK used for native image generation") From b222ed01919acbe28547081fede427fd5471ade2 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:25:53 +0200 Subject: [PATCH 38/57] Another place to asOutputStream --- .../lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso index 0fdb8f1f3d15..82b54ed0c752 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/System/Output_Stream.enso @@ -111,7 +111,9 @@ type Output_Stream Arguments: - f: Applies a function over the internal java stream. with_java_stream : (Java_Output_Stream -> Any) -> Any - with_java_stream self f = self.stream_resource . with f + with_java_stream self f = self.stream_resource . with raw_stream-> + java_stream = Stream_Utils.asOutputStream raw_stream + f java_stream ## PRIVATE ADVANCED From e819e74435a1bbe89da0eae92c8a05d3deb429dc Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:26:55 +0200 Subject: [PATCH 39/57] Calling overloaded Path.of has some issues. Use File_Utils wrapper --- .../main/java/org/enso/base/file_system/File_Utils.java | 4 ++++ test/Base_Tests/src/Data/Map_Spec.enso | 8 ++++---- test/Base_Tests/src/Semantic/Equals_Spec.enso | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java index da9368ba861a..2f48160518b3 100644 --- a/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java +++ b/std-bits/base/src/main/java/org/enso/base/file_system/File_Utils.java @@ -7,6 +7,10 @@ public final class File_Utils { private File_Utils() {} + public static Path toPath(String path) { + return Path.of(path); + } + public static PathMatcher matchPath(String filter) { var fs = FileSystems.getDefault(); var matcher = fs.getPathMatcher(filter); diff --git a/test/Base_Tests/src/Data/Map_Spec.enso b/test/Base_Tests/src/Data/Map_Spec.enso index 730fce19c710..975b8f7f88af 100644 --- a/test/Base_Tests/src/Data/Map_Spec.enso +++ b/test/Base_Tests/src/Data/Map_Spec.enso @@ -5,8 +5,8 @@ import Standard.Base.Errors.No_Such_Key.No_Such_Key from Standard.Test import all -polyglot java import java.nio.file.Path as JavaPath polyglot java import java.util.Map as JavaMap +polyglot java import org.enso.base.file_system.File_Utils ## Type that violates reflexivity type My_Nan @@ -278,11 +278,11 @@ add_specs suite_builder = map.get (js_str "A") . should_equal 42 group_builder.specify "should support host objects as keys" <| - # JavaPath has proper implementation of hashCode - map = Map.singleton (JavaPath.of "/home/user/file.txt") 42 + # java.nio.path.Path has proper implementation of hashCode + map = Map.singleton (File_Utils.toPath "/home/user/file.txt") 42 map.get "X" . should_equal Nothing map.get "A" . should_equal Nothing - map.get (JavaPath.of "/home/user/file.txt") . should_equal 42 + map.get (File_Utils.toPath "/home/user/file.txt") . should_equal 42 group_builder.specify "should support Python objects as keys" pending=pending_python_missing <| py_obj = py_wrapper 42 diff --git a/test/Base_Tests/src/Semantic/Equals_Spec.enso b/test/Base_Tests/src/Semantic/Equals_Spec.enso index fd68009445c7..6a85c61ea1ab 100644 --- a/test/Base_Tests/src/Semantic/Equals_Spec.enso +++ b/test/Base_Tests/src/Semantic/Equals_Spec.enso @@ -5,8 +5,8 @@ from Standard.Test import all polyglot java import java.math.BigInteger as Java_Big_Integer -polyglot java import java.nio.file.Path as Java_Path polyglot java import java.util.Random as Java_Random +polyglot java import org.enso.base.file_system.File_Utils polyglot java import org.enso.base_test_helpers.IntHolder polyglot java import org.enso.base_test_helpers.IntHolderEquals @@ -180,8 +180,8 @@ add_specs suite_builder = ((CustomEqType.C1 0) == (CustomEqType.C2 7 3)).should_be_false group_builder.specify "should dispatch to equals on host values" <| - path1 = Java_Path.of "home" "user" . resolve "file.txt" - path2 = Java_Path.of "home" "user" "file.txt" + path1 = File_Utils.toPath "home" . resolve "user" . resolve "file.txt" + path2 = File_Utils.toPath "home" . resolve "user" . resolve "file.txt" (path1 == path2).should_be_true path3 = path1.resolve "subfile.txt" (path3 == path2).should_be_false From fc248085ff1aaf5ae87e5ce8e6b9ac43f4e21019 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:35:59 +0200 Subject: [PATCH 40/57] Few more extra imports --- .../Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso | 1 + .../lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso index c7392df01ab3..7771401cf43d 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Extra_Imports.enso @@ -20,6 +20,7 @@ polyglot java import java.util.ArrayList polyglot java import java.util.Map polyglot java import java.nio.CharBuffer polyglot java import java.nio.file.Path +polyglot java import java.io.FileInputStream polyglot java import java.io.FileOutputStream polyglot java import java.math.BigInteger polyglot java import java.time.LocalDate diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso index e1fc58f530b1..922d78b911dc 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso @@ -30,6 +30,7 @@ from project.Data.Json.Extensions import all polyglot java import java.lang.Exception as JException polyglot java import java.net.http.HttpClient +polyglot java import java.net.http.HttpClient.Redirect polyglot java import java.net.http.HttpClient.Builder as ClientBuilder polyglot java import java.net.http.HttpRequest polyglot java import java.net.http.HttpRequest.BodyPublisher @@ -37,8 +38,8 @@ polyglot java import java.net.http.HttpRequest.BodyPublishers polyglot java import java.net.http.HttpRequest.Builder polyglot java import java.net.InetSocketAddress polyglot java import java.net.ProxySelector -polyglot java import java.nio.file.Path polyglot java import javax.net.ssl.SSLContext +polyglot java import org.enso.base.file_system.File_Utils polyglot java import org.enso.base.enso_cloud.EnsoSecretHelper polyglot java import org.enso.base.net.http.MultipartBodyBuilder polyglot java import org.enso.base.net.http.UrlencodedBodyBuilder @@ -245,7 +246,7 @@ resolve_body_to_publisher_and_boundary body:Request_Body = json.if_not_error <| Pair.new (body_publishers.ofString json) Nothing Request_Body.Binary file -> - path = Path.of file.path + path = File_Utils.toPath file.path Pair.new (body_publishers.ofFile path) Nothing Request_Body.Form_Data form_data url_encoded -> build_form_body_publisher form_data url_encoded From 0dec33ec54f12dc109fa1724e075524e4cb8d473 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:53:19 +0200 Subject: [PATCH 41/57] Regenerated SubstrateVM metadata with: JAVA_OPTS="-agentlib:native-image-agent=config-merge-dir=./engine/runner/src/main/resources/META-INF/native-image/org/enso/runner" ./built-distribution/enso-engine-0.0.0-dev-linux-amd64/enso-0.0.0-dev/bin/enso --run test/Base_Tests --- .../org/enso/runner/reflect-config.json | 846 +++++++++++++++++- .../org/enso/runner/resource-config.json | 12 +- 2 files changed, 838 insertions(+), 20 deletions(-) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index c54a35e2ae28..5359a26e142e 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -50,12 +50,20 @@ { "name":"[Lscala.Tuple2;" }, +{ + "name":"[Lsun.security.pkcs.SignerInfo;" +}, { "name":"[S" }, { "name":"[Z" }, +{ + "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"ch.qos.logback.classic.pattern.DateConverter", "methods":[{"name":"","parameterTypes":[] }] @@ -80,6 +88,31 @@ "name":"ch.qos.logback.classic.pattern.NopThrowableInformationConverter", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"ch.qos.logback.classic.pattern.ThreadConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.ConsoleAppender", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.OutputStreamAppender", + "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.Encoder", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods":[{"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }] +}, +{ + "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }] +}, { "name":"ch.qos.logback.core.rolling.helper.DateTokenConverter", "methods":[{"name":"","parameterTypes":[] }] @@ -88,6 +121,10 @@ "name":"ch.qos.logback.core.rolling.helper.IntegerTokenConverter", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"ch.qos.logback.core.spi.ContextAware", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, { "name":"com.fasterxml.jackson.core.JsonProcessingException" }, @@ -179,6 +216,10 @@ "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"com.sun.crypto.provider.TlsKeyMaterialGenerator", "methods":[{"name":"","parameterTypes":[] }] @@ -243,13 +284,29 @@ "name":"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"com.typesafe.sslconfig.ssl.NoopHostnameVerifier", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"com.univocity.parsers.common.TextParsingException" +}, +{ + "name":"java.beans.Introspector" +}, +{ + "name":"java.io.BufferedInputStream" +}, { "name":"java.io.ByteArrayInputStream" }, +{ + "name":"java.io.ByteArrayOutputStream" +}, { "name":"java.io.File" }, @@ -271,15 +328,27 @@ { "name":"java.io.OutputStream" }, +{ + "name":"java.io.PrintWriter" +}, +{ + "name":"java.io.Reader" +}, { "name":"java.io.Serializable" }, { "name":"java.io.StringReader" }, +{ + "name":"java.io.StringWriter" +}, { "name":"java.io.UncheckedIOException" }, +{ + "name":"java.io.Writer" +}, { "name":"java.lang.ArithmeticException" }, @@ -402,6 +471,9 @@ "name":"java.lang.Throwable", "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }] }, +{ + "name":"java.lang.UnsupportedOperationException" +}, { "name":"java.lang.Void", "fields":[{"name":"TYPE"}] @@ -527,15 +599,39 @@ { "name":"java.net.http.HttpClient" }, +{ + "name":"java.net.http.HttpClient$Builder" +}, +{ + "name":"java.net.http.HttpClient$Redirect" +}, +{ + "name":"java.net.http.HttpClient.Builder" +}, +{ + "name":"java.net.http.HttpClient.Redirect" +}, { "name":"java.net.http.HttpRequest" }, { "name":"java.net.http.HttpRequest$BodyPublisher" }, +{ + "name":"java.net.http.HttpRequest$BodyPublishers" +}, +{ + "name":"java.net.http.HttpRequest$Builder" +}, { "name":"java.net.http.HttpRequest.BodyPublisher" }, +{ + "name":"java.net.http.HttpRequest.BodyPublishers" +}, +{ + "name":"java.net.http.HttpRequest.Builder" +}, { "name":"java.nio.Buffer" }, @@ -584,6 +680,9 @@ { "name":"java.nio.file.attribute.PosixFilePermission" }, +{ + "name":"java.nio.file.attribute.PosixFilePermissions" +}, { "name":"java.security.AlgorithmParametersSpi" }, @@ -623,12 +722,39 @@ { "name":"java.security.spec.DSAParameterSpec" }, +{ + "name":"java.sql.Connection" +}, +{ + "name":"java.sql.DatabaseMetaData" +}, { "name":"java.sql.Date" }, +{ + "name":"java.sql.JDBCType" +}, +{ + "name":"java.sql.PreparedStatement" +}, +{ + "name":"java.sql.ResultSet" +}, +{ + "name":"java.sql.ResultSetMetaData" +}, +{ + "name":"java.sql.SQLException" +}, +{ + "name":"java.sql.SQLTimeoutException" +}, { "name":"java.sql.Timestamp" }, +{ + "name":"java.sql.Types" +}, { "name":"java.text.DecimalFormat" }, @@ -710,6 +836,9 @@ { "name":"java.time.temporal.TemporalUnit" }, +{ + "name":"java.time.temporal.UnsupportedTemporalTypeException" +}, { "name":"java.util.AbstractList" }, @@ -719,9 +848,27 @@ { "name":"java.util.Base64" }, +{ + "name":"java.util.Base64$Decoder" +}, +{ + "name":"java.util.Base64$Encoder" +}, +{ + "name":"java.util.Base64.Decoder" +}, +{ + "name":"java.util.Base64.Encoder" +}, { "name":"java.util.Date" }, +{ + "name":"java.util.HashSet" +}, +{ + "name":"java.util.Iterator" +}, { "name":"java.util.List" }, @@ -746,6 +893,9 @@ { "name":"java.util.Random" }, +{ + "name":"java.util.Set" +}, { "name":"java.util.UUID" }, @@ -783,6 +933,9 @@ "name":"java.util.logging.LoggingMXBean", "queryAllPublicMethods":true }, +{ + "name":"java.util.regex.Pattern" +}, { "name":"javax.management.MBeanOperationInfo", "queryAllPublicMethods":true, @@ -834,6 +987,9 @@ { "name":"javax.xml.parsers.DocumentBuilderFactory" }, +{ + "name":"javax.xml.xpath.XPath" +}, { "name":"javax.xml.xpath.XPathConstants" }, @@ -924,6 +1080,15 @@ "name":"org.apache.commons.compress.archivers.zip.Zip64ExtendedInformationExtraField", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.apache.poi.UnsupportedFileFormatException" +}, +{ + "name":"org.apache.poi.poifs.filesystem.NotOLE2FileException" +}, +{ + "name":"org.apache.poi.ss.usermodel.Workbook" +}, { "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", "methods":[{"name":"","parameterTypes":[] }] @@ -1388,18 +1553,54 @@ { "name":"org.enso.base.Regex_Utils" }, +{ + "name":"org.enso.base.Stream_Utils" +}, +{ + "name":"org.enso.base.Stream_Utils$InputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils$OutputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils.InputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils.OutputStreamLike" +}, { "name":"org.enso.base.Text_Utils" }, { "name":"org.enso.base.Time_Utils" }, +{ + "name":"org.enso.base.Time_Utils$AdjustOp" +}, +{ + "name":"org.enso.base.Time_Utils.AdjustOp" +}, +{ + "name":"org.enso.base.WithProblems" +}, { "name":"org.enso.base.XML_Utils" }, { "name":"org.enso.base.arrays.LongArrayList" }, +{ + "name":"org.enso.base.encoding.DecodingProblem" +}, +{ + "name":"org.enso.base.encoding.DecodingProblemAggregator" +}, +{ + "name":"org.enso.base.encoding.Encoding_Utils" +}, +{ + "name":"org.enso.base.encoding.NewlineDetector" +}, { "name":"org.enso.base.encoding.ReportingStreamDecoder" }, @@ -1433,12 +1634,42 @@ { "name":"org.enso.base.enso_cloud.HideableValue" }, +{ + "name":"org.enso.base.enso_cloud.HideableValue$Base64EncodeValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$ConcatValues" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$PlainValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$SecretValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.Base64EncodeValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.ConcatValues" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.PlainValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.SecretValue" +}, +{ + "name":"org.enso.base.enso_cloud.audit.AuditLog" +}, { "name":"org.enso.base.file_format.FileFormatSPI" }, { "name":"org.enso.base.file_system.FileSystemSPI" }, +{ + "name":"org.enso.base.file_system.File_Utils" +}, { "name":"org.enso.base.net.URITransformer" }, @@ -1457,6 +1688,12 @@ { "name":"org.enso.base.numeric.Decimal_Utils" }, +{ + "name":"org.enso.base.polyglot.NumericConverter" +}, +{ + "name":"org.enso.base.polyglot.WrappedDataflowError" +}, { "name":"org.enso.base.random.RandomInstanceHolder" }, @@ -1469,12 +1706,21 @@ { "name":"org.enso.base.statistics.FitError" }, +{ + "name":"org.enso.base.statistics.LinearModel" +}, { "name":"org.enso.base.statistics.Moments" }, { "name":"org.enso.base.statistics.Rank" }, +{ + "name":"org.enso.base.statistics.Rank$Method" +}, +{ + "name":"org.enso.base.statistics.Rank.Method" +}, { "name":"org.enso.base.statistics.Regression" }, @@ -1484,18 +1730,33 @@ { "name":"org.enso.base.text.CaseFoldedString" }, +{ + "name":"org.enso.base.text.GraphemeSpan" +}, { "name":"org.enso.base.text.Replacer_Cache" }, +{ + "name":"org.enso.base.text.ResultWithWarnings" +}, { "name":"org.enso.base.text.TextFoldingStrategy" }, +{ + "name":"org.enso.base.text.Utf16Span" +}, { "name":"org.enso.base.time.CustomTemporalUnits" }, { "name":"org.enso.base.time.Date_Period_Utils" }, +{ + "name":"org.enso.base.time.Date_Time_Utils" +}, +{ + "name":"org.enso.base.time.Date_Utils" +}, { "name":"org.enso.base.time.EnsoDateTimeFormatter" }, @@ -1508,6 +1769,9 @@ { "name":"org.enso.base.time.FormatterKind" }, +{ + "name":"org.enso.base.time.Time_Of_Day_Utils" +}, { "name":"org.enso.base_test_helpers.CallbackHelper" }, @@ -1535,6 +1799,10 @@ "name":"org.enso.compiler.core.ir.IrPersistance$PersistIdentifiedLocation", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.compiler.core.ir.IrPersistance$PersistJavaListLazy", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.enso.compiler.core.ir.IrPersistance$PersistLong", "methods":[{"name":"","parameterTypes":[] }] @@ -1755,6 +2023,14 @@ "name":"org.enso.compiler.core.ir.PersistWarning_DuplicatedImport", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.compiler.core.ir.PersistWarning_NotInvokable", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.core.ir.PersistWarning_TypeMismatch", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.enso.compiler.core.ir.PersistWarning_WrongBuiltinMethod", "methods":[{"name":"","parameterTypes":[] }] @@ -1907,6 +2183,10 @@ "name":"org.enso.compiler.pass.analyse.PersistTailCall$", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.compiler.pass.analyse.PersistTypeInference", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.enso.compiler.pass.analyse.PersistTypeNames$", "methods":[{"name":"","parameterTypes":[] }] @@ -1919,6 +2199,61 @@ "name":"org.enso.compiler.pass.analyse.PersistTypeSignatures_Signature", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistAtomTypeInterfaceFromBindingsMap", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistInferredType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistQualifiedName", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_ArrowType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_AtomType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_IntersectionType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_SumType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_TopType", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_TypeObject", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.compiler.pass.analyse.types.PersistTypeRepresentation_UnresolvedSymbol", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.database.DatabaseConnectionDetailsSPI" +}, +{ + "name":"org.enso.database.JDBCProxy" +}, +{ + "name":"org.enso.database.JDBCUtils" +}, +{ + "name":"org.enso.database.dryrun.HiddenTableReferenceCounter" +}, +{ + "name":"org.enso.database.dryrun.OperationSynchronizer" +}, { "name":"org.enso.interpreter.caches.ImportExportCache$PersistBindingsMap", "methods":[{"name":"","parameterTypes":[] }] @@ -1955,6 +2290,10 @@ "name":"org.enso.interpreter.caches.PersistBindingsMap$SymbolRestriction$Union", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.interpreter.caches.PersistBindingsMap_Argument", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.enso.interpreter.caches.PersistBindingsMap_Cons", "methods":[{"name":"","parameterTypes":[] }] @@ -2007,52 +2346,100 @@ "name":"org.enso.interpreter.caches.PersistBindingsMap_Type", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.enso.interpreter.caches.PersistLibraryName", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.enso.interpreter.caches.PersistQualifiedName", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Any", + "name":"org.enso.interpreter.caches.PersistSuggestion_Argument", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Boolean", + "name":"org.enso.interpreter.caches.PersistSuggestion_Constructor", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.CreateProcessSystemMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_Conversion", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.EmptyMapMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_DefinedMethod", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Error", + "name":"org.enso.interpreter.caches.PersistSuggestion_Function", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.ExitSystemMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_Getter", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Is_normalizedTextMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_Local", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Is_unixSystemMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_Module", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.LengthTextMethodGen", - "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] + "name":"org.enso.interpreter.caches.PersistSuggestion_Type", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.Map", + "name":"org.enso.interpreter.caches.PersistSuggestionsCache_CachedSuggestions", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"org.enso.interpreter.node.expression.builtin.NanoTimeSystemMethodGen", + "name":"org.enso.interpreter.caches.PersistUtils$PersistArrayList", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Any", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Boolean", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.CreateProcessSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.EmptyMapMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Error", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ExitSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Is_normalizedTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Is_unixSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.LengthTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Map", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.NanoTimeSystemMethodGen", "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] }, { @@ -2367,6 +2754,10 @@ "name":"org.enso.interpreter.node.expression.builtin.error.GetAllArrayWarningMethodGen", "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] }, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.GetAllVectorWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, { "name":"org.enso.interpreter.node.expression.builtin.error.GetAttachedStackTraceMethodGen", "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] @@ -3055,6 +3446,10 @@ "name":"org.enso.interpreter.node.expression.builtin.resource.RegisterManagedResourceMethodGen", "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] }, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.TakeManagedResourceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, { "name":"org.enso.interpreter.node.expression.builtin.resource.WithMethodGen", "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] @@ -3190,6 +3585,405 @@ "name":"org.enso.runner.Main", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] }, +{ + "name":"org.enso.table.aggregations.Aggregator" +}, +{ + "name":"org.enso.table.aggregations.Concatenate" +}, +{ + "name":"org.enso.table.aggregations.Count" +}, +{ + "name":"org.enso.table.aggregations.CountDistinct" +}, +{ + "name":"org.enso.table.aggregations.CountEmpty" +}, +{ + "name":"org.enso.table.aggregations.CountNothing" +}, +{ + "name":"org.enso.table.aggregations.First" +}, +{ + "name":"org.enso.table.aggregations.GroupBy" +}, +{ + "name":"org.enso.table.aggregations.Last" +}, +{ + "name":"org.enso.table.aggregations.Mean" +}, +{ + "name":"org.enso.table.aggregations.MinOrMax" +}, +{ + "name":"org.enso.table.aggregations.Mode" +}, +{ + "name":"org.enso.table.aggregations.Percentile" +}, +{ + "name":"org.enso.table.aggregations.ShortestOrLongest" +}, +{ + "name":"org.enso.table.aggregations.StandardDeviation" +}, +{ + "name":"org.enso.table.aggregations.Sum" +}, +{ + "name":"org.enso.table.data.column.builder.BigIntegerBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.BoolBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.Builder" +}, +{ + "name":"org.enso.table.data.column.builder.DateBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.DateTimeBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.InferredBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.LossOfBigDecimalPrecision" +}, +{ + "name":"org.enso.table.data.column.builder.LossOfIntegerPrecision" +}, +{ + "name":"org.enso.table.data.column.builder.NumericBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.StringBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.TimeOfDayBuilder" +}, +{ + "name":"org.enso.table.data.column.operation.CountNothing" +}, +{ + "name":"org.enso.table.data.column.operation.UnaryOperation" +}, +{ + "name":"org.enso.table.data.column.operation.cast.CastProblemAggregator" +}, +{ + "name":"org.enso.table.data.column.operation.cast.ConversionFailure" +}, +{ + "name":"org.enso.table.data.column.operation.cast.ConversionFailureType" +}, +{ + "name":"org.enso.table.data.column.operation.map.MapOperationProblemAggregator" +}, +{ + "name":"org.enso.table.data.column.operation.unary.DatePartOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsEmptyOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsInfiniteOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsNaNOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsNothingOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.NotOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.TextLengthOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.TruncatedTimePartOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.UnaryRoundOperation" +}, +{ + "name":"org.enso.table.data.column.storage.Storage" +}, +{ + "name":"org.enso.table.data.column.storage.numeric.LongRangeStorage" +}, +{ + "name":"org.enso.table.data.column.storage.type.AnyObjectType" +}, +{ + "name":"org.enso.table.data.column.storage.type.BigDecimalType" +}, +{ + "name":"org.enso.table.data.column.storage.type.BigIntegerType" +}, +{ + "name":"org.enso.table.data.column.storage.type.Bits" +}, +{ + "name":"org.enso.table.data.column.storage.type.BooleanType" +}, +{ + "name":"org.enso.table.data.column.storage.type.DateTimeType" +}, +{ + "name":"org.enso.table.data.column.storage.type.DateType" +}, +{ + "name":"org.enso.table.data.column.storage.type.FloatType" +}, +{ + "name":"org.enso.table.data.column.storage.type.IntegerType" +}, +{ + "name":"org.enso.table.data.column.storage.type.StorageType" +}, +{ + "name":"org.enso.table.data.column.storage.type.TextType" +}, +{ + "name":"org.enso.table.data.column.storage.type.TimeOfDayType" +}, +{ + "name":"org.enso.table.data.index.MultiValueIndex" +}, +{ + "name":"org.enso.table.data.mask.OrderMask" +}, +{ + "name":"org.enso.table.data.table.Column" +}, +{ + "name":"org.enso.table.data.table.Table" +}, +{ + "name":"org.enso.table.data.table.TableToXml" +}, +{ + "name":"org.enso.table.data.table.join.JoinKind" +}, +{ + "name":"org.enso.table.data.table.join.conditions.Between" +}, +{ + "name":"org.enso.table.data.table.join.conditions.Equals" +}, +{ + "name":"org.enso.table.data.table.join.conditions.EqualsIgnoreCase" +}, +{ + "name":"org.enso.table.data.table.join.lookup.LookupColumnDescription" +}, +{ + "name":"org.enso.table.data.table.join.lookup.LookupJoin" +}, +{ + "name":"org.enso.table.data.table.problems.ArithmeticError" +}, +{ + "name":"org.enso.table.data.table.problems.ArithmeticOverflow" +}, +{ + "name":"org.enso.table.data.table.problems.FloatingPointGrouping" +}, +{ + "name":"org.enso.table.data.table.problems.IgnoredNaN" +}, +{ + "name":"org.enso.table.data.table.problems.IgnoredNothing" +}, +{ + "name":"org.enso.table.data.table.problems.IllegalArgumentError" +}, +{ + "name":"org.enso.table.data.table.problems.InvalidAggregation" +}, +{ + "name":"org.enso.table.data.table.problems.UnquotedCharactersInOutput" +}, +{ + "name":"org.enso.table.data.table.problems.UnquotedDelimiter" +}, +{ + "name":"org.enso.table.error.ColumnCountMismatchException" +}, +{ + "name":"org.enso.table.error.ColumnNameMismatchException" +}, +{ + "name":"org.enso.table.error.EmptyFileException" +}, +{ + "name":"org.enso.table.error.EmptySheetException" +}, +{ + "name":"org.enso.table.error.ExistingDataException" +}, +{ + "name":"org.enso.table.error.InvalidColumnNameException" +}, +{ + "name":"org.enso.table.error.InvalidLocationException" +}, +{ + "name":"org.enso.table.error.NonUniqueLookupKey" +}, +{ + "name":"org.enso.table.error.NullValuesInKeyColumns" +}, +{ + "name":"org.enso.table.error.RangeExceededException" +}, +{ + "name":"org.enso.table.error.TooManyColumnsException" +}, +{ + "name":"org.enso.table.error.UnmatchedRow" +}, +{ + "name":"org.enso.table.error.ValueTypeMismatchException" +}, +{ + "name":"org.enso.table.excel.ExcelConnectionPool" +}, +{ + "name":"org.enso.table.excel.ExcelFileFormat" +}, +{ + "name":"org.enso.table.excel.ExcelHeaders" +}, +{ + "name":"org.enso.table.excel.ExcelRange" +}, +{ + "name":"org.enso.table.excel.ReadOnlyExcelConnection" +}, +{ + "name":"org.enso.table.expressions.ExpressionVisitorImpl" +}, +{ + "name":"org.enso.table.formatting.AnyObjectFormatter" +}, +{ + "name":"org.enso.table.formatting.BooleanFormatter" +}, +{ + "name":"org.enso.table.formatting.DateFormatter" +}, +{ + "name":"org.enso.table.formatting.DateTimeFormatter" +}, +{ + "name":"org.enso.table.formatting.DecimalFormatter" +}, +{ + "name":"org.enso.table.formatting.IntegerFormatter" +}, +{ + "name":"org.enso.table.formatting.TextFormatter" +}, +{ + "name":"org.enso.table.formatting.TimeFormatter" +}, +{ + "name":"org.enso.table.operations.AddRowNumber" +}, +{ + "name":"org.enso.table.operations.AddRunning" +}, +{ + "name":"org.enso.table.operations.OrderBuilder" +}, +{ + "name":"org.enso.table.parsing.BooleanParser" +}, +{ + "name":"org.enso.table.parsing.DateParser" +}, +{ + "name":"org.enso.table.parsing.DateTimeParser" +}, +{ + "name":"org.enso.table.parsing.IdentityParser" +}, +{ + "name":"org.enso.table.parsing.NumberParser" +}, +{ + "name":"org.enso.table.parsing.TimeOfDayParser" +}, +{ + "name":"org.enso.table.parsing.TypeInferringParser" +}, +{ + "name":"org.enso.table.parsing.WhitespaceStrippingParser" +}, +{ + "name":"org.enso.table.parsing.problems.AdditionalInvalidRows" +}, +{ + "name":"org.enso.table.parsing.problems.InvalidFormat" +}, +{ + "name":"org.enso.table.parsing.problems.InvalidRow" +}, +{ + "name":"org.enso.table.parsing.problems.MismatchedQuote" +}, +{ + "name":"org.enso.table.parsing.problems.ParseProblemAggregator" +}, +{ + "name":"org.enso.table.problems.ProblemAggregator" +}, +{ + "name":"org.enso.table.read.DelimitedReader" +}, +{ + "name":"org.enso.table.read.ExcelReader" +}, +{ + "name":"org.enso.table.read.ParsingFailedException" +}, +{ + "name":"org.enso.table.read.QuoteStrippingParser" +}, +{ + "name":"org.enso.table.util.ColumnMapper" +}, +{ + "name":"org.enso.table.util.NameDeduplicator" +}, +{ + "name":"org.enso.table.util.problems.DuplicateNames" +}, +{ + "name":"org.enso.table.util.problems.InvalidNames" +}, +{ + "name":"org.enso.table.write.DelimitedWriter" +}, +{ + "name":"org.enso.table.write.ExcelWriter" +}, +{ + "name":"org.enso.table.write.ExistingDataMode" +}, +{ + "name":"org.enso.table.write.ExistingFileBehavior" +}, +{ + "name":"org.enso.table.write.WriteQuoteBehavior" +}, { "name":"org.graalvm.collections.Pair" }, @@ -3224,12 +4018,24 @@ { "name":"org.openide.util.RequestProcessor" }, +{ + "name":"org.sqlite.SQLiteErrorCode" +}, +{ + "name":"org.sqlite.SQLiteException" +}, +{ + "name":"org.w3c.dom.Attr" +}, { "name":"org.w3c.dom.Document" }, { "name":"org.w3c.dom.Element" }, +{ + "name":"org.w3c.dom.NamedNodeMap" +}, { "name":"org.w3c.dom.Node" }, @@ -3388,6 +4194,9 @@ "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"sun.security.util.ObjectIdentifier" +}, { "name":"sun.security.x509.AuthorityInfoAccessExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] @@ -3404,6 +4213,9 @@ "name":"sun.security.x509.CRLDistributionPointsExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] }, +{ + "name":"sun.security.x509.CertificateExtensions" +}, { "name":"sun.security.x509.CertificatePoliciesExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/resource-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/resource-config.json index db8b9343c210..e8b2a0b8e74e 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/resource-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/resource-config.json @@ -1,6 +1,8 @@ { "resources":{ "includes":[{ + "pattern":"\\QMETA-INF/native-image/com.oracle.truffle.espresso/native-image.properties\\E" + }, { "pattern":"\\QMETA-INF/org/enso/interpreter/node/expression/builtin/BuiltinMethods.metadata\\E" }, { "pattern":"\\QMETA-INF/org/enso/interpreter/node/expression/builtin/BuiltinTypes.metadata\\E" @@ -52,6 +54,8 @@ "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" }, { "pattern":"\\QMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory\\E" + }, { + "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E" }, { "pattern":"\\QMETA-INF/services/javax.xml.xpath.XPathFactory\\E" }, { @@ -166,6 +170,8 @@ "pattern":"\\Qversion.json\\E" }, { "pattern":"\\Qversion.properties\\E" + }, { + "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/nfkc.nrm\\E" }, { "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/uprops.icu\\E" }, { @@ -597,13 +603,13 @@ }]}, "bundles":[{ "name":"com.oracle.js.parser.resources.Messages", - "locales":[""] + "locales":["", "und"] }, { "name":"com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", - "locales":[""] + "locales":["", "und"] }, { "name":"com.sun.org.apache.xml.internal.serializer.XMLEntities", - "locales":[""] + "locales":["", "und"] }, { "name":"com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages", "classNames":["com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages", "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages_en"] From 41ef406574caa98871c4f937bf93b7c2c1da2986 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 10:53:50 +0200 Subject: [PATCH 42/57] Search from cwd is important for development setup --- .../parser/generate-java/java/org/enso/syntax2/Parser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java index 0447a154d73b..1b569a5e6090 100644 --- a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java +++ b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java @@ -45,7 +45,9 @@ private static void initializeLibraries() { System.load(path.getAbsolutePath()); } catch (NullPointerException | IllegalArgumentException | LinkageError e) { if (!searchFromDirToTop(e, root, "target", "rust", "debug", name)) { - throw new IllegalStateException("Cannot load parser from " + root, e); + if (!searchFromDirToTop(e, new File("."), "target", "rust", "debug", name)) { + throw new IllegalStateException("Cannot load parser from " + root, e); + } } } } From 582f3be4be20c9550cafd2c94f019fbac1051ab0 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 11:30:05 +0200 Subject: [PATCH 43/57] Relaxing the test as NI cannot provide location of the error (yet) --- test/Base_Tests/src/Data/Json_Spec.enso | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Base_Tests/src/Data/Json_Spec.enso b/test/Base_Tests/src/Data/Json_Spec.enso index 049e07e8ade5..2d9801ed46c3 100644 --- a/test/Base_Tests/src/Data/Json_Spec.enso +++ b/test/Base_Tests/src/Data/Json_Spec.enso @@ -65,11 +65,11 @@ add_specs suite_builder = group_builder.specify "should report meaningful parsing errors" <| "".should_fail_parsing_with "Empty string is not valid JSON." - "foo".should_fail_parsing_with "Unrecognized token 'foo': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line: 1, column: 4]" - "[,]".should_fail_parsing_with "Unexpected character (',' (code 44)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line: 1, column: 3]" - "{,}".should_fail_parsing_with "Unexpected character (',' (code 44)): was expecting double-quote to start field name at position [line: 1, column: 3]" + "foo".should_fail_parsing_with "Unrecognized token 'foo': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line:" + "[,]".should_fail_parsing_with "Unexpected character (',' (code 44)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line:" + "{,}".should_fail_parsing_with "Unexpected character (',' (code 44)): was expecting double-quote to start field name at position [line:" deep_err = '{ "foo": "bar", "baz": ["foo", "x"", false], "y": {"z": null, "w": null} }' - deep_err.should_fail_parsing_with 'Unexpected character (\'\"\' (code 34)): was expecting comma to separate Array entries at position [line: 1, column: 36]' + deep_err.should_fail_parsing_with 'Unexpected character (\'\"\' (code 34)): was expecting comma to separate Array entries at position [line:' "123 4".should_parse_as 123 # Jackson parser assumes this is "correct" group_builder.specify "should be able to deserialize using into via conversion" <| From 403e0d6868bb1228871890f38c28f3ca9c11f395 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 11:30:43 +0200 Subject: [PATCH 44/57] HttpClient.Version is being access --- distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso index 922d78b911dc..05a92252b3df 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP.enso @@ -31,6 +31,7 @@ from project.Data.Json.Extensions import all polyglot java import java.lang.Exception as JException polyglot java import java.net.http.HttpClient polyglot java import java.net.http.HttpClient.Redirect +polyglot java import java.net.http.HttpClient.Version polyglot java import java.net.http.HttpClient.Builder as ClientBuilder polyglot java import java.net.http.HttpRequest polyglot java import java.net.http.HttpRequest.BodyPublisher From cc14d91e8f42d4c52002b98b43c557fbd651304a Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 11:31:02 +0200 Subject: [PATCH 45/57] Manual tweaks to reflect-config.json file --- .../org/enso/runner/reflect-config.json | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index 5359a26e142e..e8e0dedd890e 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -668,6 +668,9 @@ { "name":"java.nio.file.Path" }, +{ + "name":"java.nio.file.WatchEvent$Modifier" +}, { "name":"java.nio.file.Path[]" }, @@ -1773,19 +1776,24 @@ "name":"org.enso.base.time.Time_Of_Day_Utils" }, { - "name":"org.enso.base_test_helpers.CallbackHelper" + "name":"org.enso.base_test_helpers.CallbackHelper", + "methods":[{"name":"runCallbackInt","parameterTypes":["java.util.function.Function","int"] }] }, { - "name":"org.enso.base_test_helpers.FileSystemHelper" + "name":"org.enso.base_test_helpers.FileSystemHelper", + "methods":[{"name":"setWritable","parameterTypes":["java.lang.String","boolean"] }] }, { - "name":"org.enso.base_test_helpers.IntHolder" + "name":"org.enso.base_test_helpers.IntHolder", + "methods":[{"name":"","parameterTypes":["int"] }] }, { - "name":"org.enso.base_test_helpers.IntHolderEquals" + "name":"org.enso.base_test_helpers.IntHolderEquals", + "methods":[{"name":"","parameterTypes":["int"] }] }, { - "name":"org.enso.base_test_helpers.Number_Utils" + "name":"org.enso.base_test_helpers.Number_Utils", + "methods":[{"name":"floatId","parameterTypes":["java.lang.Double"] }] }, { "name":"org.enso.compiler.core.ir.IrPersistance$PersistDiagnosticStorage", From 34424ae67cf74e5b2cb363d8337f50f475c116f0 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 12:40:54 +0200 Subject: [PATCH 46/57] Have to absolutize the file path --- .../parser/generate-java/java/org/enso/syntax2/Parser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java index 1b569a5e6090..d2c8a75fef2f 100644 --- a/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java +++ b/lib/rust/parser/generate-java/java/org/enso/syntax2/Parser.java @@ -45,7 +45,8 @@ private static void initializeLibraries() { System.load(path.getAbsolutePath()); } catch (NullPointerException | IllegalArgumentException | LinkageError e) { if (!searchFromDirToTop(e, root, "target", "rust", "debug", name)) { - if (!searchFromDirToTop(e, new File("."), "target", "rust", "debug", name)) { + if (!searchFromDirToTop( + e, new File(".").getAbsoluteFile(), "target", "rust", "debug", name)) { throw new IllegalStateException("Cannot load parser from " + root, e); } } From 71cfc0d350617390f4fcb8f57f00443177316989 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 13:07:04 +0200 Subject: [PATCH 47/57] Avoid asGuestValue in EnsoProjectNode --- .../lib/Standard/Base/0.0.0-dev/src/Meta/Enso_Project.enso | 6 +++--- .../node/expression/builtin/meta/EnsoProjectNode.java | 5 +++-- .../node/expression/builtin/meta/ProjectDescription.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Meta/Enso_Project.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Meta/Enso_Project.enso index e6a98f22370c..7a7af704033a 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Meta/Enso_Project.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Meta/Enso_Project.enso @@ -45,7 +45,7 @@ type Project_Description Arguments: - prim_root_file: The primitive root file of the project. - prim_config: The primitive config of the project. - private Value prim_root_file prim_config + private Value prim_root_file ns:Text n:Text ## GROUP Metadata ICON folder @@ -78,7 +78,7 @@ type Project_Description enso_project.name name : Text - name self = self.prim_config.name + name self = self.n ## GROUP Metadata ICON metadata @@ -89,7 +89,7 @@ type Project_Description enso_project.namespace namespace : Text - namespace self = self.prim_config.namespace + namespace self = self.ns ## ICON enso_icon Returns the Enso project description for the project that the engine was diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/EnsoProjectNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/EnsoProjectNode.java index 69084e337a72..09d3a7f3f7a7 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/EnsoProjectNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/EnsoProjectNode.java @@ -98,10 +98,11 @@ private static Package getMainProjectFromCtx(EnsoContext ctx) { private static Atom createProjectDescriptionAtom(EnsoContext ctx, Package pkg) { var rootPath = new EnsoFile(pkg.root().normalize()); - var cfg = ctx.asGuestValue(pkg.getConfig()); + var namespace = pkg.getConfig().namespace(); + var name = pkg.getConfig().name(); var cons = ctx.getBuiltins().getProjectDescription().getUniqueConstructor(); - return AtomNewInstanceNode.getUncached().newInstance(cons, rootPath, cfg); + return AtomNewInstanceNode.getUncached().newInstance(cons, rootPath, namespace, name); } private DataflowError unsupportedArgsError(Object moduleActual) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/ProjectDescription.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/ProjectDescription.java index 053a96a3dceb..6d93c6805cae 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/ProjectDescription.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/ProjectDescription.java @@ -13,6 +13,6 @@ protected String getConstructorName() { @Override protected List getConstructorParamNames() { - return List.of("prim_root_file", "prim_config"); + return List.of("prim_root_file", "ns", "n"); } } From 2b9be62d4d6672021569b41dba56290e2da442b5 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 13:19:47 +0200 Subject: [PATCH 48/57] Need to read statusCode from EnsoHttpResponse --- .../lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso | 2 ++ 1 file changed, 2 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso index febf5b30ebc2..03f788738477 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso @@ -25,6 +25,8 @@ from project.Data.Text.Extensions import all from project.Metadata import Display, Widget from project.Network.HTTP.Response_Body import decode_format_selector +polyglot java import org.enso.base.enso_cloud.EnsoHttpResponse + type Response ## PRIVATE From a1bff6efb7f4fd7dfdfd15f0de708ddc9c6a8aaa Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 13:20:12 +0200 Subject: [PATCH 49/57] Test is accessing IntHolder value and boxed fields --- .../META-INF/native-image/org/enso/runner/reflect-config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index e8e0dedd890e..9e666fecce08 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -1785,7 +1785,8 @@ }, { "name":"org.enso.base_test_helpers.IntHolder", - "methods":[{"name":"","parameterTypes":["int"] }] + "methods":[{"name":"","parameterTypes":["int"] }], + "fields":[{"name":"value"}, {"name":"boxed"}] }, { "name":"org.enso.base_test_helpers.IntHolderEquals", From c4fb3db09fbcbef42c56f88b3f4d48e3e4bc26ae Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 14:30:25 +0200 Subject: [PATCH 50/57] Re-adding @Tail_Call as #9251 is fixed --- distribution/lib/Standard/Test/0.0.0-dev/src/Test.enso | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/distribution/lib/Standard/Test/0.0.0-dev/src/Test.enso b/distribution/lib/Standard/Test/0.0.0-dev/src/Test.enso index 6fe511012264..bc7e7d83716a 100644 --- a/distribution/lib/Standard/Test/0.0.0-dev/src/Test.enso +++ b/distribution/lib/Standard/Test/0.0.0-dev/src/Test.enso @@ -205,8 +205,5 @@ type Test if i % 10 == 0 then IO.println 'Still failing after '+i.to_text+' retries ('+loc.to_display_text+'):\n'+caught_panic.payload.to_display_text Thread.sleep milliseconds_between_attempts - ## TODO This used to be - @Tail_Call go (i+1) - We should re-add the tail call once https://github.com/enso-org/enso/issues/9251 is fixed. - go (i+1) + @Tail_Call go (i+1) go 1 From 31a3de8782b4f4bb330884a1ebe5e65ce906b8ea Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 14:48:55 +0200 Subject: [PATCH 51/57] test/Base_Tests shall be executed with assertions enabled --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index dcc89a8c051c..bd30dfed9c0a 100644 --- a/build.sbt +++ b/build.sbt @@ -2614,6 +2614,7 @@ lazy val `engine-runner` = project "-H:IncludeResources=.*Main.enso$", "-H:+AddAllCharsets", "-H:+IncludeAllLocales", + "-ea", // useful perf & debug switches: // "-g", // "-H:+SourceLevelDebug", From b2caa90ff4973def110222b1c96ca6c81e9b106a Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 14:49:18 +0200 Subject: [PATCH 52/57] HTTP Response is using a lot of Java classes --- .../lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso | 2 ++ 1 file changed, 2 insertions(+) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso index 03f788738477..44fe5a0de624 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Network/HTTP/Response.enso @@ -25,7 +25,9 @@ from project.Data.Text.Extensions import all from project.Metadata import Display, Widget from project.Network.HTTP.Response_Body import decode_format_selector +polyglot java import java.net.http.HttpHeaders polyglot java import org.enso.base.enso_cloud.EnsoHttpResponse +polyglot java import java.util.Optional type Response ## PRIVATE From 1bae3745c6544b60eef4dcca9c8bd7a2065be517 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 15:30:37 +0200 Subject: [PATCH 53/57] polyglot java import JsonLocation to be able to extract line and column number --- .../lib/Standard/Base/0.0.0-dev/src/Data/Json.enso | 6 +++--- test/Base_Tests/src/Data/Json_Spec.enso | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso index 1fcec753fb5c..1dc72a6ea39e 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Json.enso @@ -13,7 +13,6 @@ import project.Data.Time.Time_Of_Day.Time_Of_Day import project.Data.Vector.Vector import project.Error.Error import project.Errors.Common.No_Such_Conversion -import project.Errors.Common.No_Such_Method import project.Errors.Common.Type_Error import project.Errors.Illegal_Argument.Illegal_Argument import project.Errors.No_Such_Key.No_Such_Key @@ -31,6 +30,7 @@ from project.Data.Text.Extensions import all from project.Metadata.Choice import Option from project.Metadata.Widget import Single_Choice +polyglot java import com.fasterxml.jackson.core.JsonLocation polyglot java import com.fasterxml.jackson.core.JsonProcessingException polyglot java import com.fasterxml.jackson.databind.JsonNode polyglot java import com.fasterxml.jackson.databind.node.ArrayNode @@ -61,8 +61,8 @@ type Json parse : Text -> Nothing | Boolean | Number | Text | Vector | Date | Date_Time | Time_Of_Day | JS_Object ! Invalid_JSON parse (json : Text) = error_handler js_exception = - line = Panic.catch No_Such_Method js_exception.payload.getLocation.getLineNr.to_text (_->"...") - col = Panic.catch No_Such_Method js_exception.payload.getLocation.getColumnNr.to_text (_->"...") + line = js_exception.payload.getLocation.getLineNr.to_text + col = js_exception.payload.getLocation.getColumnNr.to_text pos = '[line: '+line+', column: '+col+']' Error.throw (Invalid_JSON.Error js_exception.payload.getOriginalMessage+' at position '+pos) diff --git a/test/Base_Tests/src/Data/Json_Spec.enso b/test/Base_Tests/src/Data/Json_Spec.enso index 2d9801ed46c3..049e07e8ade5 100644 --- a/test/Base_Tests/src/Data/Json_Spec.enso +++ b/test/Base_Tests/src/Data/Json_Spec.enso @@ -65,11 +65,11 @@ add_specs suite_builder = group_builder.specify "should report meaningful parsing errors" <| "".should_fail_parsing_with "Empty string is not valid JSON." - "foo".should_fail_parsing_with "Unrecognized token 'foo': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line:" - "[,]".should_fail_parsing_with "Unexpected character (',' (code 44)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line:" - "{,}".should_fail_parsing_with "Unexpected character (',' (code 44)): was expecting double-quote to start field name at position [line:" + "foo".should_fail_parsing_with "Unrecognized token 'foo': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line: 1, column: 4]" + "[,]".should_fail_parsing_with "Unexpected character (',' (code 44)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at position [line: 1, column: 3]" + "{,}".should_fail_parsing_with "Unexpected character (',' (code 44)): was expecting double-quote to start field name at position [line: 1, column: 3]" deep_err = '{ "foo": "bar", "baz": ["foo", "x"", false], "y": {"z": null, "w": null} }' - deep_err.should_fail_parsing_with 'Unexpected character (\'\"\' (code 34)): was expecting comma to separate Array entries at position [line:' + deep_err.should_fail_parsing_with 'Unexpected character (\'\"\' (code 34)): was expecting comma to separate Array entries at position [line: 1, column: 36]' "123 4".should_parse_as 123 # Jackson parser assumes this is "correct" group_builder.specify "should be able to deserialize using into via conversion" <| From 562e611f6bef4618ee076e37a988d54320314f91 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 19:04:00 +0200 Subject: [PATCH 54/57] Factorial sample program is no longer needed --- build/build/src/engine/context.rs | 14 -------------- docs/infrastructure/native-image.md | 11 +++++------ engine/runner/src/test/resources/Factorial.enso | 12 ------------ 3 files changed, 5 insertions(+), 32 deletions(-) delete mode 100644 engine/runner/src/test/resources/Factorial.enso diff --git a/build/build/src/engine/context.rs b/build/build/src/engine/context.rs index 7c670c1df94b..3bc0778196c9 100644 --- a/build/build/src/engine/context.rs +++ b/build/build/src/engine/context.rs @@ -635,20 +635,6 @@ pub async fn runner_sanity_test( let engine_package = repo_root.built_distribution.enso_engine_triple.engine_package.as_path(); // The engine package is necessary for running the native runner. ide_ci::fs::tokio::require_exist(engine_package).await?; - let output = Command::new(&repo_root.runner) - .args([ - "--run", - repo_root.engine.runner.src.test.resources.factorial_enso.as_str(), - factorial_input, - ]) - .set_env_opt(ENSO_JAVA, enso_java)? - .set_env(ENSO_DATA_DIRECTORY, engine_package)? - .run_stdout() - .await?; - ensure!( - output.contains(factorial_expected_output), - "Native runner output does not contain expected result '{factorial_expected_output}'. Output:\n{output}", - ); if enso_java.is_none() { let test_base = Command::new(&repo_root.runner) .args(["--run", repo_root.test.join("Base_Tests").as_str()]) diff --git a/docs/infrastructure/native-image.md b/docs/infrastructure/native-image.md index 3dd872d00a80..b1091285b21f 100644 --- a/docs/infrastructure/native-image.md +++ b/docs/infrastructure/native-image.md @@ -207,17 +207,16 @@ state. To generate the Native Image for runner simply execute sbt> engine-runner/buildNativeImage ``` -and execute the binary on a sample factorial test program +and execute any program with that binary - for example `test/Base_Tests` ```bash -> runner --run engine/runner/src/test/resources/Factorial.enso 6 +$ runner --run test/Base_Tests ``` The task that generates the Native Image, along with all the necessary -configuration, reside in a separate project due to a bug in the currently used -GraalVM version. As September 2023 it can execute all Enso code, but cannot -invoke `IO.println` or other library functions that require -[polyglot java import](../../docs/polyglot/java.md), but read on... +configuration, makes sure that `Standard.Base` library calls into Java via +[polyglot java import](../../docs/polyglot/java.md) are compiled into the binary +and ready to be used. ### Engine with Espresso diff --git a/engine/runner/src/test/resources/Factorial.enso b/engine/runner/src/test/resources/Factorial.enso deleted file mode 100644 index ef86800b699f..000000000000 --- a/engine/runner/src/test/resources/Factorial.enso +++ /dev/null @@ -1,12 +0,0 @@ -import Standard.Base.Data.Numbers -import Standard.Base.IO - -fac n = - facacc n v = if n <= 1 then v else @Tail_Call facacc n-1 n*v - - res = facacc n 1 - res - -main number=5 = - v = fac number - IO.println v From b8b4aae4f49b8c6d8f961bf544b47dc4c2f6d6ac Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 19:15:49 +0200 Subject: [PATCH 55/57] Removing unused variables --- build/build/src/engine/context.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/build/src/engine/context.rs b/build/build/src/engine/context.rs index 3bc0778196c9..8da68903ab0e 100644 --- a/build/build/src/engine/context.rs +++ b/build/build/src/engine/context.rs @@ -630,8 +630,6 @@ pub async fn runner_sanity_test( repo_root: &crate::paths::generated::RepoRoot, enso_java: Option<&str>, ) -> Result { - let factorial_input = "6"; - let factorial_expected_output = "720"; let engine_package = repo_root.built_distribution.enso_engine_triple.engine_package.as_path(); // The engine package is necessary for running the native runner. ide_ci::fs::tokio::require_exist(engine_package).await?; From 8d0684c9b74a009a45f5b01e55056cf937dbe24b Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 19:48:21 +0200 Subject: [PATCH 56/57] Including Input_Stream_Spec in the Base_Tests --- .../META-INF/native-image/org/enso/runner/reflect-config.json | 4 ++++ test/Base_Tests/src/Main.enso | 2 ++ 2 files changed, 6 insertions(+) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index 9e666fecce08..bcfb3e1fce1b 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -1796,6 +1796,10 @@ "name":"org.enso.base_test_helpers.Number_Utils", "methods":[{"name":"floatId","parameterTypes":["java.lang.Double"] }] }, +{ + "name":"org.enso.base_test_helpers.RangeStream", + "methods":[{"name":"","parameterTypes":["int", "int"] }] +}, { "name":"org.enso.compiler.core.ir.IrPersistance$PersistDiagnosticStorage", "methods":[{"name":"","parameterTypes":[] }] diff --git a/test/Base_Tests/src/Main.enso b/test/Base_Tests/src/Main.enso index 8b5c42e25c27..80e6ef962052 100644 --- a/test/Base_Tests/src/Main.enso +++ b/test/Base_Tests/src/Main.enso @@ -85,6 +85,7 @@ import project.Runtime.Stack_Traces_Spec import project.System.Environment_Spec import project.System.File_Spec import project.System.File_Read_Spec +import project.System.Input_Stream_Spec import project.System.Process_Spec import project.System.Reporting_Stream_Decoder_Spec import project.System.Reporting_Stream_Encoder_Spec @@ -112,6 +113,7 @@ main filter=Nothing = File_Spec.add_specs suite_builder Temporary_File_Spec.add_specs suite_builder File_Read_Spec.add_specs suite_builder + Input_Stream_Spec.add_specs suite_builder Reporting_Stream_Decoder_Spec.add_specs suite_builder Reporting_Stream_Encoder_Spec.add_specs suite_builder Http_Header_Spec.add_specs suite_builder From bfa60b4c2761ed9e09b6648b32334130a56e0497 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 20 Jun 2024 20:33:19 +0200 Subject: [PATCH 57/57] Testing InputStreamLike with and without available member --- .../src/System/Input_Stream_Spec.enso | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/Base_Tests/src/System/Input_Stream_Spec.enso b/test/Base_Tests/src/System/Input_Stream_Spec.enso index 4d1423c1296f..8121dbf587e6 100644 --- a/test/Base_Tests/src/System/Input_Stream_Spec.enso +++ b/test/Base_Tests/src/System/Input_Stream_Spec.enso @@ -6,12 +6,33 @@ import Standard.Base.System.Input_Stream.Input_Stream from Standard.Test import all polyglot java import org.enso.base_test_helpers.RangeStream +polyglot java import org.enso.base.Stream_Utils main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder suite.run_with_filter filter + +foreign js is_like data available = """ + let at = 0 + let is = { + read : function(arr, off, len) { + let cnt = 0; + while (len-- > 0) { + arr[off++] = data[at++]; + cnt++; + } + return cnt; + } + } + if (available) { + is.available = function() { + return data.length - at; + }; + } + return is; + add_specs suite_builder = suite_builder.group "Input Stream" group_builder-> group_builder.specify "should be peekable if backed by memory" <| Managed_Resource.bracket (Input_Stream.from_bytes [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) (.close) stream-> @@ -61,3 +82,33 @@ add_specs suite_builder = suite_builder.group "Input Stream" group_builder-> promoted_stream.peek_bytes 10 . should_equal [100, 101, 102, 103, 104] # The read still succeeds - ensuring there isn't some early EOF promoted_stream.read_n_bytes 10 . should_equal [100, 101, 102, 103, 104] + + group_builder.specify "read without available" <| + stream_like = is_like [20, 5, 1, 10] False + is = Stream_Utils.asInputStream stream_like + is.available . should_equal 0 + + is.read . should_equal 20 + is.read . should_equal 5 + + is.available . should_equal 0 + + is.read . should_equal 1 + is.read . should_equal 10 + + is.available . should_equal 0 + + group_builder.specify "read with available" <| + stream_like = is_like [20, 6, 8, 23] True + is = Stream_Utils.asInputStream stream_like + is.available . should_equal 4 + + is.read . should_equal 20 + is.read . should_equal 6 + + is.available . should_equal 2 + + is.read . should_equal 8 + is.read . should_equal 23 + + is.available . should_equal 0