Skip to content

Commit ff11d81

Browse files
committed
Revert "Use field indices for struct deserialization"
This reverts commit ce7669e.
1 parent e65f027 commit ff11d81

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

src/de.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -65,40 +65,39 @@ impl<'de> de::MapAccess<'de> for MapAccess {
6565

6666
struct ObjectAccess {
6767
obj: ObjectExt,
68-
fields: std::iter::Enumerate<std::slice::Iter<'static, &'static str>>,
68+
fields: std::slice::Iter<'static, &'static str>,
6969
next_value: Option<Deserializer>,
7070
}
7171

7272
impl ObjectAccess {
7373
fn new(obj: ObjectExt, fields: &'static [&'static str]) -> Self {
7474
Self {
7575
obj,
76-
fields: fields.iter().enumerate(),
76+
fields: fields.iter(),
7777
next_value: None,
7878
}
7979
}
8080
}
8181

82+
fn str_deserializer(s: &str) -> de::value::StrDeserializer<Error> {
83+
de::IntoDeserializer::into_deserializer(s)
84+
}
85+
8286
impl<'de> de::MapAccess<'de> for ObjectAccess {
8387
type Error = Error;
8488

8589
fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
8690
debug_assert!(self.next_value.is_none());
8791

88-
for (i, &field) in &mut self.fields {
92+
for field in &mut self.fields {
8993
let js_field = static_str_to_js(field);
9094
let next_value = self.obj.get_with_ref_key(&js_field);
9195
// If this value is `undefined`, it might be actually a missing field;
9296
// double-check with an `in` operator if so.
9397
let is_missing_field = next_value.is_undefined() && !js_field.js_in(&self.obj);
9498
if !is_missing_field {
9599
self.next_value = Some(Deserializer::from(next_value));
96-
// Serde can deserialize struct fields from their indices.
97-
// Using them allows for more efficient deserialization as it
98-
// avoids string comparisons.
99-
return Ok(Some(seed.deserialize(
100-
de::IntoDeserializer::<Error>::into_deserializer(i),
101-
)?));
100+
return Ok(Some(seed.deserialize(str_deserializer(field))?));
102101
}
103102
}
104103

@@ -128,10 +127,8 @@ impl<'de> de::SeqAccess<'de> for PreservedValueAccess {
128127
match this {
129128
Self::OnMagic(value) => {
130129
*self = Self::OnValue(value);
131-
seed.deserialize(de::IntoDeserializer::into_deserializer(
132-
PRESERVED_VALUE_MAGIC,
133-
))
134-
.map(Some)
130+
seed.deserialize(str_deserializer(PRESERVED_VALUE_MAGIC))
131+
.map(Some)
135132
}
136133
Self::OnValue(value) => seed
137134
.deserialize(Deserializer {

0 commit comments

Comments
 (0)