mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-04-01 18:01:06 +00:00
Merge remote-tracking branch 'alex/master'
This commit is contained in:
commit
7cef4a66b8
@ -155,6 +155,7 @@ impl ToTokens for ast::Struct {
|
|||||||
impl ::wasm_bindgen::__rt::core::convert::From<#name> for
|
impl ::wasm_bindgen::__rt::core::convert::From<#name> for
|
||||||
::wasm_bindgen::JsValue
|
::wasm_bindgen::JsValue
|
||||||
{
|
{
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
fn from(value: #name) -> Self {
|
fn from(value: #name) -> Self {
|
||||||
let ptr = ::wasm_bindgen::convert::IntoWasmAbi::into_abi(
|
let ptr = ::wasm_bindgen::convert::IntoWasmAbi::into_abi(
|
||||||
value,
|
value,
|
||||||
@ -174,8 +175,14 @@ impl ToTokens for ast::Struct {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(all(target_arch = "wasm32", not(target_os = "emscripten"))))]
|
||||||
|
fn from(_value: #name) -> Self {
|
||||||
|
panic!("cannot convert to JsValue outside of the wasm target")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern fn #free_fn(ptr: u32) {
|
pub unsafe extern fn #free_fn(ptr: u32) {
|
||||||
<#name as ::wasm_bindgen::convert::FromWasmAbi>::from_abi(
|
<#name as ::wasm_bindgen::convert::FromWasmAbi>::from_abi(
|
||||||
@ -229,6 +236,7 @@ impl ToTokens for ast::StructField {
|
|||||||
let desc = syn::Ident::from(format!("__wbindgen_describe_{}", getter));
|
let desc = syn::Ident::from(format!("__wbindgen_describe_{}", getter));
|
||||||
(quote! {
|
(quote! {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
pub unsafe extern fn #getter(js: u32)
|
pub unsafe extern fn #getter(js: u32)
|
||||||
-> <#ty as ::wasm_bindgen::convert::IntoWasmAbi>::Abi
|
-> <#ty as ::wasm_bindgen::convert::IntoWasmAbi>::Abi
|
||||||
{
|
{
|
||||||
@ -260,6 +268,7 @@ impl ToTokens for ast::StructField {
|
|||||||
|
|
||||||
(quote! {
|
(quote! {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
pub unsafe extern fn #setter(
|
pub unsafe extern fn #setter(
|
||||||
js: u32,
|
js: u32,
|
||||||
val: <#ty as ::wasm_bindgen::convert::FromWasmAbi>::Abi,
|
val: <#ty as ::wasm_bindgen::convert::FromWasmAbi>::Abi,
|
||||||
@ -395,6 +404,7 @@ impl ToTokens for ast::Export {
|
|||||||
let tokens = quote! {
|
let tokens = quote! {
|
||||||
#[export_name = #export_name]
|
#[export_name = #export_name]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
pub extern fn #generated_name(#(#args),*) #ret_ty {
|
pub extern fn #generated_name(#(#args),*) #ret_ty {
|
||||||
::wasm_bindgen::__rt::link_this_library();
|
::wasm_bindgen::__rt::link_this_library();
|
||||||
let #ret = {
|
let #ret = {
|
||||||
@ -424,6 +434,7 @@ impl ToTokens for ast::Export {
|
|||||||
// this, but the tl;dr; is that this is stripped from the final wasm
|
// this, but the tl;dr; is that this is stripped from the final wasm
|
||||||
// binary along with anything it references.
|
// binary along with anything it references.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
pub extern fn #descriptor_name() {
|
pub extern fn #descriptor_name() {
|
||||||
use wasm_bindgen::describe::*;
|
use wasm_bindgen::describe::*;
|
||||||
inform(FUNCTION);
|
inform(FUNCTION);
|
||||||
@ -640,6 +651,7 @@ impl ToTokens for ast::ImportFunction {
|
|||||||
.iter()
|
.iter()
|
||||||
.skip(if is_method { 1 } else { 0 })
|
.skip(if is_method { 1 } else { 0 })
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
let arguments = &arguments[..];
|
||||||
|
|
||||||
let me = if is_method {
|
let me = if is_method {
|
||||||
quote! { &self, }
|
quote! { &self, }
|
||||||
@ -650,6 +662,7 @@ impl ToTokens for ast::ImportFunction {
|
|||||||
let invocation = quote! {
|
let invocation = quote! {
|
||||||
#(#attrs)*
|
#(#attrs)*
|
||||||
#[allow(bad_style)]
|
#[allow(bad_style)]
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
#vis extern #fn_token #rust_name(#me #(#arguments),*) #ret {
|
#vis extern #fn_token #rust_name(#me #(#arguments),*) #ret {
|
||||||
::wasm_bindgen::__rt::link_this_library();
|
::wasm_bindgen::__rt::link_this_library();
|
||||||
#[wasm_import_module = "__wbindgen_placeholder__"]
|
#[wasm_import_module = "__wbindgen_placeholder__"]
|
||||||
@ -668,6 +681,14 @@ impl ToTokens for ast::ImportFunction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#(#attrs)*
|
||||||
|
#[allow(bad_style, unused_variables)]
|
||||||
|
#[cfg(not(all(target_arch = "wasm32", not(target_os = "emscripten"))))]
|
||||||
|
#vis extern #fn_token #rust_name(#me #(#arguments),*) #ret {
|
||||||
|
panic!("cannot call wasm-bindgen imported functions on \
|
||||||
|
non-wasm targets");
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(class) = class_ty {
|
if let Some(class) = class_ty {
|
||||||
@ -766,6 +787,7 @@ impl ToTokens for ast::ImportStatic {
|
|||||||
(quote! {
|
(quote! {
|
||||||
#[allow(bad_style)]
|
#[allow(bad_style)]
|
||||||
#vis static #name: ::wasm_bindgen::JsStatic<#ty> = {
|
#vis static #name: ::wasm_bindgen::JsStatic<#ty> = {
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
fn init() -> #ty {
|
fn init() -> #ty {
|
||||||
#[wasm_import_module = "__wbindgen_placeholder__"]
|
#[wasm_import_module = "__wbindgen_placeholder__"]
|
||||||
extern {
|
extern {
|
||||||
@ -779,6 +801,10 @@ impl ToTokens for ast::ImportStatic {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(not(all(target_arch = "wasm32", not(target_os = "emscripten"))))]
|
||||||
|
fn init() -> #ty {
|
||||||
|
panic!("cannot access imported statics on non-wasm targets")
|
||||||
|
}
|
||||||
static mut _VAL: ::wasm_bindgen::__rt::core::cell::UnsafeCell<Option<#ty>> =
|
static mut _VAL: ::wasm_bindgen::__rt::core::cell::UnsafeCell<Option<#ty>> =
|
||||||
::wasm_bindgen::__rt::core::cell::UnsafeCell::new(None);
|
::wasm_bindgen::__rt::core::cell::UnsafeCell::new(None);
|
||||||
::wasm_bindgen::JsStatic {
|
::wasm_bindgen::JsStatic {
|
||||||
|
29
src/lib.rs
29
src/lib.rs
@ -275,10 +275,27 @@ macro_rules! numbers {
|
|||||||
|
|
||||||
numbers! { i8 u8 i16 u16 i32 u32 f32 f64 }
|
numbers! { i8 u8 i16 u16 i32 u32 f32 f64 }
|
||||||
|
|
||||||
#[wasm_import_module = "__wbindgen_placeholder__"]
|
macro_rules! externs {
|
||||||
extern {
|
($(fn $name:ident($($args:tt)*) -> $ret:ty;)*) => (
|
||||||
|
#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))]
|
||||||
|
#[wasm_import_module = "__wbindgen_placeholder__"]
|
||||||
|
extern {
|
||||||
|
$(fn $name($($args)*) -> $ret;)*
|
||||||
|
}
|
||||||
|
|
||||||
|
$(
|
||||||
|
#[cfg(not(all(target_arch = "wasm32", not(target_os = "emscripten"))))]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
unsafe extern fn $name($($args)*) -> $ret {
|
||||||
|
panic!("function not implemented on non-wasm32 targets")
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
externs! {
|
||||||
fn __wbindgen_object_clone_ref(idx: u32) -> u32;
|
fn __wbindgen_object_clone_ref(idx: u32) -> u32;
|
||||||
fn __wbindgen_object_drop_ref(idx: u32);
|
fn __wbindgen_object_drop_ref(idx: u32) -> ();
|
||||||
fn __wbindgen_string_new(ptr: *const u8, len: usize) -> u32;
|
fn __wbindgen_string_new(ptr: *const u8, len: usize) -> u32;
|
||||||
fn __wbindgen_number_new(f: f64) -> u32;
|
fn __wbindgen_number_new(f: f64) -> u32;
|
||||||
fn __wbindgen_number_get(idx: u32, invalid: *mut u8) -> f64;
|
fn __wbindgen_number_get(idx: u32, invalid: *mut u8) -> f64;
|
||||||
@ -293,10 +310,10 @@ extern {
|
|||||||
fn __wbindgen_string_get(idx: u32, len: *mut usize) -> *mut u8;
|
fn __wbindgen_string_get(idx: u32, len: *mut usize) -> *mut u8;
|
||||||
fn __wbindgen_throw(a: *const u8, b: usize) -> !;
|
fn __wbindgen_throw(a: *const u8, b: usize) -> !;
|
||||||
|
|
||||||
fn __wbindgen_cb_drop(idx: u32);
|
fn __wbindgen_cb_drop(idx: u32) -> ();
|
||||||
fn __wbindgen_cb_forget(idx: u32);
|
fn __wbindgen_cb_forget(idx: u32) -> ();
|
||||||
|
|
||||||
fn __wbindgen_describe(v: u32);
|
fn __wbindgen_describe(v: u32) -> ();
|
||||||
|
|
||||||
fn __wbindgen_json_parse(ptr: *const u8, len: usize) -> u32;
|
fn __wbindgen_json_parse(ptr: *const u8, len: usize) -> u32;
|
||||||
fn __wbindgen_json_serialize(idx: u32, ptr: *mut *mut u8) -> usize;
|
fn __wbindgen_json_serialize(idx: u32, ptr: *mut *mut u8) -> usize;
|
||||||
|
@ -17,6 +17,8 @@ struct Project {
|
|||||||
node: bool,
|
node: bool,
|
||||||
no_std: bool,
|
no_std: bool,
|
||||||
serde: bool,
|
serde: bool,
|
||||||
|
rlib: bool,
|
||||||
|
deps: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn project() -> Project {
|
fn project() -> Project {
|
||||||
@ -29,23 +31,9 @@ fn project() -> Project {
|
|||||||
node: false,
|
node: false,
|
||||||
no_std: false,
|
no_std: false,
|
||||||
serde: false,
|
serde: false,
|
||||||
|
rlib: false,
|
||||||
|
deps: Vec::new(),
|
||||||
files: vec![
|
files: vec![
|
||||||
("Cargo.toml".to_string(), format!(r#"
|
|
||||||
[package]
|
|
||||||
name = "test{}"
|
|
||||||
version = "0.0.1"
|
|
||||||
authors = []
|
|
||||||
|
|
||||||
[workspace]
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
# XXX: It is important that `[dependencies]` is the last section
|
|
||||||
# here, so that `add_local_dependency` functions correctly!
|
|
||||||
[dependencies]
|
|
||||||
"#, IDX.with(|x| *x))),
|
|
||||||
|
|
||||||
("Cargo.lock".to_string(), lockfile),
|
("Cargo.lock".to_string(), lockfile),
|
||||||
|
|
||||||
("run.js".to_string(), r#"
|
("run.js".to_string(), r#"
|
||||||
@ -158,49 +146,58 @@ impl Project {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn rlib(&mut self, rlib: bool) -> &mut Project {
|
||||||
|
self.rlib = rlib;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
fn depend(&mut self, dep: &str) -> &mut Project {
|
fn depend(&mut self, dep: &str) -> &mut Project {
|
||||||
{
|
self.deps.push(dep.to_string());
|
||||||
let cargo_toml = self.files
|
|
||||||
.iter_mut()
|
|
||||||
.find(|f| f.0 == "Cargo.toml")
|
|
||||||
.expect("should have Cargo.toml file!");
|
|
||||||
cargo_toml.1.push_str(dep);
|
|
||||||
cargo_toml.1.push_str("\n");
|
|
||||||
}
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_local_dependency(&mut self, name: &str, path: &str) -> &mut Project {
|
fn add_local_dependency(&mut self, name: &str, path: &str) -> &mut Project {
|
||||||
{
|
self.deps.push(format!("{} = {{ path = '{}' }}", name, path));
|
||||||
let cargo_toml = self.files
|
|
||||||
.iter_mut()
|
|
||||||
.find(|f| f.0 == "Cargo.toml")
|
|
||||||
.expect("should have Cargo.toml file!");
|
|
||||||
cargo_toml.1.push_str(name);
|
|
||||||
cargo_toml.1.push_str(" = { path = '");
|
|
||||||
cargo_toml.1.push_str(path);
|
|
||||||
cargo_toml.1.push_str("' }\n");
|
|
||||||
}
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test(&mut self) {
|
fn crate_name(&self) -> String {
|
||||||
{
|
format!("test{}", IDX.with(|x| *x))
|
||||||
let cargo_toml = self.files
|
}
|
||||||
.iter_mut()
|
|
||||||
.find(|f| f.0 == "Cargo.toml")
|
fn build(&mut self) -> (PathBuf, PathBuf) {
|
||||||
.expect("should have Cargo.toml file!");
|
let mut manifest = format!(r#"
|
||||||
cargo_toml.1.push_str("wasm-bindgen = { path = '");
|
[package]
|
||||||
cargo_toml.1.push_str(env!("CARGO_MANIFEST_DIR"));
|
name = "test{}"
|
||||||
cargo_toml.1.push_str("'");
|
version = "0.0.1"
|
||||||
if self.no_std {
|
authors = []
|
||||||
cargo_toml.1.push_str(", default-features = false");
|
|
||||||
}
|
[workspace]
|
||||||
if self.serde {
|
|
||||||
cargo_toml.1.push_str(", features = ['serde-serialize']");
|
[lib]
|
||||||
}
|
"#, IDX.with(|x| *x));
|
||||||
cargo_toml.1.push_str(" }\n");
|
|
||||||
|
if !self.rlib {
|
||||||
|
manifest.push_str("crate-type = [\"cdylib\"]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
manifest.push_str("[dependencies]\n");
|
||||||
|
for dep in self.deps.iter() {
|
||||||
|
manifest.push_str(dep);
|
||||||
|
manifest.push_str("\n");
|
||||||
|
}
|
||||||
|
manifest.push_str("wasm-bindgen = { path = '");
|
||||||
|
manifest.push_str(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
manifest.push_str("'");
|
||||||
|
if self.no_std {
|
||||||
|
manifest.push_str(", default-features = false");
|
||||||
|
}
|
||||||
|
if self.serde {
|
||||||
|
manifest.push_str(", features = ['serde-serialize']");
|
||||||
|
}
|
||||||
|
manifest.push_str(" }\n");
|
||||||
|
self.files.push(("Cargo.toml".to_string(), manifest));
|
||||||
|
|
||||||
let root = root();
|
let root = root();
|
||||||
drop(fs::remove_dir_all(&root));
|
drop(fs::remove_dir_all(&root));
|
||||||
for &(ref file, ref contents) in self.files.iter() {
|
for &(ref file, ref contents) in self.files.iter() {
|
||||||
@ -208,9 +205,13 @@ impl Project {
|
|||||||
fs::create_dir_all(dst.parent().unwrap()).unwrap();
|
fs::create_dir_all(dst.parent().unwrap()).unwrap();
|
||||||
fs::File::create(&dst).unwrap().write_all(contents.as_ref()).unwrap();
|
fs::File::create(&dst).unwrap().write_all(contents.as_ref()).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
let target_dir = root.parent().unwrap() // chop off test name
|
let target_dir = root.parent().unwrap() // chop off test name
|
||||||
.parent().unwrap(); // chop off `generated-tests`
|
.parent().unwrap(); // chop off `generated-tests`
|
||||||
|
(root.clone(), target_dir.to_path_buf())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test(&mut self) {
|
||||||
|
let (root, target_dir) = self.build();
|
||||||
|
|
||||||
let mut cmd = Command::new("cargo");
|
let mut cmd = Command::new("cargo");
|
||||||
cmd.arg("build")
|
cmd.arg("build")
|
||||||
@ -333,3 +334,4 @@ mod non_debug;
|
|||||||
mod simple;
|
mod simple;
|
||||||
mod slice;
|
mod slice;
|
||||||
mod structural;
|
mod structural;
|
||||||
|
mod non_wasm;
|
||||||
|
86
tests/all/non_wasm.rs
Normal file
86
tests/all/non_wasm.rs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
use std::process::Command;
|
||||||
|
use super::{run, project};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn works() {
|
||||||
|
let mut p = project();
|
||||||
|
let name = p.crate_name();
|
||||||
|
p
|
||||||
|
.rlib(true)
|
||||||
|
.file("src/lib.rs", r#"
|
||||||
|
#![feature(proc_macro, wasm_custom_section, wasm_import_module)]
|
||||||
|
|
||||||
|
extern crate wasm_bindgen;
|
||||||
|
|
||||||
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub struct A {
|
||||||
|
x: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
impl A {
|
||||||
|
pub fn new() -> A {
|
||||||
|
A { x: 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn foo(&self) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn foo(x: bool) {
|
||||||
|
A::new().foo();
|
||||||
|
|
||||||
|
if x {
|
||||||
|
bar("test");
|
||||||
|
baz(JsValue::from(3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
extern {
|
||||||
|
fn some_import();
|
||||||
|
static A: JsValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn bar(_: &str) -> JsValue {
|
||||||
|
some_import();
|
||||||
|
A.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn baz(_: JsValue) {
|
||||||
|
}
|
||||||
|
"#)
|
||||||
|
.file("tests/foo.rs", &format!("
|
||||||
|
extern crate {} as mytest;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn foo() {{
|
||||||
|
mytest::foo(false);
|
||||||
|
mytest::A::new().foo();
|
||||||
|
}}
|
||||||
|
", name))
|
||||||
|
.file("benches/foo.rs", &format!("
|
||||||
|
#![feature(test)]
|
||||||
|
extern crate test;
|
||||||
|
extern crate {} as mytest;
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn foo(b: &mut test::Bencher) {{
|
||||||
|
b.iter(|| mytest::foo(false));
|
||||||
|
}}
|
||||||
|
", name));
|
||||||
|
let (root, target_dir) = p.build();
|
||||||
|
let mut cmd = Command::new("cargo");
|
||||||
|
cmd.arg("test")
|
||||||
|
.arg("--test").arg("foo")
|
||||||
|
.arg("--bench").arg("foo")
|
||||||
|
.current_dir(&root)
|
||||||
|
.env("CARGO_TARGET_DIR", &target_dir);
|
||||||
|
run(&mut cmd, "cargo");
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user