script: Use atom comparison in more places, especially for attributes.

75% improvement in style recalc for Guardians of the Galaxy.
This commit is contained in:
Patrick Walton 2014-09-12 13:28:37 -07:00
parent 61642d64b5
commit 874db26104
32 changed files with 300 additions and 147 deletions

View file

@ -273,15 +273,14 @@ impl<'ln> TNode<LayoutElement<'ln>> for LayoutNode<'ln> {
fn match_attr(&self, attr: &AttrSelector, test: |&str| -> bool) -> bool {
assert!(self.is_element())
let name = if self.is_html_element_in_html_document() {
attr.lower_name.as_slice()
&attr.lower_name
} else {
attr.name.as_slice()
&attr.name
};
match attr.namespace {
SpecificNamespace(ref ns) => {
let element = self.as_element();
element.get_attr(ns, name)
.map_or(false, |attr| test(attr))
element.get_attr(ns, name).map_or(false, |attr| test(attr))
},
// FIXME: https://github.com/mozilla/servo/issues/1558
AnyNamespace => false,
@ -383,7 +382,7 @@ impl<'le> TElement for LayoutElement<'le> {
}
#[inline]
fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> {
fn get_attr(&self, namespace: &Namespace, name: &Atom) -> Option<&'static str> {
unsafe { self.element.get_attr_val_for_layout(namespace, name) }
}
@ -395,7 +394,9 @@ impl<'le> TElement for LayoutElement<'le> {
ElementNodeTypeId(HTMLAnchorElementTypeId) |
ElementNodeTypeId(HTMLAreaElementTypeId) |
ElementNodeTypeId(HTMLLinkElementTypeId) => {
unsafe { self.element.get_attr_val_for_layout(&namespace::Null, "href") }
unsafe {
self.element.get_attr_val_for_layout(&namespace::Null, &satom!("href"))
}
}
_ => None,
}
@ -409,7 +410,9 @@ impl<'le> TElement for LayoutElement<'le> {
#[inline]
fn get_id(&self) -> Option<Atom> {
unsafe { self.element.get_attr_atom_for_layout(&namespace::Null, "id") }
unsafe {
self.element.get_attr_atom_for_layout(&namespace::Null, &satom!("id"))
}
}
fn get_disabled_state(&self) -> bool {
@ -424,11 +427,24 @@ impl<'le> TElement for LayoutElement<'le> {
}
}
fn has_class(&self, name: &str) -> bool {
fn has_class(&self, name: &Atom) -> bool {
unsafe {
self.element.has_class_for_layout(name)
}
}
fn each_class(&self, callback: |&Atom|) {
unsafe {
match self.element.get_classes_for_layout() {
None => {}
Some(ref classes) => {
for class in classes.iter() {
callback(class)
}
}
}
}
}
}
fn get_content(content_list: &content::T) -> String {
@ -758,8 +774,10 @@ pub struct ThreadSafeLayoutElement<'le> {
impl<'le> ThreadSafeLayoutElement<'le> {
#[inline]
pub fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> {
unsafe { self.element.get_attr_val_for_layout(namespace, name) }
pub fn get_attr(&self, namespace: &Namespace, name: &Atom) -> Option<&'static str> {
unsafe {
self.element.get_attr_val_for_layout(namespace, name)
}
}
}