@@ -41,30 +41,21 @@ use list::{MutList, MutCons, MutNil};
41
41
use core:: at_vec;
42
42
use core:: cast:: { transmute, transmute_mut, transmute_mut_region} ;
43
43
use core:: cast;
44
- use core:: libc:: size_t;
45
44
use core:: ptr;
46
- use core:: sys:: TypeDesc ;
47
45
use core:: sys;
48
46
use core:: uint;
49
47
use core:: vec;
50
48
use core:: unstable:: intrinsics;
49
+ use core:: unstable:: intrinsics:: { TyDesc } ;
51
50
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} ;
55
53
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
62
57
}
63
58
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
-
68
59
// The way arena uses arrays is really deeply awful. The arrays are
69
60
// allocated, and have capacities reserved, but the fill for the array
70
61
// will always stay at 0.
@@ -125,6 +116,19 @@ fn round_up_to(base: uint, align: uint) -> uint {
125
116
( base + ( align - 1 ) ) & !( align - 1 )
126
117
}
127
118
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
+
128
132
// Walk down a chunk, running the destructors for any objects stored
129
133
// in it.
130
134
unsafe fn destroy_chunk ( chunk : & Chunk ) {
@@ -137,19 +141,18 @@ unsafe fn destroy_chunk(chunk: &Chunk) {
137
141
let ( tydesc, is_done) = un_bitpack_tydesc_ptr ( * tydesc_data) ;
138
142
let ( size, align) = ( ( * tydesc) . size , ( * tydesc) . align ) ;
139
143
140
- let after_tydesc = idx + sys:: size_of :: < * TypeDesc > ( ) ;
144
+ let after_tydesc = idx + sys:: size_of :: < * TyDesc > ( ) ;
141
145
142
146
let start = round_up_to ( after_tydesc, align) ;
143
147
144
148
//debug!("freeing object: idx = %u, size = %u, align = %u, done = %b",
145
149
// start, size, align, is_done);
146
150
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 ) ;
149
152
}
150
153
151
154
// 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 > ( ) ) ;
153
156
}
154
157
}
155
158
@@ -158,12 +161,12 @@ unsafe fn destroy_chunk(chunk: &Chunk) {
158
161
// is necessary in order to properly do cleanup if a failure occurs
159
162
// during an initializer.
160
163
#[ 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 {
162
165
let p_bits: uint = transmute ( p) ;
163
166
p_bits | ( is_done as uint )
164
167
}
165
168
#[ inline]
166
- unsafe fn un_bitpack_tydesc_ptr ( p : uint ) -> ( * TypeDesc , bool ) {
169
+ unsafe fn un_bitpack_tydesc_ptr ( p : uint ) -> ( * TyDesc , bool ) {
167
170
( transmute ( p & !1 ) , p & 1 == 1 )
168
171
}
169
172
@@ -203,7 +206,7 @@ impl Arena {
203
206
#[ inline]
204
207
fn alloc_pod < ' a , T > ( & ' a mut self , op : & fn ( ) -> T ) -> & ' a T {
205
208
unsafe {
206
- let tydesc = sys :: get_type_desc :: < T > ( ) ;
209
+ let tydesc = get_tydesc :: < T > ( ) ;
207
210
let ptr = self . alloc_pod_inner ( ( * tydesc) . size , ( * tydesc) . align ) ;
208
211
let ptr: * mut T = transmute ( ptr) ;
209
212
intrinsics:: move_val_init ( & mut ( * ptr) , op ( ) ) ;
@@ -231,13 +234,13 @@ impl Arena {
231
234
let head = transmute_mut_region ( & mut self . head ) ;
232
235
233
236
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 > ( ) ;
235
238
let start = round_up_to ( after_tydesc, align) ;
236
239
let end = start + n_bytes;
237
240
if end > at_vec:: capacity ( head. data ) {
238
241
return self . alloc_nonpod_grow ( n_bytes, align) ;
239
242
}
240
- head. fill = round_up_to ( end, sys:: pref_align_of :: < * TypeDesc > ( ) ) ;
243
+ head. fill = round_up_to ( end, sys:: pref_align_of :: < * TyDesc > ( ) ) ;
241
244
242
245
//debug!("idx = %u, size = %u, align = %u, fill = %u",
243
246
// start, n_bytes, align, head.fill);
@@ -250,7 +253,7 @@ impl Arena {
250
253
#[ inline]
251
254
fn alloc_nonpod < ' a , T > ( & ' a mut self , op : & fn ( ) -> T ) -> & ' a T {
252
255
unsafe {
253
- let tydesc = sys :: get_type_desc :: < T > ( ) ;
256
+ let tydesc = get_tydesc :: < T > ( ) ;
254
257
let ( ty_ptr, ptr) =
255
258
self . alloc_nonpod_inner ( ( * tydesc) . size , ( * tydesc) . align ) ;
256
259
let ty_ptr: * mut uint = transmute ( ty_ptr) ;
0 commit comments