Skip to content

Commit d4d5383

Browse files
committed
use MaybeUninit
* instead of mem::uninitialized() * There is still an unsafe {} required as maybe_uninit_slice is unstable. * Once [MaybeUninit<T>; N]::maybe_uninit_slice() is stabilized, this can be used instead
1 parent 3792317 commit d4d5383

File tree

2 files changed

+15
-12
lines changed

2 files changed

+15
-12
lines changed

src/lib.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,3 @@ pub use self::ser::{to_string, to_vec};
7171

7272
#[cfg(feature = "heapless")]
7373
pub use heapless;
74-
75-
#[allow(deprecated)]
76-
unsafe fn uninitialized<T>() -> T {
77-
core::mem::uninitialized()
78-
}

src/ser/mod.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Serialize a Rust data structure into JSON data
22
3+
use core::mem::MaybeUninit;
34
use core::{fmt, str};
45

56
use serde::ser;
@@ -96,12 +97,12 @@ impl<'a> Serializer<'a> {
9697
// which take 200+ bytes of ROM / Flash
9798
macro_rules! serialize_unsigned {
9899
($self:ident, $N:expr, $v:expr) => {{
99-
let mut buf: [u8; $N] = unsafe { super::uninitialized() };
100+
let mut buf: [MaybeUninit<u8>; $N] = [MaybeUninit::uninit(); $N];
100101

101102
let mut v = $v;
102103
let mut i = $N - 1;
103104
loop {
104-
buf[i] = (v % 10) as u8 + b'0';
105+
buf[i].write((v % 10) as u8 + b'0');
105106
v /= 10;
106107

107108
if v == 0 {
@@ -111,7 +112,10 @@ macro_rules! serialize_unsigned {
111112
}
112113
}
113114

114-
$self.extend_from_slice(&buf[i..])
115+
// Note(feature): maybe_uninit_slice
116+
let buf = unsafe { &*(&buf[i..] as *const _ as *const [u8]) };
117+
118+
$self.extend_from_slice(buf)
115119
}};
116120
}
117121

@@ -126,10 +130,10 @@ macro_rules! serialize_signed {
126130
(false, v as $uxx)
127131
};
128132

129-
let mut buf: [u8; $N] = unsafe { super::uninitialized() };
133+
let mut buf: [MaybeUninit<u8>; $N] = [MaybeUninit::uninit(); $N];
130134
let mut i = $N - 1;
131135
loop {
132-
buf[i] = (v % 10) as u8 + b'0';
136+
buf[i].write((v % 10) as u8 + b'0');
133137
v /= 10;
134138

135139
i -= 1;
@@ -140,11 +144,15 @@ macro_rules! serialize_signed {
140144
}
141145

142146
if signed {
143-
buf[i] = b'-';
147+
buf[i].write(b'-');
144148
} else {
145149
i += 1;
146150
}
147-
$self.extend_from_slice(&buf[i..])
151+
152+
// Note(feature): maybe_uninit_slice
153+
let buf = unsafe { &*(&buf[i..] as *const _ as *const [u8]) };
154+
155+
$self.extend_from_slice(buf)
148156
}};
149157
}
150158

0 commit comments

Comments
 (0)