Skip to content

Commit b24f978

Browse files
committed
Drop arguments on the caller side, not the callee
This makes it easier for the caller to optimize the take/drop away for temporary values, and opens up new possibilities for alias handling. Breaks tail calls.
1 parent 35c962e commit b24f978

File tree

8 files changed

+125
-147
lines changed

8 files changed

+125
-147
lines changed

src/comp/driver/rustc.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -148,26 +148,24 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
148148
time(time_passes, "freevar finding",
149149
bind freevars::annotate_freevars(sess, def_map, crate));
150150
let ty_cx = ty::mk_ctxt(sess, def_map, ext_map, ast_map, freevars);
151-
time::<()>(time_passes, "typechecking",
152-
bind typeck::check_crate(ty_cx, crate));
153-
time::<()>(time_passes, "alt checking",
154-
bind middle::check_alt::check_crate(ty_cx, crate));
151+
time(time_passes, "typechecking",
152+
bind typeck::check_crate(ty_cx, crate));
153+
time(time_passes, "alt checking",
154+
bind middle::check_alt::check_crate(ty_cx, crate));
155155
if sess.get_opts().run_typestate {
156156
time(time_passes, "typestate checking",
157157
bind middle::tstate::ck::check_crate(ty_cx, crate));
158158
}
159-
time(time_passes, "alias checking",
160-
bind middle::alias::check_crate(ty_cx, crate));
161-
time::<()>(time_passes, "kind checking",
162-
bind kind::check_crate(ty_cx, crate));
159+
let mut_map = time(time_passes, "alias checking",
160+
bind middle::alias::check_crate(ty_cx, crate));
161+
time(time_passes, "kind checking",
162+
bind kind::check_crate(ty_cx, crate));
163163
if sess.get_opts().no_trans { ret; }
164-
let llmod =
165-
time::<llvm::llvm::ModuleRef>(time_passes, "translation",
166-
bind trans::trans_crate(sess, crate,
167-
ty_cx, output,
168-
ast_map));
169-
time::<()>(time_passes, "LLVM passes",
170-
bind link::write::run_passes(sess, llmod, output));
164+
let llmod = time(time_passes, "translation",
165+
bind trans::trans_crate(sess, crate, ty_cx, output,
166+
ast_map, mut_map));
167+
time(time_passes, "LLVM passes",
168+
bind link::write::run_passes(sess, llmod, output));
171169
}
172170

173171
fn pretty_print_input(sess: session::session, cfg: ast::crate_cfg, input: str,

src/comp/middle/alias.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,25 @@ type scope = @[restrict];
3636

3737
tag local_info { arg(ast::mode); objfield(ast::mutability); }
3838

39-
type ctx = {tcx: ty::ctxt, local_map: std::map::hashmap<node_id, local_info>};
39+
type mut_map = std::map::hashmap<node_id, ()>;
40+
type ctx = {tcx: ty::ctxt,
41+
local_map: std::map::hashmap<node_id, local_info>,
42+
mut_map: mut_map};
4043

41-
fn check_crate(tcx: ty::ctxt, crate: &@ast::crate) {
44+
fn check_crate(tcx: ty::ctxt, crate: &@ast::crate) -> mut_map {
4245
// Stores information about object fields and function
4346
// arguments that's otherwise not easily available.
44-
let cx = @{tcx: tcx, local_map: std::map::new_int_hash()};
45-
let v =
46-
@{visit_fn: bind visit_fn(cx, _, _, _, _, _, _, _),
47-
visit_item: bind visit_item(cx, _, _, _),
48-
visit_expr: bind visit_expr(cx, _, _, _),
49-
visit_decl: bind visit_decl(cx, _, _, _)
50-
with *visit::default_visitor::<scope>()};
47+
let cx = @{tcx: tcx,
48+
local_map: std::map::new_int_hash(),
49+
mut_map: std::map::new_int_hash()};
50+
let v = @{visit_fn: bind visit_fn(cx, _, _, _, _, _, _, _),
51+
visit_item: bind visit_item(cx, _, _, _),
52+
visit_expr: bind visit_expr(cx, _, _, _),
53+
visit_decl: bind visit_decl(cx, _, _, _)
54+
with *visit::default_visitor::<scope>()};
5155
visit::visit_crate(*crate, @[], visit::mk_vt(v));
5256
tcx.sess.abort_if_errors();
57+
ret cx.mut_map;
5358
}
5459

5560
fn visit_fn(cx: &@ctx, f: &ast::_fn, _tp: &[ast::ty_param], _sp: &span,
@@ -425,6 +430,7 @@ fn check_lval(cx: &@ctx, dest: &@ast::expr, sc: &scope, v: &vt<scope>) {
425430
alt dest.node {
426431
ast::expr_path(p) {
427432
let dnum = ast::def_id_of_def(cx.tcx.def_map.get(dest.id)).node;
433+
cx.mut_map.insert(dnum, ());
428434
if is_immutable_alias(*cx, sc, dnum) {
429435
cx.tcx.sess.span_err(dest.span, "assigning to immutable alias");
430436
} else if is_immutable_objfield(*cx, dnum) {

0 commit comments

Comments
 (0)