@@ -127,6 +127,22 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
127
127
self . visit ( name, [ ] ) ;
128
128
}
129
129
130
+ fn visit_closure_ty ( & mut self , fty : & ty:: ClosureTy , is_unboxed : bool ) {
131
+ let pureval = ast_fn_style_constant ( fty. fn_style ) ;
132
+ let sigilval = match fty. store {
133
+ ty:: UniqTraitStore => 2 u,
134
+ ty:: RegionTraitStore ( ..) => 4 u,
135
+ } ;
136
+ let retval = if ty:: type_is_bot ( fty. sig . output ) { 0 u} else { 1 u} ;
137
+ let extra = vec ! ( self . c_uint( pureval) ,
138
+ self . c_uint( sigilval) ,
139
+ self . c_uint( fty. sig. inputs. len( ) ) ,
140
+ self . c_uint( retval) ) ;
141
+ self . visit ( "enter_fn" , extra. as_slice ( ) ) ;
142
+ self . visit_sig ( retval, & fty. sig , is_unboxed) ;
143
+ self . visit ( "leave_fn" , extra. as_slice ( ) ) ;
144
+ }
145
+
130
146
// Entrypoint
131
147
pub fn visit_ty ( & mut self , t : ty:: t ) {
132
148
let bcx = self . bcx ;
@@ -247,20 +263,8 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
247
263
248
264
// FIXME (#2594): fetch constants out of intrinsic
249
265
// FIXME (#4809): visitor should break out bare fns from other fns
250
- ty:: ty_closure( ref fty) => {
251
- let pureval = ast_fn_style_constant ( fty. fn_style ) ;
252
- let sigilval = match fty. store {
253
- ty:: UniqTraitStore => 2 u,
254
- ty:: RegionTraitStore ( ..) => 4 u,
255
- } ;
256
- let retval = if ty:: type_is_bot ( fty. sig . output ) { 0 u} else { 1 u} ;
257
- let extra = vec ! ( self . c_uint( pureval) ,
258
- self . c_uint( sigilval) ,
259
- self . c_uint( fty. sig. inputs. len( ) ) ,
260
- self . c_uint( retval) ) ;
261
- self . visit ( "enter_fn" , extra. as_slice ( ) ) ;
262
- self . visit_sig ( retval, & fty. sig ) ;
263
- self . visit ( "leave_fn" , extra. as_slice ( ) ) ;
266
+ ty:: ty_closure( box ref fty) => {
267
+ self . visit_closure_ty ( fty, false ) ;
264
268
}
265
269
266
270
// FIXME (#2594): fetch constants out of intrinsic:: for the
@@ -274,7 +278,7 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
274
278
self . c_uint( fty. sig. inputs. len( ) ) ,
275
279
self . c_uint( retval) ) ;
276
280
self . visit ( "enter_fn" , extra. as_slice ( ) ) ;
277
- self . visit_sig ( retval, & fty. sig ) ;
281
+ self . visit_sig ( retval, & fty. sig , false ) ;
278
282
self . visit ( "leave_fn" , extra. as_slice ( ) ) ;
279
283
}
280
284
@@ -388,16 +392,30 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
388
392
// Miscellaneous extra types
389
393
ty:: ty_infer( _) => self . leaf ( "infer" ) ,
390
394
ty:: ty_err => self . leaf ( "err" ) ,
391
- ty:: ty_unboxed_closure( ..) => self . leaf ( "err" ) ,
395
+ ty:: ty_unboxed_closure( ref def_id, _) => {
396
+ let closure_map = tcx. unboxed_closures . borrow ( ) ;
397
+ let fty = & closure_map. find ( def_id) . unwrap ( ) . closure_type ;
398
+ self . visit_closure_ty ( fty, true ) ;
399
+ }
392
400
ty:: ty_param( ref p) => {
393
401
let extra = vec ! ( self . c_uint( p. idx) ) ;
394
402
self . visit ( "param" , extra. as_slice ( ) )
395
403
}
396
404
}
397
405
}
398
406
399
- pub fn visit_sig ( & mut self , retval : uint , sig : & ty:: FnSig ) {
400
- for ( i, arg) in sig. inputs . iter ( ) . enumerate ( ) {
407
+ pub fn visit_sig ( & mut self , retval : uint , sig : & ty:: FnSig , is_unboxed : bool ) {
408
+ let args = if is_unboxed {
409
+ match ty:: get ( sig. inputs [ 0 ] ) . sty {
410
+ ty:: ty_tup( ref contents) => contents. iter ( ) ,
411
+ ty:: ty_nil => [ ] . iter ( ) ,
412
+ _ => unreachable ! ( )
413
+ }
414
+ } else {
415
+ sig. inputs . iter ( )
416
+ } ;
417
+
418
+ for ( i, arg) in args. enumerate ( ) {
401
419
let modeval = 5 u; // "by copy"
402
420
let extra = vec ! ( self . c_uint( i) ,
403
421
self . c_uint( modeval) ,
0 commit comments