Improve the --wasm2asm flag of wasm2es6js

* Don't glob import modules an instead selectively only import required items
* Be compatible with node.js and avoid the usage of `self`
This commit is contained in:
Alex Crichton 2018-05-22 08:31:35 -07:00
parent dd76707ea1
commit 17861a45ab

View File

@ -254,11 +254,10 @@ impl Output {
fn js_wasm2asm(self) -> Result<String, Error> { fn js_wasm2asm(self) -> Result<String, Error> {
let mut js_imports = String::new(); let mut js_imports = String::new();
let mut imported_modules = Vec::new(); let mut imported_items = Vec::new();
if let Some(i) = self.module.import_section() { if let Some(i) = self.module.import_section() {
let mut module_set = HashSet::new();
let mut name_map = HashMap::new(); let mut name_map = HashMap::new();
for entry in i.entries() { for (i, entry) in i.entries().iter().enumerate() {
match *entry.external() { match *entry.external() {
External::Function(_) => {} External::Function(_) => {}
External::Table(_) => { External::Table(_) => {
@ -279,15 +278,12 @@ impl Output {
mode"); mode");
} }
if !module_set.insert(entry.module()) { let name = format!("import{}", i);
continue js_imports.push_str(&format!("import {{ {} as {} }} from '{}';\n",
} entry.field(),
let name = (b'a' + (module_set.len() as u8)) as char;
js_imports.push_str(&format!("import * as import_{} from '{}';",
name, name,
entry.module())); entry.module()));
imported_modules.push(format!("import_{}", name)); imported_items.push((entry.field().to_string(), name));
} }
} }
@ -373,9 +369,11 @@ impl Output {
})?; })?;
let mut imports = String::from("{}"); let mut make_imports = String::from("
for m in imported_modules { var imports = {};
imports = format!("Object.assign({}, {})", imports, m); ");
for (name, import) in imported_items {
make_imports.push_str(&format!("imports['{}'] = {};\n", name, import));
} }
Ok(format!("\ Ok(format!("\
@ -397,14 +395,27 @@ impl Output {
}} }}
}} }}
{js_init_mem} {js_init_mem}
const ret = asmFunc(self, {imports}, mem); {make_imports}
const ret = asmFunc({{
Math,
Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
NaN,
Infinity,
}}, imports, mem);
{js_exports} {js_exports}
", ",
js_imports = js_imports, js_imports = js_imports,
js_init_mem = js_init_mem, js_init_mem = js_init_mem,
asm_func = asm_func, asm_func = asm_func,
js_exports = js_exports, js_exports = js_exports,
imports = imports, make_imports = make_imports,
mem_size = memory_size * (1 << 16), mem_size = memory_size * (1 << 16),
)) ))
} }