aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/utils.rs
diff options
context:
space:
mode:
authorTamir Duberstein <tamird@gmail.com>2015-05-26 13:14:39 -0400
committerTamir Duberstein <tamird@gmail.com>2015-05-26 13:26:26 -0400
commita3d463093ec6ff445d9e1d3352696754431ae68b (patch)
tree7f70c97975cf36e5b2866de574cc9b43de619f56 /components/script/dom/bindings/utils.rs
parent8759d42559bc5c10f8d90903f33f75bddf44d9fe (diff)
downloadservo-a3d463093ec6ff445d9e1d3352696754431ae68b.tar.gz
servo-a3d463093ec6ff445d9e1d3352696754431ae68b.zip
Avoid extra O(n) scan in `validate_and_extract`
Also `debug_assert!`s that `splitn` was called with the correct `count` argument.
Diffstat (limited to 'components/script/dom/bindings/utils.rs')
-rw-r--r--components/script/dom/bindings/utils.rs32
1 files changed, 21 insertions, 11 deletions
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index 55933484165..612cba46f35 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -637,19 +637,29 @@ pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str)
// Step 2.
try!(validate_qualified_name(qualified_name));
- let (prefix, local_name) = if qualified_name.contains(":") {
- // Step 5.
- let mut parts = qualified_name.splitn(2, ':');
- let prefix = parts.next().unwrap();
- debug_assert!(!prefix.is_empty());
- let local_name = parts.next().unwrap();
- debug_assert!(!local_name.contains(":"));
- (Some(prefix), local_name)
- } else {
- (None, qualified_name)
+ let colon = ':';
+
+ // Step 5.
+ let mut parts = qualified_name.splitn(2, colon);
+
+ let (maybe_prefix, local_name) = {
+ let maybe_prefix = parts.next();
+ let maybe_local_name = parts.next();
+
+ 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 {
+ (None, maybe_prefix.unwrap())
+ }
};
- match (namespace, prefix) {
+ debug_assert!(!local_name.contains(colon));
+
+ match (namespace, maybe_prefix) {
(ns!(""), Some(_)) => {
// Step 6.
Err(Error::Namespace)