Avoid extra O(n) scan in validate_and_extract

Also `debug_assert!`s that `splitn` was called with the
correct `count` argument.
This commit is contained in:
Tamir Duberstein 2015-05-26 13:14:39 -04:00
parent 8759d42559
commit a3d463093e

View file

@ -637,19 +637,29 @@ pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str)
// Step 2. // Step 2.
try!(validate_qualified_name(qualified_name)); try!(validate_qualified_name(qualified_name));
let (prefix, local_name) = if qualified_name.contains(":") { let colon = ':';
// Step 5. // Step 5.
let mut parts = qualified_name.splitn(2, ':'); let mut parts = qualified_name.splitn(2, colon);
let prefix = parts.next().unwrap();
debug_assert!(!prefix.is_empty()); let (maybe_prefix, local_name) = {
let local_name = parts.next().unwrap(); let maybe_prefix = parts.next();
debug_assert!(!local_name.contains(":")); let maybe_local_name = parts.next();
(Some(prefix), local_name)
debug_assert!(parts.next().is_none());
if let Some(local_name) = maybe_local_name {
debug_assert!(!maybe_prefix.unwrap().is_empty());
(maybe_prefix, local_name)
} else { } else {
(None, qualified_name) (None, maybe_prefix.unwrap())
}
}; };
match (namespace, prefix) { debug_assert!(!local_name.contains(colon));
match (namespace, maybe_prefix) {
(ns!(""), Some(_)) => { (ns!(""), Some(_)) => {
// Step 6. // Step 6.
Err(Error::Namespace) Err(Error::Namespace)