diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-03-27 18:59:18 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-04-02 09:03:45 -0700 |
commit | d1c13faf4be3307d7e2ba55f1b1046d230610c47 (patch) | |
tree | 9ee52074bda77fa9ada7c606d3b248708c291d0e /components/script/dom/bindings/js.rs | |
parent | 6bedf4a229f07a9cce589466cb398cd5afdd382d (diff) | |
download | servo-d1c13faf4be3307d7e2ba55f1b1046d230610c47.tar.gz servo-d1c13faf4be3307d7e2ba55f1b1046d230610c47.zip |
script: Optimize JS rooting to not move the entire `Root` struct from
the stack to the return out-pointer.
This was showing up very high in instruction-level profiling.
Diffstat (limited to 'components/script/dom/bindings/js.rs')
-rw-r--r-- | components/script/dom/bindings/js.rs | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 84644a8428f..ef5fb2155df 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -626,12 +626,12 @@ impl RootCollection { } } - /// Track a stack-based root to ensure LIFO root ordering - fn root<'b, T: Reflectable>(&self, untracked: &Root<T>) { + /// Track a stack-based root as a pointer to ensure LIFO root ordering. + fn root<'b>(&self, untracked_js_ptr: *mut JSObject) { unsafe { let roots = self.roots.get(); - (*roots).push(untracked.js_ptr); - debug!(" rooting {:?}", untracked.js_ptr); + (*roots).push(untracked_js_ptr); + debug!(" rooting {:?}", untracked_js_ptr); assert!(!(*roots).spilled()); } } @@ -668,15 +668,18 @@ impl<T: Reflectable> Root<T> { /// Create a new stack-bounded root for the provided JS-owned value. /// It cannot not outlive its associated `RootCollection`, and it contains /// a `JSRef` which cannot outlive this new `Root`. + #[inline] fn new(roots: &'static RootCollection, unrooted: NonZero<*const T>) -> Root<T> { - let root = Root { + let js_ptr = unsafe { + (**unrooted).reflector().get_jsobject() + }; + roots.root(js_ptr); + Root { root_list: roots, ptr: unrooted, - js_ptr: unsafe { (**unrooted).reflector().get_jsobject() }, - }; - roots.root(&root); - root + js_ptr: js_ptr, + } } /// Obtain a safe reference to the wrapped JS owned-value that cannot |