@@ -80,10 +80,14 @@ impl methods for reflector {
80
80
[ self . c_uint ( mt. mutbl as uint ) ] + extra) ;
81
81
}
82
82
83
- fn vstore_name_and_extra ( vstore : ty:: vstore ,
83
+ fn vstore_name_and_extra ( t : ty:: t ,
84
+ vstore : ty:: vstore ,
84
85
f : fn ( str , [ ValueRef ] ) ) {
85
86
alt vstore {
86
- ty : : vstore_fixed ( n) { f ( "fixed" , [ self . c_uint ( n) ] ) }
87
+ ty : : vstore_fixed ( n) {
88
+ let extra = [ self . c_uint ( n) ] + self . c_size_and_align ( t) ;
89
+ f ( "fixed" , extra)
90
+ }
87
91
ty:: vstore_slice ( _) { f ( "slice" , [ ] ) }
88
92
ty:: vstore_uniq { f( "uniq" , [ ] ) ; }
89
93
ty:: vstore_box { f( "box" , [ ] ) ; }
@@ -123,12 +127,12 @@ impl methods for reflector {
123
127
124
128
ty:: ty_vec ( mt) { self . bracketed_mt ( "vec" , mt, [ ] ) }
125
129
ty:: ty_estr ( vst) {
126
- self . vstore_name_and_extra ( vst) { |name, extra|
130
+ self . vstore_name_and_extra ( t , vst) { |name, extra|
127
131
self . visit ( "estr_" + name, extra)
128
132
}
129
133
}
130
134
ty:: ty_evec ( mt, vst) {
131
- self . vstore_name_and_extra ( vst) { |name, extra|
135
+ self . vstore_name_and_extra ( t , vst) { |name, extra|
132
136
self . bracketed_mt ( "evec_" + name, mt, extra)
133
137
}
134
138
}
@@ -138,21 +142,25 @@ impl methods for reflector {
138
142
ty:: ty_rptr ( _, mt) { self . bracketed_mt ( "rptr" , mt, [ ] ) }
139
143
140
144
ty:: ty_rec ( fields) {
141
- self . visit ( "enter_rec" , [ self . c_uint ( vec:: len ( fields) ) ] ) ;
145
+ let extra = ( [ self . c_uint ( vec:: len ( fields) ) ]
146
+ + self . c_size_and_align ( t) ) ;
147
+ self . visit ( "enter_rec" , extra) ;
142
148
for fields. eachi { |i, field|
143
149
self . bracketed_mt( "rec_field" , field. mt,
144
150
[ self . c_uint( i) ,
145
151
self . c_slice( * field. ident) ] ) ;
146
152
}
147
- self . visit( "leave_rec" , [ self . c_uint ( vec :: len ( fields ) ) ] ) ;
153
+ self . visit( "leave_rec" , extra ) ;
148
154
}
149
155
150
156
ty:: ty_tup( tys) {
151
- self . visit( "enter_tup" , [ self . c_uint( vec:: len( tys) ) ] ) ;
157
+ let extra = ( [ self . c_uint( vec:: len( tys) ) ]
158
+ + self . c_size_and_align( t) ) ;
159
+ self . visit( "enter_tup" , extra) ;
152
160
for tys. eachi { |i, t |
153
161
self . bracketed_t( "tup_field" , t, [ self . c_uint( i) ] ) ;
154
162
}
155
- self . visit( "leave_tup" , [ self . c_uint ( vec :: len ( tys ) ) ] ) ;
163
+ self . visit( "leave_tup" , extra ) ;
156
164
}
157
165
158
166
// FIXME: fetch constants out of intrinsic:: for the numbers.
@@ -206,13 +214,16 @@ impl methods for reflector {
206
214
let bcx = self . bcx;
207
215
let tcx = bcx. ccx( ) . tcx;
208
216
let fields = ty:: class_items_as_fields( tcx, did, substs) ;
209
- self . visit( "enter_class" , [ self . c_uint( vec:: len( fields) ) ] ) ;
217
+ let extra = ( [ self . c_uint( vec:: len( fields) ) ]
218
+ + self . c_size_and_align( t) ) ;
219
+
220
+ self . visit( "enter_class" , extra) ;
210
221
for fields. eachi { |i, field|
211
222
self . bracketed_mt( "class_field" , field. mt,
212
223
[ self . c_uint( i) ,
213
224
self . c_slice( * field. ident) ] ) ;
214
225
}
215
- self . visit( "leave_class" , [ self . c_uint ( vec :: len ( fields ) ) ] ) ;
226
+ self . visit( "leave_class" , extra ) ;
216
227
}
217
228
218
229
// FIXME: visiting all the variants in turn is probably
@@ -223,8 +234,10 @@ impl methods for reflector {
223
234
let bcx = self . bcx;
224
235
let tcx = bcx. ccx( ) . tcx;
225
236
let variants = ty:: substd_enum_variants( tcx, did, substs) ;
237
+ let extra = ( [ self . c_uint( vec:: len( variants) ) ]
238
+ + self . c_size_and_align( t) ) ;
226
239
227
- self . visit( "enter_enum" , [ self . c_uint ( vec :: len ( variants ) ) ] ) ;
240
+ self . visit( "enter_enum" , extra ) ;
228
241
for variants. eachi { |i, v|
229
242
let extra = [ self . c_uint( i) ,
230
243
self . c_int( v. disr_val) ,
@@ -237,7 +250,7 @@ impl methods for reflector {
237
250
}
238
251
self . visit( "leave_enum_variant" , extra) ;
239
252
}
240
- self . visit( "leave_enum" , [ self . c_uint ( vec :: len ( variants ) ) ] ) ;
253
+ self . visit( "leave_enum" , extra ) ;
241
254
}
242
255
243
256
// Miscallaneous extra types
0 commit comments