From 6dfb7035622272c94a1df4bbb7e929fe5f072b48 Mon Sep 17 00:00:00 2001 From: James Roome Date: Mon, 29 Jun 2026 20:25:59 +0530 Subject: [PATCH] Was failing with when processing a wasm with an import/export TAG. Added generation for tag import. Export TAG has no generation but is skipped, enabling generation to complete. --- .../processor/WasmModuleProcessorTest.java | 32 ++++++++++++++---- .../src/test/resources/TagExportModule.java | 6 ++++ .../src/test/resources/TagImportModule.java | 6 ++++ .../src/test/resources/tag-export.wasm | Bin 0 -> 53 bytes .../src/test/resources/tag-import.wasm | Bin 0 -> 67 bytes .../codegen/ModuleInterfaceCodegen.java | 14 ++++++++ 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 annotations/processor/src/test/resources/TagExportModule.java create mode 100644 annotations/processor/src/test/resources/TagImportModule.java create mode 100644 annotations/processor/src/test/resources/tag-export.wasm create mode 100644 annotations/processor/src/test/resources/tag-import.wasm diff --git a/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java b/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java index e6063a81..7b644abf 100644 --- a/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java +++ b/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java @@ -9,11 +9,14 @@ class WasmModuleProcessorTest { + private static Compilation compile(String source) { + return javac().withProcessors(new WasmModuleProcessor()) + .compile(JavaFileObjects.forResource(source)); + } + @Test void resolvesWasmModuleFromClassPathNotJustClassOutput() { - Compilation compilation = - javac().withProcessors(new WasmModuleProcessor()) - .compile(JavaFileObjects.forResource("IterFactModule.java")); + Compilation compilation = compile("IterFactModule.java"); assertThat(compilation).succeededWithoutWarnings(); @@ -22,9 +25,7 @@ void resolvesWasmModuleFromClassPathNotJustClassOutput() { @Test void reportsMissingWasmModule() { - Compilation compilation = - javac().withProcessors(new WasmModuleProcessor()) - .compile(JavaFileObjects.forResource("MissingModule.java")); + Compilation compilation = compile("MissingModule.java"); assertThat(compilation).failed(); @@ -32,4 +33,23 @@ void reportsMissingWasmModule() { .hadErrorContaining("Failed to load wasmFile") .inFile(JavaFileObjects.forResource("MissingModule.java")); } + + @Test + void skipsTagExportAndStillGeneratesFunctionExport() { + Compilation compilation = compile("TagExportModule.java"); + + assertThat(compilation).succeededWithoutWarnings(); + + assertThat(compilation).generatedSourceFile("endive.testing.TagExportModule_ModuleExports"); + } + + @Test + void generatesTagImportBindingAlongsideFunctionImport() { + Compilation compilation = compile("TagImportModule.java"); + + assertThat(compilation).succeededWithoutWarnings(); + + assertThat(compilation).generatedSourceFile("endive.testing.TagImportModule_Host"); + assertThat(compilation).generatedSourceFile("endive.testing.TagImportModule_ModuleImports"); + } } diff --git a/annotations/processor/src/test/resources/TagExportModule.java b/annotations/processor/src/test/resources/TagExportModule.java new file mode 100644 index 00000000..647199b2 --- /dev/null +++ b/annotations/processor/src/test/resources/TagExportModule.java @@ -0,0 +1,6 @@ +package endive.testing; + +import run.endive.annotations.WasmModuleInterface; + +@WasmModuleInterface("tag-export.wasm") +public class TagExportModule {} diff --git a/annotations/processor/src/test/resources/TagImportModule.java b/annotations/processor/src/test/resources/TagImportModule.java new file mode 100644 index 00000000..45653c0c --- /dev/null +++ b/annotations/processor/src/test/resources/TagImportModule.java @@ -0,0 +1,6 @@ +package endive.testing; + +import run.endive.annotations.WasmModuleInterface; + +@WasmModuleInterface("tag-import.wasm") +public class TagImportModule {} diff --git a/annotations/processor/src/test/resources/tag-export.wasm b/annotations/processor/src/test/resources/tag-export.wasm new file mode 100644 index 0000000000000000000000000000000000000000..00f457f12024c37facf8794c29db0f7b0d224c68 GIT binary patch literal 53 zcmZQbEY4+QU|?Y6VoG4FX8>ZxdS)g@MqXy1C_5h$OG&0~Z@33xfg! FHvr0!2I2q! literal 0 HcmV?d00001 diff --git a/annotations/processor/src/test/resources/tag-import.wasm b/annotations/processor/src/test/resources/tag-import.wasm new file mode 100644 index 0000000000000000000000000000000000000000..bdf5df0542121b1313d9824c83eb2f66ffb099c8 GIT binary patch literal 67 zcmZQbEY4+QU|?Y6WJ+MHXGmaRtY?y7V#&xaE@95ePiJ6&FjFg%Sr{0YnHU+_IT%?| R^5fGO7`fOOSr{A{xB;Q+3s3+6 literal 0 HcmV?d00001 diff --git a/codegen/src/main/java/run/endive/codegen/ModuleInterfaceCodegen.java b/codegen/src/main/java/run/endive/codegen/ModuleInterfaceCodegen.java index 0b6adb31..028f9ae0 100644 --- a/codegen/src/main/java/run/endive/codegen/ModuleInterfaceCodegen.java +++ b/codegen/src/main/java/run/endive/codegen/ModuleInterfaceCodegen.java @@ -153,6 +153,8 @@ public Map generate() { case FUNCTION: exportFieldType = parseType("ExportFunction"); break; + case TAG: + continue; } exportsClass.addField( exportFieldType, @@ -479,6 +481,18 @@ exportApplyHandle, new IntegerLiteralExpr("0")), "addTable", NodeList.nodeList(importObj.apply("ImportTable")))); continue; + } else if (importedFun.importType() == ExternalType.TAG) { + cu.addImport("run.endive.runtime.TagInstance"); + importMethod.setType("TagInstance"); + importMethod.removeBody(); + + importsCu.addImport("run.endive.runtime.ImportTag"); + toImportValuesBody.addStatement( + new MethodCallExpr( + new NameExpr("imports"), + "addTag", + NodeList.nodeList(importObj.apply("ImportTag")))); + continue; } // we now know it's a function assert (importedFun.importType() == ExternalType.FUNCTION);