diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index abc473c8cb71..2239718cc245 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2444,61 +2444,30 @@ fn move_val_if_temp(cx: @block_ctxt, action: copy_action, dst: ValueRef, } fn trans_lit_istr(cx: &@block_ctxt, s: str) -> result { - let llstackpart = alloca(cx, T_ivec(T_i8())); - let len = str::byte_len(s); + let vec_ty = ty::mk_vec(bcx_tcx(cx), + {ty: ty::mk_mach(bcx_tcx(cx), ast::ty_u8), + mut: ast::imm}); + let strlen = str::byte_len(s); + let veclen = strlen + 1u; // +1 for \0 + let alloc_res = trans_ivec::alloc_with_heap(cx, vec_ty, veclen); - let bcx; - if len < 3u { // 3 because of the \0 - cx.build.Store(C_uint(len + 1u), - cx.build.InBoundsGEP(llstackpart, - [C_int(0), C_int(0)])); - cx.build.Store(C_int(4), - cx.build.InBoundsGEP(llstackpart, - [C_int(0), C_int(1)])); - let i = 0u; - while i < len { - cx.build.Store(C_u8(s[i] as uint), - cx.build.InBoundsGEP(llstackpart, - [C_int(0), C_int(2), - C_uint(i)])); - i += 1u; - } - cx.build.Store(C_u8(0u), - cx.build.InBoundsGEP(llstackpart, - [C_int(0), C_int(2), - C_uint(len)])); + let bcx = alloc_res.bcx; + let llvecptr = alloc_res.llptr; + let llfirsteltptr = alloc_res.llfirsteltptr; - bcx = cx; - } else { - let r = - trans_shared_malloc(cx, T_ptr(T_ivec_heap_part(T_i8())), - llsize_of(T_struct([T_int(), - T_array(T_i8(), - len + 1u)]))); - bcx = r.bcx; - let llheappart = r.val; - - bcx.build.Store(C_uint(len + 1u), - bcx.build.InBoundsGEP(llheappart, - [C_int(0), C_int(0)])); - bcx.build.Store(llvm::LLVMConstString(str::buf(s), len, False), - bcx.build.InBoundsGEP(llheappart, - [C_int(0), C_int(1)])); - - let llspilledstackpart = - bcx.build.PointerCast(llstackpart, T_ptr(T_ivec_heap(T_i8()))); - bcx.build.Store(C_int(0), - bcx.build.InBoundsGEP(llspilledstackpart, - [C_int(0), C_int(0)])); - bcx.build.Store(C_uint(len + 1u), - bcx.build.InBoundsGEP(llspilledstackpart, - [C_int(0), C_int(1)])); - bcx.build.Store(llheappart, - bcx.build.InBoundsGEP(llspilledstackpart, - [C_int(0), C_int(2)])); + // FIXME: Do something smarter here to load the string + let i = 0u; + while i < strlen { + bcx.build.Store(C_u8(s[i] as uint), + bcx.build.InBoundsGEP(llfirsteltptr, + [C_uint(i)])); + i += 1u; } + bcx.build.Store(C_u8(0u), + bcx.build.InBoundsGEP(llfirsteltptr, + [C_uint(strlen)])); - ret rslt(bcx, llstackpart); + ret rslt(bcx, llvecptr); } fn trans_crate_lit(cx: &@crate_ctxt, lit: &ast::lit) -> ValueRef { diff --git a/src/comp/middle/trans_ivec.rs b/src/comp/middle/trans_ivec.rs index 7bdc1241a0a0..bc548c8c4b54 100644 --- a/src/comp/middle/trans_ivec.rs +++ b/src/comp/middle/trans_ivec.rs @@ -12,7 +12,7 @@ import trans::{call_memmove, trans_shared_malloc, llsize_of, import trans_common::*; export trans_ivec, get_len_and_data, duplicate_heap_part, trans_add, -trans_append; +trans_append, alloc_with_heap; fn alloc_with_heap(bcx: @block_ctxt, typ: &ty::t, vecsz: uint) -> {bcx: @block_ctxt, diff --git a/src/test/run-pass/istr.rs b/src/test/run-pass/istr.rs new file mode 100644 index 000000000000..624b7edb1027 --- /dev/null +++ b/src/test/run-pass/istr.rs @@ -0,0 +1,17 @@ +fn test_stack_assign() { + let s: istr = ~"a"; + log s; + let t: istr = ~"a"; + assert s == t; + let u: istr = ~"b"; + assert s != u; +} + +fn test_heap_lit() { + ~"a big string"; +} + +fn main() { + test_stack_assign(); + test_heap_lit(); +} \ No newline at end of file