11//! Serialize a Rust data structure into JSON data
22
3+ use core:: mem:: MaybeUninit ;
34use core:: { fmt, str} ;
45
56use serde:: ser;
@@ -39,12 +40,7 @@ impl From<u8> for Error {
3940 }
4041}
4142
42- #[ cfg( feature = "std" ) ]
43- impl :: std:: error:: Error for Error {
44- fn description ( & self ) -> & str {
45- ""
46- }
47- }
43+ impl serde:: ser:: StdError for Error { }
4844
4945impl fmt:: Display for Error {
5046 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -96,12 +92,12 @@ impl<'a> Serializer<'a> {
9692// which take 200+ bytes of ROM / Flash
9793macro_rules! serialize_unsigned {
9894 ( $self: ident, $N: expr, $v: expr) => { {
99- let mut buf: [ u8 ; $N] = unsafe { super :: uninitialized ( ) } ;
95+ let mut buf: [ MaybeUninit < u8 > ; $N] = [ MaybeUninit :: uninit ( ) ; $N ] ;
10096
10197 let mut v = $v;
10298 let mut i = $N - 1 ;
10399 loop {
104- buf[ i] = ( v % 10 ) as u8 + b'0' ;
100+ buf[ i] . write ( ( v % 10 ) as u8 + b'0' ) ;
105101 v /= 10 ;
106102
107103 if v == 0 {
@@ -111,7 +107,10 @@ macro_rules! serialize_unsigned {
111107 }
112108 }
113109
114- $self. extend_from_slice( & buf[ i..] )
110+ // Note(feature): maybe_uninit_slice
111+ let buf = unsafe { & * ( & buf[ i..] as * const _ as * const [ u8 ] ) } ;
112+
113+ $self. extend_from_slice( buf)
115114 } } ;
116115}
117116
@@ -126,10 +125,10 @@ macro_rules! serialize_signed {
126125 ( false , v as $uxx)
127126 } ;
128127
129- let mut buf: [ u8 ; $N] = unsafe { super :: uninitialized ( ) } ;
128+ let mut buf: [ MaybeUninit < u8 > ; $N] = [ MaybeUninit :: uninit ( ) ; $N ] ;
130129 let mut i = $N - 1 ;
131130 loop {
132- buf[ i] = ( v % 10 ) as u8 + b'0' ;
131+ buf[ i] . write ( ( v % 10 ) as u8 + b'0' ) ;
133132 v /= 10 ;
134133
135134 i -= 1 ;
@@ -140,11 +139,15 @@ macro_rules! serialize_signed {
140139 }
141140
142141 if signed {
143- buf[ i] = b'-' ;
142+ buf[ i] . write ( b'-' ) ;
144143 } else {
145144 i += 1 ;
146145 }
147- $self. extend_from_slice( & buf[ i..] )
146+
147+ // Note(feature): maybe_uninit_slice
148+ let buf = unsafe { & * ( & buf[ i..] as * const _ as * const [ u8 ] ) } ;
149+
150+ $self. extend_from_slice( buf)
148151 } } ;
149152}
150153
0 commit comments