Skip to content

Commit 9e6a068

Browse files
committed
replace last_use with liveness info
1 parent 62fe587 commit 9e6a068

File tree

10 files changed

+122
-481
lines changed

10 files changed

+122
-481
lines changed

src/rustc/driver/driver.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import session::session;
44
import syntax::parse;
55
import syntax::{ast, codemap};
66
import syntax::attr;
7-
import middle::{trans, resolve, freevars, kind, ty, typeck,
8-
last_use, lint};
7+
import middle::{trans, resolve, freevars, kind, ty, typeck, lint};
98
import syntax::print::{pp, pprust};
109
import util::{ppaux, filesearch};
1110
import back::link;
@@ -192,29 +191,27 @@ fn compile_upto(sess: session, cfg: ast::crate_cfg,
192191
bind middle::check_loop::check_crate(ty_cx, crate));
193192
time(time_passes, "alt checking",
194193
bind middle::check_alt::check_crate(ty_cx, crate));
195-
let _last_use_map =
194+
let (last_use_map, spill_map) =
196195
time(time_passes, "liveness checking",
197196
bind middle::liveness::check_crate(ty_cx, method_map, crate));
198197
time(time_passes, "typestate checking",
199198
bind middle::tstate::ck::check_crate(ty_cx, crate));
200199
let (root_map, mutbl_map) = time(
201200
time_passes, "borrow checking",
202201
bind middle::borrowck::check_crate(ty_cx, method_map, crate));
203-
let (copy_map, ref_map) =
202+
let (copy_map, _ref_map) =
204203
time(time_passes, "alias checking",
205204
bind middle::alias::check_crate(ty_cx, crate));
206-
let (last_uses, spill_map) = time(time_passes, "last use finding",
207-
bind last_use::find_last_uses(crate, def_map, ref_map, ty_cx));
208205
time(time_passes, "kind checking",
209-
bind kind::check_crate(ty_cx, method_map, last_uses, crate));
206+
bind kind::check_crate(ty_cx, method_map, last_use_map, crate));
210207

211208
lint::check_crate(ty_cx, crate, sess.opts.lint_opts, time_passes);
212209

213210
if upto == cu_no_trans { ret {crate: crate, tcx: some(ty_cx)}; }
214211
let outputs = option::get(outputs);
215212

216213
let maps = {mutbl_map: mutbl_map, root_map: root_map,
217-
copy_map: copy_map, last_uses: last_uses,
214+
copy_map: copy_map, last_use_map: last_use_map,
218215
impl_map: impl_map, method_map: method_map,
219216
vtable_map: vtable_map, spill_map: spill_map};
220217

src/rustc/middle/astencode.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import util::ppaux::ty_to_str;
22

3+
import dvec::extensions;
34
import syntax::ast;
45
import syntax::fold;
56
import syntax::visit;
@@ -18,7 +19,7 @@ import std::serialization::serializer_helpers;
1819
import std::serialization::deserializer_helpers;
1920
import std::prettyprint::serializer;
2021
import std::smallintmap::map;
21-
import middle::{ty, typeck, last_use};
22+
import middle::{ty, typeck};
2223
import middle::typeck::{method_origin,
2324
serialize_method_origin,
2425
deserialize_method_origin,
@@ -52,11 +53,11 @@ type maps = {
5253
mutbl_map: middle::borrowck::mutbl_map,
5354
root_map: middle::borrowck::root_map,
5455
copy_map: middle::alias::copy_map,
55-
last_uses: middle::last_use::last_uses,
56+
last_use_map: middle::liveness::last_use_map,
5657
impl_map: middle::resolve::impl_map,
5758
method_map: middle::typeck::method_map,
5859
vtable_map: middle::typeck::vtable_map,
59-
spill_map: middle::last_use::spill_map
60+
spill_map: middle::liveness::spill_map
6061
};
6162

6263
type decode_ctxt = @{
@@ -539,10 +540,6 @@ impl helper for ebml::ebml_deserializer {
539540
let fv = deserialize_method_origin(self);
540541
fv.tr(xcx)
541542
}
542-
fn read_is_last_use(xcx: extended_decode_ctxt) -> last_use::is_last_use {
543-
let lu = last_use::deserialize_is_last_use(self);
544-
lu.tr(xcx)
545-
}
546543
}
547544

548545
impl of tr for method_origin {
@@ -561,17 +558,6 @@ impl of tr for method_origin {
561558
}
562559
}
563560

564-
impl of tr for last_use::is_last_use {
565-
fn tr(xcx: extended_decode_ctxt) -> last_use::is_last_use {
566-
alt self {
567-
last_use::is_last_use { self }
568-
last_use::closes_over(ids) {
569-
last_use::closes_over(vec::map(ids, {|id| xcx.tr_id(id)}))
570-
}
571-
}
572-
}
573-
}
574-
575561
// ______________________________________________________________________
576562
// Encoding and decoding vtable_res
577563

@@ -844,11 +830,13 @@ fn encode_side_tables_for_id(ecx: @e::encode_ctxt,
844830
}
845831
}
846832

847-
option::iter(maps.last_uses.find(id)) {|m|
833+
option::iter(maps.last_use_map.find(id)) {|m|
848834
ebml_w.tag(c::tag_table_last_use) {||
849835
ebml_w.id(id);
850836
ebml_w.tag(c::tag_table_val) {||
851-
last_use::serialize_is_last_use(ebml_w, m)
837+
ebml_w.emit_from_vec((*m).get()) {|id|
838+
ebml_w.emit_int(id);
839+
}
852840
}
853841
}
854842
}
@@ -975,7 +963,11 @@ fn decode_side_tables(xcx: extended_decode_ctxt,
975963
let bounds = val_dsr.read_bounds(xcx);
976964
dcx.tcx.ty_param_bounds.insert(id, bounds);
977965
} else if tag == (c::tag_table_last_use as uint) {
978-
dcx.maps.last_uses.insert(id, val_dsr.read_is_last_use(xcx));
966+
let ids = val_dsr.read_to_vec {||
967+
xcx.tr_id(val_dsr.read_int())
968+
};
969+
let dvec = @dvec::from_vec(vec::to_mut(ids));
970+
dcx.maps.last_use_map.insert(id, dvec);
979971
} else if tag == (c::tag_table_method_map as uint) {
980972
dcx.maps.method_map.insert(id,
981973
val_dsr.read_method_origin(xcx));

src/rustc/middle/borrowck.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ enum loan_path {
138138
// a complete record of a loan that was granted
139139
type loan = {lp: @loan_path, cmt: cmt, mutbl: ast::mutability};
140140

141-
fn save_and_restore<T:copy,U>(&t: T, f: fn() -> U) -> U {
142-
let old_t = t;
141+
fn save_and_restore<T:copy,U>(&save_and_restore_t: T, f: fn() -> U) -> U {
142+
let old_save_and_restore_t = save_and_restore_t;
143143
let u <- f();
144-
t = old_t;
144+
save_and_restore_t = old_save_and_restore_t;
145145
ret u;
146146
}
147147

@@ -888,6 +888,7 @@ fn check_loans_in_fn(fk: visit::fn_kind, decl: ast::fn_decl, body: ast::blk,
888888
sp: span, id: ast::node_id, &&self: check_loan_ctxt,
889889
visitor: visit::vt<check_loan_ctxt>) {
890890

891+
#debug["purity on entry=%?", self.declared_purity];
891892
save_and_restore(self.in_ctor) {||
892893
save_and_restore(self.declared_purity) {||
893894
// In principle, we could consider fk_anon(*) or
@@ -909,6 +910,7 @@ fn check_loans_in_fn(fk: visit::fn_kind, decl: ast::fn_decl, body: ast::blk,
909910
visit::visit_fn(fk, decl, body, sp, id, self, visitor);
910911
}
911912
}
913+
#debug["purity on exit=%?", self.declared_purity];
912914
}
913915

914916
fn check_loans_in_expr(expr: @ast::expr,

src/rustc/middle/kind.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import std::map::hashmap;
88
import util::ppaux::{ty_to_str, tys_to_str};
99
import syntax::print::pprust::expr_to_str;
1010
import freevars::freevar_entry;
11+
import dvec::extensions;
1112

1213
// Kind analysis pass.
1314
//
@@ -56,15 +57,15 @@ type rval_map = std::map::hashmap<node_id, ()>;
5657
type ctx = {tcx: ty::ctxt,
5758
rval_map: rval_map,
5859
method_map: typeck::method_map,
59-
last_uses: last_use::last_uses};
60+
last_use_map: liveness::last_use_map};
6061

6162
fn check_crate(tcx: ty::ctxt, method_map: typeck::method_map,
62-
last_uses: last_use::last_uses, crate: @crate)
63+
last_use_map: liveness::last_use_map, crate: @crate)
6364
-> rval_map {
6465
let ctx = {tcx: tcx,
6566
rval_map: std::map::int_hash(),
6667
method_map: method_map,
67-
last_uses: last_uses};
68+
last_use_map: last_use_map};
6869
let visit = visit::mk_vt(@{
6970
visit_expr: check_expr,
7071
visit_stmt: check_stmt,
@@ -177,11 +178,10 @@ fn check_fn(fk: visit::fn_kind, decl: fn_decl, body: blk, sp: span,
177178
// if this is the last use of the variable, then it will be
178179
// a move and not a copy
179180
let is_move = {
180-
let last_uses = alt check cx.last_uses.find(fn_id) {
181-
some(last_use::closes_over(vars)) { vars }
182-
none { [] }
183-
};
184-
last_uses.contains(id)
181+
alt check cx.last_use_map.find(fn_id) {
182+
some(vars) {(*vars).contains(id)}
183+
none {false}
184+
}
185185
};
186186

187187
let ty = ty::node_id_to_type(cx.tcx, id);
@@ -367,7 +367,7 @@ fn is_nullary_variant(cx: ctx, ex: @expr) -> bool {
367367

368368
fn check_copy_ex(cx: ctx, ex: @expr, _warn: bool) {
369369
if ty::expr_is_lval(cx.method_map, ex) &&
370-
!cx.last_uses.contains_key(ex.id) &&
370+
!cx.last_use_map.contains_key(ex.id) &&
371371
!is_nullary_variant(cx, ex) {
372372
let ty = ty::expr_ty(cx.tcx, ex);
373373
check_copy(cx, ty, ex.span);

0 commit comments

Comments
 (0)