@@ -127,6 +127,22 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
127127 self . visit ( name, [ ] ) ;
128128 }
129129
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+
130146 // Entrypoint
131147 pub fn visit_ty ( & mut self , t : ty:: t ) {
132148 let bcx = self . bcx ;
@@ -247,20 +263,8 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
247263
248264 // FIXME (#2594): fetch constants out of intrinsic
249265 // 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 ) ;
264268 }
265269
266270 // FIXME (#2594): fetch constants out of intrinsic:: for the
@@ -274,7 +278,7 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
274278 self . c_uint( fty. sig. inputs. len( ) ) ,
275279 self . c_uint( retval) ) ;
276280 self . visit ( "enter_fn" , extra. as_slice ( ) ) ;
277- self . visit_sig ( retval, & fty. sig ) ;
281+ self . visit_sig ( retval, & fty. sig , false ) ;
278282 self . visit ( "leave_fn" , extra. as_slice ( ) ) ;
279283 }
280284
@@ -388,16 +392,30 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
388392 // Miscellaneous extra types
389393 ty:: ty_infer( _) => self . leaf ( "infer" ) ,
390394 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+ }
392400 ty:: ty_param( ref p) => {
393401 let extra = vec ! ( self . c_uint( p. idx) ) ;
394402 self . visit ( "param" , extra. as_slice ( ) )
395403 }
396404 }
397405 }
398406
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 ( ) {
401419 let modeval = 5 u; // "by copy"
402420 let extra = vec ! ( self . c_uint( i) ,
403421 self . c_uint( modeval) ,
0 commit comments