diff options
| author | Graydon Hoare <[email protected]> | 2011-02-18 18:04:37 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-02-18 18:04:37 -0800 |
| commit | 80c67268fc007d55fa0ff193ac0be6ab83640aa6 (patch) | |
| tree | 5b082b3656449985d1b6712e464a37dddcdeea7e | |
| parent | Make a tag for iterness / fnness, teach many places about it. (diff) | |
| download | rust-80c67268fc007d55fa0ff193ac0be6ab83640aa6.tar.xz rust-80c67268fc007d55fa0ff193ac0be6ab83640aa6.zip | |
Pass correct lliterbody; can compile and run no-put iters.
| -rw-r--r-- | src/comp/middle/trans.rs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 03d1fad9..59d6ad7f 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2238,7 +2238,7 @@ fn trans_for_each(@block_ctxt cx, // escape. This could be determined upstream, and probably ought // to be so, eventualy. For first cut, skip this. Null env. - auto env_ty = T_struct(vec(T_ptr(T_i8()))); + auto env_ty = T_opaque_closure_ptr(cx.fcx.ccx.tn); // Step 2: Declare foreach body function. @@ -2283,11 +2283,19 @@ fn trans_for_each(@block_ctxt cx, // Step 3: Call iter passing [lliterbody, llenv], plus other args. alt (seq.node) { + case (ast.expr_call(?f, ?args, ?ann)) { + auto pair = cx.build.Alloca(T_fn_pair(cx.fcx.ccx.tn, + iter_body_llty)); + auto code_cell = cx.build.GEP(pair, + vec(C_int(0), + C_int(abi.fn_field_code))); + cx.build.Store(lliterbody, code_cell); + // log "lliterbody: " + val_str(cx.fcx.ccx.tn, lliterbody); ret trans_call(cx, f, - some[ValueRef](lliterbody), + some[ValueRef](cx.build.Load(pair)), args, ann); } @@ -3364,7 +3372,7 @@ fn trans_expr(@block_ctxt cx, @ast.expr e) -> result { ret trans_ret(cx, e); } - case (ast.expr_ret(?e)) { + case (ast.expr_put(?e)) { ret trans_put(cx, e); } |