From 3ad3123882e4780c1e9c940559a0755a0abe1bb5 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 6 Mar 2018 13:45:44 -0800 Subject: [PATCH] Disambiguate generated wrappers --- crates/wasm-bindgen-macro/src/lib.rs | 33 ++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) mode change 100644 => 100755 crates/wasm-bindgen-macro/src/lib.rs diff --git a/crates/wasm-bindgen-macro/src/lib.rs b/crates/wasm-bindgen-macro/src/lib.rs old mode 100644 new mode 100755 index 13544e5b..b0fe93d9 --- a/crates/wasm-bindgen-macro/src/lib.rs +++ b/crates/wasm-bindgen-macro/src/lib.rs @@ -10,6 +10,8 @@ extern crate proc_macro2; extern crate serde_json; extern crate wasm_bindgen_shared as shared; +use std::borrow::Cow; +use std::env; use std::sync::atomic::*; use proc_macro::TokenStream; @@ -39,6 +41,24 @@ pub fn wasm_bindgen(attr: TokenStream, input: TokenStream) -> TokenStream { ret.into() } +fn to_ident_name(s: &str) -> Cow { + if s.chars().all(|c| match c { + 'a'...'z' | 'A'...'Z' | '0'...'9' | '_' => true, + _ => false, + }) { + return Cow::from(s); + } + + Cow::from( + s.chars() + .map(|c| match c { + 'a'...'z' | 'A'...'Z' | '0'...'9' | '_' => c, + _ => '_', + }) + .collect::(), + ) +} + // Generate wrappers for all the items that we've found fn generate_wrappers(program: ast::Program, tokens: &mut Tokens) { for export in program.exports.iter() { @@ -62,9 +82,18 @@ fn generate_wrappers(program: ast::Program, tokens: &mut Tokens) { // eventually have it actually in its own section. static CNT: AtomicUsize = ATOMIC_USIZE_INIT; - let generated_static_name = format!("__WASM_BINDGEN_GENERATED{}", - CNT.fetch_add(1, Ordering::SeqCst)); + + let crate_name = env::var("CARGO_PKG_NAME").expect("should have CARGO_PKG_NAME env var"); + let crate_vers = env::var("CARGO_PKG_VERSION").expect("should have CARGO_PKG_VERSION env var"); + + let generated_static_name = format!( + "__WASM_BINDGEN_GENERATED_{}_{}_{}", + to_ident_name(&crate_name), + to_ident_name(&crate_vers), + CNT.fetch_add(1, Ordering::SeqCst) + ); let generated_static_name = syn::Ident::from(generated_static_name); + let mut generated_static_value = Tokens::new(); let generated_static_length = program.wbg_literal(&mut generated_static_value);