aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/flow_ref.rs
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2015-06-27 18:09:14 +0200
committerMs2ger <ms2ger@gmail.com>2015-06-27 18:09:14 +0200
commitb37d9cc1737c927ae9cd3b87a68c85840f4cef59 (patch)
treec02083b1f37c5c8bac3d9585cc0d93d07e97c2c6 /components/layout/flow_ref.rs
parent8892f8175d84126f938965bc7256ba3f3f4c14d5 (diff)
downloadservo-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.rs33
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