Skip to content

Commit

Permalink
Put panic code path from copy_from_slice into cold function
Browse files Browse the repository at this point in the history
The previous `assert_eq` generated quite some code, which is especially
problematic when this call is inlined. This commit also slightly
improves the panic message from:

  assertion failed: `(left == right)`
    left: `3`,
   right: `2`: destination and source slices have different lengths

...to:

  source slice length (2) does not match destination slice length (3)
  • Loading branch information
LukasKalbertodt committed Aug 12, 2020
1 parent 3df25ae commit db99f98
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
4 changes: 2 additions & 2 deletions library/alloc/tests/slice.rs
Expand Up @@ -1522,15 +1522,15 @@ fn test_copy_from_slice() {
}

#[test]
#[should_panic(expected = "destination and source slices have different lengths")]
#[should_panic(expected = "source slice length (4) does not match destination slice length (5)")]
fn test_copy_from_slice_dst_longer() {
let src = [0, 1, 2, 3];
let mut dst = [0; 5];
dst.copy_from_slice(&src);
}

#[test]
#[should_panic(expected = "destination and source slices have different lengths")]
#[should_panic(expected = "source slice length (4) does not match destination slice length (3)")]
fn test_copy_from_slice_dst_shorter() {
let src = [0, 1, 2, 3];
let mut dst = [0; 3];
Expand Down
17 changes: 16 additions & 1 deletion library/core/src/slice/mod.rs
Expand Up @@ -2501,7 +2501,22 @@ impl<T> [T] {
where
T: Copy,
{
assert_eq!(self.len(), src.len(), "destination and source slices have different lengths");
// The panic code path was put into a cold function to not bloat the
// call site.
#[inline(never)]
#[cold]
#[track_caller]
fn len_mismatch_fail(dst_len: usize, src_len: usize) -> ! {
panic!(
"source slice length ({}) does not match destination slice length ({})",
src_len, dst_len,
);
}

if self.len() != src.len() {
len_mismatch_fail(self.len(), src.len());
}

// SAFETY: `self` is valid for `self.len()` elements by definition, and `src` was
// checked to have the same length. The slices cannot overlap because
// mutable references are exclusive.
Expand Down

0 comments on commit db99f98

Please sign in to comment.