Skip to content

Commit 15c9e5e

Browse files
Mutate llargs instead of reconstructing it.
1 parent 88202c5 commit 15c9e5e

File tree

1 file changed

+14
-20
lines changed

1 file changed

+14
-20
lines changed

src/librustc_trans/callee.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -331,16 +331,21 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>(
331331
let fcx = FunctionContext::new(ccx, lloncefn, fn_ty);
332332
let mut bcx = fcx.get_entry_block();
333333

334+
let callee = Callee {
335+
data: Fn(llreffn),
336+
ty: llref_fn_ty
337+
};
338+
334339
// the first argument (`self`) will be the (by value) closure env.
335340

336341
let mut llargs = get_params(fcx.llfn);
337-
let mut self_idx = fcx.fn_ty.ret.is_indirect() as usize;
342+
let idx = fcx.fn_ty.ret.is_indirect() as usize;
338343
let env_arg = &fcx.fn_ty.args[0];
339344
let llenv = if env_arg.is_indirect() {
340-
llargs[self_idx]
345+
llargs[idx]
341346
} else {
342347
let scratch = alloc_ty(&bcx, closure_ty, "self");
343-
let mut llarg_idx = self_idx;
348+
let mut llarg_idx = idx;
344349
env_arg.store_fn_arg(&bcx, &mut llarg_idx, scratch);
345350
scratch
346351
};
@@ -349,35 +354,24 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>(
349354
// Adjust llargs such that llargs[self_idx..] has the call arguments.
350355
// For zero-sized closures that means sneaking in a new argument.
351356
if env_arg.is_ignore() {
352-
if self_idx > 0 {
353-
self_idx -= 1;
354-
llargs[self_idx] = llenv;
357+
if fcx.fn_ty.ret.is_indirect() {
358+
llargs[0] = llenv;
355359
} else {
356360
llargs.insert(0, llenv);
357361
}
358362
} else {
359-
llargs[self_idx] = llenv;
363+
llargs[idx] = llenv;
360364
}
361365

362-
let callee = Callee {
363-
data: Fn(llreffn),
364-
ty: llref_fn_ty
365-
};
366-
367366
// Call the by-ref closure body with `self` in a cleanup scope,
368367
// to drop `self` when the body returns, or in case it unwinds.
369368
let self_scope = fcx.schedule_drop_mem(llenv, closure_ty);
370369
let fn_ret = callee.ty.fn_ret();
371370
let fn_ty = callee.direct_fn_type(bcx.ccx, &[]);
372371

373-
let first_llarg = if fn_ty.ret.is_indirect() && !fcx.fn_ty.ret.is_ignore() {
374-
Some(get_param(fcx.llfn, 0))
375-
} else {
376-
None
377-
};
378-
let llargs = first_llarg.into_iter().chain(llargs[self_idx..].iter().cloned())
379-
.collect::<Vec<_>>();
380-
372+
if fn_ty.ret.is_indirect() {
373+
llargs.insert(0, get_param(fcx.llfn, 0));
374+
}
381375
let llfn = callee.reify(bcx.ccx);
382376
let llret;
383377
if let Some(landing_pad) = self_scope.landing_pad {

0 commit comments

Comments
 (0)