mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-17 05:25:37 +03:00
return &mut T from the arenas, not &T
The arenas write the value to memory and then return a non-aliasing reference to it. The returned reference can be mutable and can be coerced to an immutable one. [breaking-change]
This commit is contained in:
+7
-7
@@ -208,13 +208,13 @@ fn alloc_copy_inner(&self, n_bytes: uint, align: uint) -> *const u8 {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn alloc_copy<T>(&self, op: || -> T) -> &T {
|
||||
fn alloc_copy<T>(&self, op: || -> T) -> &mut T {
|
||||
unsafe {
|
||||
let ptr = self.alloc_copy_inner(mem::size_of::<T>(),
|
||||
mem::min_align_of::<T>());
|
||||
let ptr = ptr as *mut T;
|
||||
ptr::write(&mut (*ptr), op());
|
||||
return &*ptr;
|
||||
return &mut *ptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,7 +262,7 @@ fn alloc_noncopy_inner(&self, n_bytes: uint,
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn alloc_noncopy<T>(&self, op: || -> T) -> &T {
|
||||
fn alloc_noncopy<T>(&self, op: || -> T) -> &mut T {
|
||||
unsafe {
|
||||
let tydesc = get_tydesc::<T>();
|
||||
let (ty_ptr, ptr) =
|
||||
@@ -279,14 +279,14 @@ fn alloc_noncopy<T>(&self, op: || -> T) -> &T {
|
||||
// the object is there.
|
||||
*ty_ptr = bitpack_tydesc_ptr(tydesc, true);
|
||||
|
||||
return &*ptr;
|
||||
return &mut *ptr;
|
||||
}
|
||||
}
|
||||
|
||||
/// Allocates a new item in the arena, using `op` to initialize the value,
|
||||
/// and returns a reference to it.
|
||||
#[inline]
|
||||
pub fn alloc<T>(&self, op: || -> T) -> &T {
|
||||
pub fn alloc<T>(&self, op: || -> T) -> &mut T {
|
||||
unsafe {
|
||||
if intrinsics::needs_drop::<T>() {
|
||||
self.alloc_noncopy(op)
|
||||
@@ -459,12 +459,12 @@ pub fn with_capacity(capacity: uint) -> TypedArena<T> {
|
||||
|
||||
/// Allocates an object in the `TypedArena`, returning a reference to it.
|
||||
#[inline]
|
||||
pub fn alloc(&self, object: T) -> &T {
|
||||
pub fn alloc(&self, object: T) -> &mut T {
|
||||
if self.ptr == self.end {
|
||||
self.grow()
|
||||
}
|
||||
|
||||
let ptr: &T = unsafe {
|
||||
let ptr: &mut T = unsafe {
|
||||
let ptr: &mut T = mem::transmute(self.ptr);
|
||||
ptr::write(ptr, object);
|
||||
self.ptr.set(self.ptr.get().offset(1));
|
||||
|
||||
@@ -715,7 +715,7 @@ fn xform(&mut self,
|
||||
}
|
||||
|
||||
_ => {
|
||||
self.terms_cx.arena.alloc(|| TransformTerm(v1, v2))
|
||||
&*self.terms_cx.arena.alloc(|| TransformTerm(v1, v2))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user