Skip to content

Commit

Permalink
perf: Optimized definition_name for the non-: case
Browse files Browse the repository at this point in the history
  • Loading branch information
Marwes committed Jan 27, 2019
1 parent c0acb06 commit 1713a44
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 7 deletions.
40 changes: 35 additions & 5 deletions base/src/symbol.rs
Expand Up @@ -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
}

Expand All @@ -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
}
}

Expand Down Expand Up @@ -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");
}
}
4 changes: 2 additions & 2 deletions vm/src/primitives.rs
Expand Up @@ -706,12 +706,12 @@ pub fn load<'vm>(vm: &'vm Thread) -> Result<ExternModule> {
use self::std;

vm.define_global(
"@error",
"error",
primitive::<fn(StdString) -> Pushed<A>>("@error", std::prim::error),
)?;

vm.define_global(
"@string_eq",
"string_eq",
primitive!(2, "@string_eq", <str as PartialEq>::eq),
)?;

Expand Down

0 comments on commit 1713a44

Please sign in to comment.