From 813210d4337bf6e174f1da1f1a6c6fb9b073afa2 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Thu, 11 Jun 2020 15:03:27 +0000 Subject: fix: WebAssembly runtime error propagation (#6137) Currently WebAssembly runtime errors don't propagate up to the user as they use urls to denote where the error occurred which get caught by the source-map pipeline which doesn't support the wasm scheme. --- cli/disk_cache.rs | 3 ++- cli/tests/integration_tests.rs | 6 +++++ cli/tests/wasm_unreachable.js | 50 ++++++++++++++++++++++++++++++++++++++++++ cli/tests/wasm_unreachable.out | 3 +++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 cli/tests/wasm_unreachable.js create mode 100644 cli/tests/wasm_unreachable.out (limited to 'cli') diff --git a/cli/disk_cache.rs b/cli/disk_cache.rs index 58744acd8..965f8c096 100644 --- a/cli/disk_cache.rs +++ b/cli/disk_cache.rs @@ -50,7 +50,7 @@ impl DiskCache { out.push(scheme); match scheme { - "http" | "https" => { + "http" | "https" | "wasm" => { let host = url.host_str().unwrap(); let host_port = match url.port() { // Windows doesn't support ":" in filenames, so we represent port using a @@ -196,6 +196,7 @@ mod tests { "https://deno.land/std/http/file_server.ts", "https/deno.land/std/http/file_server.ts", ), + ("wasm://wasm/d1c677ea", "wasm/wasm/d1c677ea"), ]; if cfg!(target_os = "windows") { diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 5ecd6d35b..9bdc1db60 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -1872,6 +1872,12 @@ itest!(wasm_async { output: "wasm_async.out", }); +itest!(wasm_unreachable { + args: "run wasm_unreachable.js", + output: "wasm_unreachable.out", + exit_code: 1, +}); + itest!(top_level_await { args: "run --allow-read top_level_await.js", output: "top_level_await.out", diff --git a/cli/tests/wasm_unreachable.js b/cli/tests/wasm_unreachable.js new file mode 100644 index 000000000..991ebcec8 --- /dev/null +++ b/cli/tests/wasm_unreachable.js @@ -0,0 +1,50 @@ +// WebAssembly module containing a single function with an unreachable instruction +const binary = Uint8Array.from([ + 0x00, + 0x61, + 0x73, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x04, + 0x01, + 0x60, + 0x00, + 0x00, + 0x03, + 0x02, + 0x01, + 0x00, + 0x07, + 0x0f, + 0x01, + 0x0b, + 0x75, + 0x6e, + 0x72, + 0x65, + 0x61, + 0x63, + 0x68, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x0a, + 0x05, + 0x01, + 0x03, + 0x00, + 0x00, + 0x0b, +]); + +const module = new WebAssembly.Module(binary); +const instance = new WebAssembly.Instance(module); + +instance.exports.unreachable(); diff --git a/cli/tests/wasm_unreachable.out b/cli/tests/wasm_unreachable.out new file mode 100644 index 000000000..64978bbb8 --- /dev/null +++ b/cli/tests/wasm_unreachable.out @@ -0,0 +1,3 @@ +error: Uncaught RuntimeError: unreachable + at unreachable (:0:40) + at [WILDCARD]/deno/cli/tests/wasm_unreachable.js:[WILDCARD]:18 -- cgit v1.2.3