diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index b2656f73..1d179bc2 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -633,6 +633,15 @@ impl<'a> Context<'a> { self.global(&format!(" let stack = []; ")); + if self.config.debug { + self.export("assertStackEmpty", " + function() { + if (stack.length === 0) + return; + throw new Error('stack is not currently empty'); + } + "); + } } fn expose_global_slab(&mut self) { @@ -640,6 +649,17 @@ impl<'a> Context<'a> { return; } self.global(&format!("let slab = [];")); + if self.config.debug { + self.export("assertSlabEmpty", " + function() { + for (let i = 0; i < slab.length; i++) { + if (typeof(slab[i]) === 'number') + continue; + throw new Error('slab is not currently empty'); + } + } + "); + } } fn expose_global_slab_next(&mut self) { @@ -882,14 +902,14 @@ impl<'a> Context<'a> { return; } self.expose_get_array_u32_from_wasm(); - self.expose_get_object(); + self.expose_take_object(); self.global(&format!(" function getArrayJsValueFromWasm(ptr, len) {{ const mem = getUint32Memory(); const slice = mem.slice(ptr / 4, ptr / 4 + len); const result = []; for (let i = 0; i < slice.length; i++) {{ - result.push(getObject(slice[i])) + result.push(takeObject(slice[i])) }} return result; }} diff --git a/tests/all/imports.rs b/tests/all/imports.rs index 3cd4f7fc..a1b812f6 100644 --- a/tests/all/imports.rs +++ b/tests/all/imports.rs @@ -283,6 +283,7 @@ fn free_imports() { #[test] fn import_a_field() { project() + .debug(false) .file("src/lib.rs", r#" #![feature(proc_macro, wasm_custom_section, wasm_import_module)] diff --git a/tests/all/main.rs b/tests/all/main.rs index 6f239aff..396d0e02 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -48,11 +48,18 @@ fn project() -> Project { ("run.js".to_string(), r#" import * as process from "process"; + let wasm = import('./out'); const test = import("./test"); - test.then(test => { + Promise.all([test, wasm]).then(results => { + let [test, wasm] = results; test.test(); + + if (wasm.assertStackEmpty) + wasm.assertStackEmpty(); + if (wasm.assertSlabEmpty) + wasm.assertSlabEmpty(); }).catch(error => { console.error(error); process.exit(1); diff --git a/tests/all/simple.rs b/tests/all/simple.rs index a86b718d..f0b43da0 100644 --- a/tests/all/simple.rs +++ b/tests/all/simple.rs @@ -216,7 +216,7 @@ fn no_std() { use wasm_bindgen::prelude::*; - #[wasm_bindgen] + #[wasm_bindgen(module = "./foo")] extern { fn test(a: &str); @@ -238,6 +238,12 @@ fn no_std() { wasm.foo(1); } "#) + .file("foo.js", r#" + export class Js { + init() { + } + } + "#) .test(); }