Skip to content

Commit 4cf4e17

Browse files
committed
Track the node_id of the function in trans_common::fn_ctxt.
1 parent f8b0d3d commit 4cf4e17

File tree

3 files changed

+25
-31
lines changed

3 files changed

+25
-31
lines changed

src/comp/middle/freevars.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ fn def_lookup(tcx: &ty::ctxt, f: ast::node_id, id: ast::node_id) ->
180180
none. { ret none; }
181181
some(d) {
182182
let did = ast::def_id_of_def(d);
183-
if is_freevar_of(tcx, did.node, f) {
183+
if f != -1 && is_freevar_of(tcx, did.node, f) {
184184
ret some(ast::def_upvar(did, @d));
185185
} else { ret some(d); }
186186
}

src/comp/middle/trans.rs

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3951,7 +3951,7 @@ fn trans_for_each(cx: &@block_ctxt, local: &@ast::local, seq: &@ast::expr,
39513951
ty::mk_nil(lcx.ccx.tcx), 0u);
39523952
let lliterbody: ValueRef =
39533953
decl_internal_fastcall_fn(lcx.ccx.llmod, s, iter_body_llty);
3954-
let fcx = new_fn_ctxt(lcx, cx.sp, lliterbody);
3954+
let fcx = new_fn_ctxt_w_id(lcx, cx.sp, lliterbody, body.node.id);
39553955

39563956
// Generate code to load the environment out of the
39573957
// environment pointer.
@@ -3961,7 +3961,7 @@ fn trans_for_each(cx: &@block_ctxt, local: &@ast::local, seq: &@ast::expr,
39613961
// Add bindings for the loop variable alias.
39623962
bcx = trans_alt::bind_irrefutable_pat
39633963
(bcx, local.node.pat, llvm::LLVMGetParam(fcx.llfn, 3u),
3964-
bcx.fcx.llupvars, false);
3964+
bcx.fcx.lllocals, false);
39653965
let lltop = bcx.llbb;
39663966
let r = trans_block(bcx, body, return);
39673967
finish_fn(fcx, lltop);
@@ -3971,7 +3971,6 @@ fn trans_for_each(cx: &@block_ctxt, local: &@ast::local, seq: &@ast::expr,
39713971
r.bcx.build.RetVoid();
39723972
}
39733973

3974-
39753974
// Step 3: Call iter passing [lliterbody, llenv], plus other args.
39763975
alt seq.node {
39773976
ast::expr_call(f, args) {
@@ -4101,36 +4100,22 @@ fn lookup_discriminant(lcx: &@local_ctxt, tid: &ast::def_id,
41014100
fn trans_var(cx: &@block_ctxt, sp: &span, id: ast::node_id) ->
41024101
lval_result {
41034102
let ccx = bcx_ccx(cx);
4104-
// If we had a good way to get at the node_id for the function we
4105-
// are in, we could do a freevars::def_lookup and avoid having to
4106-
// check the llupvars case in all of the other cases...
4107-
alt bcx_tcx(cx).def_map.find(id) {
4103+
alt freevars::def_lookup(bcx_tcx(cx), cx.fcx.id, id) {
4104+
some(ast::def_upvar(did, _)) {
4105+
assert (cx.fcx.llupvars.contains_key(did.node));
4106+
ret lval_mem(cx, cx.fcx.llupvars.get(did.node));
4107+
}
41084108
some(ast::def_arg(did)) {
4109-
alt cx.fcx.llargs.find(did.node) {
4110-
none. {
4111-
assert (cx.fcx.llupvars.contains_key(did.node));
4112-
ret lval_mem(cx, cx.fcx.llupvars.get(did.node));
4113-
}
4114-
some(llval) { ret lval_mem(cx, llval); }
4115-
}
4109+
assert (cx.fcx.llargs.contains_key(did.node));
4110+
ret lval_mem(cx, cx.fcx.llargs.get(did.node));
41164111
}
41174112
some(ast::def_local(did)) {
4118-
alt cx.fcx.lllocals.find(did.node) {
4119-
none. {
4120-
assert (cx.fcx.llupvars.contains_key(did.node));
4121-
ret lval_mem(cx, cx.fcx.llupvars.get(did.node));
4122-
}
4123-
some(llval) { ret lval_mem(cx, llval); }
4124-
}
4113+
assert (cx.fcx.lllocals.contains_key(did.node));
4114+
ret lval_mem(cx, cx.fcx.lllocals.get(did.node));
41254115
}
41264116
some(ast::def_binding(did)) {
4127-
alt cx.fcx.lllocals.find(did.node) {
4128-
none. {
4129-
assert (cx.fcx.llupvars.contains_key(did.node));
4130-
ret lval_mem(cx, cx.fcx.llupvars.get(did.node));
4131-
}
4132-
some(llval) { ret lval_mem(cx, llval); }
4133-
}
4117+
assert (cx.fcx.lllocals.contains_key(did.node));
4118+
ret lval_mem(cx, cx.fcx.lllocals.get(did.node));
41344119
}
41354120
some(ast::def_obj_field(did)) {
41364121
assert (cx.fcx.llobjfields.contains_key(did.node));
@@ -6227,7 +6212,8 @@ fn mk_standard_basic_blocks(llfn: ValueRef) ->
62276212
// - create_llargs_for_fn_args.
62286213
// - new_fn_ctxt
62296214
// - trans_args
6230-
fn new_fn_ctxt(cx: @local_ctxt, sp: &span, llfndecl: ValueRef) -> @fn_ctxt {
6215+
fn new_fn_ctxt_w_id(cx: @local_ctxt, sp: &span, llfndecl: ValueRef,
6216+
id: ast::node_id) -> @fn_ctxt {
62316217
let llretptr: ValueRef = llvm::LLVMGetParam(llfndecl, 0u);
62326218
let lltaskptr: ValueRef = llvm::LLVMGetParam(llfndecl, 1u);
62336219
let llenv: ValueRef = llvm::LLVMGetParam(llfndecl, 2u);
@@ -6256,10 +6242,14 @@ fn new_fn_ctxt(cx: @local_ctxt, sp: &span, llfndecl: ValueRef) -> @fn_ctxt {
62566242
llupvars: llupvars,
62576243
mutable lltydescs: ~[],
62586244
derived_tydescs: derived_tydescs,
6245+
id: id,
62596246
sp: sp,
62606247
lcx: cx};
62616248
}
62626249

6250+
fn new_fn_ctxt(cx: @local_ctxt, sp: &span, llfndecl: ValueRef) -> @fn_ctxt {
6251+
be new_fn_ctxt_w_id(cx, sp, llfndecl, -1);
6252+
}
62636253

62646254
// NB: must keep 4 fns in sync:
62656255
//
@@ -6460,7 +6450,7 @@ fn trans_closure(bcx_maybe: &option::t[@block_ctxt],
64606450
set_uwtable(llfndecl);
64616451

64626452
// Set up arguments to the function.
6463-
let fcx = new_fn_ctxt(cx, sp, llfndecl);
6453+
let fcx = new_fn_ctxt_w_id(cx, sp, llfndecl, id);
64646454
create_llargs_for_fn_args(fcx, f.proto, ty_self,
64656455
ty::ret_ty_of_fn(cx.ccx.tcx, id), f.decl.inputs,
64666456
ty_params);

src/comp/middle/trans_common.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ type fn_ctxt =
235235
// a tydesc is created, we cache it in the derived_tydescs table for
236236
// the next time that such a tydesc is needed.
237237

238+
// The node_id of the function, or -1 if it doesn't correspond to a
239+
// user defined function.
240+
238241
// The source span where this function comes from, for error
239242
// reporting.
240243

@@ -256,6 +259,7 @@ type fn_ctxt =
256259
llupvars: hashmap[ast::node_id, ValueRef],
257260
mutable lltydescs: ValueRef[],
258261
derived_tydescs: hashmap[ty::t, derived_tydesc_info],
262+
id: ast::node_id,
259263
sp: span,
260264
lcx: @local_ctxt};
261265

0 commit comments

Comments
 (0)