Skip to content

Commit 806e74f

Browse files
committed
Move expr_lit and expr_vec into trans_expr_dps
Issue #667
1 parent 8ea72fa commit 806e74f

File tree

3 files changed

+54
-32
lines changed

3 files changed

+54
-32
lines changed

src/comp/middle/trans.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2153,10 +2153,16 @@ fn trans_crate_lit(cx: @crate_ctxt, lit: ast::lit) -> ValueRef {
21532153
}
21542154
}
21552155

2156-
fn trans_lit(cx: @block_ctxt, lit: ast::lit) -> result {
2156+
fn trans_lit(cx: @block_ctxt, lit: ast::lit, dest: dest) -> @block_ctxt {
2157+
if dest == ignore { ret cx; }
21572158
alt lit.node {
2158-
ast::lit_str(s) { ret tvec::trans_str(cx, s); }
2159-
_ { ret rslt(cx, trans_crate_lit(bcx_ccx(cx), lit)); }
2159+
ast::lit_str(s) { ret tvec::trans_str(cx, s, dest); }
2160+
_ {
2161+
let cell = alt dest { by_val(c) { c }
2162+
_ { bcx_ccx(cx).sess.span_note(lit.span, "here"); fail; }};
2163+
*cell = trans_crate_lit(bcx_ccx(cx), lit);
2164+
ret cx;
2165+
}
21602166
}
21612167
}
21622168

@@ -4129,7 +4135,6 @@ fn trans_rec(bcx: @block_ctxt, fields: [ast::field],
41294135
fn trans_expr(cx: @block_ctxt, e: @ast::expr) -> result {
41304136
// Fixme Fill in cx.sp
41314137
alt e.node {
4132-
ast::expr_lit(lit) { ret trans_lit(cx, *lit); }
41334138
ast::expr_binary(op, x, y) { ret trans_binary(cx, op, x, y); }
41344139
ast::expr_fn(f) {
41354140
let ccx = bcx_ccx(cx);
@@ -4186,7 +4191,6 @@ fn trans_expr(cx: @block_ctxt, e: @ast::expr) -> result {
41864191
}
41874192
ast::expr_bind(f, args) { ret trans_bind(cx, f, args, e.id); }
41884193
ast::expr_cast(val, _) { ret trans_cast(cx, val, e.id); }
4189-
ast::expr_vec(args, _) { ret tvec::trans_vec(cx, args, e.id); }
41904194
ast::expr_anon_obj(anon_obj) {
41914195
ret trans_anon_obj(cx, e.span, anon_obj, e.id);
41924196
}
@@ -4261,6 +4265,9 @@ fn trans_expr_dps(bcx: @block_ctxt, e: @ast::expr, dest: dest)
42614265
ret trans_rec(bcx, args, base, e.id, dest);
42624266
}
42634267
ast::expr_tup(args) { ret trans_tup(bcx, args, e.id, dest); }
4268+
ast::expr_lit(lit) { ret trans_lit(bcx, *lit, dest); }
4269+
ast::expr_vec(args, _) { ret tvec::trans_vec(bcx, args, e.id, dest); }
4270+
42644271
ast::expr_break. {
42654272
assert dest == ignore;
42664273
ret trans_break(e.span, bcx);
@@ -5306,13 +5313,18 @@ fn trans_closure(bcx_maybe: option::t<@block_ctxt>,
53065313
// translation calls that don't have a return value (trans_crate,
53075314
// trans_mod, trans_item, trans_obj, et cetera) and those that do
53085315
// (trans_block, trans_expr, et cetera).
5309-
let dest = if !ty::type_is_bot(cx.ccx.tcx, block_ty) &&
5310-
!ty::type_is_nil(cx.ccx.tcx, block_ty) &&
5311-
f.proto != ast::proto_iter &&
5312-
option::is_some(f.body.node.expr) {
5313-
save_in(fcx.llretptr)
5314-
} else { ignore };
5315-
bcx = trans_block_dps(bcx, f.body, dest);
5316+
if ty::type_is_bot(cx.ccx.tcx, block_ty) ||
5317+
ty::type_is_nil(cx.ccx.tcx, block_ty) ||
5318+
f.proto == ast::proto_iter ||
5319+
option::is_none(f.body.node.expr) {
5320+
bcx = trans_block_dps(bcx, f.body, ignore);
5321+
} else if type_is_immediate(cx.ccx, block_ty) {
5322+
let cell = empty_dest_cell();
5323+
bcx = trans_block_dps(bcx, f.body, by_val(cell));
5324+
Store(bcx, *cell, fcx.llretptr);
5325+
} else {
5326+
bcx = trans_block_dps(bcx, f.body, save_in(fcx.llretptr));
5327+
}
53165328

53175329
if !bcx.unreachable {
53185330
// FIXME: until LLVM has a unit type, we are moving around

src/comp/middle/trans_alt.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,19 @@ fn opt_eq(a: opt, b: opt) -> bool {
3333
}
3434
fn trans_opt(bcx: @block_ctxt, o: opt) -> result {
3535
alt o {
36-
lit(l) { ret trans::trans_lit(bcx, *l); }
36+
lit(l) {
37+
alt l.node {
38+
ast::lit_str(s) {
39+
let {bcx, val: dst} =
40+
trans::alloc_ty(bcx, ty::mk_str(bcx_tcx(bcx)));
41+
bcx = trans_vec::trans_str(bcx, s, trans::save_in(dst));
42+
ret rslt(bcx, dst);
43+
}
44+
_ {
45+
ret rslt(bcx, trans::trans_crate_lit(bcx_ccx(bcx), *l));
46+
}
47+
}
48+
}
3749
var(id, _) { ret rslt(bcx, C_int(id as int)); }
3850
}
3951
}

src/comp/middle/trans_vec.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import trans::{call_memmove, trans_shared_malloc, llsize_of, type_of_or_i8,
88
llderivedtydescs_block_ctxt, lazily_emit_tydesc_glue,
99
get_tydesc, load_inbounds, move_val_if_temp, trans_lval,
1010
node_id_type, new_sub_block_ctxt, tps_normal, do_spill_noroot,
11-
GEPi, alloc_ty};
11+
GEPi, alloc_ty, dest};
1212
import trans_build::*;
1313
import trans_common::*;
1414

@@ -49,7 +49,8 @@ type alloc_result =
4949
llunitsz: ValueRef,
5050
llunitty: TypeRef};
5151

52-
fn alloc(bcx: @block_ctxt, vec_ty: ty::t, elts: uint) -> alloc_result {
52+
fn alloc(bcx: @block_ctxt, vec_ty: ty::t, elts: uint, dest: dest)
53+
-> alloc_result {
5354
let unit_ty = ty::sequence_element_type(bcx_tcx(bcx), vec_ty);
5455
let llunitty = type_of_or_i8(bcx, unit_ty);
5556
let llvecty = T_vec(llunitty);
@@ -60,12 +61,9 @@ fn alloc(bcx: @block_ctxt, vec_ty: ty::t, elts: uint) -> alloc_result {
6061
let {bcx: bcx, val: vptr} = alloc_raw(bcx, fill, alloc);
6162
let vptr = PointerCast(bcx, vptr, T_ptr(llvecty));
6263

63-
let r = alloc_ty(bcx, vec_ty);
64-
let vptrptr = r.val;
65-
bcx = r.bcx;
66-
64+
let vptrptr = alt dest { trans::save_in(a) { a } };
6765
Store(bcx, vptr, vptrptr);
68-
add_clean_temp(bcx, vptrptr, vec_ty);
66+
// add_clean_temp(bcx, vptrptr, vec_ty);
6967
ret {bcx: bcx,
7068
val: vptrptr,
7169
unit_ty: unit_ty,
@@ -102,18 +100,19 @@ fn make_drop_glue(bcx: @block_ctxt, vptrptr: ValueRef, vec_ty: ty::t) ->
102100
ret next_cx;
103101
}
104102

105-
fn trans_vec(bcx: @block_ctxt, args: [@ast::expr], id: ast::node_id) ->
106-
result {
103+
// FIXME handle dest == ignore
104+
fn trans_vec(bcx: @block_ctxt, args: [@ast::expr], id: ast::node_id,
105+
dest: dest) -> @block_ctxt {
107106
let vec_ty = node_id_type(bcx_ccx(bcx), id);
108107
let {bcx: bcx,
109-
val: vptr,
108+
val: vptrptr,
110109
llunitsz: llunitsz,
111110
unit_ty: unit_ty,
112111
llunitty: llunitty} =
113-
alloc(bcx, vec_ty, vec::len(args));
112+
alloc(bcx, vec_ty, vec::len(args), dest);
114113

115114
// Store the individual elements.
116-
let dataptr = get_dataptr(bcx, vptr, llunitty);
115+
let dataptr = get_dataptr(bcx, vptrptr, llunitty);
117116
let i = 0u;
118117
for e in args {
119118
let lv = trans_lval(bcx, e);
@@ -125,19 +124,18 @@ fn trans_vec(bcx: @block_ctxt, args: [@ast::expr], id: ast::node_id) ->
125124
bcx = move_val_if_temp(bcx, INIT, lleltptr, lv, unit_ty);
126125
i += 1u;
127126
}
128-
ret rslt(bcx, vptr);
127+
ret bcx;
129128
}
130-
fn trans_str(bcx: @block_ctxt, s: str) -> result {
129+
fn trans_str(bcx: @block_ctxt, s: str, dest: dest) -> @block_ctxt {
131130
let veclen = std::str::byte_len(s) + 1u; // +1 for \0
132-
let {bcx: bcx, val: sptr, _} =
133-
alloc(bcx, ty::mk_str(bcx_tcx(bcx)), veclen);
131+
let {bcx: bcx, val: sptrptr, _} =
132+
alloc(bcx, ty::mk_str(bcx_tcx(bcx)), veclen, dest);
134133

135134
let llcstr = C_cstr(bcx_ccx(bcx), s);
136135
let bcx =
137-
call_memmove(bcx, get_dataptr(bcx, sptr, T_i8()), llcstr,
136+
call_memmove(bcx, get_dataptr(bcx, sptrptr, T_i8()), llcstr,
138137
C_uint(veclen)).bcx;
139-
140-
ret rslt(bcx, sptr);
138+
ret bcx;
141139
}
142140

143141
fn trans_append(cx: @block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,

0 commit comments

Comments
 (0)