diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index f67236599..e1e9d8a35 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -1817,8 +1817,9 @@ impl<'a, 'b> SubContext<'a, 'b> { if import.structural { format!( "function() {{ - return this.{}; + return {}.{}; }}", + if is_static { &class } else { "this" }, g ) } else { @@ -1835,8 +1836,9 @@ impl<'a, 'b> SubContext<'a, 'b> { if import.structural { format!( "function(y) {{ - this.{} = y; + {}.{} = y; }}", + if is_static { &class } else { "this" }, s ) } else { diff --git a/src/js.rs b/src/js.rs index 4a42626ab..ff2d5eae7 100644 --- a/src/js.rs +++ b/src/js.rs @@ -1388,3 +1388,17 @@ if_std! { } } } + +// Symbol +#[wasm_bindgen] +extern "C" { + pub type Symbol; + + /// The Symbol.hasInstance well-known symbol is used to determine + /// if a constructor object recognizes an object as its instance. + /// The instanceof operator's behavior can be customized by this symbol. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance + #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = hasInstance)] + pub fn has_instance() -> Symbol; +} diff --git a/tests/all/js_globals/Symbol.rs b/tests/all/js_globals/Symbol.rs new file mode 100644 index 000000000..740030890 --- /dev/null +++ b/tests/all/js_globals/Symbol.rs @@ -0,0 +1,42 @@ +#![allow(non_snake_case)] + +use project; + +#[test] +fn has_instance() { + project() + .file( + "src/lib.rs", + r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn symbol_has_instance() -> js::Symbol { + js::Symbol::has_instance() + } + + "#, + ) + .file( + "test.js", + r#" + import * as assert from "assert"; + import * as wasm from "./out"; + class Array1 { + static [wasm.symbol_has_instance()](instance) { + return Array.isArray(instance); + } + } + + export function test() { + assert.equal(typeof wasm.symbol_has_instance(), "symbol"); + assert.ok([] instanceof Array1); + } + "#, + ) + .test() +} diff --git a/tests/all/js_globals/mod.rs b/tests/all/js_globals/mod.rs index ee786ddae..633372e0c 100644 --- a/tests/all/js_globals/mod.rs +++ b/tests/all/js_globals/mod.rs @@ -19,6 +19,7 @@ mod Object; mod Proxy; mod Set; mod SetIterator; +mod Symbol; mod TypedArray; mod WeakMap; mod WeakSet;