Skip to content

Commit af66736

Browse files
committed
Remove BytesMut in favor of buf-min::Buffer trait
1 parent dc561eb commit af66736

File tree

9 files changed

+81
-60
lines changed

9 files changed

+81
-60
lines changed

v_escape/Cargo.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "v_escape"
3-
version = "0.11.3"
3+
version = "0.12.0"
44
authors = ["Juan Aguilar Santillana <[email protected]>"]
55
description = "The simd optimized escaping code"
66
documentation = "https://docs.rs/v_escape"
@@ -15,6 +15,13 @@ workspace = ".."
1515
travis-ci = { repository = "botika/v_escape", branch = "master" }
1616
maintenance = { status = "actively-developed" }
1717

18+
[features]
19+
bytes-buf = ["buf-min/bytes-buf"]
20+
1821
[dependencies]
1922
v_escape_derive = { version = "0.8", path = "../v_escape_derive" }
23+
buf-min = "0.1"
24+
25+
[dev-dependencies]
2026
bytes = "0.5"
27+
buf-min = { version = "0.1", features = ["bytes-buf"] }

v_escape/build.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fn main() {
2+
enable_simd_optimizations();
3+
}
4+
5+
fn enable_simd_optimizations() {
6+
if is_x86_feature_detected!("sse2") {
7+
println!("cargo:rustc-cfg=v_escape_sse");
8+
}
9+
10+
if is_x86_feature_detected!("avx2") {
11+
println!("cargo:rustc-cfg=v_escape_avx");
12+
}
13+
}

v_escape/src/chars.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ macro_rules! _v_escape_escape_char_ptr {
7575
#[doc(hidden)]
7676
macro_rules! _v_escape_escape_char_bytes {
7777
($($t:tt)+) => {
78-
pub unsafe fn b_escape_char(c: char, buf: &mut v_escape::BytesMut) {
78+
pub unsafe fn b_escape_char<B: v_escape::Buffer>(c: char, buf: &mut B) {
7979
let len = c.len_utf8();
8080
buf.reserve(len);
8181
if len == 1 {
@@ -97,11 +97,11 @@ macro_rules! _v_escape_escape_char_bytes {
9797
}
9898

9999
_inside!(impl $($t)+);
100-
*buf.as_mut_ptr().add(buf.len()) = c as u8;
100+
*buf.buf_ptr() = c as u8;
101101
} else {
102-
c.encode_utf8(std::slice::from_raw_parts_mut(buf.as_mut_ptr().add(buf.len()), len));
102+
c.encode_utf8(std::slice::from_raw_parts_mut(buf.buf_ptr(), len));
103103
}
104-
v_escape::BufMut::advance_mut(buf, len);
104+
buf.advance(len);
105105
}
106106
};
107107
}

v_escape/src/lib.rs

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@
106106
//!
107107
#![allow(unused_imports)]
108108

109+
pub use buf_min::Buffer;
110+
109111
use v_escape_derive::Escape;
110112

111113
#[macro_use]
@@ -117,8 +119,6 @@ mod ranges;
117119
#[macro_use]
118120
mod chars;
119121

120-
pub use bytes::{BufMut, BytesMut};
121-
122122
#[macro_export]
123123
/// Generates struct `$name` with escaping functionality at `fmt`
124124
///
@@ -271,16 +271,24 @@ macro_rules! _v_escape_escape_new {
271271
}
272272
}
273273

274+
/// Escape byte slice to `buf-min::Buffer`
275+
///
276+
/// # SIGILL
277+
/// Can produce **SIGILL** if compile with `sse2` or `avx2` and execute without they
278+
/// Because not exist way to build multiple static allocations by type
279+
/// And it's very expensive check it in runtime
280+
/// https://github.com/rust-lang/rust/issues/57775
274281
#[inline]
275-
pub fn b_escape(s: &[u8], buf: &mut v_escape::BytesMut) {
282+
pub fn b_escape<B: v_escape::Buffer>(s: &[u8], buf: &mut B) {
276283
#[allow(unused_unsafe)]
277284
unsafe {
278285
_b_escape(s, buf)
279286
}
280287
}
281288

289+
/// Escape char to `buf-min::Buffer`
282290
#[inline]
283-
pub fn b_escape_char(s: char, buf: &mut v_escape::BytesMut) {
291+
pub fn b_escape_char<B: v_escape::Buffer>(s: char, buf: &mut B) {
284292
#[allow(unused_unsafe)]
285293
unsafe {
286294
chars::b_escape_char(s, buf)
@@ -309,7 +317,7 @@ macro_rules! _v_escape_cfg_escape {
309317
let fun = _v_escape_cfg_escape!(if $($t)+);
310318

311319
let slot = unsafe { &*(&FN as *const _ as *const AtomicUsize) };
312-
slot.store(fun as usize, Ordering::Relaxed);
320+
slot.store(fun, Ordering::Relaxed);
313321
unsafe {
314322
mem::transmute::<usize, fn(&[u8], &mut Formatter) -> fmt::Result>(fun)(
315323
bytes, fmt,
@@ -334,7 +342,7 @@ macro_rules! _v_escape_cfg_escape {
334342
}
335343
};
336344
(if true) => {
337-
if cfg!(not(v_escape_noavx)) && is_x86_feature_detected!("avx2") {
345+
if is_x86_feature_detected!("avx2") {
338346
ranges::avx::escape as usize
339347
} else if is_x86_feature_detected!("sse2") {
340348
ranges::sse::escape as usize
@@ -372,7 +380,7 @@ macro_rules! _v_escape_cfg_escape_ptr {
372380
let fun = _v_escape_cfg_escape_ptr!(if $($t)+);
373381

374382
let slot = unsafe { &*(&FN as *const _ as *const AtomicUsize) };
375-
slot.store(fun as usize, Ordering::Relaxed);
383+
slot.store(fun, Ordering::Relaxed);
376384
unsafe {
377385
mem::transmute::<usize, fn(&[u8], &mut [std::mem::MaybeUninit<u8>]) -> Option<usize>>(fun)(
378386
bytes, buf,
@@ -397,7 +405,7 @@ macro_rules! _v_escape_cfg_escape_ptr {
397405
}
398406
};
399407
(if true) => {
400-
if cfg!(not(v_escape_noavx)) && is_x86_feature_detected!("avx2") {
408+
if is_x86_feature_detected!("avx2") {
401409
ranges::avx::f_escape as usize
402410
} else if is_x86_feature_detected!("sse2") {
403411
ranges::sse::f_escape as usize
@@ -424,55 +432,38 @@ macro_rules! _v_escape_cfg_escape_bytes {
424432
(true, $($t:tt)+) => {
425433
#[cfg(all(target_arch = "x86_64", not(v_escape_nosimd)))]
426434
#[inline(always)]
427-
#[allow(unreachable_code)]
428-
// https://github.com/BurntSushi/rust-memchr/blob/master/src/x86/mod.rs#L9-L29
429-
pub unsafe fn _b_escape(bytes: &[u8], buf: &mut v_escape::BytesMut) {
430-
use std::mem;
431-
use std::sync::atomic::{AtomicUsize, Ordering};
432-
static mut FN: fn(&[u8], &mut v_escape::BytesMut) = detect;
433-
434-
fn detect(bytes: &[u8], buf: &mut v_escape::BytesMut) {
435-
let fun = _v_escape_cfg_escape_bytes!(if $($t)+);
436-
437-
let slot = unsafe { &*(&FN as *const _ as *const AtomicUsize) };
438-
slot.store(fun as usize, Ordering::Relaxed);
439-
unsafe {
440-
mem::transmute::<usize, fn(&[u8], &mut v_escape::BytesMut)>(fun)(
441-
bytes, buf,
442-
)
443-
}
444-
}
445-
446-
unsafe {
447-
let slot = &*(&FN as *const _ as *const AtomicUsize);
448-
let fun = slot.load(Ordering::Relaxed);
449-
mem::transmute::<usize, fn(&[u8], &mut v_escape::BytesMut)>(fun)(bytes, buf)
450-
}
435+
pub unsafe fn _b_escape<B: v_escape::Buffer>(bytes: &[u8], buf: &mut B) {
436+
_v_escape_cfg_escape_bytes!(if $($t)+, bytes, buf)
451437
}
452438

453439
#[cfg(not(all(target_arch = "x86_64", not(b_escape_nosimd))))]
454440
_v_escape_cfg_escape_bytes!(fn);
455441
};
456442
(fn) => {
457443
#[inline(always)]
458-
pub unsafe fn _b_escape(bytes: &[u8], buf: &mut v_escape::BytesMut) {
444+
pub unsafe fn _b_escape<B: v_escape::Buffer>(bytes: &[u8], buf: &mut B) {
459445
scalar::b_escape(bytes, buf)
460446
}
461447
};
462-
(if true) => {
463-
if cfg!(not(b_escape_noavx)) && is_x86_feature_detected!("avx2") {
464-
ranges::avx::b_escape as usize
465-
} else if is_x86_feature_detected!("sse2") {
466-
ranges::sse::b_escape as usize
467-
} else {
468-
scalar::b_escape as usize
448+
(if true, $bytes:ident, $buf:ident) => {{
449+
#[cfg(not(v_escape_avx))] {
450+
#[cfg(not(v_escape_sse))] {
451+
scalar::b_escape($bytes, $buf)
452+
}
453+
#[cfg(v_escape_sse)] {
454+
ranges::sse::b_escape($bytes, $buf)
455+
}
469456
}
470-
};
471-
(if false) => {
472-
if is_x86_feature_detected!("sse2") {
473-
ranges::sse::b_escape as usize
474-
} else {
475-
scalar::b_escape as usize
457+
#[cfg(v_escape_avx)] {
458+
ranges::avx::b_escape($bytes, $buf)
476459
}
477-
};
460+
}};
461+
(if false, $bytes:ident, $buf:ident) => {{
462+
#[cfg(not(v_escape_sse))] {
463+
scalar::b_escape($bytes, $buf)
464+
}
465+
#[cfg(v_escape_sse)] {
466+
ranges::sse::b_escape($bytes, $buf)
467+
}
468+
}};
478469
}

v_escape/src/ranges/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ macro_rules! _v_escape_escape_ranges_bytes {
305305
_v_escape_escape_ranges_bytes!(impl loop_range_switch_sse2 for $($t)+);
306306
};
307307
(impl $loops:ident for ($T:ident, $Q:ident, $Q_LEN:ident) $($t:tt)+) => {
308-
pub unsafe fn b_escape(bytes: &[u8], buf: &mut v_escape::BytesMut) {
308+
pub unsafe fn b_escape<B: v_escape::Buffer>(bytes: &[u8], buf: &mut B) {
309309
let len = bytes.len();
310310
let start_ptr = bytes.as_ptr();
311311
let end_ptr = bytes[len..].as_ptr();

v_escape/src/scalar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ macro_rules! _v_escape_escape_scalar_ptr {
115115
macro_rules! _v_escape_escape_scalar_bytes {
116116
($($t:tt)+) => {
117117
#[inline]
118-
pub unsafe fn b_escape(bytes: &[u8], buf: &mut v_escape::BytesMut) {
118+
pub unsafe fn b_escape<B: v_escape::Buffer>(bytes: &[u8], buf: &mut B) {
119119
let mut start = 0;
120120

121121
for (i, b) in bytes.iter().enumerate() {

v_htmlescape/Cargo.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "v_htmlescape"
3-
version = "0.9.1"
3+
version = "0.10.0"
44
authors = ["Juan Aguilar Santillana <[email protected]>"]
55
description = "The simd optimized HTML escaping code"
66
documentation = "https://docs.rs/v_htmlescape"
@@ -15,6 +15,10 @@ workspace = ".."
1515
travis-ci = { repository = "botika/v_escape", branch = "master" }
1616
maintenance = { status = "actively-developed" }
1717

18+
[features]
19+
bytes-buf = ["v_escape/bytes-buf"]
20+
1821
[dependencies]
19-
v_escape = { version = "0.11", path = "../v_escape" }
22+
v_escape = { version = "0.12", path = "../v_escape" }
2023
cfg-if = "0.1"
24+
buf-min = { version = "0.1", optional = true }

v_jsonescape/Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "v_jsonescape"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
authors = ["Juan Aguilar Santillana <[email protected]>"]
55
description = "The simd optimized JSON escaping code"
66
documentation = "https://docs.rs/v_jsonescape"
@@ -15,6 +15,9 @@ workspace = ".."
1515
travis-ci = { repository = "botika/v_escape", branch = "master" }
1616
maintenance = { status = "actively-developed" }
1717

18+
[features]
19+
bytes-buf = ["v_escape/bytes-buf"]
20+
1821
[dependencies]
19-
v_escape = { version = "0.11", path = "../v_escape" }
22+
v_escape = { version = "0.12", path = "../v_escape" }
2023
cfg-if = "0.1"

v_latexescape/Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "v_latexescape"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
authors = ["Juan Aguilar Santillana <[email protected]>"]
55
description = "The simd optimized LaTeX escaping code"
66
documentation = "https://docs.rs/v_latexescape"
@@ -15,6 +15,9 @@ workspace = ".."
1515
travis-ci = { repository = "botika/v_escape", branch = "master" }
1616
maintenance = { status = "actively-developed" }
1717

18+
[features]
19+
bytes-buf = ["v_escape/bytes-buf"]
20+
1821
[dependencies]
19-
v_escape = { version = "0.11", path = "../v_escape" }
22+
v_escape = { version = "0.12", path = "../v_escape" }
2023
cfg-if = "0.1"

0 commit comments

Comments
 (0)