Skip to content

Commit 54bdde6

Browse files
committed
Running splicer as CLI for multithreading support
1 parent 56abfc0 commit 54bdde6

File tree

7 files changed

+734
-507
lines changed

7 files changed

+734
-507
lines changed

Cargo.lock

Lines changed: 2 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,21 @@ anyhow = { version = "1.0.95", default-features = false }
1515
heck = { version = "0.5", default-features = false }
1616
js-component-bindgen = { version = "1.11.0" }
1717
#orca-wasm = { version = "0.9.2", default-features = false }
18-
wirm = { version = "2.1.0", features = ["parallel"] }
18+
wirm = { path = "../wirm/", features = ["parallel"] }
1919
rand = { version = "0.8", default-features = false }
20-
wasm-encoder = { version = "0.227.1", features = [ "component-model", "std" ] }
21-
wasmparser = { version = "0.239.0", features = ["features",
20+
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
21+
# wasm-encoder = { version = "0.227.1", features = [ "component-model", "std" ] }
22+
# wasmparser = { version = "0.239.0", features = ["features",
23+
# "component-model",
24+
# "hash-collections",
25+
# "serde",
26+
# "simd" ,
27+
# "std",
28+
# "validate",
29+
# ] }
30+
31+
wasm-encoder = { path = "../wasm-tools/crates/wasm-encoder/", features = [ "component-model", "std" ] }
32+
wasmparser = { path = "../wasm-tools/crates/wasmparser/", features = ["features",
2233
"component-model",
2334
"hash-collections",
2435
"serde",

Makefile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ endif
1313
STARLINGMONKEY_DEPS = $(STARLINGMONKEY_SRC)/cmake/* embedding/* $(STARLINGMONKEY_SRC)/runtime/* $(STARLINGMONKEY_SRC)/builtins/* $(STARLINGMONKEY_SRC)/builtins/*/* $(STARLINGMONKEY_SRC)/builtins/*/*/* $(STARLINGMONKEY_SRC)/include/*
1414

1515
all: release
16-
debug: lib/starlingmonkey_embedding.debug.wasm lib/spidermonkey-embedding-splicer.js
17-
release: lib/starlingmonkey_embedding.wasm lib/spidermonkey-embedding-splicer.js
16+
debug: lib/starlingmonkey_embedding.debug.wasm lib/spidermonkey-embedding-splicer.js target/debug/splicer
17+
release: lib/starlingmonkey_embedding.wasm lib/spidermonkey-embedding-splicer.js target/release/splicer
1818

1919
lib/spidermonkey-embedding-splicer.js: target/wasm32-wasip1/release/splicer_component.wasm crates/spidermonkey-embedding-splicer/wit/spidermonkey-embedding-splicer.wit | obj lib
2020
@$(JCO) new target/wasm32-wasip1/release/splicer_component.wasm -o obj/spidermonkey-embedding-splicer.wasm --wasi-reactor
@@ -23,6 +23,12 @@ lib/spidermonkey-embedding-splicer.js: target/wasm32-wasip1/release/splicer_comp
2323
target/wasm32-wasip1/release/splicer_component.wasm: Cargo.toml crates/spidermonkey-embedding-splicer/Cargo.toml crates/spidermonkey-embedding-splicer/src/*.rs crates/splicer-component/src/*.rs
2424
cargo build --lib --release --target wasm32-wasip1
2525

26+
target/release/splicer: Cargo.toml crates/spidermonkey-embedding-splicer/Cargo.toml crates/spidermonkey-embedding-splicer/src/*.rs crates/spidermonkey-embedding-splicer/src/bin/splicer.rs
27+
cargo build --bin splicer --release
28+
29+
target/debug/splicer: Cargo.toml crates/spidermonkey-embedding-splicer/Cargo.toml crates/spidermonkey-embedding-splicer/src/*.rs crates/spidermonkey-embedding-splicer/src/bin/splicer.rs
30+
cargo build --bin splicer
31+
2632
lib/starlingmonkey_embedding.wasm: $(STARLINGMONKEY_DEPS) | lib
2733
cmake -B build-release -DCMAKE_BUILD_TYPE=Release
2834
make -j16 -C build-release starlingmonkey_embedding

crates/spidermonkey-embedding-splicer/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ js-component-bindgen = { workspace = true, features = [ "transpile-bindgen" ] }
1919
#orca-wasm = { workspace = true }
2020
wirm = { workspace = true }
2121
rand = { workspace = true }
22+
serde_json = { workspace = true }
2223
wasm-encoder = { workspace = true }
2324
wasmparser = { workspace = true }
2425
wit-bindgen = { workspace = true }

crates/spidermonkey-embedding-splicer/src/bin/splicer.rs

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use std::str::FromStr;
55
use anyhow::{Context, Result};
66
use clap::{Parser, Subcommand};
77

8-
use spidermonkey_embedding_splicer::wit::exports::local::spidermonkey_embedding_splicer::splicer::Feature;
8+
use spidermonkey_embedding_splicer::wit::exports::local::spidermonkey_embedding_splicer::splicer::{
9+
CoreFn, CoreTy, Feature,
10+
};
911
use spidermonkey_embedding_splicer::{splice, stub_wasi};
1012

1113
#[derive(Parser, Debug)]
@@ -139,8 +141,112 @@ fn main() -> Result<()> {
139141
out_dir.join("initializer.js").display()
140142
)
141143
})?;
144+
145+
// Write exports and imports as JSON (manual serialization)
146+
let exports_json = serialize_exports(&result.exports);
147+
fs::write(out_dir.join("exports.json"), exports_json).with_context(|| {
148+
format!(
149+
"Failed to write exports file: {}",
150+
out_dir.join("exports.json").display()
151+
)
152+
})?;
153+
154+
let imports_json = serialize_imports(&result.imports);
155+
fs::write(out_dir.join("imports.json"), imports_json).with_context(|| {
156+
format!(
157+
"Failed to write imports file: {}",
158+
out_dir.join("imports.json").display()
159+
)
160+
})?;
161+
162+
println!(
163+
"Successfully generated bindings and saved to {}",
164+
out_dir.display()
165+
);
142166
}
143167
}
144168

145169
Ok(())
146170
}
171+
172+
/// Manually serialize exports to JSON
173+
fn serialize_exports(exports: &[(String, CoreFn)]) -> String {
174+
let mut result = String::from("[\n");
175+
for (i, (name, core_fn)) in exports.iter().enumerate() {
176+
if i > 0 {
177+
result.push_str(",\n");
178+
}
179+
result.push_str(" [\"");
180+
result.push_str(&name.replace('\\', "\\\\").replace('"', "\\\""));
181+
result.push_str("\", ");
182+
result.push_str(&serialize_core_fn(core_fn));
183+
result.push(']');
184+
}
185+
result.push_str("\n]");
186+
result
187+
}
188+
189+
/// Manually serialize imports to JSON
190+
fn serialize_imports(imports: &[(String, String, u32)]) -> String {
191+
let mut result = String::from("[\n");
192+
for (i, (specifier, name, arg_count)) in imports.iter().enumerate() {
193+
if i > 0 {
194+
result.push_str(",\n");
195+
}
196+
result.push_str(" [\"");
197+
result.push_str(&specifier.replace('\\', "\\\\").replace('"', "\\\""));
198+
result.push_str("\", \"");
199+
result.push_str(&name.replace('\\', "\\\\").replace('"', "\\\""));
200+
result.push_str("\", ");
201+
result.push_str(&arg_count.to_string());
202+
result.push(']');
203+
}
204+
result.push_str("\n]");
205+
result
206+
}
207+
208+
/// Manually serialize CoreFn to JSON
209+
fn serialize_core_fn(core_fn: &CoreFn) -> String {
210+
let mut result = String::from("{");
211+
212+
// params
213+
result.push_str("\"params\": [");
214+
for (i, param) in core_fn.params.iter().enumerate() {
215+
if i > 0 {
216+
result.push_str(", ");
217+
}
218+
result.push_str(&serialize_core_ty(param));
219+
}
220+
result.push_str("], ");
221+
222+
// ret
223+
result.push_str("\"ret\": ");
224+
if let Some(ref ret) = core_fn.ret {
225+
result.push_str(&serialize_core_ty(ret));
226+
} else {
227+
result.push_str("null");
228+
}
229+
result.push_str(", ");
230+
231+
// retptr
232+
result.push_str(&format!("\"retptr\": {}, ", core_fn.retptr));
233+
234+
// retsize
235+
result.push_str(&format!("\"retsize\": {}, ", core_fn.retsize));
236+
237+
// paramptr
238+
result.push_str(&format!("\"paramptr\": {}", core_fn.paramptr));
239+
240+
result.push('}');
241+
result
242+
}
243+
244+
/// Manually serialize CoreTy to JSON
245+
fn serialize_core_ty(core_ty: &CoreTy) -> String {
246+
match core_ty {
247+
CoreTy::I32 => "\"i32\"".to_string(),
248+
CoreTy::I64 => "\"i64\"".to_string(),
249+
CoreTy::F32 => "\"f32\"".to_string(),
250+
CoreTy::F64 => "\"f64\"".to_string(),
251+
}
252+
}

crates/spidermonkey-embedding-splicer/src/stub_wasi.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ use std::path::PathBuf;
33
use std::time::{SystemTime, UNIX_EPOCH};
44

55
use anyhow::{bail, Result};
6+
use wasmparser::{MemArg, TypeRef};
67
use wirm::ir::function::FunctionBuilder;
78
use wirm::ir::id::{FunctionID, LocalID};
89
use wirm::ir::module::module_functions::FuncKind;
9-
use wirm::ir::types::{BlockType, InitExpr, Value, Instructions};
10+
use wirm::ir::types::{BlockType, InitExpr, Value};
1011
use wirm::module_builder::AddLocal;
1112
use wirm::{DataType, InitInstr, Module, Opcode};
12-
use wasmparser::{MemArg, Operator, TypeRef};
1313
use wit_parser::Resolve;
1414

1515
use crate::parse_wit;
@@ -44,14 +44,14 @@ where
4444
};
4545

4646
let ty = module.types.get(ty_id).unwrap();
47-
let (params, results) = (ty.params().to_vec(), ty.results().to_vec());
48-
let mut builder = FunctionBuilder::new(params.as_slice(), results.as_slice());
47+
let mut builder = FunctionBuilder::new(ty.params().as_slice(), ty.results().as_slice());
4948
let _args = stub(&mut builder)?;
5049

5150
builder.replace_import_in_module(module, iid);
5251

5352
return Ok(Some(fid));
5453
}
54+
5555
Ok(None)
5656
}
5757

@@ -120,7 +120,9 @@ pub fn stub_wasi(
120120
target_world_imports.insert(resolve.name_canonicalized_world_key(key));
121121
}
122122

123+
let start_time = std::time::Instant::now();
123124
let mut module = Module::parse(wasm.as_slice(), false).unwrap();
125+
println!("stub_wasi module parse took {:?}", start_time.elapsed());
124126

125127
stub_preview1(&mut module)?;
126128

0 commit comments

Comments
 (0)