diff -Nru rust-stdweb-internal-macros-0.2.5/Cargo.toml rust-stdweb-internal-macros-0.2.9/Cargo.toml --- rust-stdweb-internal-macros-0.2.5/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,7 +12,7 @@ [package] name = "stdweb-internal-macros" -version = "0.2.5" +version = "0.2.9" authors = ["Jan Bujak "] description = "Internal procedural macros for the `stdweb` crate" homepage = "https://github.com/koute/stdweb" @@ -29,10 +29,10 @@ version = "0.2" [dependencies.proc-macro2] -version = "0.4" +version = "1" [dependencies.quote] -version = "0.6" +version = "1" [dependencies.serde] version = "1" @@ -47,6 +47,6 @@ version = "0.6" [dependencies.syn] -version = "0.15" +version = "1" features = ["full", "parsing", "printing", "clone-impls"] default-features = false diff -Nru rust-stdweb-internal-macros-0.2.5/Cargo.toml.orig rust-stdweb-internal-macros-0.2.9/Cargo.toml.orig --- rust-stdweb-internal-macros-0.2.5/Cargo.toml.orig 2019-01-08 19:22:17.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/Cargo.toml.orig 2019-10-07 17:03:40.000000000 +0000 @@ -1,6 +1,6 @@ [package] name = "stdweb-internal-macros" -version = "0.2.5" +version = "0.2.9" authors = ["Jan Bujak "] repository = "https://github.com/koute/stdweb" homepage = "https://github.com/koute/stdweb" @@ -15,16 +15,16 @@ proc-macro = true [dependencies] -quote = "0.6" +quote = "1" base-x = "0.2" serde = "1" serde_derive = "1" serde_json = "1" -proc-macro2 = "0.4" +proc-macro2 = "1" sha1 = "0.6" [dependencies.syn] -version = "0.15" +version = "1" default-features = false features = ["full", "parsing", "printing", "clone-impls"] diff -Nru rust-stdweb-internal-macros-0.2.5/.cargo_vcs_info.json rust-stdweb-internal-macros-0.2.9/.cargo_vcs_info.json --- rust-stdweb-internal-macros-0.2.5/.cargo_vcs_info.json 1970-01-01 00:00:00.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/.cargo_vcs_info.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +1,5 @@ { "git": { - "sha1": "5c4f1c5165d484545361e785539a28adffaf5dfb" + "sha1": "9b418d98df6fafaa4d4b87b04c304d0220292055" } } diff -Nru rust-stdweb-internal-macros-0.2.5/debian/cargo-checksum.json rust-stdweb-internal-macros-0.2.9/debian/cargo-checksum.json --- rust-stdweb-internal-macros-0.2.5/debian/cargo-checksum.json 2019-01-22 08:58:56.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/debian/cargo-checksum.json 2019-11-05 03:29:21.000000000 +0000 @@ -1 +1 @@ -{"package":"432465093692af7379dcd196ce4be398c906958d91b412fff9102a66238d6f26","files":{}} +{"package":"58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11","files":{}} diff -Nru rust-stdweb-internal-macros-0.2.5/debian/changelog rust-stdweb-internal-macros-0.2.9/debian/changelog --- rust-stdweb-internal-macros-0.2.5/debian/changelog 2019-01-22 08:58:56.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/debian/changelog 2019-11-05 03:29:21.000000000 +0000 @@ -1,3 +1,15 @@ +rust-stdweb-internal-macros (0.2.9-1) unstable; urgency=medium + + * Package stdweb-internal-macros 0.2.9 from crates.io using debcargo 2.4.0 + + -- kpcyrd Tue, 05 Nov 2019 04:29:21 +0100 + +rust-stdweb-internal-macros (0.2.7-1) unstable; urgency=medium + + * Package stdweb-internal-macros 0.2.7 from crates.io using debcargo 2.4.0 + + -- Wolfgang Silbermayr Sat, 28 Sep 2019 11:45:16 +0200 + rust-stdweb-internal-macros (0.2.5-1) unstable; urgency=medium * Package stdweb-internal-macros 0.2.5 from crates.io using debcargo 2.2.9 diff -Nru rust-stdweb-internal-macros-0.2.5/debian/control rust-stdweb-internal-macros-0.2.9/debian/control --- rust-stdweb-internal-macros-0.2.5/debian/control 2019-01-22 08:58:56.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/debian/control 2019-11-05 03:29:21.000000000 +0000 @@ -2,21 +2,21 @@ Section: rust Priority: optional Build-Depends: debhelper (>= 11), - dh-cargo (>= 10), + dh-cargo (>= 18), cargo:native , rustc:native , libstd-rust-dev , librust-base-x-0.2+default-dev , - librust-proc-macro2-0.4+default-dev , - librust-quote-0.6+default-dev , + librust-proc-macro2-1+default-dev , + librust-quote-1+default-dev , librust-serde-1+default-dev , librust-serde-derive-1+default-dev , librust-serde-json-1+default-dev , librust-sha1-0.6+default-dev , - librust-syn-0.15+clone-impls-dev , - librust-syn-0.15+full-dev , - librust-syn-0.15+parsing-dev , - librust-syn-0.15+printing-dev + librust-syn-1+clone-impls-dev , + librust-syn-1+full-dev , + librust-syn-1+parsing-dev , + librust-syn-1+printing-dev Maintainer: Debian Rust Maintainers Uploaders: kpcyrd , @@ -32,24 +32,24 @@ Depends: ${misc:Depends}, librust-base-x-0.2+default-dev, - librust-proc-macro2-0.4+default-dev, - librust-quote-0.6+default-dev, + librust-proc-macro2-1+default-dev, + librust-quote-1+default-dev, librust-serde-1+default-dev, librust-serde-derive-1+default-dev, librust-serde-json-1+default-dev, librust-sha1-0.6+default-dev, - librust-syn-0.15+clone-impls-dev, - librust-syn-0.15+full-dev, - librust-syn-0.15+parsing-dev, - librust-syn-0.15+printing-dev + librust-syn-1+clone-impls-dev, + librust-syn-1+full-dev, + librust-syn-1+parsing-dev, + librust-syn-1+printing-dev Provides: librust-stdweb-internal-macros+default-dev (= ${binary:Version}), librust-stdweb-internal-macros-0-dev (= ${binary:Version}), librust-stdweb-internal-macros-0+default-dev (= ${binary:Version}), librust-stdweb-internal-macros-0.2-dev (= ${binary:Version}), librust-stdweb-internal-macros-0.2+default-dev (= ${binary:Version}), - librust-stdweb-internal-macros-0.2.5-dev (= ${binary:Version}), - librust-stdweb-internal-macros-0.2.5+default-dev (= ${binary:Version}) + librust-stdweb-internal-macros-0.2.9-dev (= ${binary:Version}), + librust-stdweb-internal-macros-0.2.9+default-dev (= ${binary:Version}) Description: Internal procedural macros for the `stdweb` crate - Rust source code This package contains the source for the Rust stdweb-internal-macros crate, packaged by debcargo for use with cargo and dh-cargo. diff -Nru rust-stdweb-internal-macros-0.2.5/debian/rules rust-stdweb-internal-macros-0.2.9/debian/rules --- rust-stdweb-internal-macros-0.2.5/debian/rules 2019-01-22 08:58:56.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/debian/rules 2019-11-05 03:29:21.000000000 +0000 @@ -1,3 +1,6 @@ #!/usr/bin/make -f %: dh $@ --buildsystem cargo + +override_dh_auto_test: + dh_auto_test -- test --all diff -Nru rust-stdweb-internal-macros-0.2.5/debian/tests/control rust-stdweb-internal-macros-0.2.9/debian/tests/control --- rust-stdweb-internal-macros-0.2.5/debian/tests/control 1970-01-01 00:00:00.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/debian/tests/control 2019-11-05 03:29:21.000000000 +0000 @@ -0,0 +1,7 @@ +Test-Command: /usr/share/cargo/bin/cargo-auto-test stdweb-internal-macros 0.2.9 --all-targets --all-features +Depends: dh-cargo (>= 18), @ +Restrictions: allow-stderr, skip-not-installable + +Test-Command: /usr/share/cargo/bin/cargo-auto-test stdweb-internal-macros 0.2.9 --all-targets --no-default-features +Depends: dh-cargo (>= 18), librust-stdweb-internal-macros-dev +Restrictions: allow-stderr, skip-not-installable diff -Nru rust-stdweb-internal-macros-0.2.5/src/attr_hack.rs rust-stdweb-internal-macros-0.2.9/src/attr_hack.rs --- rust-stdweb-internal-macros-0.2.5/src/attr_hack.rs 2018-12-08 22:25:17.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/attr_hack.rs 2019-10-07 16:31:14.000000000 +0000 @@ -5,6 +5,7 @@ // this problem. pub struct AttrHack< T: Parse > { pub fn_name: syn::Ident, + pub return_ty: Option< syn::Type >, pub inner: T } @@ -17,6 +18,14 @@ let fn_args_input; parenthesized!( fn_args_input in input ); + let return_ty = + if input.peek( Token![->] ) { + let _: Token![->] = input.parse()?; + Some( input.parse()? ) + } else { + None + }; + let fn_body_input; braced!( fn_body_input in input ); @@ -31,6 +40,7 @@ Ok( AttrHack { fn_name, + return_ty, inner }) } else { diff -Nru rust-stdweb-internal-macros-0.2.5/src/js_shim.rs rust-stdweb-internal-macros-0.2.9/src/js_shim.rs --- rust-stdweb-internal-macros-0.2.5/src/js_shim.rs 2018-12-15 12:23:57.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/js_shim.rs 2019-10-07 16:37:29.000000000 +0000 @@ -1,6 +1,7 @@ use std::env; use std::path::PathBuf; use std::fs; +use std::fmt::Write; use syn; use proc_macro2::{TokenStream, Span}; @@ -49,30 +50,42 @@ fs::write( path, blob ).expect( "failed to write a JS snippet" ); } -pub fn js_shim_extern_code( target: Target, code: &str, arg_count: usize ) -> (syn::Ident, TokenStream) { +pub fn js_shim_extern_code( target: Target, code: &str, arg_count: usize, return_ty: Option< syn::Type > ) -> (syn::Ident, TokenStream) { let snippet = Snippet { name: format!( "__cargo_web_snippet_{}", hash( code ) ), code: code.to_owned(), arg_count }; + let has_return_value = return_ty.is_some(); + let return_signature = if let Some( ty ) = return_ty { + quote! { -> #ty } + } else { + quote! {} + }; + let shim_name = syn::Ident::new( &snippet.name, Span::call_site() ); let shim_args: Vec< _ > = dummy_idents( arg_count ).map( |name| quote! { #name: *const u8 } ).collect(); let shim_args_passthrough: Vec< _ > = dummy_idents( arg_count ).map( |name| quote! { #name } ).collect(); let output = match target { Target::Emscripten => { let code_bytes = syn::LitByteStr::new( format!( "{}\0", code ).as_str().as_bytes(), Span::call_site() ); + let return_semicolon = if has_return_value { + quote! {} + } else { + quote! { ; } + }; quote! { const SNIPPET: &'static [u8] = #code_bytes; - fn #shim_name( #(#shim_args),* ) -> i32 { + fn #shim_name( #(#shim_args),* ) #return_signature { extern "C" { pub fn emscripten_asm_const_int( code: *const u8, ... ) -> i32; } unsafe { - emscripten_asm_const_int( SNIPPET as *const _ as *const u8, #(#shim_args_passthrough),* ) + emscripten_asm_const_int( SNIPPET as *const _ as *const u8, #(#shim_args_passthrough),* ) #return_semicolon } } } @@ -81,7 +94,35 @@ output_snippet( &snippet ); quote! { extern "C" { - pub fn #shim_name( #(#shim_args),* ) -> i32; + pub fn #shim_name( #(#shim_args),* ) #return_signature; + } + } + }, + Target::WasmBindgen => { + let mut code_string = String::new(); + write!( &mut code_string, "export function {}(", &snippet.name ).unwrap(); + write!( &mut code_string, "Module" ).unwrap(); + if arg_count != 0 { + write!( &mut code_string, ", " ).unwrap(); + } + for nth in 0..arg_count { + write!( &mut code_string, "${}", nth ).unwrap(); + if nth + 1 != arg_count { + write!( &mut code_string, ", " ).unwrap(); + } + } + write!( &mut code_string, ") {{ {} }}", code ).unwrap(); + let shim_name = &shim_name; + let shim_args = &shim_args; + quote! { + use ::stdweb::private::wasm_bindgen::prelude::*; + unsafe fn #shim_name( #(#shim_args),* ) #return_signature { + #[wasm_bindgen(inline_js = #code_string)] + extern "C" { + pub fn #shim_name( module: JsValue, #(#shim_args),* ) #return_signature; + } + + #shim_name( ::stdweb::private::get_module(), #(#shim_args_passthrough),* ) } } } diff -Nru rust-stdweb-internal-macros-0.2.5/src/lib.rs rust-stdweb-internal-macros-0.2.9/src/lib.rs --- rust-stdweb-internal-macros-0.2.5/src/lib.rs 2018-12-13 16:52:46.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/lib.rs 2019-10-07 15:33:16.000000000 +0000 @@ -85,3 +85,18 @@ pub fn emscripten_js_no_return_attr( _: proc_macro::TokenStream, input: proc_macro::TokenStream ) -> proc_macro::TokenStream { emit( macro_js::js_attr( Target::Emscripten, input.into(), true ) ) } + +#[proc_macro_attribute] +pub fn wasm_bindgen_js_raw_attr( _: proc_macro::TokenStream, input: proc_macro::TokenStream ) -> proc_macro::TokenStream { + emit( macro_js_raw::js_raw_attr( Target::WasmBindgen, input.into() ) ) +} + +#[proc_macro_attribute] +pub fn wasm_bindgen_js_attr( _: proc_macro::TokenStream, input: proc_macro::TokenStream ) -> proc_macro::TokenStream { + emit( macro_js::js_attr( Target::WasmBindgen, input.into(), false ) ) +} + +#[proc_macro_attribute] +pub fn wasm_bindgen_js_no_return_attr( _: proc_macro::TokenStream, input: proc_macro::TokenStream ) -> proc_macro::TokenStream { + emit( macro_js::js_attr( Target::WasmBindgen, input.into(), true ) ) +} diff -Nru rust-stdweb-internal-macros-0.2.5/src/macro_async_test.rs rust-stdweb-internal-macros-0.2.9/src/macro_async_test.rs --- rust-stdweb-internal-macros-0.2.5/src/macro_async_test.rs 2018-12-08 22:25:17.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/macro_async_test.rs 2019-09-17 21:28:33.000000000 +0000 @@ -29,7 +29,7 @@ } // TODO: There must be a cleaner way to do this. -fn check_decl( decl: &syn::FnDecl ) -> TestKind { +fn check_decl( decl: &syn::Signature ) -> TestKind { assert!( decl.generics.lifetimes().next().is_none(), "Lifetimes are yet not supported" ); assert!( decl.generics.where_clause.is_none(), "`where` clauses are not supported" ); assert!( decl.variadic.is_none(), "Variadic functions are not supported" ); @@ -137,19 +137,17 @@ panic!( "Expected a function with a single argument!" ); } - let arg = decl.inputs.last().unwrap().into_value(); - match arg { - syn::FnArg::SelfRef( .. ) => panic!( "`&self` is not supported" ), - syn::FnArg::SelfValue( .. ) => panic!( "`self` is not supported" ), - syn::FnArg::Ignored( .. ) => panic!( "ignored args are not supported" ), - syn::FnArg::Captured( cap ) => { - match cap.pat { + let arg = decl.inputs.last().unwrap(); + match *arg { + syn::FnArg::Receiver( .. ) => panic!( "`self` is not supported" ), + syn::FnArg::Typed( syn::PatType { ref pat, ref ty, .. } ) => { + match **pat { syn::Pat::Ident( ref pat ) => { assert!( pat.by_ref.is_none(), "`ref` bindings are not supported" ); assert!( pat.mutability.is_none(), "`mut` bindings are not supported" ); assert!( pat.subpat.is_none(), "Subpatterns are not supported" ); - match cap.ty { + match **ty { syn::Type::Path( syn::TypePath { qself: None, @@ -177,16 +175,15 @@ }, _ => panic!( "Argument patterns are not supported" ) } - }, - syn::FnArg::Inferred( _ ) => panic!( "inferred argument types are not supported" ) + } } } fn async_test_impl( item: syn::Item ) -> proc_macro2::TokenStream { let (ident, block, test_kind) = match item { syn::Item::Fn( function ) => { - let test_kind = check_decl( &function.decl ); - (function.ident, function.block, test_kind) + let test_kind = check_decl( &function.sig ); + (function.sig.ident.clone(), function.block, test_kind) }, _ => panic!( "`#[async_test]` attached to an unsupported element!" ) }; diff -Nru rust-stdweb-internal-macros-0.2.5/src/macro_js_export.rs rust-stdweb-internal-macros-0.2.9/src/macro_js_export.rs --- rust-stdweb-internal-macros-0.2.5/src/macro_js_export.rs 2018-11-19 22:00:17.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/macro_js_export.rs 2019-09-17 21:28:33.000000000 +0000 @@ -138,7 +138,7 @@ let __result = ::stdweb::private::JsSerializeOwned::into_js_owned( &mut __result ); let __result = &__result as *const _; __js_raw_asm!( "Module.STDWEB_PRIVATE.tmp = Module.STDWEB_PRIVATE.to_js( $0 );", __result ); - ::std::mem::drop( __arena_restore_point ); + std::mem::drop( __arena_restore_point ); let __result = (); }; export_result_metadata = Some( TypeMetadata::Custom { @@ -175,7 +175,7 @@ let pointer = #export_arg_ident as *mut ::stdweb::private::SerializedValue; unsafe { let value = (&*pointer).deserialize(); - ::stdweb::private::__web_free( pointer as *mut u8, ::std::mem::size_of::< ::stdweb::private::SerializedValue >() ); + ::stdweb::private::__web_free( pointer as *mut u8, std::mem::size_of::< ::stdweb::private::SerializedValue >() ); value } }; @@ -262,7 +262,8 @@ quote! { #(#output)* } } -fn into_export( ident: syn::Ident, decl: &syn::FnDecl ) -> Export { +fn into_export( decl: &syn::Signature ) -> Export { + let ident = decl.ident.clone(); assert!( decl.generics.lifetimes().next().is_none(), "Lifetimes are not yet not supported" ); assert!( decl.generics.type_params().next().is_none(), "Generics are not supported" ); assert!( decl.generics.where_clause.is_none(), "`where` clauses are not supported" ); @@ -276,22 +277,14 @@ let mut args = Vec::new(); for (index, arg) in decl.inputs.iter().cloned().enumerate() { match arg { - syn::FnArg::SelfRef( .. ) => panic!( "`&self` is not supported" ), - syn::FnArg::SelfValue( .. ) => panic!( "`self` is not supported" ), - syn::FnArg::Ignored( ty ) => { - let ident = syn::Ident::new( &format!( "__arg_{}", index ), Span::call_site() ); - args.push( ExportArg { - ident, - ty: match_type( &ty ) - }); - }, - syn::FnArg::Captured( cap ) => { - match cap.pat { + syn::FnArg::Receiver( .. ) => panic!( "`self` is not supported" ), + syn::FnArg::Typed( syn::PatType { pat, ty, .. } ) => { + match *pat { syn::Pat::Wild( _ ) => { let ident = syn::Ident::new( &format!( "__arg_{}", index ), Span::call_site() ); args.push( ExportArg { ident, - ty: match_type( &cap.ty ) + ty: match_type( &ty ) }); }, syn::Pat::Ident( pat ) => { @@ -301,13 +294,12 @@ args.push( ExportArg { ident: pat.ident, - ty: match_type( &cap.ty ) + ty: match_type( &ty ) }); }, _ => panic!( "Argument patterns are not supported" ) } - }, - syn::FnArg::Inferred( _ ) => panic!( "inferred argument types are not supported" ) + } } } @@ -329,7 +321,7 @@ match item { syn::Item::Fn( ref function ) => { - exports.push( into_export( function.ident.clone(), &function.decl ) ); + exports.push( into_export( &function.sig ) ); }, _ => panic!( "`#[js_export]` attached to an unsupported element!" ) } diff -Nru rust-stdweb-internal-macros-0.2.5/src/macro_js_raw.rs rust-stdweb-internal-macros-0.2.9/src/macro_js_raw.rs --- rust-stdweb-internal-macros-0.2.5/src/macro_js_raw.rs 2018-12-13 16:52:46.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/macro_js_raw.rs 2019-10-07 16:34:40.000000000 +0000 @@ -69,7 +69,7 @@ } fn js_raw_code( target: Target, js_raw: JsRawInvocation ) -> TokenStream { - let (shim_name, shim) = js_shim_extern_code( target, &js_raw.code, js_raw.args.len() ); + let (shim_name, shim) = js_shim_extern_code( target, &js_raw.code, js_raw.args.len(), None ); let args = js_raw.args; quote! {{ @@ -90,13 +90,19 @@ let wrapper: AttrHack< JsRawInvocation > = syn::parse2( input )?; let wrapper_name = wrapper.fn_name; let js_raw = wrapper.inner; + let return_ty = wrapper.return_ty; - let (shim_name, shim) = js_shim_extern_code( target, &js_raw.code, js_raw.args.len() ); + let (shim_name, shim) = js_shim_extern_code( target, &js_raw.code, js_raw.args.len(), return_ty.clone() ); + let return_signature = if let Some( ty ) = return_ty { + quote! { -> #ty } + } else { + quote! {} + }; let prototype_args = dummy_idents( js_raw.args.len() ).map( |name| quote! { #name: *const u8 } ); let call_args = dummy_idents( js_raw.args.len() ).map( |name| quote! { #name } ); let output = quote! { - fn #wrapper_name( #(#prototype_args),* ) -> i32 { + fn #wrapper_name( #(#prototype_args),* ) #return_signature { #shim unsafe { #shim_name( #(#call_args),* ) diff -Nru rust-stdweb-internal-macros-0.2.5/src/macro_js.rs rust-stdweb-internal-macros-0.2.9/src/macro_js.rs --- rust-stdweb-internal-macros-0.2.5/src/macro_js.rs 2018-12-13 16:52:46.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/macro_js.rs 2019-10-07 16:27:32.000000000 +0000 @@ -9,34 +9,42 @@ use utils::{Target, dummy_idents}; // TODO: Delete this once expression procedural macros are stable. -pub fn js_attr( target: Target, input: TokenStream, no_return: bool ) -> Result< TokenStream > { +pub fn js_attr( target: Target, input: TokenStream, outer_no_return: bool ) -> Result< TokenStream > { let wrapper: AttrHack< StringifiedCode > = syn::parse2( input )?; let wrapper_name = wrapper.fn_name; let snippet = wrapper.inner; - let mut arg_count = snippet.arg_count(); - if !no_return { - arg_count += 1; - } + let inner_no_return = outer_no_return || snippet.code( 0 ).contains( "return" ) == false; + let inner_arg_count = snippet.arg_count() + if inner_no_return { 0 } else { 1 }; + let outer_arg_count = snippet.arg_count() + if outer_no_return { 0 } else { 1 }; - let initial_arg_index = if no_return { 0 } else { 1 }; + let initial_arg_index = if inner_no_return { 0 } else { 1 }; let mut code = snippet.code( initial_arg_index ); - if !no_return { + if !inner_no_return { code = format!( "Module.STDWEB_PRIVATE.from_js($0, (function(){{{}}})());", code ); } let mut prelude = String::new(); - for nth in initial_arg_index..arg_count { + for nth in initial_arg_index..inner_arg_count { write!( prelude, "${} = Module.STDWEB_PRIVATE.to_js(${});", nth, nth ).unwrap(); } code = format!( "{}{}", prelude, code ); - let (shim_name, shim) = js_shim_extern_code( target, &code, arg_count ); + let (shim_name, shim) = js_shim_extern_code( target, &code, inner_arg_count, wrapper.return_ty ); + + let arg_names: Vec< _ > = dummy_idents( outer_arg_count ).collect(); + let prototype_args = arg_names.clone().into_iter().map( |name| quote! { #name: *const u8 } ); + + let call_args: Vec< _ >; + if inner_no_return && !outer_no_return { + call_args = arg_names.into_iter().skip( 1 ).collect(); + } else { + call_args = arg_names.into_iter().collect(); + } - let prototype_args = dummy_idents( arg_count ).map( |name| quote! { #name: *const u8 } ); - let call_args = dummy_idents( arg_count ).map( |name| quote! { #name } ); + let call_args = call_args.into_iter().map( |name| quote! { #name } ); let output = quote! { - fn #wrapper_name( #(#prototype_args),* ) -> i32 { + fn #wrapper_name( #(#prototype_args),* ) { #shim unsafe { #shim_name( #(#call_args),* ) diff -Nru rust-stdweb-internal-macros-0.2.5/src/utils.rs rust-stdweb-internal-macros-0.2.9/src/utils.rs --- rust-stdweb-internal-macros-0.2.5/src/utils.rs 2018-12-13 16:52:46.000000000 +0000 +++ rust-stdweb-internal-macros-0.2.9/src/utils.rs 2019-05-19 19:28:54.000000000 +0000 @@ -4,7 +4,8 @@ #[derive(Copy, Clone)] pub enum Target { Emscripten, - NativeWebAssembly + NativeWebAssembly, + WasmBindgen } pub fn dummy_idents( count: usize ) -> impl Iterator< Item = syn::Ident > {