Skip to content

Commit 3d43af1

Browse files
committed
rustc: Anti-copy police
In this case, some copies are still necessary to convert from a mutable to an immutable @-box. It's still an improvement, I hope.
1 parent 18db9a2 commit 3d43af1

File tree

8 files changed

+33
-32
lines changed

8 files changed

+33
-32
lines changed

src/librustc/driver/driver.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -898,9 +898,9 @@ mod test {
898898
getopts::fail_str(f))
899899
};
900900
let sessopts = build_session_options(
901-
~"rustc", matches, diagnostic::emit);
901+
@~"rustc", matches, diagnostic::emit);
902902
let sess = build_session(sessopts, diagnostic::emit);
903-
let cfg = build_configuration(sess, ~"whatever", str_input(~""));
903+
let cfg = build_configuration(sess, @~"whatever", str_input(~""));
904904
assert!((attr::contains_name(cfg, ~"test")));
905905
}
906906
@@ -917,9 +917,9 @@ mod test {
917917
}
918918
};
919919
let sessopts = build_session_options(
920-
~"rustc", matches, diagnostic::emit);
920+
@~"rustc", matches, diagnostic::emit);
921921
let sess = build_session(sessopts, diagnostic::emit);
922-
let cfg = build_configuration(sess, ~"whatever", str_input(~""));
922+
let cfg = build_configuration(sess, @~"whatever", str_input(~""));
923923
let test_items = attr::find_meta_items_by_name(cfg, ~"test");
924924
assert!((vec::len(test_items) == 1u));
925925
}

src/librustc/middle/trans/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ pub struct CrateContext {
184184
monomorphized: @mut HashMap<mono_id, ValueRef>,
185185
monomorphizing: @mut HashMap<ast::def_id, uint>,
186186
// Cache computed type parameter uses (see type_use.rs)
187-
type_use_cache: @mut HashMap<ast::def_id, ~[type_use::type_uses]>,
187+
type_use_cache: @mut HashMap<ast::def_id, @~[type_use::type_uses]>,
188188
// Cache generated vtables
189189
vtables: @mut HashMap<mono_id, ValueRef>,
190190
// Cache of constant strings,

src/librustc/middle/trans/monomorphize.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ pub fn make_mono_id(ccx: @CrateContext,
342342
substs: &[ty::t],
343343
vtables: Option<typeck::vtable_res>,
344344
impl_did_opt: Option<ast::def_id>,
345-
+param_uses: Option<~[type_use::type_uses]>) -> mono_id {
345+
param_uses: Option<@~[type_use::type_uses]>) -> mono_id {
346346
let precise_param_ids = match vtables {
347347
Some(vts) => {
348348
let item_ty = ty::lookup_item_type(ccx.tcx, item);
@@ -353,12 +353,12 @@ pub fn make_mono_id(ccx: @CrateContext,
353353
match *bound {
354354
ty::bound_trait(_) => {
355355
v.push(meth::vtable_id(ccx, /*bad*/copy vts[i]));
356-
i += 1u;
356+
i += 1;
357357
}
358358
_ => ()
359359
}
360360
}
361-
(*subst, if v.len() > 0u { Some(v) } else { None })
361+
(*subst, if !v.is_empty() { Some(v) } else { None })
362362
})
363363
}
364364
None => {
@@ -367,7 +367,7 @@ pub fn make_mono_id(ccx: @CrateContext,
367367
};
368368
let param_ids = match param_uses {
369369
Some(ref uses) => {
370-
vec::map2(precise_param_ids, *uses, |id, uses| {
370+
vec::map2(precise_param_ids, **uses, |id, uses| {
371371
if ccx.sess.no_monomorphic_collapse() {
372372
match copy *id {
373373
(a, b) => mono_precise(a, b)
@@ -377,7 +377,7 @@ pub fn make_mono_id(ccx: @CrateContext,
377377
// XXX: Bad copy.
378378
(a, copy b@Some(_)) => mono_precise(a, b),
379379
(subst, None) => {
380-
if *uses == 0u {
380+
if *uses == 0 {
381381
mono_any
382382
} else if *uses == type_use::use_repr &&
383383
!ty::type_needs_drop(ccx.tcx, subst)

src/librustc/middle/trans/type_use.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,19 @@ use syntax::ast_util;
4747
use syntax::visit;
4848

4949
pub type type_uses = uint; // Bitmask
50-
pub static use_repr: uint = 1u; /* Dependency on size/alignment/mode and
50+
pub static use_repr: uint = 1; /* Dependency on size/alignment/mode and
5151
take/drop glue */
52-
pub static use_tydesc: uint = 2u; /* Takes the tydesc, or compares */
52+
pub static use_tydesc: uint = 2; /* Takes the tydesc, or compares */
5353

5454
pub struct Context {
5555
ccx: @CrateContext,
5656
uses: @mut ~[type_uses]
5757
}
5858

5959
pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint)
60-
-> ~[type_uses] {
60+
-> @~[type_uses] {
6161
match ccx.type_use_cache.find(&fn_id) {
62-
Some(uses) => return /*bad*/ copy *uses,
62+
Some(uses) => return *uses,
6363
None => ()
6464
}
6565

@@ -70,11 +70,11 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint)
7070
};
7171

7272
// Conservatively assume full use for recursive loops
73-
ccx.type_use_cache.insert(fn_id, vec::from_elem(n_tps, 3u));
73+
ccx.type_use_cache.insert(fn_id, @vec::from_elem(n_tps, 3u));
7474

7575
let cx = Context {
7676
ccx: ccx,
77-
uses: @mut vec::from_elem(n_tps, 0u)
77+
uses: @mut vec::from_elem(n_tps, 0)
7878
};
7979
match ty::get(ty::lookup_item_type(cx.ccx.tcx, fn_id).ty).sty {
8080
ty::ty_bare_fn(ty::BareFnTy {sig: ref sig, _}) |
@@ -92,8 +92,9 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint)
9292
}
9393

9494
if fn_id_loc.crate != local_crate {
95-
let uses = copy *cx.uses;
96-
ccx.type_use_cache.insert(fn_id, copy uses);
95+
let Context { uses: @uses, _ } = cx;
96+
let uses = @uses; // mutability
97+
ccx.type_use_cache.insert(fn_id, uses);
9798
return uses;
9899
}
99100
let map_node = match ccx.tcx.items.find(&fn_id_loc.node) {
@@ -179,9 +180,9 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint)
179180
ccx.tcx.sess.parse_sess.interner)));
180181
}
181182
}
182-
// XXX: Bad copies, use @vec instead?
183-
let uses = copy *cx.uses;
184-
ccx.type_use_cache.insert(fn_id, copy uses);
183+
let Context { uses: @uses, _ } = cx;
184+
let uses = @uses; // mutability
185+
ccx.type_use_cache.insert(fn_id, uses);
185186
uses
186187
}
187188

@@ -253,7 +254,7 @@ pub fn mark_for_method_call(cx: Context, e_id: node_id, callee_id: node_id) {
253254
// before stage2
254255
let ts = /*bad*/ copy **ts;
255256
let type_uses = type_uses_for(cx.ccx, did, ts.len());
256-
for vec::each2(type_uses, ts) |uses, subst| {
257+
for vec::each2(*type_uses, ts) |uses, subst| {
257258
type_needs(cx, *uses, *subst)
258259
}
259260
}
@@ -302,7 +303,7 @@ pub fn mark_for_expr(cx: Context, e: @expr) {
302303
let ts = copy **ts;
303304
let id = ast_util::def_id_of_def(*cx.ccx.tcx.def_map.get(&e.id));
304305
let uses_for_ts = type_uses_for(cx.ccx, id, ts.len());
305-
for vec::each2(uses_for_ts, ts) |uses, subst| {
306+
for vec::each2(*uses_for_ts, ts) |uses, subst| {
306307
type_needs(cx, *uses, *subst)
307308
}
308309
}

src/librustdoc/parse.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,5 @@ pub fn from_str_sess(sess: session::Session, source: ~str) -> @ast::crate {
3939
}
4040
4141
fn cfg(sess: session::Session, input: driver::input) -> ast::crate_cfg {
42-
driver::build_configuration(sess, ~"rustdoc", input)
42+
driver::build_configuration(sess, @~"rustdoc", input)
4343
}

src/librusti/rusti.rc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fn record(repl: Repl, blk: @ast::blk, intr: @token::ident_interner) -> Repl {
127127
fn run(repl: Repl, input: ~str) -> Repl {
128128
let options = @session::options {
129129
crate_type: session::unknown_crate,
130-
binary: repl.binary,
130+
binary: @repl.binary,
131131
addl_lib_search_paths: repl.lib_search_paths.map(|p| Path(*p)),
132132
jit: true,
133133
.. *session::basic_options()
@@ -146,7 +146,7 @@ fn run(repl: Repl, input: ~str) -> Repl {
146146

147147
debug!("building driver configuration");
148148
let cfg = driver::build_configuration(sess,
149-
repl.binary,
149+
@repl.binary,
150150
wrapped);
151151

152152
let outputs = driver::build_output_filenames(wrapped, &None, &None, sess);
@@ -191,14 +191,14 @@ fn compile_crate(src_filename: ~str, binary: ~str) -> Option<bool> {
191191
match do task::try {
192192
let src_path = Path(src_filename);
193193
let options = @session::options {
194-
binary: binary,
194+
binary: @binary,
195195
addl_lib_search_paths: ~[os::getcwd()],
196196
.. *session::basic_options()
197197
};
198198
let input = driver::file_input(src_path);
199199
let sess = driver::build_session(options, diagnostic::emit);
200200
*sess.building_library = true;
201-
let cfg = driver::build_configuration(sess, binary, input);
201+
let cfg = driver::build_configuration(sess, @binary, input);
202202
let outputs = driver::build_output_filenames(
203203
input, &None, &None, sess);
204204
// If the library already exists and is newer than the source

src/librustpkg/rustpkg.rc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ impl PkgScript {
7676
// Build the rustc session data structures to pass
7777
// to the compiler
7878
let options = @session::options {
79-
binary: binary,
79+
binary: @binary,
8080
crate_type: session::bin_crate,
8181
.. *session::basic_options()
8282
};
8383
let input = driver::file_input(script);
8484
let sess = driver::build_session(options, diagnostic::emit);
85-
let cfg = driver::build_configuration(sess, binary, input);
85+
let cfg = driver::build_configuration(sess, @binary, input);
8686
let (crate, _) = driver::compile_upto(sess, cfg, input,
8787
driver::cu_parse, None);
8888
let work_dir = dest_dir(id);

src/librustpkg/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ pub fn compile_input(sysroot: Option<Path>,
467467
test: test,
468468
maybe_sysroot: sysroot,
469469
addl_lib_search_paths: ~[copy *out_dir],
470-
.. *driver::build_session_options(binary, &matches, diagnostic::emit)
470+
.. *driver::build_session_options(@binary, &matches, diagnostic::emit)
471471
};
472472
let mut crate_cfg = options.cfg;
473473
@@ -499,7 +499,7 @@ pub fn compile_crate_from_input(input: driver::input, build_dir_opt: Option<Path
499499
debug!("Calling build_output_filenames with %?", build_dir_opt);
500500
let outputs = driver::build_output_filenames(input, &build_dir_opt, &None, sess);
501501
debug!("Outputs are %? and output type = %?", outputs, sess.opts.output_type);
502-
let cfg = driver::build_configuration(sess, binary, input);
502+
let cfg = driver::build_configuration(sess, @binary, input);
503503
match crate_opt {
504504
Some(c) => {
505505
debug!("Calling compile_rest, outputs = %?", outputs);

0 commit comments

Comments
 (0)