|
13 | 13 | use back::abi;
|
14 | 14 | use llvm;
|
15 | 15 | use llvm::{ValueRef};
|
16 |
| -use middle::lang_items::StrDupUniqFnLangItem; |
17 | 16 | use middle::trans::base::*;
|
18 | 17 | use middle::trans::base;
|
19 | 18 | use middle::trans::build::*;
|
20 |
| -use middle::trans::callee; |
21 | 19 | use middle::trans::cleanup;
|
22 | 20 | use middle::trans::cleanup::CleanupMethods;
|
23 | 21 | use middle::trans::common::*;
|
@@ -241,94 +239,6 @@ pub fn trans_lit_str<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
241 | 239 | }
|
242 | 240 | }
|
243 | 241 |
|
244 |
| -pub fn trans_uniq_vec<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, |
245 |
| - uniq_expr: &ast::Expr, |
246 |
| - content_expr: &ast::Expr) |
247 |
| - -> DatumBlock<'blk, 'tcx, Expr> { |
248 |
| - /*! |
249 |
| - * Box<[...]> and "...".to_string() allocate boxes in the exchange heap and write |
250 |
| - * the array elements into them. |
251 |
| - */ |
252 |
| - |
253 |
| - debug!("trans_uniq_vec(uniq_expr={})", bcx.expr_to_string(uniq_expr)); |
254 |
| - let fcx = bcx.fcx; |
255 |
| - let ccx = fcx.ccx; |
256 |
| - |
257 |
| - // Handle "".to_string(). |
258 |
| - match content_expr.node { |
259 |
| - ast::ExprLit(lit) => { |
260 |
| - match lit.node { |
261 |
| - ast::LitStr(ref s, _) => { |
262 |
| - let llptrval = C_cstr(ccx, (*s).clone(), false); |
263 |
| - let llptrval = PointerCast(bcx, llptrval, Type::i8p(ccx)); |
264 |
| - let llsizeval = C_uint(ccx, s.get().len()); |
265 |
| - let typ = ty::mk_uniq(bcx.tcx(), ty::mk_str(bcx.tcx())); |
266 |
| - let lldestval = rvalue_scratch_datum(bcx, |
267 |
| - typ, |
268 |
| - ""); |
269 |
| - let alloc_fn = langcall(bcx, |
270 |
| - Some(lit.span), |
271 |
| - "", |
272 |
| - StrDupUniqFnLangItem); |
273 |
| - let bcx = callee::trans_lang_call( |
274 |
| - bcx, |
275 |
| - alloc_fn, |
276 |
| - [ llptrval, llsizeval ], |
277 |
| - Some(expr::SaveIn(lldestval.val))).bcx; |
278 |
| - return DatumBlock::new(bcx, lldestval).to_expr_datumblock(); |
279 |
| - } |
280 |
| - _ => {} |
281 |
| - } |
282 |
| - } |
283 |
| - _ => {} |
284 |
| - } |
285 |
| - |
286 |
| - let vt = vec_types_from_expr(bcx, content_expr); |
287 |
| - let count = elements_required(bcx, content_expr); |
288 |
| - debug!(" vt={}, count={:?}", vt.to_string(ccx), count); |
289 |
| - let vec_ty = node_id_type(bcx, uniq_expr.id); |
290 |
| - |
291 |
| - let llty = type_of::type_of(ccx, vt.unit_ty); |
292 |
| - let unit_sz = nonzero_llsize_of(ccx, llty); |
293 |
| - let llcount = if count < 4u { |
294 |
| - C_int(ccx, 4) |
295 |
| - } else { |
296 |
| - C_uint(ccx, count) |
297 |
| - }; |
298 |
| - let alloc = Mul(bcx, llcount, unit_sz); |
299 |
| - let llty_ptr = llty.ptr_to(); |
300 |
| - let align = C_uint(ccx, machine::llalign_of_min(ccx, llty) as uint); |
301 |
| - let Result { bcx: bcx, val: dataptr } = malloc_raw_dyn(bcx, |
302 |
| - llty_ptr, |
303 |
| - vec_ty, |
304 |
| - alloc, |
305 |
| - align); |
306 |
| - |
307 |
| - // Create a temporary scope lest execution should fail while |
308 |
| - // constructing the vector. |
309 |
| - let temp_scope = fcx.push_custom_cleanup_scope(); |
310 |
| - |
311 |
| - fcx.schedule_free_slice(cleanup::CustomScope(temp_scope), |
312 |
| - dataptr, alloc, align, cleanup::HeapExchange); |
313 |
| - |
314 |
| - debug!(" alloc_uniq_vec() returned dataptr={}, len={}", |
315 |
| - bcx.val_to_string(dataptr), count); |
316 |
| - |
317 |
| - let bcx = write_content(bcx, &vt, uniq_expr, |
318 |
| - content_expr, SaveIn(dataptr)); |
319 |
| - |
320 |
| - fcx.pop_custom_cleanup_scope(temp_scope); |
321 |
| - |
322 |
| - if ty::type_is_sized(bcx.tcx(), vec_ty) { |
323 |
| - immediate_rvalue_bcx(bcx, dataptr, vec_ty).to_expr_datumblock() |
324 |
| - } else { |
325 |
| - let scratch = rvalue_scratch_datum(bcx, vec_ty, ""); |
326 |
| - Store(bcx, dataptr, GEPi(bcx, scratch.val, [0u, abi::slice_elt_base])); |
327 |
| - Store(bcx, llcount, GEPi(bcx, scratch.val, [0u, abi::slice_elt_len])); |
328 |
| - DatumBlock::new(bcx, scratch.to_expr_datum()) |
329 |
| - } |
330 |
| -} |
331 |
| - |
332 | 242 | pub fn write_content<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
333 | 243 | vt: &VecTypes,
|
334 | 244 | vstore_expr: &ast::Expr,
|
|
0 commit comments