Skip to content

Commit

Permalink
Fix direct imports in --target web
Browse files Browse the repository at this point in the history
Currently the import object constructed for the `--target web` output
only ever includes the current module as an one of the modules included.
With `wasm-bindgen`'s optimization to import directly from modules,
however, it's possible to have more modules imported from in the
generated wasm file. This commit ensures that the imports are hooked up
in the `--target web` es6 emulation mode, ensuring there aren't
extraneous errors about import objects.
  • Loading branch information
alexcrichton committed May 1, 2019
1 parent c127ef7 commit 98ebbf6
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 2 deletions.
33 changes: 31 additions & 2 deletions crates/cli-support/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::{
};
use failure::{bail, Error, ResultExt};
use std::{
collections::{BTreeMap, HashMap, HashSet},
collections::{BTreeMap, HashMap, HashSet, BTreeSet},
env, fs,
};
use walrus::{MemoryId, Module};
Expand Down Expand Up @@ -918,13 +918,41 @@ impl<'a> Context<'a> {
} else {
""
};

let ts = Self::ts_for_init_fn(mem.import.is_some());

// Generate extra initialization for the `imports` object if necessary
// based on the values in `direct_imports` we find. These functions are
// intended to be imported directly to the wasm module and we need to
// ensure that the modules are actually imported from and inserted into
// the object correctly.
let mut map = BTreeMap::new();
for &(module, name) in self.direct_imports.values() {
map.entry(module).or_insert(BTreeSet::new()).insert(name);
}
let mut imports_init = String::new();
for (module, names) in map {
imports_init.push_str("imports['");
imports_init.push_str(module);
imports_init.push_str("'] = { ");
for (i, name) in names.into_iter().enumerate() {
if i != 0 {
imports_init.push_str(", ");
}
let import = Import::Module { module, name, field: None };
let identifier = self.import_identifier(import);
imports_init.push_str(name);
imports_init.push_str(": ");
imports_init.push_str(&identifier);
}
imports_init.push_str(" };\n");
}

let js = format!(
"\
function init(module{init_memory_arg}) {{
let result;
const imports = {{ './{module}': __exports }};
{imports_init}
if (module instanceof URL || typeof module === 'string' || module instanceof Request) {{
{init_memory2}
const response = fetch(module);
Expand Down Expand Up @@ -973,6 +1001,7 @@ impl<'a> Context<'a> {
} else {
""
},
imports_init = imports_init,
);

(js, ts)
Expand Down
1 change: 1 addition & 0 deletions tests/headless/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ fn can_log_html_strings() {
}

pub mod snippets;
pub mod modules;
3 changes: 3 additions & 0 deletions tests/headless/modules.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function get_five() {
return 5;
}
12 changes: 12 additions & 0 deletions tests/headless/modules.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use wasm_bindgen::prelude::*;
use wasm_bindgen_test::*;

#[wasm_bindgen(raw_module = "./tests/headless/modules.js")]
extern "C" {
fn get_five() -> u32;
}

#[wasm_bindgen_test]
fn test_get_five() {
assert_eq!(get_five(), 2);
}

0 comments on commit 98ebbf6

Please sign in to comment.