Skip to content

Commit 1d10ae2

Browse files
andreaTPkddnewton
authored andcommitted
Cleanup and improvements
1 parent fb707f5 commit 1d10ae2

14 files changed

Lines changed: 199 additions & 168 deletions

File tree

.github/workflows/java-wasm-bindings.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ jobs:
4848
- uses: actions/upload-artifact@v6
4949
with:
5050
name: prism.wasm
51-
path: java-wasm/src/main/resources/prism.wasm
51+
path: java-wasm/src/test/resources/prism.wasm

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,5 @@ compile_commands.json
7474
.vscode/
7575

7676
tags
77+
78+
wasi-sdk*

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ SOEXT ?= $(shell ruby -e 'puts RbConfig::CONFIG["SOEXT"]')
1212

1313
CPPFLAGS := -Iinclude $(CPPFLAGS)
1414
CFLAGS := -g -O2 -std=c99 -Wall -Werror -Wextra -Wpedantic -Wundef -Wconversion -Wno-missing-braces -fPIC -fvisibility=hidden -Wimplicit-fallthrough $(CFLAGS)
15-
JAVA_WASM_CFLAGS := -g -Oz -std=c99 -Wall -Werror -Wextra -Wpedantic -Wundef -Wconversion -Wno-missing-braces -fPIC -fvisibility=hidden -Wimplicit-fallthrough $(JAVA_WASM_CFLAGS)
15+
JAVA_WASM_CFLAGS := -g0 -O2 -Oz -std=c99 -Wall -Werror -Wextra -Wpedantic -Wundef -Wconversion -Wno-missing-braces -fno-sanitize=all -fno-stack-protector -fPIC -fvisibility=hidden -Wimplicit-fallthrough $(JAVA_WASM_CFLAGS)
1616
CC ?= cc
1717
AR ?= ar
1818
ARFLAGS ?= -r$(V0:1=v)
@@ -31,7 +31,7 @@ all: shared static
3131
shared: build/libprism.$(SOEXT)
3232
static: build/libprism.a
3333
wasm: javascript/src/prism.wasm
34-
java-wasm: java-wasm/src/main/resources/prism.wasm
34+
java-wasm: java-wasm/src/test/resources/prism.wasm
3535

3636
build/libprism.$(SOEXT): $(SHARED_OBJECTS)
3737
$(ECHO) "linking $@ with $(CC)"
@@ -51,7 +51,7 @@ javascript/src/prism.wasm: Makefile $(SOURCES) $(HEADERS)
5151
-Oz -g0 -flto -fdata-sections -ffunction-sections \
5252
-o $@ $(SOURCES)
5353

54-
java-wasm/src/main/resources/prism.wasm: Makefile $(SOURCES) $(HEADERS)
54+
java-wasm/src/test/resources/prism.wasm: Makefile $(SOURCES) $(HEADERS)
5555
$(ECHO) "building $@"
5656
$(Q) $(MAKEDIRS) $(@D)
5757
$(Q) $(WASI_SDK_PATH)/bin/clang $(DEBUG_FLAGS) -DPRISM_EXCLUDE_PRETTYPRINT -DPRISM_EXPORT_SYMBOLS -D_WASI_EMULATED_MMAN -lwasi-emulated-mman $(CPPFLAGS) $(JAVA_WASM_CFLAGS) -Wl,--export-all -Wl,--no-entry -mexec-model=reactor -lc++ -lc++abi -o $@ $(SOURCES)

java-wasm/perf-test/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
profile.html

java-wasm/perf-test/bench.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#! /bin/bash
2+
set -euxo pipefail
3+
4+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
5+
6+
jbang --fresh --deps org.openjdk.jmh:jmh-generator-annprocess:1.36 --javaagent=ap-loader@jvm-profiling-tools/ap-loader=start,event=cpu,file=${SCRIPT_DIR}/profile.html ${SCRIPT_DIR}/test

java-wasm/perf-test/test

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
///usr/bin/env jbang "$0" "$@" ; exit $?
2+
3+
//DEPS org.jruby:chicory-prism:0.0.1-SNAPSHOT
4+
//DEPS org.jruby:jruby-complete:10.0.2.0
5+
6+
import static java.lang.System.*;
7+
8+
import java.io.DataInputStream;
9+
import java.io.InputStream;
10+
import java.nio.charset.StandardCharsets;
11+
import java.util.EnumSet;
12+
13+
import org.jruby.Ruby;
14+
15+
import org.prism.Prism;
16+
import org.prism.ParsingOptions;
17+
18+
public class test {
19+
20+
final static String[] JRUBY_BOOT_FILES = {
21+
"jruby/java.rb",
22+
"jruby/java/core_ext.rb",
23+
"jruby/java/core_ext/object.rb",
24+
"jruby/java/java_ext.rb",
25+
"jruby/kernel.rb",
26+
"jruby/kernel/signal.rb",
27+
"jruby/kernel/kernel.rb",
28+
"jruby/kernel/proc.rb",
29+
"jruby/kernel/process.rb",
30+
"jruby/kernel/enumerator.rb",
31+
"jruby/kernel/enumerable.rb",
32+
"jruby/kernel/io.rb",
33+
"jruby/kernel/gc.rb",
34+
"jruby/kernel/range.rb",
35+
"jruby/kernel/file.rb",
36+
"jruby/kernel/method.rb",
37+
"jruby/kernel/thread.rb",
38+
"jruby/kernel/integer.rb",
39+
"jruby/kernel/time.rb",
40+
"jruby/preludes.rb",
41+
"jruby/kernel/prelude.rb",
42+
"jruby/kernel/enc_prelude.rb",
43+
"META-INF/jruby.home/lib/ruby/stdlib/unicode_normalize.rb",
44+
"jruby/kernel/gem_prelude.rb",
45+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems.rb",
46+
"META-INF/jruby.home/lib/ruby/stdlib/rbconfig.rb",
47+
"jruby/kernel/rbconfig.rb",
48+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/compatibility.rb",
49+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/defaults.rb",
50+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/deprecate.rb",
51+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/errors.rb",
52+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/target_rbconfig.rb",
53+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/exceptions.rb",
54+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/unknown_command_spell_checker.rb",
55+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/specification.rb",
56+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/basic_specification.rb",
57+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/stub_specification.rb",
58+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/platform.rb",
59+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/specification_record.rb",
60+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/util/list.rb",
61+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/requirement.rb",
62+
"META-INF/jruby.home/lib/ruby/stdlib/rubygems/version.rb",
63+
};
64+
65+
public static void main(String... args) throws Exception {
66+
out.println("Starting");
67+
var count = 100;
68+
69+
var prism = new Prism();
70+
byte[] src = new byte[1024 * 1024];
71+
72+
for (int i = 0; i < count; i++) {
73+
for (var file : JRUBY_BOOT_FILES) {
74+
byte[] options = ParsingOptions.serialize(
75+
file.getBytes(StandardCharsets.UTF_8),
76+
1,
77+
"UTF-8".getBytes(StandardCharsets.UTF_8),
78+
false,
79+
EnumSet.noneOf(ParsingOptions.CommandLine.class),
80+
ParsingOptions.SyntaxVersion.LATEST,
81+
false,
82+
false,
83+
false,
84+
new byte[][][]{}
85+
);
86+
87+
try (InputStream fileIn = Ruby.getClassLoader().getResourceAsStream(file)) {
88+
DataInputStream dis = new DataInputStream(fileIn);
89+
int read = dis.read(src);
90+
prism.serialize(options, src, read);
91+
}
92+
}
93+
}
94+
95+
out.println("End");
96+
}
97+
}

java-wasm/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@
131131
</goals>
132132
<configuration>
133133
<name>org.prism.PrismParser</name>
134-
<wasmFile>src/main/resources/prism.wasm</wasmFile>
134+
<wasmFile>src/test/resources/prism.wasm</wasmFile>
135135
</configuration>
136136
</execution>
137137
</executions>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.prism;
22

33
public final class WasmResource {
4-
public static final String absoluteFile = "file://${project.basedir}/src/main/resources/prism.wasm";
4+
public static final String absoluteFile = "file://${project.basedir}/src/test/resources/prism.wasm";
55

66
private WasmResource() {}
77
}

java-wasm/src/main/java/org/prism/Prism.java

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,82 @@
11
package org.prism;
22

33
import com.dylibso.chicory.annotations.WasmModuleInterface;
4+
import com.dylibso.chicory.runtime.ByteArrayMemory;
5+
import com.dylibso.chicory.runtime.ImportValues;
6+
import com.dylibso.chicory.runtime.Instance;
47
import com.dylibso.chicory.wasi.WasiOptions;
58
import com.dylibso.chicory.wasi.WasiPreview1;
69

710
import java.nio.charset.StandardCharsets;
811

912
@WasmModuleInterface(WasmResource.absoluteFile)
10-
public abstract class Prism implements AutoCloseable {
11-
protected final WasiPreview1 wasi;
13+
public class Prism implements AutoCloseable {
14+
private final WasiPreview1 wasi;
15+
protected final Prism_ModuleExports exports;
16+
private final Instance instance;
1217

13-
Prism() {
18+
private int bufferPointer;
19+
private int preSourcePointer;
20+
private int preOptionsPointer;
21+
22+
private final int SOURCE_SIZE = 2 * 1024 * 1024; // 2 MiB
23+
private final int PACKED_OPTIONS_BUFFER_SIZE = 1024;
24+
25+
public Prism() {
1426
this(WasiOptions.builder().build());
1527
}
1628

17-
Prism(WasiOptions wasiOpts) {
29+
public Prism(WasiOptions wasiOpts) {
1830
wasi = WasiPreview1.builder().withOptions(wasiOpts).build();
19-
}
31+
instance = Instance.builder(PrismParser.load())
32+
.withMemoryFactory(ByteArrayMemory::new)
33+
.withMachineFactory(PrismParser::create)
34+
.withImportValues(ImportValues.builder().addFunction(wasi.toHostFunctions()).build())
35+
.build();
36+
exports = new Prism_ModuleExports(instance);
2037

21-
public static Prism newInstance(boolean aot) {
22-
if (aot) return new PrismAOT();
38+
preOptionsPointer = exports.calloc(1, PACKED_OPTIONS_BUFFER_SIZE);
39+
preSourcePointer = exports.calloc(1, SOURCE_SIZE);
2340

24-
return new PrismWASM();
41+
bufferPointer = exports.calloc(exports.pmBufferSizeof(), 1);
42+
exports.pmBufferInit(bufferPointer);
2543
}
2644

27-
public abstract byte[] serialize(byte[] packedOptions, byte[] source, int sourceLength);
45+
public byte[] serialize(byte[] packedOptions, byte[] sourceBytes, int sourceLength) {
46+
int sourcePointer = 0;
47+
boolean useDefaultSourcePointer = sourceLength + 1 > SOURCE_SIZE;
48+
int optionsPointer = 0;
49+
boolean useDefaultOptionsPointer = packedOptions.length > PACKED_OPTIONS_BUFFER_SIZE;
50+
byte[] result;
51+
try {
52+
sourcePointer = (!useDefaultSourcePointer) ?
53+
exports.calloc(1, sourceLength + 1) : preSourcePointer;
54+
instance.memory().write(sourcePointer, sourceBytes, 0, sourceLength);
55+
instance.memory().writeByte(sourcePointer + sourceLength, (byte) 0);
56+
57+
optionsPointer = (!useDefaultOptionsPointer) ?
58+
exports.calloc(1, packedOptions.length) : preOptionsPointer;
59+
instance.memory().write(optionsPointer, packedOptions);
60+
61+
exports.pmBufferClear(bufferPointer);
62+
63+
exports.pmSerializeParse(
64+
bufferPointer, sourcePointer, sourceLength, optionsPointer);
65+
66+
result = instance.memory().readBytes(
67+
exports.pmBufferValue(bufferPointer),
68+
exports.pmBufferLength(bufferPointer));
69+
} finally {
70+
if (!useDefaultSourcePointer) {
71+
exports.free(sourcePointer);
72+
}
73+
if (!useDefaultOptionsPointer) {
74+
exports.free(optionsPointer);
75+
}
76+
}
77+
78+
return result;
79+
}
2880

2981
public ParseResult serializeParse(byte[] packedOptions, String source) {
3082
var sourceBytes = source.getBytes(StandardCharsets.ISO_8859_1);

java-wasm/src/main/java/org/prism/PrismAOT.java

Lines changed: 0 additions & 69 deletions
This file was deleted.

0 commit comments

Comments
 (0)