1
Fork 0

rustc: "foo" is now a static string

This commit is contained in:
Patrick Walton 2012-08-03 11:51:04 -07:00
parent 4bfd4fb8ea
commit 4e60d7e3a6
4 changed files with 12 additions and 15 deletions

View file

@ -52,7 +52,8 @@ fn trans_opt(bcx: block, o: opt) -> opt_result {
ast::vstore_uniq) {
let strty = ty::mk_estr(bcx.tcx(), ty::vstore_uniq);
let cell = empty_dest_cell();
bcx = tvec::trans_estr(bcx, s, ast::vstore_uniq, by_val(cell));
bcx = tvec::trans_estr(bcx, s, some(ast::vstore_uniq),
by_val(cell));
add_clean_temp(bcx, *cell, strty);
return single_result(rslt(bcx, *cell));
}

View file

@ -1424,12 +1424,9 @@ fn store_temp_expr(cx: block, action: copy_action, dst: ValueRef,
fn trans_lit(cx: block, e: @ast::expr, lit: ast::lit, dest: dest) -> block {
let _icx = cx.insn_ctxt(~"trans_lit");
if dest == ignore { return cx; }
alt lit.node {
ast::lit_str(s) { tvec::trans_estr(cx, s,
ast::vstore_fixed(none), dest) }
_ {
store_in_dest(cx, consts::const_lit(cx.ccx(), e, lit), dest)
}
match lit.node {
ast::lit_str(s) => tvec::trans_estr(cx, s, none, dest),
_ => store_in_dest(cx, consts::const_lit(cx.ccx(), e, lit), dest)
}
}

View file

@ -220,7 +220,7 @@ fn trans_vstore(bcx: block, e: @ast::expr,
v: ast::vstore, dest: dest) -> block {
alt e.node {
ast::expr_lit(@{node: ast::lit_str(s), span: _}) {
return trans_estr(bcx, s, v, dest);
return trans_estr(bcx, s, some(v), dest);
}
ast::expr_vec(es, mutbl) {
return trans_evec(bcx, es, v, e.id, dest);
@ -266,27 +266,26 @@ fn get_base_and_len(cx: block, v: ValueRef, e_ty: ty::t)
}
}
fn trans_estr(bcx: block, s: @~str, vstore: ast::vstore,
fn trans_estr(bcx: block, s: @~str, vstore: option<ast::vstore>,
dest: dest) -> block {
let _icx = bcx.insn_ctxt(~"tvec::trans_estr");
if dest == base::ignore { return bcx; }
let ccx = bcx.ccx();
let c = alt vstore {
ast::vstore_fixed(_)
{
some(ast::vstore_fixed(_)) => {
// "hello"/_ => "hello"/5 => ~[i8 x 6] in llvm
debug!{"trans_estr: fixed: %s", *s};
C_postr(*s)
}
ast::vstore_slice(_) {
some(ast::vstore_slice(_)) | none => {
// "hello" => (*i8, 6u) in llvm
debug!{"trans_estr: slice '%s'", *s};
C_estr_slice(ccx, *s)
}
ast::vstore_uniq {
some(ast::vstore_uniq) => {
let cs = PointerCast(bcx, C_cstr(ccx, *s), T_ptr(T_i8()));
let len = C_uint(ccx, str::len(*s));
let c = Call(bcx, ccx.upcalls.str_new_uniq, ~[cs, len]);
@ -294,7 +293,7 @@ fn trans_estr(bcx: block, s: @~str, vstore: ast::vstore,
T_unique_ptr(T_unique(ccx, T_vec(ccx, T_i8()))))
}
ast::vstore_box {
some(ast::vstore_box) => {
let cs = PointerCast(bcx, C_cstr(ccx, *s), T_ptr(T_i8()));
let len = C_uint(ccx, str::len(*s));
let c = Call(bcx, ccx.upcalls.str_new_shared, ~[cs, len]);

View file

@ -703,7 +703,7 @@ fn check_lit(fcx: @fn_ctxt, lit: @ast::lit) -> ty::t {
alt lit.node {
ast::lit_str(s) {
tcx.sess.span_warn(lit.span, ~"fixed length string");
ty::mk_estr(tcx, ty::vstore_fixed(s.len()))
ty::mk_estr(tcx, ty::vstore_slice(ty::re_static))
}
ast::lit_int(_, t) { ty::mk_mach_int(tcx, t) }
ast::lit_uint(_, t) { ty::mk_mach_uint(tcx, t) }