Skip to content

Commit 51e7ebc

Browse files
committed
Remove some more if let Err patterns and revert simdjson value parsing
Signed-off-by: Matthias Wahl <matthiaswahl@m7w3.de>
1 parent f1d717f commit 51e7ebc

8 files changed

Lines changed: 51 additions & 72 deletions

File tree

Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,10 @@ allow-non-simd = [
3636

3737
[package.metadata.docs.rs]
3838
features = ["allow-non-simd"]
39+
40+
[[bench]]
41+
name = "value"
42+
harness = false
43+
44+
[[example]]
45+
name = "enum1"

examples/enum1.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1-
#[derive(simd_json_derive::Deserialize)]
1+
use simd_json_derive::{Deserialize, Serialize};
2+
3+
#[derive(Deserialize, Serialize, Debug)]
24
pub enum StoredVariants {
35
YesNo(bool),
46
Small(u8, i8),
57
Signy(i64),
68
Stringy(String),
79
}
810

9-
fn main() {}
11+
fn main() {
12+
let x = StoredVariants::Signy(-1);
13+
let mut serialized = x.json_string().expect("serialization shouldnt fail :(");
14+
let deserialized = StoredVariants::from_str(serialized.as_mut_str())
15+
.expect("serialized stuff should be deserializable");
16+
println!("Serialized: {x:?}");
17+
println!("Deserialized: {deserialized:?}");
18+
}

simd-json-derive-int/src/deserialize.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ fn derive_named_struct(
2424
let mut ids = Vec::new();
2525
let mut opt_ids = Vec::new();
2626
let mut id: u64 = 0;
27-
let mut all: u64 = 0;
2827
let mut all_needed: u64 = 0;
2928
let deny_unknown_fields: bool = attrs.deny_unknown_fields();
3029
let params = &generics.params;
@@ -52,7 +51,6 @@ fn derive_named_struct(
5251
let name = name.trim_matches(':').trim_matches('"').to_string();
5352
let bit = 1 << id;
5453
id += 1;
55-
all = all | bit;
5654
if is_option {
5755
options.push(ident.clone());
5856
opt_ids.push(bit);
@@ -151,6 +149,7 @@ fn derive_named_struct(
151149
} = __res;
152150
#(
153151
if #ids & __seen == 0 {
152+
#[allow(clippy::forget_ref)]
154153
::std::mem::forget(#values);
155154
};
156155
)*

simd-json-derive-int/src/serialize.rs

Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,11 @@ fn derive_unnamed_struct(
3939
fn json_write<W>(&self, writer: &mut W) -> std::io::Result<()>
4040
where
4141
W: std::io::Write {
42-
if let Err(e) = writer.write_all(b"[") {
43-
return Err(e)
44-
}
45-
if let Err(e) = self.0.json_write(writer) {
46-
return Err(e)
47-
}
42+
writer.write_all(b"[")?;
43+
self.0.json_write(writer)?;
4844
#(
49-
if let Err(e) = writer.write_all(b",") {
50-
return Err(e)
51-
};
52-
if let Err(e) = self.#keys.json_write(writer) {
53-
return Err(e)
54-
};
45+
writer.write_all(b",")?;
46+
self.#keys.json_write(writer)?;
5547
)*
5648
writer.write_all(b"]")
5749
}
@@ -95,12 +87,8 @@ fn derive_named_struct(
9587
where
9688
W: std::io::Write {
9789
#(
98-
if let Err(e) = writer.write_all(#keys.as_bytes()) {
99-
return Err(e);
100-
}
101-
if let Err(e) = self.#values.json_write(writer) {
102-
return Err(e);
103-
}
90+
writer.write_all(#keys.as_bytes())?;
91+
self.#values.json_write(writer)?;
10492
)*
10593
writer.write_all(b"}")
10694
}
@@ -172,12 +160,8 @@ fn derive_enum(ident: Ident, data: DataEnum, generics: Generics) -> TokenStream
172160
let unnamed1 = quote! {
173161
#(
174162
#ident::#unnamed1_idents(v) => {
175-
if let Err(e) = writer.write_all(#unnamed1_keys.as_bytes()) {
176-
return Err(e);
177-
};
178-
if let Err(e) = v.json_write(writer) {
179-
return Err(e);
180-
};
163+
writer.write_all(#unnamed1_keys.as_bytes())?;
164+
v.json_write(writer)?;
181165
writer.write_all(b"}")
182166
}
183167
),*
@@ -213,16 +197,10 @@ fn derive_enum(ident: Ident, data: DataEnum, generics: Generics) -> TokenStream
213197
let unnamed_vecs = unnamed_var_names.iter().map(|vs| {
214198
let (first, rest) = vs.split_first().expect("zero unnamed vars");
215199
quote! {
216-
if let Err(e) = #first.json_write(writer) {
217-
return Err(e);
218-
};
200+
#first.json_write(writer)?;
219201
#(
220-
if let Err(e) = writer.write_all(b",") {
221-
return Err(e);
222-
};
223-
if let Err(e) = #rest.json_write(writer) {
224-
return Err(e);
225-
};
202+
writer.write_all(b",")?;
203+
#rest.json_write(writer)?;
226204
)*
227205
}
228206
});
@@ -233,9 +211,7 @@ fn derive_enum(ident: Ident, data: DataEnum, generics: Generics) -> TokenStream
233211
#(
234212
#ident::#unnamed_idents(#unnamed_vars) =>
235213
{
236-
if let Err(e) = writer.write_all(#unnamed_keys.as_bytes()) {
237-
return Err(e);
238-
};
214+
writer.write_all(#unnamed_keys.as_bytes())?;
239215
#unnamed_vecs
240216
writer.write_all(b"]}")
241217
}
@@ -271,19 +247,11 @@ fn derive_enum(ident: Ident, data: DataEnum, generics: Generics) -> TokenStream
271247

272248
named_bodies.push(quote! {
273249
#ident::#named_ident{#(#fields),*} => {
274-
if let Err(e) = writer.write_all(#start.as_bytes()) {
275-
return Err(e);
276-
};
277-
if let Err(e) = #first.json_write(writer) {
278-
return Err(e);
279-
};
250+
writer.write_all(#start.as_bytes())?;
251+
#first.json_write(writer)?;
280252
#(
281-
if let Err(e) = writer.write_all(#rest_keys.as_bytes()) {
282-
return Err(e);
283-
};
284-
if let Err(e) = #rest.json_write(writer) {
285-
return Err(e);
286-
};
253+
writer.write_all(#rest_keys.as_bytes())?;
254+
#rest.json_write(writer)?;
287255

288256
)*
289257
writer.write_all(b"}}")

src/impls/array.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ mod test {
6262
#[test]
6363
fn slice() {
6464
let s: [u8; 0] = [];
65-
assert_eq!((&s).json_string().unwrap(), "[]");
66-
assert_eq!((&[1]).json_string().unwrap(), "[1]");
67-
assert_eq!((&[1, 2]).json_string().unwrap(), "[1,2]");
68-
assert_eq!((&[1, 2, 3]).json_string().unwrap(), "[1,2,3]");
65+
assert_eq!(s.json_string().unwrap(), "[]");
66+
assert_eq!([1].json_string().unwrap(), "[1]");
67+
assert_eq!([1, 2].json_string().unwrap(), "[1,2]");
68+
assert_eq!([1, 2, 3].json_string().unwrap(), "[1,2,3]");
6969
}
7070
}

src/impls/primitives.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl<'input> Deserialize<'input> for f32 {
149149
#[cfg(feature = "128bit")]
150150
Some(simd_json::Node::Static(simd_json::StaticNode::I128(i))) => Ok(i as f32),
151151
_ => Err(simd_json::Error::generic(
152-
simd_json::ErrorType::ExpectedString,
152+
simd_json::ErrorType::ExpectedFloat,
153153
)),
154154
}
155155
}

src/impls/simdjson.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::mem::MaybeUninit;
2-
31
use crate::{Deserialize, Serialize};
42
use simd_json::{BorrowedValue, Node, OwnedValue};
53
use value_trait::Writable;
@@ -40,14 +38,13 @@ impl<'input, 'tape> OwnedDeser<'input, 'tape> {
4038
// Rust doens't optimize the normal loop away here
4139
// so we write our own avoiding the lenght
4240
// checks during push
43-
let res: Vec<OwnedValue> = unsafe {
44-
let mut res: Vec<MaybeUninit<OwnedValue>> = Vec::with_capacity(len);
41+
let mut res: Vec<OwnedValue> = Vec::with_capacity(len);
42+
unsafe {
43+
res.set_len(len);
4544
for i in 0..len {
46-
res.get_unchecked_mut(i).write(self.parse().unwrap());
45+
std::ptr::write(res.get_unchecked_mut(i), self.parse().unwrap());
4746
}
48-
res.set_len(len);
49-
std::mem::transmute(res)
50-
};
47+
}
5148
OwnedValue::Array(res)
5249
}
5350

@@ -95,14 +92,13 @@ impl<'input, 'tape> BorrowedDeser<'input, 'tape> {
9592
// Rust doens't optimize the normal loop away here
9693
// so we write our own avoiding the lenght
9794
// checks during push
98-
let res: Vec<BorrowedValue> = unsafe {
99-
let mut res: Vec<MaybeUninit<BorrowedValue>> = Vec::with_capacity(len);
95+
let mut res = Vec::with_capacity(len);
96+
unsafe {
97+
res.set_len(len);
10098
for i in 0..len {
101-
res.get_unchecked_mut(i).write(self.parse().unwrap());
99+
std::ptr::write(res.get_unchecked_mut(i), self.parse().unwrap());
102100
}
103-
res.set_len(len);
104-
std::mem::transmute(res)
105-
};
101+
}
106102
BorrowedValue::Array(res)
107103
}
108104

tests/deser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ fn event() {
124124

125125
#[test]
126126
fn enum_ser() {
127-
#[derive(Deserialize, PartialEq, Debug)]
127+
#[derive(Deserialize, PartialEq, Eq, Debug)]
128128
pub enum StoredVariants {
129129
YesNo(bool),
130130
Small(u8, i8),

0 commit comments

Comments
 (0)