From 1b786fe414036d5df661f63e56d0079b0ed22f80 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 24 Jan 2014 16:57:26 -0800 Subject: [PATCH] script: Avoid an allocation when getting attribute data. 15% improvement in selector matching performance on the rainbow page. --- src/components/script/dom/element.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 309204ee7a9..d2a5d2057ea 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -157,15 +157,16 @@ impl Element { }).map(|&x| x) } + #[inline] pub unsafe fn get_attr_val_for_layout(&self, namespace: Namespace, name: &str) -> Option<&'static str> { - // FIXME: only case-insensitive in the HTML namespace (as opposed to SVG, etc.) - let name = name.to_ascii_lower(); self.attrs.iter().find(|attr: & &@mut Attr| { // unsafely avoid a borrow because this is accessed by many tasks // during parallel layout + // FIXME: only case-insensitive in the HTML namespace (as opposed to SVG, etc.) let attr: ***Box = cast::transmute(attr); - name == (***attr).data.local_name && (***attr).data.namespace == namespace + name.eq_ignore_ascii_case((***attr).data.local_name) && + (***attr).data.namespace == namespace }).map(|attr| { let attr: **Box = cast::transmute(attr); cast::transmute((**attr).data.value.as_slice())