Skip to content

Commit 9d408be

Browse files
committed
---
yaml --- r: 137166 b: refs/heads/release-prep c: c4c19fe h: refs/heads/master v: v3
1 parent f478ac7 commit 9d408be

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2929
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
3030
refs/heads/libuv-update-temp-branch: 6ed22c618766f1f2a2e108eef8ce3f51be0f70b7
3131
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
32-
refs/heads/release-prep: 72dc0f5f82efcf891581fdc3ec15eb46f38cd718
32+
refs/heads/release-prep: c4c19fe96003bb5bdaa6ca35603eb4220b1d5ca8

branches/release-prep/src/librustc/middle/trans/closure.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ fn load_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
301301
fn load_unboxed_closure_environment<'blk, 'tcx>(
302302
bcx: Block<'blk, 'tcx>,
303303
arg_scope_id: ScopeId,
304+
freevar_mode: ast::CaptureClause,
304305
freevars: &Vec<ty::Freevar>,
305306
closure_id: ast::DefId)
306307
-> Block<'blk, 'tcx> {
@@ -326,11 +327,14 @@ fn load_unboxed_closure_environment<'blk, 'tcx>(
326327
};
327328

328329
for (i, freevar) in freevars.iter().enumerate() {
329-
let upvar_ptr = GEPi(bcx, llenv, [0, i]);
330+
let mut upvar_ptr = GEPi(bcx, llenv, [0, i]);
331+
if freevar_mode == ast::CaptureByRef {
332+
upvar_ptr = Load(bcx, upvar_ptr);
333+
}
330334
let def_id = freevar.def.def_id();
331335
bcx.fcx.llupvars.borrow_mut().insert(def_id.node, upvar_ptr);
332336

333-
if kind == ty::FnOnceUnboxedClosureKind {
337+
if kind == ty::FnOnceUnboxedClosureKind && freevar_mode == ast::CaptureByValue {
334338
bcx.fcx.schedule_drop_mem(arg_scope_id,
335339
upvar_ptr,
336340
node_id_type(bcx, def_id.node))
@@ -477,6 +481,7 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
477481
let freevars: Vec<ty::Freevar> =
478482
ty::with_freevars(bcx.tcx(), id, |fv| fv.iter().map(|&fv| fv).collect());
479483
let freevars_ptr = &freevars;
484+
let freevar_mode = bcx.tcx().capture_mode(id);
480485

481486
trans_closure(bcx.ccx(),
482487
decl,
@@ -493,6 +498,7 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
493498
|bcx, arg_scope| {
494499
load_unboxed_closure_environment(bcx,
495500
arg_scope,
501+
freevar_mode,
496502
freevars_ptr,
497503
closure_id)
498504
});
@@ -518,7 +524,14 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
518524
dest_addr,
519525
0,
520526
i);
521-
bcx = datum.store_to(bcx, upvar_slot_dest);
527+
match freevar_mode {
528+
ast::CaptureByValue => {
529+
bcx = datum.store_to(bcx, upvar_slot_dest);
530+
}
531+
ast::CaptureByRef => {
532+
Store(bcx, datum.to_llref(), upvar_slot_dest);
533+
}
534+
}
522535
}
523536
adt::trans_set_discr(bcx, &*repr, dest_addr, 0);
524537

0 commit comments

Comments
 (0)