aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen.rs
diff options
context:
space:
mode:
authorGravatar Hugo van der Wijst <hugo@wij.st> 2019-02-10 15:25:33 -0800
committerGravatar Jorge Aparicio <jorge@japaric.io> 2019-02-16 00:23:01 +0100
commit577d188f72398461650a4e76d81396bf0abea0f4 (patch)
tree039c3c5201032016f1497cbf9e2fa110a195e40a /macros/src/codegen.rs
parenta654d13eefa846b9dc7fcdc1ccf5af43fc33834e (diff)
downloadrtic-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.rs35
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())
}
}