@@ -33,6 +33,7 @@ use std::cmp;
3333use std:: intrinsics:: { TyDesc , get_tydesc} ;
3434use std:: intrinsics;
3535use std:: mem;
36+ use std:: mem:: min_align_of;
3637use std:: num;
3738use std:: ptr:: read;
3839use std:: rc:: Rc ;
@@ -204,7 +205,7 @@ impl Arena {
204205 #[ inline]
205206 fn alloc_copy < ' a , T > ( & ' a mut self , op: || -> T ) -> & ' a T {
206207 unsafe {
207- let ptr = self . alloc_copy_inner ( mem:: size_of :: < T > ( ) , mem :: min_align_of :: < T > ( ) ) ;
208+ let ptr = self . alloc_copy_inner ( mem:: size_of :: < T > ( ) , min_align_of :: < T > ( ) ) ;
208209 let ptr: * mut T = transmute ( ptr) ;
209210 mem:: move_val_init ( & mut ( * ptr) , op ( ) ) ;
210211 return transmute ( ptr) ;
@@ -261,7 +262,7 @@ impl Arena {
261262 unsafe {
262263 let tydesc = get_tydesc :: < T > ( ) ;
263264 let ( ty_ptr, ptr) =
264- self . alloc_noncopy_inner ( mem:: size_of :: < T > ( ) , mem :: min_align_of :: < T > ( ) ) ;
265+ self . alloc_noncopy_inner ( mem:: size_of :: < T > ( ) , min_align_of :: < T > ( ) ) ;
265266 let ty_ptr: * mut uint = transmute ( ty_ptr) ;
266267 let ptr: * mut T = transmute ( ptr) ;
267268 // Write in our tydesc along with a bit indicating that it
@@ -353,11 +354,12 @@ struct TypedArenaChunk<T> {
353354}
354355
355356impl < T > TypedArenaChunk < T > {
357+ #[ cfg( stage0) ]
356358 #[ inline]
357359 fn new ( next : Option < Box < TypedArenaChunk < T > > > , capacity : uint )
358360 -> Box < TypedArenaChunk < T > > {
359361 let mut size = mem:: size_of :: < TypedArenaChunk < T > > ( ) ;
360- size = round_up ( size, mem :: min_align_of :: < T > ( ) ) ;
362+ size = round_up ( size, min_align_of :: < T > ( ) ) ;
361363 let elem_size = mem:: size_of :: < T > ( ) ;
362364 let elems_size = elem_size. checked_mul ( & capacity) . unwrap ( ) ;
363365 size = size. checked_add ( & elems_size) . unwrap ( ) ;
@@ -373,6 +375,27 @@ impl<T> TypedArenaChunk<T> {
373375 chunk
374376 }
375377
378+ #[ inline]
379+ #[ cfg( not( stage0) ) ]
380+ fn new ( next : Option < Box < TypedArenaChunk < T > > > , capacity : uint )
381+ -> Box < TypedArenaChunk < T > > {
382+ let mut size = mem:: size_of :: < TypedArenaChunk < T > > ( ) ;
383+ size = round_up ( size, mem:: min_align_of :: < T > ( ) ) ;
384+ let elem_size = mem:: size_of :: < T > ( ) ;
385+ let elems_size = elem_size. checked_mul ( & capacity) . unwrap ( ) ;
386+ size = size. checked_add ( & elems_size) . unwrap ( ) ;
387+
388+ let mut chunk = unsafe {
389+ let chunk = global_heap:: exchange_malloc ( size, min_align_of :: < TypedArenaChunk < T > > ( ) ) ;
390+ let mut chunk: Box < TypedArenaChunk < T > > = cast:: transmute ( chunk) ;
391+ mem:: move_val_init ( & mut chunk. next , next) ;
392+ chunk
393+ } ;
394+
395+ chunk. capacity = capacity;
396+ chunk
397+ }
398+
376399 /// Destroys this arena chunk. If the type descriptor is supplied, the
377400 /// drop glue is called; otherwise, drop glue is not called.
378401 #[ inline]
@@ -402,7 +425,7 @@ impl<T> TypedArenaChunk<T> {
402425 fn start ( & self ) -> * u8 {
403426 let this: * TypedArenaChunk < T > = self ;
404427 unsafe {
405- cast:: transmute ( round_up ( this. offset ( 1 ) as uint , mem :: min_align_of :: < T > ( ) ) )
428+ cast:: transmute ( round_up ( this. offset ( 1 ) as uint , min_align_of :: < T > ( ) ) )
406429 }
407430 }
408431
0 commit comments