Skip to content

Commit

Permalink
fix: intrinsic definitions syntax and ordering (#437)
Browse files Browse the repository at this point in the history
  • Loading branch information
guybedford committed May 6, 2024
1 parent 0963dec commit 5402dad
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
34 changes: 26 additions & 8 deletions crates/js-component-bindgen/src/transpile_bindgen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,18 @@ pub fn transpile_bindgen(
instantiator.sizes.fill(resolve);
instantiator.initialize();
instantiator.instantiate();
instantiator.resource_definitions();

let mut intrinsic_definitions = source::Source::default();

instantiator.resource_definitions(&mut intrinsic_definitions);
instantiator.instance_flags();

instantiator.gen.src.js(&instantiator.src.js);
instantiator.gen.src.js_init(&instantiator.src.js_init);

instantiator.gen.finish_component(name, files, &opts);
instantiator
.gen
.finish_component(name, files, &opts, intrinsic_definitions);

let exports = instantiator
.gen
Expand All @@ -198,7 +204,13 @@ pub fn transpile_bindgen(
}

impl<'a> JsBindgen<'a> {
fn finish_component(&mut self, name: &str, files: &mut Files, opts: &TranspileOpts) {
fn finish_component(
&mut self,
name: &str,
files: &mut Files,
opts: &TranspileOpts,
intrinsic_definitions: source::Source,
) {
let mut output = source::Source::default();
let mut compilation_promises = source::Source::default();

Expand Down Expand Up @@ -249,11 +261,13 @@ impl<'a> JsBindgen<'a> {
uwrite!(
output,
"\
{}
{}
export async function instantiate(getCoreModule, imports, instantiateCore = WebAssembly.instantiate) {{
{}
",
&js_intrinsics as &str,
&intrinsic_definitions as &str,
&compilation_promises as &str,
)
}
Expand All @@ -262,11 +276,13 @@ impl<'a> JsBindgen<'a> {
uwrite!(
output,
"\
{}
{}
export function instantiate(getCoreModule, imports, instantiateCore = (module, importObject) => new WebAssembly.Instance(module, importObject)) {{
{}
",
&js_intrinsics as &str,
&intrinsic_definitions as &str,
&compilation_promises as &str,
)
}
Expand Down Expand Up @@ -321,6 +337,7 @@ impl<'a> JsBindgen<'a> {
uwrite!(
output,
"\
{}
{}
{}
{maybe_init_export}const $init = (async() => {{
Expand All @@ -330,6 +347,7 @@ impl<'a> JsBindgen<'a> {
{maybe_init}\
",
&js_intrinsics as &str,
&intrinsic_definitions as &str,
&self.src.js as &str,
&compilation_promises as &str,
&self.src.js_init as &str,
Expand Down Expand Up @@ -560,7 +578,7 @@ impl<'a> Instantiator<'a, '_> {
}
}

fn resource_definitions(&mut self) {
fn resource_definitions(&mut self, definitions: &mut source::Source) {
// It is theoretically possible for locally defined resources used in no functions
// to still be exported
for resource in 0..self.component.num_resources {
Expand All @@ -585,21 +603,21 @@ impl<'a> Instantiator<'a, '_> {
.contains(&Intrinsic::ResourceTransferBorrowValidLifting)
{
let defined_resource_tables = Intrinsic::DefinedResourceTables.name();
uwrite!(self.src.js, "const {defined_resource_tables} = [");
uwrite!(definitions, "const {defined_resource_tables} = [");
for tidx in 0..self.component.num_resource_tables {
let tid = TypeResourceTableIndex::from_u32(tidx as u32);
let rid = self.types[tid].ty;
if let Some(defined_index) = self.component.defined_resource_index(rid) {
if self.types[tid].instance
== self.component.defined_resource_instances[defined_index]
{
uwrite!(self.src.js, "true,");
uwrite!(definitions, "true,");
}
} else {
uwrite!(self.src.js, ",");
uwrite!(definitions, ",");
};
}
uwrite!(self.src.js, "]");
uwrite!(definitions, "];\n");
}
}

Expand Down
3 changes: 3 additions & 0 deletions test/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { readdirSync, readFileSync } from "node:fs";
import { resolve } from "node:path";
import { exec, jcoPath } from "./helpers.js";

const DEBUG = false;

const tests = JSON.parse(readFileSync('test/fixtures/commands/tests.json', 'utf8'));

export async function commandsTest() {
Expand All @@ -14,6 +16,7 @@ export async function commandsTest() {
const { stdout, stderr } = await exec(
jcoPath,
"run",
...DEBUG ? ["--jco-dir", `test/output/commands/${fixture}`] : [],
resolve("test/fixtures/commands", fixture),
...(tests[runName]?.args || [])
);
Expand Down

0 comments on commit 5402dad

Please sign in to comment.