rustc: "foo" is now a static string
This commit is contained in:
parent
4bfd4fb8ea
commit
4e60d7e3a6
4 changed files with 12 additions and 15 deletions
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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) }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue