From b70b76ad9336c6569bf2b7a2632561e597cfbce3 Mon Sep 17 00:00:00 2001 From: Andrea Peruffo Date: Tue, 25 Mar 2025 13:49:08 +0000 Subject: [PATCH] Java prism iteration 2 --- java-wasm/pom.xml | 35 +++++++++- .../org/prism/WasmResource.java | 7 ++ java-wasm/src/main/java/org/prism/Prism.java | 65 ++++++++++++------- .../src/test/java/org/prism/DummyTest.java | 2 +- 4 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 java-wasm/src/main/java-templates/org/prism/WasmResource.java diff --git a/java-wasm/pom.xml b/java-wasm/pom.xml index d5b721c17f..884be45aca 100644 --- a/java-wasm/pom.xml +++ b/java-wasm/pom.xml @@ -15,7 +15,7 @@ 11 11 - 1.1.1 + 1.2.1 5.12.1 @@ -45,10 +45,43 @@ junit-jupiter-engine ${junit.version} + + com.dylibso.chicory + host-module-annotations-experimental + provided + + + org.codehaus.mojo + templating-maven-plugin + 3.0.0 + + + filtering-java-templates + + filter-sources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.0 + + 11 + + + com.dylibso.chicory + host-module-processor-experimental + ${chicory.version} + + + + org.apache.maven.plugins maven-surefire-plugin diff --git a/java-wasm/src/main/java-templates/org/prism/WasmResource.java b/java-wasm/src/main/java-templates/org/prism/WasmResource.java new file mode 100644 index 0000000000..48f2671714 --- /dev/null +++ b/java-wasm/src/main/java-templates/org/prism/WasmResource.java @@ -0,0 +1,7 @@ +package org.prism; + +public final class WasmResource { + public static final String absoluteFile = "file://${project.basedir}/src/test/resources/prism.wasm"; + + private WasmResource() {} +} diff --git a/java-wasm/src/main/java/org/prism/Prism.java b/java-wasm/src/main/java/org/prism/Prism.java index d0562aa4ae..12a6f1ee31 100644 --- a/java-wasm/src/main/java/org/prism/Prism.java +++ b/java-wasm/src/main/java/org/prism/Prism.java @@ -1,7 +1,8 @@ package org.prism; import com.dylibso.chicory.runtime.ByteArrayMemory; -import com.dylibso.chicory.runtime.ExportFunction; +import com.dylibso.chicory.experimental.hostmodule.annotations.WasmModuleInterface; +import com.dylibso.chicory.runtime.ByteArrayMemory; import com.dylibso.chicory.runtime.ImportValues; import com.dylibso.chicory.runtime.Instance; import com.dylibso.chicory.wasi.WasiOptions; @@ -9,16 +10,11 @@ import java.nio.charset.StandardCharsets; +@WasmModuleInterface(WasmResource.absoluteFile) public class Prism implements AutoCloseable { - private final ExportFunction calloc; - private final ExportFunction pmSerializeParse; - private final ExportFunction pmBufferInit; - private final ExportFunction pmBufferSizeof; - private final ExportFunction pmBufferValue; - private final ExportFunction pmBufferLength; - private final WasiPreview1 wasi; private final Instance instance; + private final Prism_ModuleExports exports; public Prism() { this(WasiOptions.builder().build()); @@ -30,33 +26,52 @@ public Prism(WasiOptions wasiOpts) { .withMachineFactory(PrismModule::create) .withImportValues(ImportValues.builder().addFunction(wasi.toHostFunctions()).build()) .build(); + exports = new Prism_ModuleExports(instance); + } - calloc = instance.exports().function("calloc"); - pmSerializeParse = instance.exports().function("pm_serialize_parse"); - pmBufferInit = instance.exports().function("pm_buffer_init"); - pmBufferSizeof = instance.exports().function("pm_buffer_sizeof"); - pmBufferValue = instance.exports().function("pm_buffer_value"); - pmBufferLength = instance.exports().function("pm_buffer_length"); + public Prism_ModuleExports exports() { + return exports; } public ParseResult serializeParse(byte[] packedOptions, String source) { var sourceBytes = source.getBytes(StandardCharsets.US_ASCII); - var sourcePointer = calloc.apply(1, source.length()); - instance.memory().writeString((int) sourcePointer[0], source); + int sourcePointer = 0; + int optionsPointer = 0; + int bufferPointer = 0; + int resultPointer = 0; + byte[] result; + try { + sourcePointer = exports.calloc(1, source.length()); + exports.memory().writeString(sourcePointer, source); - var optionsPointer = calloc.apply(1, packedOptions.length); - instance.memory().write((int) optionsPointer[0], packedOptions); + optionsPointer = exports.calloc(1, packedOptions.length); + exports.memory().write(optionsPointer, packedOptions); - var bufferPointer = calloc.apply(pmBufferSizeof.apply()[0], 1); - pmBufferInit.apply(bufferPointer); + bufferPointer = exports.calloc(exports.pmBufferSizeof(), 1); + exports.pmBufferInit(bufferPointer); - pmSerializeParse.apply( - bufferPointer[0], sourcePointer[0], source.length(), optionsPointer[0]); + exports.pmSerializeParse(bufferPointer, sourcePointer, source.length(), optionsPointer); - var result = instance.memory().readBytes( - (int) pmBufferValue.apply(bufferPointer[0])[0], - (int) pmBufferLength.apply(bufferPointer[0])[0]); + resultPointer = exports.pmBufferValue(bufferPointer); + + result = instance.memory().readBytes( + resultPointer, + exports.pmBufferLength(bufferPointer)); + } finally { + if (sourcePointer != 0) { + exports.free(sourcePointer); + } + if (optionsPointer != 0) { + exports.free(optionsPointer); + } + if (bufferPointer != 0) { + exports.free(bufferPointer); + } + if (resultPointer != 0) { + exports.free(resultPointer); + } + } return Loader.load(result, sourceBytes); } diff --git a/java-wasm/src/test/java/org/prism/DummyTest.java b/java-wasm/src/test/java/org/prism/DummyTest.java index c9f317ba46..9e49f1afdd 100644 --- a/java-wasm/src/test/java/org/prism/DummyTest.java +++ b/java-wasm/src/test/java/org/prism/DummyTest.java @@ -16,7 +16,7 @@ public class DummyTest { - byte[] packedOptions = ParsingOptions.serialize( + private static final byte[] packedOptions = ParsingOptions.serialize( new byte[] {}, 1, new byte[] {},