@@ -41,30 +41,21 @@ use list::{MutList, MutCons, MutNil};
4141use core:: at_vec;
4242use core:: cast:: { transmute, transmute_mut, transmute_mut_region} ;
4343use core:: cast;
44- use core:: libc:: size_t;
4544use core:: ptr;
46- use core:: sys:: TypeDesc ;
4745use core:: sys;
4846use core:: uint;
4947use core:: vec;
5048use core:: unstable:: intrinsics;
49+ use core:: unstable:: intrinsics:: { TyDesc } ;
5150
52- pub mod rustrt {
53- use core:: libc:: size_t;
54- use core:: sys:: TypeDesc ;
51+ #[ cfg( not( stage0) ) ]
52+ use core:: unstable:: intrinsics:: { get_tydesc} ;
5553
56- pub extern {
57- #[ rust_stack]
58- unsafe fn rust_call_tydesc_glue ( root : * u8 ,
59- tydesc : * TypeDesc ,
60- field : size_t ) ;
61- }
54+ #[ cfg( stage0) ]
55+ unsafe fn get_tydesc < T > ( ) -> * TyDesc {
56+ intrinsics:: get_tydesc :: < T > ( ) as * TyDesc
6257}
6358
64- // This probably belongs somewhere else. Needs to be kept in sync with
65- // changes to glue...
66- static tydesc_drop_glue_index: size_t = 3 as size_t ;
67-
6859// The way arena uses arrays is really deeply awful. The arrays are
6960// allocated, and have capacities reserved, but the fill for the array
7061// will always stay at 0.
@@ -125,6 +116,19 @@ fn round_up_to(base: uint, align: uint) -> uint {
125116 ( base + ( align - 1 ) ) & !( align - 1 )
126117}
127118
119+ #[ inline]
120+ #[ cfg( not( stage0) ) ]
121+ unsafe fn call_drop_glue ( tydesc : * TyDesc , data : * i8 ) {
122+ // This function should be inlined when stage0 is gone
123+ ( ( * tydesc) . drop_glue ) ( data) ;
124+ }
125+
126+ #[ inline]
127+ #[ cfg( stage0) ]
128+ unsafe fn call_drop_glue ( tydesc : * TyDesc , data : * i8 ) {
129+ ( ( * tydesc) . drop_glue ) ( 0 as * * TyDesc , data) ;
130+ }
131+
128132// Walk down a chunk, running the destructors for any objects stored
129133// in it.
130134unsafe fn destroy_chunk ( chunk : & Chunk ) {
@@ -137,19 +141,18 @@ unsafe fn destroy_chunk(chunk: &Chunk) {
137141 let ( tydesc, is_done) = un_bitpack_tydesc_ptr ( * tydesc_data) ;
138142 let ( size, align) = ( ( * tydesc) . size , ( * tydesc) . align ) ;
139143
140- let after_tydesc = idx + sys:: size_of :: < * TypeDesc > ( ) ;
144+ let after_tydesc = idx + sys:: size_of :: < * TyDesc > ( ) ;
141145
142146 let start = round_up_to ( after_tydesc, align) ;
143147
144148 //debug!("freeing object: idx = %u, size = %u, align = %u, done = %b",
145149 // start, size, align, is_done);
146150 if is_done {
147- rustrt:: rust_call_tydesc_glue (
148- ptr:: offset ( buf, start) , tydesc, tydesc_drop_glue_index) ;
151+ call_drop_glue ( tydesc, ptr:: offset ( buf, start) as * i8 ) ;
149152 }
150153
151154 // Find where the next tydesc lives
152- idx = round_up_to ( start + size, sys:: pref_align_of :: < * TypeDesc > ( ) ) ;
155+ idx = round_up_to ( start + size, sys:: pref_align_of :: < * TyDesc > ( ) ) ;
153156 }
154157}
155158
@@ -158,12 +161,12 @@ unsafe fn destroy_chunk(chunk: &Chunk) {
158161// is necessary in order to properly do cleanup if a failure occurs
159162// during an initializer.
160163#[ inline]
161- unsafe fn bitpack_tydesc_ptr ( p : * TypeDesc , is_done : bool ) -> uint {
164+ unsafe fn bitpack_tydesc_ptr ( p : * TyDesc , is_done : bool ) -> uint {
162165 let p_bits: uint = transmute ( p) ;
163166 p_bits | ( is_done as uint )
164167}
165168#[ inline]
166- unsafe fn un_bitpack_tydesc_ptr ( p : uint ) -> ( * TypeDesc , bool ) {
169+ unsafe fn un_bitpack_tydesc_ptr ( p : uint ) -> ( * TyDesc , bool ) {
167170 ( transmute ( p & !1 ) , p & 1 == 1 )
168171}
169172
@@ -203,7 +206,7 @@ impl Arena {
203206 #[ inline]
204207 fn alloc_pod < ' a , T > ( & ' a mut self , op : & fn ( ) -> T ) -> & ' a T {
205208 unsafe {
206- let tydesc = sys :: get_type_desc :: < T > ( ) ;
209+ let tydesc = get_tydesc :: < T > ( ) ;
207210 let ptr = self . alloc_pod_inner ( ( * tydesc) . size , ( * tydesc) . align ) ;
208211 let ptr: * mut T = transmute ( ptr) ;
209212 intrinsics:: move_val_init ( & mut ( * ptr) , op ( ) ) ;
@@ -231,13 +234,13 @@ impl Arena {
231234 let head = transmute_mut_region ( & mut self . head ) ;
232235
233236 let tydesc_start = head. fill ;
234- let after_tydesc = head. fill + sys:: size_of :: < * TypeDesc > ( ) ;
237+ let after_tydesc = head. fill + sys:: size_of :: < * TyDesc > ( ) ;
235238 let start = round_up_to ( after_tydesc, align) ;
236239 let end = start + n_bytes;
237240 if end > at_vec:: capacity ( head. data ) {
238241 return self . alloc_nonpod_grow ( n_bytes, align) ;
239242 }
240- head. fill = round_up_to ( end, sys:: pref_align_of :: < * TypeDesc > ( ) ) ;
243+ head. fill = round_up_to ( end, sys:: pref_align_of :: < * TyDesc > ( ) ) ;
241244
242245 //debug!("idx = %u, size = %u, align = %u, fill = %u",
243246 // start, n_bytes, align, head.fill);
@@ -250,7 +253,7 @@ impl Arena {
250253 #[ inline]
251254 fn alloc_nonpod < ' a , T > ( & ' a mut self , op : & fn ( ) -> T ) -> & ' a T {
252255 unsafe {
253- let tydesc = sys :: get_type_desc :: < T > ( ) ;
256+ let tydesc = get_tydesc :: < T > ( ) ;
254257 let ( ty_ptr, ptr) =
255258 self . alloc_nonpod_inner ( ( * tydesc) . size , ( * tydesc) . align ) ;
256259 let ty_ptr: * mut uint = transmute ( ty_ptr) ;
0 commit comments