From 7c7021db60eaa93e83ec0ad7683c20024dec698f Mon Sep 17 00:00:00 2001 From: Hugo Guerrier Date: Tue, 10 Dec 2024 18:08:53 +0100 Subject: [PATCH 1/2] Add a default LKQL options instance Do this to avoid the obligation to explicitly pass the "lkql.options" option when create an Polyglot context. --- .../main/java/com/adacore/lkql_jit/LKQLContext.java | 10 ++++++++-- .../main/java/com/adacore/lkql_jit/LKQLLanguage.java | 2 +- .../java/com/adacore/lkql_jit/options/LKQLOptions.java | 5 +++++ testsuite/tests/interop/function/Main.java | 10 +--------- testsuite/tests/interop/iterator/Main.java | 10 +--------- testsuite/tests/interop/list/Main.java | 10 +--------- testsuite/tests/interop/list_comp/Main.java | 10 +--------- testsuite/tests/interop/namespace/Main.java | 10 +--------- testsuite/tests/interop/null/Main.java | 10 +--------- testsuite/tests/interop/object/Main.java | 10 +--------- testsuite/tests/interop/pattern/Main.java | 10 +--------- testsuite/tests/interop/tuple/Main.java | 10 +--------- testsuite/tests/interop/unit/Main.java | 10 +--------- 13 files changed, 24 insertions(+), 93 deletions(-) diff --git a/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLContext.java b/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLContext.java index dde4e2ad1..0758a6a57 100644 --- a/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLContext.java +++ b/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLContext.java @@ -246,8 +246,14 @@ public void patchContext(TruffleLanguage.Env newEnv) { public LKQLOptions getOptions() { if (this.options == null) { final var optionsSource = this.env.getOptions().get(LKQLLanguage.options); - final var jsonObject = new JSONObject(new JSONTokener(optionsSource)); - this.options = LKQLOptions.fromJson(jsonObject); + + // If the "lkql.options" value is empty, get default options. + if (!optionsSource.isBlank()) { + final var jsonObject = new JSONObject(new JSONTokener(optionsSource)); + this.options = LKQLOptions.fromJson(jsonObject); + } else { + this.options = LKQLOptions.getDefault(); + } } return this.options; } diff --git a/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLLanguage.java b/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLLanguage.java index df898a198..297b176f0 100644 --- a/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLLanguage.java +++ b/lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLLanguage.java @@ -91,7 +91,7 @@ public final class LKQLLanguage extends TruffleLanguage { help = "Options for the LKQL engine as a JSON object", category = OptionCategory.INTERNAL, stability = OptionStability.STABLE) - static final OptionKey options = new OptionKey<>("{}"); + static final OptionKey options = new OptionKey<>(""); Liblkqllang.AnalysisContext lkqlAnalysisContext; diff --git a/lkql_jit/options/src/main/java/com/adacore/lkql_jit/options/LKQLOptions.java b/lkql_jit/options/src/main/java/com/adacore/lkql_jit/options/LKQLOptions.java index 8538c6062..3732b2412 100644 --- a/lkql_jit/options/src/main/java/com/adacore/lkql_jit/options/LKQLOptions.java +++ b/lkql_jit/options/src/main/java/com/adacore/lkql_jit/options/LKQLOptions.java @@ -122,6 +122,11 @@ public static LKQLOptions fromJson(JSONObject jsonLKQLOptions) { AutoFixMode.valueOf(jsonLKQLOptions.getString("autoFixMode"))); } + /** Get a default options instance. */ + public static LKQLOptions getDefault() { + return new Builder().build(); + } + // ----- Instance methods ----- /** Serialize the LKQL options to a JSON object. */ diff --git a/testsuite/tests/interop/function/Main.java b/testsuite/tests/interop/function/Main.java index 8a5156d84..3a588f635 100644 --- a/testsuite/tests/interop/function/Main.java +++ b/testsuite/tests/interop/function/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/iterator/Main.java b/testsuite/tests/interop/iterator/Main.java index 10870ff6f..a37877384 100644 --- a/testsuite/tests/interop/iterator/Main.java +++ b/testsuite/tests/interop/iterator/Main.java @@ -8,15 +8,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", "val list = [1, \"Hello\", [1, 2]]"); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/list/Main.java b/testsuite/tests/interop/list/Main.java index 124ec5c12..ed6177cff 100644 --- a/testsuite/tests/interop/list/Main.java +++ b/testsuite/tests/interop/list/Main.java @@ -14,15 +14,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/list_comp/Main.java b/testsuite/tests/interop/list_comp/Main.java index 1693c624a..cdb245acc 100644 --- a/testsuite/tests/interop/list_comp/Main.java +++ b/testsuite/tests/interop/list_comp/Main.java @@ -14,15 +14,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/namespace/Main.java b/testsuite/tests/interop/namespace/Main.java index 1b0a7198e..301fe6c4d 100644 --- a/testsuite/tests/interop/namespace/Main.java +++ b/testsuite/tests/interop/namespace/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/null/Main.java b/testsuite/tests/interop/null/Main.java index ba47b49ed..633c13e1c 100644 --- a/testsuite/tests/interop/null/Main.java +++ b/testsuite/tests/interop/null/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/object/Main.java b/testsuite/tests/interop/object/Main.java index 732f7508c..80135f644 100644 --- a/testsuite/tests/interop/object/Main.java +++ b/testsuite/tests/interop/object/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/pattern/Main.java b/testsuite/tests/interop/pattern/Main.java index 2659d0f07..7651a2307 100644 --- a/testsuite/tests/interop/pattern/Main.java +++ b/testsuite/tests/interop/pattern/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/tuple/Main.java b/testsuite/tests/interop/tuple/Main.java index 282817e4a..e544a0c5f 100644 --- a/testsuite/tests/interop/tuple/Main.java +++ b/testsuite/tests/interop/tuple/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); diff --git a/testsuite/tests/interop/unit/Main.java b/testsuite/tests/interop/unit/Main.java index b26c2338e..18871cc60 100644 --- a/testsuite/tests/interop/unit/Main.java +++ b/testsuite/tests/interop/unit/Main.java @@ -13,15 +13,7 @@ private static void print(String messageName, Object value) { } public static void main(String[] args) { - Context context = Context - .newBuilder("lkql") - .option( - "lkql.options", new LKQLOptions.Builder() - .projectFile("default_project/default.gpr") - .build() - .toJson() - .toString() - ).build(); + Context context = Context.newBuilder("lkql").build(); Value executable = context.parse("lkql", LKQL_SOURCE); Value namespace = executable.execute(false); From 50c0741851c53b89d310e5e26c0ffe52a732f305 Mon Sep 17 00:00:00 2001 From: Hugo Guerrier Date: Tue, 10 Dec 2024 18:10:06 +0100 Subject: [PATCH 2/2] Add newlines to the big list literal in 'ListComprehensionBenchmark' Having a too long list literal caused column number to overflow (they are stored in a "short" value). --- .../lkql_jit/benchmarks/ListComprehensionBenchmark.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lkql_jit/benchmarks/src/test/java/com/adacore/lkql_jit/benchmarks/ListComprehensionBenchmark.java b/lkql_jit/benchmarks/src/test/java/com/adacore/lkql_jit/benchmarks/ListComprehensionBenchmark.java index 5795e96a3..e2dba9dfc 100644 --- a/lkql_jit/benchmarks/src/test/java/com/adacore/lkql_jit/benchmarks/ListComprehensionBenchmark.java +++ b/lkql_jit/benchmarks/src/test/java/com/adacore/lkql_jit/benchmarks/ListComprehensionBenchmark.java @@ -31,14 +31,14 @@ public class ListComprehensionBenchmark extends TruffleBenchmark { /** The source for the LKQL list comprehension value. */ private static final String lkqlSource = """ - val generator = %s + val generator = [%s] val result = [x * 2 for x in generator].to_list """; /** The fibonacci function in JS */ private static final String jsSource = """ - var generator = %s; + var generator = [%s]; var result = generator.map(x => x * 2); """; @@ -55,7 +55,9 @@ public void setup() { for (int i = 0; i < size; i++) { this.generator[i] = i; } - final String generatorLiteral = Arrays.toString(this.generator); + final String generatorLiteral = + String.join( + ",\n", Arrays.stream(this.generator).mapToObj(Integer::toString).toList()); this.lkqlListComp = lkqlSource.formatted(generatorLiteral); this.jsListComp = jsSource.formatted(generatorLiteral); }