mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-03-30 08:51:05 +00:00
This commit fixes instantiation of the wasm module even if some of the improted APIs don't exist. This extends the functionality initially added in #409 to attempt to gracefully allow importing values from the environment which don't actually exist in all contexts. In addition to nonexistent methods being handled now entire nonexistent types are now also handled. I suspect that eventually we'll add a CLI flag to `wasm-bindgen` to say "I assert everything exists, don't check it" to trim out the extra JS glue generated here. In the meantime though this'll pave the way for a wasm-bindgen shim to be instantiated in both a web worker and the main thread, while using DOM-like APIs only on the main thread.
235 lines
4.9 KiB
Rust
235 lines
4.9 KiB
Rust
use wasm_bindgen::prelude::*;
|
|
use wasm_bindgen_test::*;
|
|
|
|
#[wasm_bindgen(module = "tests/wasm/imports.js")]
|
|
extern "C" {
|
|
fn test_simple();
|
|
|
|
fn simple_foo(s: &str);
|
|
fn simple_another(a: u32) -> i32;
|
|
fn simple_take_and_return_bool(a: bool) -> bool;
|
|
fn simple_return_object() -> JsValue;
|
|
#[allow(dead_code)]
|
|
fn missing_symbol(s: &str);
|
|
fn return_string() -> String;
|
|
fn take_and_ret_string(s: String) -> String;
|
|
#[wasm_bindgen(js_name = take_and_ret_string)]
|
|
fn take_and_ret_string2(s: &str) -> String;
|
|
|
|
fn exceptions_throw();
|
|
#[wasm_bindgen(catch)]
|
|
fn exceptions_throw2() -> Result<(), JsValue>;
|
|
fn test_exception_propagates();
|
|
|
|
fn assert_valid_error(val: JsValue);
|
|
|
|
static IMPORT: JsValue;
|
|
|
|
#[wasm_bindgen(js_name = return_three)]
|
|
fn rust_name_for_return_three() -> u32;
|
|
|
|
fn underscore(_: u8);
|
|
|
|
#[wasm_bindgen(js_name = self)]
|
|
fn js_function_named_rust_keyword() -> u32;
|
|
|
|
type bar;
|
|
#[wasm_bindgen(js_namespace = bar, js_name = foo)]
|
|
static FOO: JsValue;
|
|
|
|
fn take_custom_type(f: CustomType) -> CustomType;
|
|
fn touch_custom_type();
|
|
fn custom_type_return_2() -> CustomType;
|
|
#[wasm_bindgen(js_name = interpret_2_as_custom_type)]
|
|
fn js_interpret_2_as_custom_type();
|
|
|
|
#[wasm_bindgen(js_name = "baz$")]
|
|
fn renamed_with_dollar_sign();
|
|
#[wasm_bindgen(js_name = "$foo")]
|
|
static RENAMED: JsValue;
|
|
|
|
fn unused_import();
|
|
fn assert_dead_import_not_generated();
|
|
fn should_call_undefined_functions() -> bool;
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
extern "C" {
|
|
fn parseInt(a: &str) -> u32;
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn simple() {
|
|
test_simple();
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn simple_take_str(s: &str) {
|
|
simple_foo(s);
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn simple_another_thunk(a: u32) -> i32 {
|
|
simple_another(a)
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn simple_bool_thunk(a: bool) -> bool {
|
|
simple_take_and_return_bool(a)
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn simple_get_the_object() -> JsValue {
|
|
simple_return_object()
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn string_ret() {
|
|
assert_eq!(return_string(), "bar");
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn strings() {
|
|
assert_eq!(take_and_ret_string(String::from("a")), "ab");
|
|
assert_eq!(take_and_ret_string2("b"), "bb");
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn exceptions() {
|
|
test_exception_propagates();
|
|
assert!(exceptions_throw2().is_err());
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn exceptions_propagate() {
|
|
exceptions_throw();
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn exn_caught() {
|
|
assert_valid_error(exceptions_throw2().unwrap_err());
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn free_imports() {
|
|
assert_eq!(parseInt("3"), 3);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn import_a_field() {
|
|
assert_eq!(IMPORT.as_f64(), Some(1.0));
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn rename() {
|
|
assert_eq!(rust_name_for_return_three(), 3);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn underscore_pattern() {
|
|
underscore(2);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn rust_keyword() {
|
|
assert_eq!(js_function_named_rust_keyword(), 2);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn rust_keyword2() {
|
|
assert_eq!(FOO.as_f64(), Some(3.0));
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn custom_type() {
|
|
take_custom_type(CustomType(()));
|
|
touch_custom_type();
|
|
js_interpret_2_as_custom_type();
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn interpret_2_as_custom_type() {
|
|
custom_type_return_2();
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub struct CustomType(());
|
|
|
|
#[wasm_bindgen]
|
|
impl CustomType {
|
|
pub fn touch(&self) {
|
|
panic!()
|
|
}
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn rename_with_string() {
|
|
renamed_with_dollar_sign();
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn rename_static_with_string() {
|
|
assert_eq!(RENAMED.as_f64(), Some(1.0));
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn dead_imports_not_generated() {
|
|
assert_dead_import_not_generated();
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
#[cfg(feature = "nightly")]
|
|
fn import_inside_function_works() {
|
|
#[wasm_bindgen(module = "tests/wasm/imports.js")]
|
|
extern {
|
|
fn import_inside_function_works();
|
|
}
|
|
import_inside_function_works();
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
#[cfg(feature = "nightly")]
|
|
fn private_module_imports_work() {
|
|
private::foo();
|
|
}
|
|
|
|
#[cfg(feature = "nightly")]
|
|
mod private {
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
pub fn foo() {
|
|
#[wasm_bindgen(module = "tests/wasm/imports.js")]
|
|
extern {
|
|
fn import_inside_private_module();
|
|
}
|
|
import_inside_private_module();
|
|
}
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
extern {
|
|
fn something_not_defined_in_the_environment();
|
|
|
|
type TypeThatIsNotDefined;
|
|
#[wasm_bindgen(constructor)]
|
|
fn new() -> TypeThatIsNotDefined;
|
|
#[wasm_bindgen(method)]
|
|
fn method(this: &TypeThatIsNotDefined);
|
|
#[wasm_bindgen(method, getter)]
|
|
fn property(this: &TypeThatIsNotDefined) -> u32;
|
|
#[wasm_bindgen(method, setter)]
|
|
fn set_property(this: &TypeThatIsNotDefined, val: u32);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn undefined_function_is_ok() {
|
|
if !should_call_undefined_functions() {
|
|
return
|
|
}
|
|
something_not_defined_in_the_environment();
|
|
|
|
let x = TypeThatIsNotDefined::new();
|
|
x.method();
|
|
x.set_property(x.property());
|
|
}
|