mirror of
https://github.com/rustwasm/wasm-bindgen.git
synced 2024-12-19 16:11:50 +03:00
bf64f74cab
Not a lot of attention has been paid to dealing with conflicts of symbols between crates and different `#[wasm_bindgen]` blocks. This commit starts to fix this issue by unblocking #486 which first ran into this. Currently there's a bug where if two independent crates bind the same JS API they'll generate the same symbol which causes conflicts for things like LTO or linking in general. This commit starts to add a "salt" to all symbols generated by `wasm-bindgen` (these are all transparent to the user) to ensure that each crate's invocations are kept apart from one another and using the correct bindings.
210 lines
5.7 KiB
Rust
210 lines
5.7 KiB
Rust
use super::project;
|
|
|
|
#[test]
|
|
fn dependencies_work() {
|
|
project()
|
|
.file(
|
|
"src/lib.rs",
|
|
r#"
|
|
#![feature(use_extern_macros, wasm_custom_section, wasm_import_module)]
|
|
extern crate wasm_bindgen;
|
|
extern crate dependency;
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen]
|
|
pub fn return_dep_ty(x: f64) -> dependency::Foo {
|
|
dependency::Foo(x)
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn takes_own_dep_ty(foo: dependency::Foo) -> f64 {
|
|
foo.0
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn takes_ref_dep_ty(foo: &dependency::Foo) -> f64 {
|
|
foo.0
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn takes_mut_dep_ty(foo: &mut dependency::Foo, x: f64) {
|
|
foo.0 = x;
|
|
}
|
|
"#,
|
|
)
|
|
.add_local_dependency("dependency", "vendor/dependency")
|
|
.file(
|
|
"vendor/dependency/Cargo.toml",
|
|
&format!(
|
|
r#"
|
|
[package]
|
|
name = "dependency"
|
|
version = "0.0.1"
|
|
authors = []
|
|
|
|
[dependencies]
|
|
wasm-bindgen = {{ path = '{}' }}
|
|
"#,
|
|
env!("CARGO_MANIFEST_DIR")
|
|
),
|
|
)
|
|
.file(
|
|
"vendor/dependency/src/lib.rs",
|
|
r#"
|
|
#![feature(use_extern_macros, wasm_custom_section, wasm_import_module)]
|
|
extern crate wasm_bindgen;
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen]
|
|
pub struct Foo(pub f64);
|
|
|
|
#[wasm_bindgen]
|
|
impl Foo {
|
|
pub fn new(x: f64) -> Foo { Foo(x) }
|
|
pub fn get(&self) -> f64 { self.0 }
|
|
}
|
|
"#,
|
|
)
|
|
.file(
|
|
"test.js",
|
|
r#"
|
|
import * as assert from "assert";
|
|
import * as wasm from "./out";
|
|
|
|
export function test() {
|
|
const foo = wasm.return_dep_ty(42);
|
|
assert.strictEqual(foo.get(), 42);
|
|
|
|
const x = wasm.takes_ref_dep_ty(foo);
|
|
assert.strictEqual(x, 42);
|
|
|
|
const y = 1337;
|
|
wasm.takes_mut_dep_ty(foo, y);
|
|
assert.strictEqual(foo.get(), y);
|
|
|
|
const z = wasm.takes_own_dep_ty(foo);
|
|
assert.strictEqual(z, y);
|
|
assert.strictEqual(foo.ptr, 0);
|
|
}
|
|
"#,
|
|
)
|
|
.test();
|
|
}
|
|
|
|
#[test]
|
|
fn same_api_two_crates() {
|
|
project()
|
|
.file(
|
|
"src/lib.rs",
|
|
r#"
|
|
#![feature(use_extern_macros, wasm_custom_section, wasm_import_module)]
|
|
extern crate wasm_bindgen;
|
|
extern crate a;
|
|
extern crate b;
|
|
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen(module = "./foo")]
|
|
extern {
|
|
fn assert_next_undefined();
|
|
fn assert_next_ten();
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub fn test() {
|
|
assert_next_undefined();
|
|
a::test();
|
|
assert_next_ten();
|
|
b::test();
|
|
}
|
|
"#,
|
|
)
|
|
.file(
|
|
"foo.js",
|
|
r#"
|
|
import { strictEqual } from "assert";
|
|
|
|
let next = null;
|
|
|
|
export function assert_next_undefined() {
|
|
next = undefined;
|
|
}
|
|
|
|
export function assert_next_ten() {
|
|
next = 10;
|
|
}
|
|
|
|
export function foo(a) {
|
|
console.log(a, next);
|
|
strictEqual(a, next);
|
|
next = null;
|
|
}
|
|
"#,
|
|
)
|
|
.add_local_dependency("a", "a")
|
|
.file(
|
|
"a/Cargo.toml",
|
|
&format!(r#"
|
|
[package]
|
|
name = 'a'
|
|
version = '0.0.0'
|
|
|
|
[dependencies]
|
|
wasm-bindgen = {{ path = '{}' }}
|
|
"#,
|
|
env!("CARGO_MANIFEST_DIR")
|
|
),
|
|
)
|
|
.file(
|
|
"a/src/lib.rs",
|
|
"
|
|
#![feature(use_extern_macros, wasm_custom_section, wasm_import_module)]
|
|
extern crate wasm_bindgen;
|
|
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen(module = \"./foo\")]
|
|
extern {
|
|
fn foo();
|
|
}
|
|
|
|
pub fn test() {
|
|
foo();
|
|
}
|
|
",
|
|
)
|
|
.add_local_dependency("b", "b")
|
|
.file(
|
|
"b/Cargo.toml",
|
|
&format!(r#"
|
|
[package]
|
|
name = 'b'
|
|
version = '0.0.0'
|
|
|
|
[dependencies]
|
|
wasm-bindgen = {{ path = '{}' }}
|
|
"#,
|
|
env!("CARGO_MANIFEST_DIR")
|
|
),
|
|
)
|
|
.file(
|
|
"b/src/lib.rs",
|
|
"
|
|
#![feature(use_extern_macros, wasm_custom_section, wasm_import_module)]
|
|
extern crate wasm_bindgen;
|
|
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[wasm_bindgen(module = \"./foo\")]
|
|
extern {
|
|
fn foo(x: u32);
|
|
}
|
|
|
|
pub fn test() {
|
|
foo(10);
|
|
}
|
|
",
|
|
)
|
|
.test();
|
|
}
|