diff --git a/src/rustc/middle/trans/tvec.rs b/src/rustc/middle/trans/tvec.rs index fa21927d743283cc0e13fdddba9f294e451628d9..125fc8d30dfa80dc1de2abcd1b18c4c7b0f7b250 100644 --- a/src/rustc/middle/trans/tvec.rs +++ b/src/rustc/middle/trans/tvec.rs @@ -57,17 +57,14 @@ fn alloc_uniq_raw(bcx: block, unit_ty: ty::t, fill: ValueRef, alloc: ValueRef) -> result { let _icx = bcx.insn_ctxt("tvec::alloc_uniq_raw"); let ccx = bcx.ccx(); - let llunitty = type_of::type_of(ccx, unit_ty); - let llvecty = T_vec(ccx, llunitty); - let vecsize = Add(bcx, alloc, llsize_of(ccx, llvecty)); - let vecbodyty = unit_ty; // FIXME: This is not the correct type (#2536) + + let vecbodyty = ty::mk_mut_unboxed_vec(bcx.tcx(), unit_ty); + let vecsize = Add(bcx, alloc, llsize_of(ccx, ccx.opaque_vec_type)); + let {box, body} = base::malloc_unique_dyn(bcx, vecbodyty, vecsize); - let boxptr = PointerCast(bcx, box, - T_unique_ptr(T_unique(bcx.ccx(), llvecty))); - let bodyptr = PointerCast(bcx, body, T_ptr(llvecty)); - Store(bcx, fill, GEPi(bcx, bodyptr, [0u, abi::vec_elt_fill])); - Store(bcx, alloc, GEPi(bcx, bodyptr, [0u, abi::vec_elt_alloc])); - ret {bcx: bcx, val: boxptr}; + Store(bcx, fill, GEPi(bcx, body, [0u, abi::vec_elt_fill])); + Store(bcx, alloc, GEPi(bcx, body, [0u, abi::vec_elt_alloc])); + ret {bcx: bcx, val: box}; } fn alloc_uniq(bcx: block, unit_ty: ty::t, elts: uint) -> result { @@ -91,14 +88,9 @@ fn duplicate_uniq(bcx: block, vptr: ValueRef, vec_ty: ty::t) -> result { let size = Add(bcx, fill, llsize_of(ccx, ccx.opaque_vec_type)); let unit_ty = ty::sequence_element_type(bcx.tcx(), vec_ty); - let llunitty = type_of::type_of(ccx, unit_ty); - let llvecty = T_vec(ccx, llunitty); - let vecbodyty = unit_ty; // FIXME: This is not the correct type (#2536) + let vecbodyty = ty::mk_mut_unboxed_vec(bcx.tcx(), unit_ty); let {box: newptr, body: new_body_ptr} = base::malloc_unique_dyn(bcx, vecbodyty, size); - let newptr = PointerCast(bcx, newptr, - T_unique_ptr(T_unique(bcx.ccx(), llvecty))); - let new_body_ptr = PointerCast(bcx, new_body_ptr, T_ptr(llvecty)); call_memmove(bcx, new_body_ptr, body_ptr, size); Store(bcx, fill, GEPi(bcx, new_body_ptr, [0u, abi::vec_elt_alloc])); diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index c770e7d71b77769a6d4d7f24e7a1182c297b7d24..8ffc0f36d2039a1a413ae27037ee5c22f38a9a4b 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -88,7 +88,7 @@ export ty_vec, mk_vec, type_is_vec; export ty_estr, mk_estr; export ty_evec, mk_evec; -export ty_unboxed_vec, mk_unboxed_vec; +export ty_unboxed_vec, mk_unboxed_vec, mk_mut_unboxed_vec; export vstore, vstore_fixed, vstore_uniq, vstore_box, vstore_slice; export ty_nil, mk_nil, type_is_nil; export ty_iface, mk_iface; @@ -677,6 +677,9 @@ fn mk_evec(cx: ctxt, tm: mt, t: vstore) -> t { fn mk_unboxed_vec(cx: ctxt, tm: mt) -> t { mk_t(cx, ty_unboxed_vec(tm)) } +fn mk_mut_unboxed_vec(cx: ctxt, ty: t) -> t { + mk_t(cx, ty_unboxed_vec({ty: ty, mutbl: ast::m_imm})) +} fn mk_rec(cx: ctxt, fs: [field]) -> t { mk_t(cx, ty_rec(fs)) }