diff options
author | 2019-02-10 15:25:33 -0800 | |
---|---|---|
committer | 2019-02-16 00:23:01 +0100 | |
commit | 577d188f72398461650a4e76d81396bf0abea0f4 (patch) | |
tree | 039c3c5201032016f1497cbf9e2fa110a195e40a /macros/src/codegen.rs | |
parent | a654d13eefa846b9dc7fcdc1ccf5af43fc33834e (diff) | |
download | rtic-577d188f72398461650a4e76d81396bf0abea0f4.tar.gz rtic-577d188f72398461650a4e76d81396bf0abea0f4.tar.zst rtic-577d188f72398461650a4e76d81396bf0abea0f4.zip |
Make generated names stable when sorting.
Diffstat (limited to 'macros/src/codegen.rs')
-rw-r--r-- | macros/src/codegen.rs | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index 9fc0e271..e2e5ac44 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -3,6 +3,7 @@ use proc_macro::TokenStream; use std::{ collections::{BTreeMap, HashMap}, + time::{SystemTime, UNIX_EPOCH}, }; use proc_macro2::Span; @@ -1993,30 +1994,48 @@ fn mk_typenum_capacity(capacity: u8, power_of_two: bool) -> proc_macro2::TokenSt } struct IdentGenerator { + call_count: u32, rng: rand::rngs::SmallRng, } impl IdentGenerator { fn new() -> IdentGenerator { - let crate_name = env!("CARGO_PKG_NAME"); - let seed = [0u8; 16]; - for (i, b) in crate_name.bytes().enumerate() { - seed[i%seed.len()].wrapping_add(b); + let elapsed = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); + + let secs = elapsed.as_secs(); + let nanos = elapsed.subsec_nanos(); + + let mut seed: [u8; 16] = [0; 16]; + + for (i, v) in seed.iter_mut().take(8).enumerate() { + *v = ((secs >> (i * 8)) & 0xFF) as u8 + } + + for (i, v) in seed.iter_mut().skip(8).take(4).enumerate() { + *v = ((nanos >> (i * 8)) & 0xFF) as u8 + } + + let rng = rand::rngs::SmallRng::from_seed(seed); + + IdentGenerator { + call_count: 0, + rng, } - IdentGenerator { rng: rand::rngs::SmallRng::from_seed(seed) } } fn mk_ident(&mut self, name: Option<&str>) -> Ident { let n; - let mut s = if let Some(name) = name { + let s = if let Some(name) = name { n = 4; format!("{}_", name) } else { let crate_name = env!("CARGO_PKG_NAME").replace("-", "_").to_lowercase(); - n = 16; + n = 4; format!("{}__internal__", crate_name) }; + let mut s = format!("{}{}_", s, self.call_count); + for i in 0..n { if i == 0 || self.rng.gen() { s.push(('a' as u8 + self.rng.gen::<u8>() % 25) as char) @@ -2025,6 +2044,8 @@ impl IdentGenerator { } } + self.call_count += 1; + Ident::new(&s, Span::call_site()) } } |