mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-04-02 02:11:06 +00:00
Handle the function table export on-demand
Don't delay processing until `finalize`, but instead process it as soon as it's requested to avoid doing too much logic in `finalize`.
This commit is contained in:
parent
71209686e9
commit
4eafaeae2d
@ -41,7 +41,6 @@ pub struct Context<'a> {
|
|||||||
defined_identifiers: HashMap<String, usize>,
|
defined_identifiers: HashMap<String, usize>,
|
||||||
|
|
||||||
exported_classes: Option<BTreeMap<String, ExportedClass>>,
|
exported_classes: Option<BTreeMap<String, ExportedClass>>,
|
||||||
function_table_needed: bool,
|
|
||||||
memory: MemoryId,
|
memory: MemoryId,
|
||||||
|
|
||||||
/// A map of the name of npm dependencies we've loaded so far to the path
|
/// A map of the name of npm dependencies we've loaded so far to the path
|
||||||
@ -95,7 +94,6 @@ impl<'a> Context<'a> {
|
|||||||
.delete_typed::<WebidlCustomSection>()
|
.delete_typed::<WebidlCustomSection>()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
module,
|
module,
|
||||||
function_table_needed: false,
|
|
||||||
memory,
|
memory,
|
||||||
npm_dependencies: Default::default(),
|
npm_dependencies: Default::default(),
|
||||||
})
|
})
|
||||||
@ -207,18 +205,6 @@ impl<'a> Context<'a> {
|
|||||||
needs_manual_start = self.unstart_start_function();
|
needs_manual_start = self.unstart_start_function();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If our JS glue needs to access the function table, then do so here.
|
|
||||||
// JS closure shim generation may access the function table as an
|
|
||||||
// example, but if there's no closures in the module there's no need to
|
|
||||||
// export it!
|
|
||||||
if self.function_table_needed {
|
|
||||||
let id = match self.module.tables.main_function_table()? {
|
|
||||||
Some(id) => id,
|
|
||||||
None => bail!("no function table found in module"),
|
|
||||||
};
|
|
||||||
self.module.exports.add("__wbg_function_table", id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// After all we've done, especially
|
// After all we've done, especially
|
||||||
// `unexport_unused_internal_exports()`, we probably have a bunch of
|
// `unexport_unused_internal_exports()`, we probably have a bunch of
|
||||||
// garbage in the module that's no longer necessary, so delete
|
// garbage in the module that's no longer necessary, so delete
|
||||||
@ -2121,6 +2107,18 @@ impl<'a> Context<'a> {
|
|||||||
",
|
",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn export_function_table(&mut self) -> Result<(), Error> {
|
||||||
|
if !self.should_write_global("wbg-function-table") {
|
||||||
|
return Ok(())
|
||||||
|
}
|
||||||
|
let id = match self.module.tables.main_function_table()? {
|
||||||
|
Some(id) => id,
|
||||||
|
None => bail!("no function table found in module"),
|
||||||
|
};
|
||||||
|
self.module.exports.add("__wbg_function_table", id);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_identifier(name: &str, used_names: &mut HashMap<String, usize>) -> String {
|
fn generate_identifier(name: &str, used_names: &mut HashMap<String, usize>) -> String {
|
||||||
|
@ -333,7 +333,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
.process(f, &None)?
|
.process(f, &None)?
|
||||||
.finish("function", "this.f")
|
.finish("function", "this.f")
|
||||||
};
|
};
|
||||||
self.cx.function_table_needed = true;
|
self.cx.export_function_table()?;
|
||||||
self.global_idx();
|
self.global_idx();
|
||||||
self.prelude(&format!(
|
self.prelude(&format!(
|
||||||
"\
|
"\
|
||||||
@ -787,7 +787,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
.process(&closure.function, &None)?
|
.process(&closure.function, &None)?
|
||||||
.finish("function", "f")
|
.finish("function", "f")
|
||||||
};
|
};
|
||||||
self.cx.function_table_needed = true;
|
self.cx.export_function_table()?;
|
||||||
let body = format!(
|
let body = format!(
|
||||||
"
|
"
|
||||||
const f = wasm.__wbg_function_table.get({});
|
const f = wasm.__wbg_function_table.get({});
|
||||||
@ -1147,7 +1147,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
|
|
||||||
Intrinsic::FunctionTable => {
|
Intrinsic::FunctionTable => {
|
||||||
assert_eq!(self.js_arguments.len(), 0);
|
assert_eq!(self.js_arguments.len(), 0);
|
||||||
self.cx.function_table_needed = true;
|
self.cx.export_function_table()?;
|
||||||
format!("wasm.__wbg_function_table")
|
format!("wasm.__wbg_function_table")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user