Skip to content

Commit bf66054

Browse files
committed
---
yaml --- r: 6847 b: refs/heads/master c: b0f1a5f h: refs/heads/master i: 6845: bf66246 6843: d4a9ae6 6839: 85673b9 6831: 514091b 6815: eb029f9 6783: d3cdcbd v: v3
1 parent 71a4378 commit bf66054

File tree

6 files changed

+26
-15
lines changed

6 files changed

+26
-15
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 98cbbbb64241ac8fe7f0aeb453a8e4a5f55b081c
2+
refs/heads/master: b0f1a5f051f1e2a5eb164e0d2abb35edea4a4c75

trunk/src/comp/middle/freevars.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ import syntax::codemap::span;
1010

1111
export annotate_freevars;
1212
export freevar_map;
13+
export freevar_info;
1314
export get_freevars;
1415
export has_freevars;
1516

1617
// A vector of defs representing the free variables referred to in a function.
1718
// (The def_upvar will already have been stripped).
18-
type freevar_info = @[ast::def];
19+
type freevar_entry = {
20+
def: ast::def, //< The variable being accessed free.
21+
span: span //< First span where it is accessed (there can be multiple)
22+
};
23+
type freevar_info = @[@freevar_entry];
1924
type freevar_map = hashmap<ast::node_id, freevar_info>;
2025

2126
// Searches through part of the AST for all references to locals or
@@ -50,7 +55,7 @@ fn collect_freevars(def_map: resolve::def_map, walker: fn@(visit::vt<int>)) ->
5055
if i == depth { // Made it to end of loop
5156
let dnum = ast_util::def_id_of_def(def).node;
5257
if !seen.contains_key(dnum) {
53-
*refs += [def];
58+
*refs += [@{def:def, span:expr.span}];
5459
seen.insert(dnum, ());
5560
}
5661
}

trunk/src/comp/middle/kind.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ fn check_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) {
5555
fn check_free_vars(e: @expr,
5656
cx: ctx,
5757
check_fn: fn(ctx, ty::t, sp: span)) {
58-
for free in *freevars::get_freevars(cx.tcx, e.id) {
59-
let id = ast_util::def_id_of_def(free).node;
58+
for @{def, span} in *freevars::get_freevars(cx.tcx, e.id) {
59+
let id = ast_util::def_id_of_def(def).node;
6060
let ty = ty::node_id_to_type(cx.tcx, id);
61-
check_fn(cx, ty, e.span);
61+
check_fn(cx, ty, span);
6262
}
6363
}
6464

trunk/src/comp/middle/trans_closure.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import llvm::{ValueRef, TypeRef};
55
import trans_common::*;
66
import trans_build::*;
77
import trans::*;
8-
import middle::freevars::get_freevars;
8+
import middle::freevars::{get_freevars, freevar_info};
99
import option::{some, none};
1010
import back::abi;
1111
import syntax::codemap::span;
@@ -261,16 +261,16 @@ fn store_environment(
261261
// Given a context and a list of upvars, build a closure. This just
262262
// collects the upvars and packages them up for store_environment.
263263
fn build_closure(cx: @block_ctxt,
264-
upvars: @[ast::def],
264+
upvars: freevar_info,
265265
ck: ty::closure_kind)
266266
-> closure_result {
267267
// If we need to, package up the iterator body to call
268268
let env_vals = [];
269269
let tcx = bcx_tcx(cx);
270270
// Package up the upvars
271-
vec::iter(*upvars) { |def|
272-
let lv = trans_local_var(cx, def);
273-
let nid = ast_util::def_id_of_def(def).node;
271+
vec::iter(*upvars) { |upvar|
272+
let lv = trans_local_var(cx, upvar.def);
273+
let nid = ast_util::def_id_of_def(upvar.def).node;
274274
let ty = ty::node_id_to_monotype(tcx, nid);
275275
alt ck {
276276
ty::closure_block. { ty = ty::mk_mut_ptr(tcx, ty); }
@@ -287,7 +287,7 @@ fn build_closure(cx: @block_ctxt,
287287
fn load_environment(enclosing_cx: @block_ctxt,
288288
fcx: @fn_ctxt,
289289
boxed_closure_ty: ty::t,
290-
upvars: @[ast::def],
290+
upvars: freevar_info,
291291
ck: ty::closure_kind) {
292292
let bcx = new_raw_block_ctxt(fcx, fcx.llloadenv);
293293

@@ -311,7 +311,7 @@ fn load_environment(enclosing_cx: @block_ctxt,
311311

312312
// Populate the upvars from the environment.
313313
let path = [0, abi::box_rc_field_body, abi::closure_elt_bindings];
314-
vec::iteri(*upvars) { |i, upvar_def|
314+
vec::iteri(*upvars) { |i, upvar|
315315
check type_is_tup_like(bcx, boxed_closure_ty);
316316
let upvarptr =
317317
GEP_tup_like(bcx, boxed_closure_ty, llclosure, path + [i as int]);
@@ -321,7 +321,7 @@ fn load_environment(enclosing_cx: @block_ctxt,
321321
ty::closure_block. { llupvarptr = Load(bcx, llupvarptr); }
322322
ty::closure_send. | ty::closure_shared. { }
323323
}
324-
let def_id = ast_util::def_id_of_def(upvar_def);
324+
let def_id = ast_util::def_id_of_def(upvar.def);
325325
fcx.llupvars.insert(def_id.node, llupvarptr);
326326
}
327327
}

trunk/src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ fn find_pre_post_expr(fcx: fn_ctxt, e: @expr) {
342342
expr_fn(f, _) { // NDM captures
343343
let rslt = expr_pp(fcx.ccx, e);
344344
clear_pp(rslt);
345-
for def in *freevars::get_freevars(fcx.ccx.tcx, e.id) {
345+
for @{def, span} in *freevars::get_freevars(fcx.ccx.tcx, e.id) {
346346
log ("handle_var_def: def=", def);
347347
handle_var_def(fcx, rslt, def, "upvar");
348348
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// error-pattern: not a sendable value
2+
3+
fn main() {
4+
let x = @3u;
5+
let _f = sendfn(y: uint) -> uint { ret *x+y; };
6+
}

0 commit comments

Comments
 (0)