@@ -27,7 +27,6 @@ use middle::trans::base;
2727use middle:: trans:: base:: * ;
2828use middle:: trans:: build:: * ;
2929use middle:: trans:: callee;
30- use middle:: trans:: closure;
3130use middle:: trans:: common;
3231use middle:: trans:: common:: * ;
3332use middle:: trans:: datum:: * ;
@@ -556,29 +555,9 @@ pub fn trans_call_inner(in_cx: @mut Block,
556555 autoref_arg : AutorefArg )
557556 -> Result {
558557 do base:: with_scope_result ( in_cx, call_info, "call" ) |cx| {
559- let ret_in_loop = match args {
560- ArgExprs ( args) => {
561- args. len ( ) > 0 u && match args. last ( ) . node {
562- ast:: expr_loop_body( @ast:: expr {
563- node : ast:: expr_fn_block( _, ref body) ,
564- _
565- } ) => body_contains_ret ( body) ,
566- _ => false
567- }
568- }
569- _ => false
570- } ;
571-
572558 let callee = get_callee ( cx) ;
573559 let mut bcx = callee. bcx ;
574560 let ccx = cx. ccx ( ) ;
575- let ret_flag = if ret_in_loop {
576- let flag = alloca ( bcx, Type :: bool ( ) , "__ret_flag" ) ;
577- Store ( bcx, C_bool ( false ) , flag) ;
578- Some ( flag)
579- } else {
580- None
581- } ;
582561
583562 let ( llfn, llenv) = unsafe {
584563 match callee. data {
@@ -611,9 +590,7 @@ pub fn trans_call_inner(in_cx: @mut Block,
611590 }
612591
613592 llargs. push ( llenv) ;
614- bcx = trans_args ( bcx, args, fn_expr_ty,
615- ret_flag, autoref_arg, & mut llargs) ;
616-
593+ bcx = trans_args ( bcx, args, fn_expr_ty, autoref_arg, & mut llargs) ;
617594
618595 // Now that the arguments have finished evaluating, we need to revoke
619596 // the cleanup for the self argument
@@ -667,20 +644,6 @@ pub fn trans_call_inner(in_cx: @mut Block,
667644
668645 if ty:: type_is_bot ( ret_ty) {
669646 Unreachable ( bcx) ;
670- } else if ret_in_loop {
671- let ret_flag_result = bool_to_i1 ( bcx, Load ( bcx, ret_flag. get ( ) ) ) ;
672- bcx = do with_cond ( bcx, ret_flag_result) |bcx| {
673- {
674- let r = bcx. fcx . loop_ret ;
675- for & ( flagptr, _) in r. iter ( ) {
676- Store ( bcx, C_bool ( true ) , flagptr) ;
677- Store ( bcx, C_bool ( false ) , bcx. fcx . llretptr . get ( ) ) ;
678- }
679- }
680- base:: cleanup_and_leave ( bcx, None , Some ( bcx. fcx . get_llreturn ( ) ) ) ;
681- Unreachable ( bcx) ;
682- bcx
683- }
684647 }
685648 rslt ( bcx, llresult)
686649 }
@@ -713,7 +676,6 @@ pub fn trans_ret_slot(bcx: @mut Block, fn_ty: ty::t, dest: Option<expr::Dest>)
713676pub fn trans_args ( cx : @mut Block ,
714677 args : CallArgs ,
715678 fn_ty : ty:: t ,
716- ret_flag : Option < ValueRef > ,
717679 autoref_arg : AutorefArg ,
718680 llargs : & mut ~[ ValueRef ] ) -> @mut Block
719681{
@@ -728,15 +690,13 @@ pub fn trans_args(cx: @mut Block,
728690 // to cast her view of the arguments to the caller's view.
729691 match args {
730692 ArgExprs ( arg_exprs) => {
731- let last = arg_exprs. len ( ) - 1 u;
732693 for ( i, arg_expr) in arg_exprs. iter ( ) . enumerate ( ) {
733694 let arg_val = unpack_result ! ( bcx, {
734695 trans_arg_expr( bcx,
735696 arg_tys[ i] ,
736697 ty:: ByCopy ,
737698 * arg_expr,
738699 & mut temp_cleanups,
739- if i == last { ret_flag } else { None } ,
740700 autoref_arg)
741701 } ) ;
742702 llargs. push ( arg_val) ;
@@ -769,49 +729,17 @@ pub fn trans_arg_expr(bcx: @mut Block,
769729 self_mode : ty:: SelfMode ,
770730 arg_expr : @ast:: expr ,
771731 temp_cleanups : & mut ~[ ValueRef ] ,
772- ret_flag : Option < ValueRef > ,
773732 autoref_arg : AutorefArg ) -> Result {
774733 let _icx = push_ctxt ( "trans_arg_expr" ) ;
775734 let ccx = bcx. ccx ( ) ;
776735
777- debug ! ( "trans_arg_expr(formal_arg_ty=(%s), self_mode=%?, arg_expr=%s, \
778- ret_flag=%?)",
736+ debug ! ( "trans_arg_expr(formal_arg_ty=(%s), self_mode=%?, arg_expr=%s)" ,
779737 formal_arg_ty. repr( bcx. tcx( ) ) ,
780738 self_mode,
781- arg_expr. repr( bcx. tcx( ) ) ,
782- ret_flag. map( |v| bcx. val_to_str( * v) ) ) ;
739+ arg_expr. repr( bcx. tcx( ) ) ) ;
783740
784741 // translate the arg expr to a datum
785- let arg_datumblock = match ret_flag {
786- None => expr:: trans_to_datum ( bcx, arg_expr) ,
787-
788- // If there is a ret_flag, this *must* be a loop body
789- Some ( _) => {
790- match arg_expr. node {
791- ast:: expr_loop_body(
792- blk @ @ast:: expr {
793- node : ast:: expr_fn_block( ref decl, ref body) ,
794- _
795- } ) => {
796- let scratch_ty = expr_ty ( bcx, arg_expr) ;
797- let scratch = alloc_ty ( bcx, scratch_ty, "__ret_flag" ) ;
798- let arg_ty = expr_ty ( bcx, arg_expr) ;
799- let sigil = ty:: ty_closure_sigil ( arg_ty) ;
800- let bcx = closure:: trans_expr_fn (
801- bcx, sigil, decl, body, arg_expr. id ,
802- blk. id , Some ( ret_flag) , expr:: SaveIn ( scratch) ) ;
803- DatumBlock { bcx : bcx,
804- datum : Datum { val : scratch,
805- ty : scratch_ty,
806- mode : ByRef ( RevokeClean ) } }
807- }
808- _ => {
809- bcx. sess ( ) . impossible_case (
810- arg_expr. span , "ret_flag with non-loop-body expr" ) ;
811- }
812- }
813- }
814- } ;
742+ let arg_datumblock = expr:: trans_to_datum ( bcx, arg_expr) ;
815743 let arg_datum = arg_datumblock. datum ;
816744 let bcx = arg_datumblock. bcx ;
817745
0 commit comments