From 1713a4424b2c3f54363f02f25d6dea216c148951 Mon Sep 17 00:00:00 2001 From: Markus Westerlind Date: Sat, 26 Jan 2019 22:38:17 +0100 Subject: [PATCH] perf: Optimized definition_name for the non-`:` case --- base/src/symbol.rs | 40 +++++++++++++++++++++++++++++++++++----- vm/src/primitives.rs | 4 ++-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/base/src/symbol.rs b/base/src/symbol.rs index 74deaf1f65..f3e545bf86 100644 --- a/base/src/symbol.rs +++ b/base/src/symbol.rs @@ -288,12 +288,15 @@ impl Name { } pub fn as_pretty_str(&self) -> &str { - let name = &self.0; - name.split(':').next().unwrap_or(name) + Self::strip_position_suffix(&self.0) } pub fn as_str(&self) -> &str { - debug_assert!(!self.0.contains(':'), "Did you mean to call as_pretty_str?"); + debug_assert!( + !self.0.contains(':'), + "Did you mean to call as_pretty_str?: {}", + &self.0 + ); &self.0 } @@ -318,8 +321,24 @@ impl Name { } pub fn definition_name(&self) -> &str { - let name = self.0.trim_start_matches('@'); - name.split(':').next().unwrap_or(name) + Self::strip_position_suffix(if self.0.as_bytes().get(0) == Some(&b'@') { + &self.0[1..] + } else { + &self.0 + }) + } + + fn strip_position_suffix(name: &str) -> &str { + // Strip away a `:1234_56` suffix + let x = match name + .bytes() + .rposition(|b| (b < b'0' || b > b'9') && b != b'_') + { + Some(i) if name.as_bytes()[i] == b':' => &name[..i], + _ => name, + }; + + x } } @@ -555,3 +574,14 @@ impl<'a> IdentEnv for SymbolModule<'a> { self.symbol(s) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn definition_name() { + assert_eq!(Name::new("a:123").definition_name(), "a"); + assert_eq!(Name::new("a:123_5").definition_name(), "a"); + } +} diff --git a/vm/src/primitives.rs b/vm/src/primitives.rs index db3afb946b..4fba0ef241 100644 --- a/vm/src/primitives.rs +++ b/vm/src/primitives.rs @@ -706,12 +706,12 @@ pub fn load<'vm>(vm: &'vm Thread) -> Result { use self::std; vm.define_global( - "@error", + "error", primitive:: Pushed>("@error", std::prim::error), )?; vm.define_global( - "@string_eq", + "string_eq", primitive!(2, "@string_eq", ::eq), )?;