diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-06-08 17:39:13 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-06-12 15:00:02 -0700 |
commit | 8c210e1a270fd8848d3ee8ed7ef84fb6e00af661 (patch) | |
tree | db4a545a157b48d379035053cee79fcb396c3df6 | |
parent | 41095c01a771c44f57da7f63b533741bf037918a (diff) | |
download | servo-8c210e1a270fd8848d3ee8ed7ef84fb6e00af661.tar.gz servo-8c210e1a270fd8848d3ee8ed7ef84fb6e00af661.zip |
script: Make `PartialEq` on element type IDs generate a lot less code.
This makes the difference between selector matching scaling on the ARM
Cortex-A9 and not, because the auto-derived `PartialEq` implementation
blows out the 32KB I-cache. With this change, there is a 2x improvement
in selector matching over sequential when using all 8 cores. (More work
needs to be done; this is a start.)
-rw-r--r-- | components/script/dom/eventtarget.rs | 39 | ||||
-rw-r--r-- | components/script/dom/htmlelement.rs | 25 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 13 | ||||
-rw-r--r-- | components/script/dom/htmltablecellelement.rs | 14 |
4 files changed, 83 insertions, 8 deletions
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 4826f88227b..19be67af464 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -28,6 +28,7 @@ use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::collections::hash_state::DefaultState; use std::default::Default; use std::ffi::CString; +use std::intrinsics; use std::ptr; use url::Url; @@ -40,7 +41,7 @@ pub enum ListenerPhase { Bubbling, } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone)] #[jstraceable] pub enum EventTargetTypeId { Node(NodeTypeId), @@ -51,6 +52,42 @@ pub enum EventTargetTypeId { XMLHttpRequestEventTarget(XMLHttpRequestEventTargetTypeId) } +impl PartialEq for EventTargetTypeId { + #[inline] + fn eq(&self, other: &EventTargetTypeId) -> bool { + match (*self, *other) { + (EventTargetTypeId::Node(this_type), EventTargetTypeId::Node(other_type)) => { + this_type == other_type + } + _ => self.eq_slow(other) + } + } +} + +impl EventTargetTypeId { + #[allow(unsafe_code)] + fn eq_slow(&self, other: &EventTargetTypeId) -> bool { + match (*self, *other) { + (EventTargetTypeId::Node(this_type), EventTargetTypeId::Node(other_type)) => { + this_type == other_type + } + (EventTargetTypeId::WorkerGlobalScope(this_type), + EventTargetTypeId::WorkerGlobalScope(other_type)) => { + this_type == other_type + } + (EventTargetTypeId::XMLHttpRequestEventTarget(this_type), + EventTargetTypeId::XMLHttpRequestEventTarget(other_type)) => { + this_type == other_type + } + (_, _) => { + unsafe { + intrinsics::discriminant_value(self) == intrinsics::discriminant_value(other) + } + } + } + } +} + #[derive(Copy, Clone, PartialEq)] #[jstraceable] pub enum EventListenerType { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index ffa13308375..9a0a0dbf808 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -36,6 +36,7 @@ use string_cache::Atom; use std::borrow::ToOwned; use std::default::Default; +use std::intrinsics; #[dom_struct] pub struct HTMLElement { @@ -303,7 +304,7 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLElement> { } } -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, Debug)] #[jstraceable] pub enum HTMLElementTypeId { HTMLElement, @@ -374,3 +375,25 @@ pub enum HTMLElementTypeId { HTMLUnknownElement, } +impl PartialEq for HTMLElementTypeId { + #[inline] + #[allow(unsafe_code)] + fn eq(&self, other: &HTMLElementTypeId) -> bool { + match (*self, *other) { + (HTMLElementTypeId::HTMLMediaElement(this_type), + HTMLElementTypeId::HTMLMediaElement(other_type)) => { + this_type == other_type + } + (HTMLElementTypeId::HTMLTableCellElement(this_type), + HTMLElementTypeId::HTMLTableCellElement(other_type)) => { + this_type == other_type + } + (_, _) => { + unsafe { + intrinsics::discriminant_value(self) == intrinsics::discriminant_value(other) + } + } + } + } +} + diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index d56ea964f91..c9dcfd36ccd 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -42,10 +42,17 @@ impl HTMLMediaElement { } } -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, Debug)] #[jstraceable] pub enum HTMLMediaElementTypeId { - HTMLAudioElement, - HTMLVideoElement, + HTMLAudioElement = 0, + HTMLVideoElement = 1, +} + +impl PartialEq for HTMLMediaElementTypeId { + #[inline] + fn eq(&self, other: &HTMLMediaElementTypeId) -> bool { + (*self as u8) == (*other as u8) + } } diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index e9c3a0ab59a..7acc0f7e4ec 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -23,11 +23,18 @@ use std::cmp::max; const DEFAULT_COLSPAN: u32 = 1; -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, Debug)] #[jstraceable] pub enum HTMLTableCellElementTypeId { - HTMLTableDataCellElement, - HTMLTableHeaderCellElement, + HTMLTableDataCellElement = 0, + HTMLTableHeaderCellElement = 1, +} + +impl PartialEq for HTMLTableCellElementTypeId { + #[inline] + fn eq(&self, other: &HTMLTableCellElementTypeId) -> bool { + (*self as u8) == (*other as u8) + } } #[dom_struct] @@ -143,3 +150,4 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTableCellElement> { } } } + |