diff options
author | Ms2ger <ms2ger@gmail.com> | 2015-06-27 18:09:14 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2015-06-27 18:09:14 +0200 |
commit | b37d9cc1737c927ae9cd3b87a68c85840f4cef59 (patch) | |
tree | c02083b1f37c5c8bac3d9585cc0d93d07e97c2c6 /components/layout/flow_ref.rs | |
parent | 8892f8175d84126f938965bc7256ba3f3f4c14d5 (diff) | |
download | servo-b37d9cc1737c927ae9cd3b87a68c85840f4cef59.tar.gz servo-b37d9cc1737c927ae9cd3b87a68c85840f4cef59.zip |
Remove Deref and DerefMut implementations from WeakFlowRef.
By definition of a weak pointer, these implementations cannot be safe.
Diffstat (limited to 'components/layout/flow_ref.rs')
-rw-r--r-- | components/layout/flow_ref.rs | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/components/layout/flow_ref.rs b/components/layout/flow_ref.rs index 6188c882ce9..f120841d2e4 100644 --- a/components/layout/flow_ref.rs +++ b/components/layout/flow_ref.rs @@ -10,7 +10,7 @@ #![allow(unsafe_code)] -use flow::Flow; +use flow::{Flow, BaseFlow}; use flow; use std::mem; @@ -133,11 +133,19 @@ impl Clone for FlowRef { } } +fn base<'a>(r: &WeakFlowRef) -> &'a BaseFlow { + let data = r.object.data; + debug_assert!(!data.is_null()); + unsafe { + mem::transmute::<*mut (), &'a BaseFlow>(data) + } +} + impl WeakFlowRef { /// Upgrades a WeakFlowRef to a FlowRef. pub fn upgrade(&self) -> Option<FlowRef> { unsafe { - let object = flow::base(&**self); + let object = base(self); // We use a CAS loop to increment the strong count instead of a // fetch_add because once the count hits 0 is must never be above // 0. @@ -153,27 +161,10 @@ impl WeakFlowRef { } } -impl<'a> Deref for WeakFlowRef { - type Target = Flow + 'a; - fn deref(&self) -> &(Flow + 'a) { - unsafe { - mem::transmute_copy::<raw::TraitObject, &(Flow + 'a)>(&self.object) - } - } -} - -impl DerefMut for WeakFlowRef { - fn deref_mut<'a>(&mut self) -> &mut (Flow + 'a) { - unsafe { - mem::transmute_copy::<raw::TraitObject, &mut (Flow + 'a)>(&self.object) - } - } -} - impl Clone for WeakFlowRef { fn clone(&self) -> WeakFlowRef { unsafe { - flow::base(&**self).weak_ref_count().fetch_add(1, Ordering::Relaxed); + base(self).weak_ref_count().fetch_add(1, Ordering::Relaxed); } WeakFlowRef { object: self. object } } @@ -187,7 +178,7 @@ impl Drop for WeakFlowRef { return } - if flow::base(&**self).weak_ref_count().fetch_sub(1, Ordering::Release) == 1 { + if base(self).weak_ref_count().fetch_sub(1, Ordering::Release) == 1 { atomic::fence(Ordering::Acquire); // This dance deallocates the Box<Flow> without running its |