mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-08 00:00:26 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7c1d658d9 | ||
|
|
ac46ebdd46 | ||
|
|
79fb85323c | ||
|
|
291df5acc9 | ||
|
|
ed7d5ff39e |
@@ -13,7 +13,7 @@ on:
|
||||
env:
|
||||
RUSTFLAGS: -Dwarnings
|
||||
RUST_BACKTRACE: 1
|
||||
nightly: nightly-2022-11-12
|
||||
nightly: nightly-2024-09-15
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -136,6 +136,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
run: rustup update $nightly && rustup default $nightly
|
||||
- name: Miri
|
||||
run: ci/miri.sh
|
||||
|
||||
@@ -160,6 +162,7 @@ jobs:
|
||||
- minrust
|
||||
- cross
|
||||
- tsan
|
||||
- miri
|
||||
- loom
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
# 1.7.2 (September 17, 2024)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix default impl of `Buf::{get_int, get_int_le}` (#732)
|
||||
|
||||
### Documented
|
||||
|
||||
- Fix double spaces in comments and doc comments (#731)
|
||||
|
||||
### Internal changes
|
||||
|
||||
- Ensure BytesMut::advance reduces capacity (#728)
|
||||
|
||||
# 1.7.1 (August 1, 2024)
|
||||
|
||||
This release reverts the following change due to a regression:
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ name = "bytes"
|
||||
# When releasing to crates.io:
|
||||
# - Update CHANGELOG.md.
|
||||
# - Create "v1.x.y" git tag.
|
||||
version = "1.7.1"
|
||||
version = "1.7.2"
|
||||
edition = "2018"
|
||||
rust-version = "1.39"
|
||||
license = "MIT"
|
||||
|
||||
+1
-2
@@ -1,8 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
rustup toolchain install nightly --component miri
|
||||
rustup override set nightly
|
||||
rustup component add miri
|
||||
cargo miri setup
|
||||
|
||||
export MIRIFLAGS="-Zmiri-strict-provenance"
|
||||
|
||||
+8
-2
@@ -66,6 +66,12 @@ macro_rules! buf_get_impl {
|
||||
}};
|
||||
}
|
||||
|
||||
// https://en.wikipedia.org/wiki/Sign_extension
|
||||
fn sign_extend(val: u64, nbytes: usize) -> i64 {
|
||||
let shift = (8 - nbytes) * 8;
|
||||
(val << shift) as i64 >> shift
|
||||
}
|
||||
|
||||
/// Read bytes from a buffer.
|
||||
///
|
||||
/// A buffer stores bytes in memory such that read operations are infallible.
|
||||
@@ -923,7 +929,7 @@ pub trait Buf {
|
||||
/// This function panics if there is not enough remaining data in `self`, or
|
||||
/// if `nbytes` is greater than 8.
|
||||
fn get_int(&mut self, nbytes: usize) -> i64 {
|
||||
buf_get_impl!(be => self, i64, nbytes);
|
||||
sign_extend(self.get_uint(nbytes), nbytes)
|
||||
}
|
||||
|
||||
/// Gets a signed n-byte integer from `self` in little-endian byte order.
|
||||
@@ -944,7 +950,7 @@ pub trait Buf {
|
||||
/// This function panics if there is not enough remaining data in `self`, or
|
||||
/// if `nbytes` is greater than 8.
|
||||
fn get_int_le(&mut self, nbytes: usize) -> i64 {
|
||||
buf_get_impl!(le => self, i64, nbytes);
|
||||
sign_extend(self.get_uint_le(nbytes), nbytes)
|
||||
}
|
||||
|
||||
/// Gets a signed n-byte integer from `self` in native-endian byte order.
|
||||
|
||||
+5
-5
@@ -1107,7 +1107,7 @@ pub unsafe trait BufMut {
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes an IEEE754 single-precision (4 bytes) floating point number to
|
||||
/// Writes an IEEE754 single-precision (4 bytes) floating point number to
|
||||
/// `self` in big-endian byte order.
|
||||
///
|
||||
/// The current position is advanced by 4.
|
||||
@@ -1131,7 +1131,7 @@ pub unsafe trait BufMut {
|
||||
self.put_u32(n.to_bits());
|
||||
}
|
||||
|
||||
/// Writes an IEEE754 single-precision (4 bytes) floating point number to
|
||||
/// Writes an IEEE754 single-precision (4 bytes) floating point number to
|
||||
/// `self` in little-endian byte order.
|
||||
///
|
||||
/// The current position is advanced by 4.
|
||||
@@ -1183,7 +1183,7 @@ pub unsafe trait BufMut {
|
||||
self.put_u32_ne(n.to_bits());
|
||||
}
|
||||
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// `self` in big-endian byte order.
|
||||
///
|
||||
/// The current position is advanced by 8.
|
||||
@@ -1207,7 +1207,7 @@ pub unsafe trait BufMut {
|
||||
self.put_u64(n.to_bits());
|
||||
}
|
||||
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// `self` in little-endian byte order.
|
||||
///
|
||||
/// The current position is advanced by 8.
|
||||
@@ -1231,7 +1231,7 @@ pub unsafe trait BufMut {
|
||||
self.put_u64_le(n.to_bits());
|
||||
}
|
||||
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// Writes an IEEE754 double-precision (8 bytes) floating point number to
|
||||
/// `self` in native-endian byte order.
|
||||
///
|
||||
/// The current position is advanced by 8.
|
||||
|
||||
@@ -110,7 +110,7 @@ impl UninitSlice {
|
||||
unsafe { self[index..].as_mut_ptr().write(byte) }
|
||||
}
|
||||
|
||||
/// Copies bytes from `src` into `self`.
|
||||
/// Copies bytes from `src` into `self`.
|
||||
///
|
||||
/// The length of `src` must be the same as `self`.
|
||||
///
|
||||
|
||||
+3
-1
@@ -142,6 +142,7 @@ impl Bytes {
|
||||
Bytes::from_static(EMPTY)
|
||||
}
|
||||
|
||||
/// Creates a new empty `Bytes`.
|
||||
#[cfg(all(loom, test))]
|
||||
pub fn new() -> Self {
|
||||
const EMPTY: &[u8] = &[];
|
||||
@@ -172,6 +173,7 @@ impl Bytes {
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new `Bytes` from a static slice.
|
||||
#[cfg(all(loom, test))]
|
||||
pub fn from_static(bytes: &'static [u8]) -> Self {
|
||||
Bytes {
|
||||
@@ -1301,7 +1303,7 @@ unsafe fn shallow_clone_vec(
|
||||
offset: *const u8,
|
||||
len: usize,
|
||||
) -> Bytes {
|
||||
// If the buffer is still tracked in a `Vec<u8>`. It is time to
|
||||
// If the buffer is still tracked in a `Vec<u8>`. It is time to
|
||||
// promote the vec to an `Arc`. This could potentially be called
|
||||
// concurrently, so some care must be taken.
|
||||
|
||||
|
||||
@@ -36,6 +36,19 @@ fn test_get_u16() {
|
||||
assert_eq!(0x5421, buf.get_u16_le());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_int() {
|
||||
let mut buf = &b"\xd6zomg"[..];
|
||||
assert_eq!(-42, buf.get_int(1));
|
||||
let mut buf = &b"\xd6zomg"[..];
|
||||
assert_eq!(-42, buf.get_int_le(1));
|
||||
|
||||
let mut buf = &b"\xfe\x1d\xc0zomg"[..];
|
||||
assert_eq!(0xffffffffffc01dfeu64 as i64, buf.get_int_le(3));
|
||||
let mut buf = &b"\xfe\x1d\xc0zomg"[..];
|
||||
assert_eq!(0xfffffffffffe1dc0u64 as i64, buf.get_int(3));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_get_u16_buffer_underflow() {
|
||||
|
||||
@@ -676,6 +676,43 @@ fn advance_bytes_mut() {
|
||||
assert_eq!(a, b"d zomg wat wat"[..]);
|
||||
}
|
||||
|
||||
// Ensures BytesMut::advance reduces always capacity
|
||||
//
|
||||
// See https://github.com/tokio-rs/bytes/issues/725
|
||||
#[test]
|
||||
fn advance_bytes_mut_remaining_capacity() {
|
||||
// reduce the search space under miri
|
||||
let max_capacity = if cfg!(miri) { 16 } else { 256 };
|
||||
for capacity in 0..=max_capacity {
|
||||
for len in 0..=capacity {
|
||||
for advance in 0..=len {
|
||||
eprintln!("testing capacity={capacity}, len={len}, advance={advance}");
|
||||
let mut buf = BytesMut::with_capacity(capacity);
|
||||
|
||||
buf.resize(len, 42);
|
||||
assert_eq!(buf.len(), len, "resize should write `len` bytes");
|
||||
assert_eq!(
|
||||
buf.remaining(),
|
||||
len,
|
||||
"Buf::remaining() should equal BytesMut::len"
|
||||
);
|
||||
|
||||
buf.advance(advance);
|
||||
assert_eq!(
|
||||
buf.remaining(),
|
||||
len - advance,
|
||||
"Buf::advance should reduce the remaining len"
|
||||
);
|
||||
assert_eq!(
|
||||
buf.capacity(),
|
||||
capacity - advance,
|
||||
"Buf::advance should reduce the remaining capacity"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn advance_past_len() {
|
||||
|
||||
Reference in New Issue
Block a user