Rc: Add assumptions that the pointer is non-null

Since the snapshot compiler is still using an older LLVM version, omit
the call in stage0, because compile times explode otherwise.
This commit is contained in:
James Miller 2015-01-21 09:35:24 +13:00 committed by Björn Steinbrink
parent 7858cb432d
commit 40b6e34240

View File

@ -160,6 +160,7 @@ use core::option::Option::{Some, None};
use core::ptr::{self, PtrExt};
use core::result::Result;
use core::result::Result::{Ok, Err};
use core::intrinsics::assume;
use heap::deallocate;
@ -769,12 +770,34 @@ trait RcBoxPtr<T> {
impl<T> RcBoxPtr<T> for Rc<T> {
#[inline(always)]
fn inner(&self) -> &RcBox<T> { unsafe { &(**self._ptr) } }
fn inner(&self) -> &RcBox<T> {
unsafe {
// Safe to assume this here, as if it weren't true, we'd be breaking
// the contract anyway.
// This allows the null check to be elided in the destructor if we
// manipulated the reference count in the same function.
if cfg!(not(stage0)) { // NOTE remove cfg after next snapshot
assume(!self._ptr.is_null());
}
&(**self._ptr)
}
}
}
impl<T> RcBoxPtr<T> for Weak<T> {
#[inline(always)]
fn inner(&self) -> &RcBox<T> { unsafe { &(**self._ptr) } }
fn inner(&self) -> &RcBox<T> {
unsafe {
// Safe to assume this here, as if it weren't true, we'd be breaking
// the contract anyway.
// This allows the null check to be elided in the destructor if we
// manipulated the reference count in the same function.
if cfg!(not(stage0)) { // NOTE remove cfg after next snapshot
assume(!self._ptr.is_null());
}
&(**self._ptr)
}
}
}
#[cfg(test)]