Skip to content

Commit

Permalink
Merge pull request #1704 from alexcrichton/skip-anyref
Browse files Browse the repository at this point in the history
Fix anyref table export in empty modules
  • Loading branch information
alexcrichton authored Aug 5, 2019
2 parents 9314873 + ba0c6a9 commit cbab8a1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 22 deletions.
22 changes: 0 additions & 22 deletions crates/cli-support/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1152,7 +1152,6 @@ impl<'a> Context<'a> {
}
self.expose_uint32_memory();
if self.config.anyref {
self.expose_anyref_table();
self.global(
"
function getArrayJsValueFromWasm(ptr, len) {
Expand Down Expand Up @@ -1834,30 +1833,11 @@ impl<'a> Context<'a> {
true
}

fn expose_anyref_table(&mut self) {
assert!(self.config.anyref);
if !self.should_write_global("anyref_table") {
return;
}
let table = self
.module
.tables
.iter()
.find(|t| match t.kind {
walrus::TableKind::Anyref(_) => true,
_ => false,
})
.expect("failed to find anyref table in module")
.id();
self.module.exports.add("__wbg_anyref_table", table);
}

fn expose_add_to_anyref_table(&mut self) -> Result<(), Error> {
assert!(self.config.anyref);
if !self.should_write_global("add_to_anyref_table") {
return Ok(());
}
self.expose_anyref_table();
self.require_internal_export("__wbindgen_anyref_table_alloc")?;
self.global(
"
Expand Down Expand Up @@ -2640,8 +2620,6 @@ impl<'a> Context<'a> {
}

Intrinsic::InitAnyrefTable => {
self.expose_anyref_table();

// Grow the table to insert our initial values, and then also
// set the 0th slot to `undefined` since that's what we've
// historically used for our ABI which is that the index of 0
Expand Down
19 changes: 19 additions & 0 deletions crates/cli-support/src/webidl/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,24 @@ impl<'a> Context<'a> {
if !self.anyref_enabled {
return Ok(());
}

// Make sure to export the `anyref` table for the JS bindings since it
// will need to be initialized. If it doesn't exist though then the
// module must not use it, so we skip it.
let table = self
.module
.tables
.iter()
.find(|t| match t.kind {
walrus::TableKind::Anyref(_) => true,
_ => false,
});
let table = match table {
Some(t) => t.id(),
None => return Ok(()),
};
self.module.exports.add("__wbg_anyref_table", table);

let ty = self.module.types.add(&[], &[]);
let (import, import_id) = self.module.add_import_func(
PLACEHOLDER_MODULE,
Expand All @@ -640,6 +658,7 @@ impl<'a> Context<'a> {
None => import,
});
self.bind_intrinsic(import_id, Intrinsic::InitAnyrefTable)?;

Ok(())
}

Expand Down

0 comments on commit cbab8a1

Please sign in to comment.