aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2015-06-08 17:39:13 -0700
committerPatrick Walton <pcwalton@mimiga.net>2015-06-12 15:00:02 -0700
commit8c210e1a270fd8848d3ee8ed7ef84fb6e00af661 (patch)
treedb4a545a157b48d379035053cee79fcb396c3df6
parent41095c01a771c44f57da7f63b533741bf037918a (diff)
downloadservo-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.rs39
-rw-r--r--components/script/dom/htmlelement.rs25
-rw-r--r--components/script/dom/htmlmediaelement.rs13
-rw-r--r--components/script/dom/htmltablecellelement.rs14
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> {
}
}
}
+