Skip to content

Commit f17ca3f

Browse files
committed
Some box cleanup that doesn't break the build.
1 parent 6413421 commit f17ca3f

File tree

5 files changed

+42
-52
lines changed

5 files changed

+42
-52
lines changed

src/rustc/middle/trans/base.rs

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,6 @@ enum dest {
6363
ignore,
6464
}
6565

66-
// Heap selectors. Indicate which heap something should go on.
67-
enum heap {
68-
heap_shared,
69-
heap_exchange,
70-
}
71-
7266
fn dest_str(ccx: @crate_ctxt, d: dest) -> str {
7367
alt d {
7468
by_val(v) { #fmt["by_val(%s)", val_str(ccx.tn, *v)] }
@@ -398,18 +392,16 @@ fn malloc_general_dyn(bcx: block, t: ty::t, heap: heap, size: ValueRef) ->
398392
ret {box: box, body: body};
399393
}
400394

401-
fn malloc_boxed(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} {
402-
malloc_general_dyn(bcx, t, heap_shared,
395+
fn malloc_general(bcx: block, t: ty::t, heap: heap) ->
396+
{box: ValueRef, body: ValueRef} {
397+
malloc_general_dyn(bcx, t, heap,
403398
llsize_of(bcx.ccx(), type_of(bcx.ccx(), t)))
404399
}
405-
fn malloc_unique(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} {
406-
malloc_general_dyn(bcx, t, heap_exchange,
407-
llsize_of(bcx.ccx(), type_of(bcx.ccx(), t)))
400+
fn malloc_boxed(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} {
401+
malloc_general(bcx, t, heap_shared)
408402
}
409-
410-
fn malloc_unique_dyn(bcx: block, t: ty::t, size: ValueRef
411-
) -> {box: ValueRef, body: ValueRef} {
412-
malloc_general_dyn(bcx, t, heap_exchange, size)
403+
fn malloc_unique(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} {
404+
malloc_general(bcx, t, heap_exchange)
413405
}
414406

415407
// Type descriptor and type glue stuff
@@ -1487,6 +1479,19 @@ fn trans_lit(cx: block, e: @ast::expr, lit: ast::lit, dest: dest) -> block {
14871479
}
14881480
}
14891481

1482+
1483+
fn trans_boxed_expr(bcx: block, contents: @ast::expr,
1484+
t: ty::t, heap: heap,
1485+
dest: dest) -> block {
1486+
let _icx = bcx.insn_ctxt("trans_boxed_expr");
1487+
let {box, body} = malloc_general(bcx, t, heap);
1488+
add_clean_free(bcx, box, heap);
1489+
let bcx = trans_expr_save_in(bcx, contents, body);
1490+
revoke_clean(bcx, box);
1491+
ret store_in_dest(bcx, box, dest);
1492+
}
1493+
1494+
14901495
fn trans_unary(bcx: block, op: ast::unop, e: @ast::expr,
14911496
un_expr: @ast::expr, dest: dest) -> block {
14921497
let _icx = bcx.insn_ctxt("trans_unary");
@@ -1509,35 +1514,25 @@ fn trans_unary(bcx: block, op: ast::unop, e: @ast::expr,
15091514
alt op {
15101515
ast::not {
15111516
let {bcx, val} = trans_temp_expr(bcx, e);
1512-
ret store_in_dest(bcx, Not(bcx, val), dest);
1517+
store_in_dest(bcx, Not(bcx, val), dest)
15131518
}
15141519
ast::neg {
15151520
let {bcx, val} = trans_temp_expr(bcx, e);
15161521
let neg = if ty::type_is_fp(e_ty) {
15171522
FNeg(bcx, val)
15181523
} else { Neg(bcx, val) };
1519-
ret store_in_dest(bcx, neg, dest);
1524+
store_in_dest(bcx, neg, dest)
15201525
}
15211526
ast::box(_) {
1522-
let mut {box, body} = malloc_boxed(bcx, e_ty);
1523-
add_clean_free(bcx, box, false);
1524-
// Cast the body type to the type of the value. This is needed to
1525-
// make enums work, since enums have a different LLVM type depending
1526-
// on whether they're boxed or not
1527-
let ccx = bcx.ccx();
1528-
let llety = T_ptr(type_of(ccx, e_ty));
1529-
body = PointerCast(bcx, body, llety);
1530-
let bcx = trans_expr_save_in(bcx, e, body);
1531-
revoke_clean(bcx, box);
1532-
ret store_in_dest(bcx, box, dest);
1527+
trans_boxed_expr(bcx, e, e_ty, heap_shared, dest)
15331528
}
15341529
ast::uniq(_) {
1535-
ret uniq::trans_uniq(bcx, e, un_expr.id, dest);
1530+
trans_boxed_expr(bcx, e, e_ty, heap_exchange, dest)
15361531
}
15371532
ast::deref {
15381533
bcx.sess().bug("deref expressions should have been \
15391534
translated using trans_lval(), not \
1540-
trans_unary()");
1535+
trans_unary()")
15411536
}
15421537
}
15431538
}

src/rustc/middle/trans/common.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@ fn warn_not_to_commit(ccx: @crate_ctxt, msg: str) {
201201
}
202202
}
203203

204+
// Heap selectors. Indicate which heap something should go on.
205+
enum heap {
206+
heap_shared,
207+
heap_exchange,
208+
}
209+
204210
enum cleantype {
205211
normal_exit_only,
206212
normal_exit_and_unwind
@@ -274,9 +280,11 @@ fn add_clean_temp_mem(cx: block, val: ValueRef, ty: ty::t) {
274280
scope_clean_changed(info);
275281
}
276282
}
277-
fn add_clean_free(cx: block, ptr: ValueRef, shared: bool) {
278-
let free_fn = if shared { {|a|base::trans_unique_free(a, ptr)} }
279-
else { {|a|base::trans_free(a, ptr)} };
283+
fn add_clean_free(cx: block, ptr: ValueRef, heap: heap) {
284+
let free_fn = alt heap {
285+
heap_shared { {|a|base::trans_free(a, ptr)} }
286+
heap_exchange { {|a|base::trans_unique_free(a, ptr)} }
287+
};
280288
in_scope_cx(cx) {|info|
281289
vec::push(info.cleanups, clean_temp(ptr, free_fn,
282290
normal_exit_and_unwind));

src/rustc/middle/trans/impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ fn trans_cast(bcx: block, val: @ast::expr, id: ast::node_id, dest: dest)
285285
let ccx = bcx.ccx();
286286
let v_ty = expr_ty(bcx, val);
287287
let {box, body} = malloc_boxed(bcx, v_ty);
288-
add_clean_free(bcx, box, false);
288+
add_clean_free(bcx, box, heap_shared);
289289
let bcx = trans_expr_save_in(bcx, val, body);
290290
revoke_clean(bcx, box);
291291
let result = get_dest_addr(dest);

src/rustc/middle/trans/tvec.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import back::abi;
55
import base::{call_memmove,
66
INIT, copy_val, load_if_immediate, get_tydesc,
77
sub_block, do_spill_noroot,
8-
dest, bcx_icx, non_gc_box_cast,
9-
heap, heap_exchange, heap_shared};
8+
dest, bcx_icx, non_gc_box_cast};
109
import syntax::codemap::span;
1110
import shape::llsize_of;
1211
import build::*;
@@ -167,14 +166,14 @@ fn trans_evec(bcx: block, args: [@ast::expr]/~,
167166
ast::vstore_uniq {
168167
let {bcx, val} = alloc_vec(bcx, unit_ty, args.len(),
169168
heap_exchange);
170-
add_clean_free(bcx, val, true);
169+
add_clean_free(bcx, val, heap_exchange);
171170
let dataptr = get_dataptr(bcx, get_bodyptr(bcx, val));
172171
{bcx: bcx, val: val, dataptr: dataptr}
173172
}
174173
ast::vstore_box {
175174
let {bcx, val} = alloc_vec(bcx, unit_ty, args.len(),
176175
heap_shared);
177-
add_clean_free(bcx, val, true);
176+
add_clean_free(bcx, val, heap_shared);
178177
let dataptr = get_dataptr(bcx, get_bodyptr(bcx, val));
179178
{bcx: bcx, val: val, dataptr: dataptr}
180179
}

src/rustc/middle/trans/uniq.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,7 @@ import build::*;
55
import base::*;
66
import shape::llsize_of;
77

8-
export trans_uniq, make_free_glue, autoderef, duplicate;
9-
10-
fn trans_uniq(bcx: block, contents: @ast::expr,
11-
node_id: ast::node_id, dest: dest) -> block {
12-
let _icx = bcx.insn_ctxt("uniq::trans_uniq");
13-
let uniq_ty = node_id_type(bcx, node_id);
14-
let contents_ty = content_ty(uniq_ty);
15-
let {box, body} = malloc_unique(bcx, contents_ty);
16-
add_clean_free(bcx, box, true);
17-
let bcx = trans_expr_save_in(bcx, contents, body);
18-
revoke_clean(bcx, box);
19-
ret store_in_dest(bcx, box, dest);
20-
}
8+
export make_free_glue, autoderef, duplicate;
219

2210
fn make_free_glue(bcx: block, vptr: ValueRef, t: ty::t)
2311
-> block {
@@ -64,4 +52,4 @@ fn duplicate(bcx: block, v: ValueRef, t: ty::t) -> result {
6452
Store(bcx, td, dst_tydesc_ptr);
6553

6654
ret rslt(bcx, dst_box);
67-
}
55+
}

0 commit comments

Comments
 (0)