@@ -275,26 +275,27 @@ pub impl Reflector {
275
275
let variants = ty:: substd_enum_variants ( ccx. tcx , did, substs) ;
276
276
let llptrty = T_ptr ( type_of ( ccx, t) ) ;
277
277
278
- // Build the get_disr function. (XXX: break this out into a function)
279
- let sub_path = bcx. fcx . path + ~[ path_name ( special_idents:: anon) ] ;
280
- let get_disr_sym = mangle_internal_name_by_path_and_seq ( ccx, sub_path, ~"get_disr") ;
281
- let get_disr_args = [ ty:: arg { mode : ast:: expl ( ast:: by_copy) ,
282
- ty : ty:: mk_nil_ptr ( ccx. tcx ) } ] ;
283
- let get_disr_llfty = type_of_fn ( ccx, get_disr_args, ty:: mk_int ( ccx. tcx ) ) ;
284
- let get_disr_llfdecl = decl_internal_cdecl_fn ( ccx. llmod , get_disr_sym, get_disr_llfty) ;
285
- let get_disr_arg = unsafe {
286
- llvm:: LLVMGetParam ( get_disr_llfdecl, first_real_arg as c_uint )
278
+ let make_get_disr = || {
279
+ let sub_path = bcx. fcx . path + ~[ path_name ( special_idents:: anon) ] ;
280
+ let sym = mangle_internal_name_by_path_and_seq ( ccx, sub_path, ~"get_disr") ;
281
+ let args = [ ty:: arg { mode : ast:: expl ( ast:: by_copy) ,
282
+ ty : ty:: mk_nil_ptr ( ccx. tcx ) } ] ;
283
+ let llfty = type_of_fn ( ccx, args, ty:: mk_int ( ccx. tcx ) ) ;
284
+ let llfdecl = decl_internal_cdecl_fn ( ccx. llmod , sym, llfty) ;
285
+ let arg = unsafe {
286
+ llvm:: LLVMGetParam ( llfdecl, first_real_arg as c_uint )
287
+ } ;
288
+ let fcx = new_fn_ctxt ( ccx, ~[ ] , llfdecl, None ) ;
289
+ let bcx = top_scope_block ( fcx, None ) ;
290
+ let arg = BitCast ( bcx, arg, llptrty) ;
291
+ let ret = adt:: trans_get_discr ( bcx, repr, arg) ;
292
+ Store ( bcx, ret, fcx. llretptr ) ;
293
+ cleanup_and_Br ( bcx, bcx, fcx. llreturn ) ;
294
+ finish_fn ( fcx, bcx. llbb ) ;
295
+ llfdecl
287
296
} ;
288
- let get_disr_fcx = new_fn_ctxt ( ccx, ~[ ] , get_disr_llfdecl, None ) ;
289
- let get_disr_bcx = top_scope_block ( get_disr_fcx, None ) ;
290
- let get_disr_arg = BitCast ( get_disr_bcx, get_disr_arg, llptrty) ;
291
- let get_disr_ret = adt:: trans_get_discr ( get_disr_bcx, repr, get_disr_arg) ;
292
- Store ( get_disr_bcx, get_disr_ret, get_disr_fcx. llretptr ) ;
293
- cleanup_and_Br ( get_disr_bcx, get_disr_bcx, get_disr_fcx. llreturn ) ;
294
- finish_fn ( get_disr_fcx, get_disr_bcx. llbb ) ;
295
297
296
- let enum_args = ~[ self . c_uint ( vec:: len ( variants) ) ,
297
- get_disr_llfdecl]
298
+ let enum_args = ~[ self . c_uint ( vec:: len ( variants) ) , make_get_disr ( ) ]
298
299
+ self . c_size_and_align ( t) ;
299
300
do self. bracketed ( ~"enum ", enum_args) |this| {
300
301
for variants. eachi |i, v| {
0 commit comments