Skip to content

Commit 3b47c8f

Browse files
committed
Fix getting registration for type twice
1 parent 97bcbd6 commit 3b47c8f

File tree

1 file changed

+47
-55
lines changed
  • crates/bevy_reflect/src/serde

1 file changed

+47
-55
lines changed

crates/bevy_reflect/src/serde/de.rs

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use crate::{
22
ArrayInfo, DynamicArray, DynamicEnum, DynamicList, DynamicMap, DynamicStruct, DynamicTuple,
33
DynamicTupleStruct, DynamicVariant, EnumInfo, ListInfo, Map, MapInfo, NamedField, Reflect,
44
ReflectDeserialize, StructInfo, StructVariantInfo, Tuple, TupleInfo, TupleStruct,
5-
TupleStructInfo, TupleVariantInfo, TypeInfo, TypeRegistry, UnnamedField, VariantInfo,
5+
TupleStructInfo, TupleVariantInfo, TypeInfo, TypeRegistration, TypeRegistry, UnnamedField,
6+
VariantInfo,
67
};
78
use erased_serde::Deserializer;
89
use serde::de::{
@@ -192,11 +193,10 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
192193
.ok_or_else(|| Error::invalid_length(0, &"at least one entry"))?;
193194

194195
let registration = self.registry.get_with_name(&type_name).ok_or_else(|| {
195-
Error::custom(format_args!("No registration found for {}", type_name))
196+
Error::custom(format_args!("No registration found for `{}`", type_name))
196197
})?;
197-
let type_info = registration.type_info();
198198
let value = map.next_value_seed(TypedReflectDeserializer {
199-
type_info,
199+
registration,
200200
registry: self.registry,
201201
})?;
202202
Ok(value)
@@ -222,14 +222,14 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
222222
/// [`DynamicList`]: crate::DynamicList
223223
/// [`FromReflect`]: crate::FromReflect
224224
pub struct TypedReflectDeserializer<'a> {
225-
type_info: &'static TypeInfo,
225+
registration: &'a TypeRegistration,
226226
registry: &'a TypeRegistry,
227227
}
228228

229229
impl<'a> TypedReflectDeserializer<'a> {
230-
pub fn new(type_info: &'static TypeInfo, registry: &'a TypeRegistry) -> Self {
230+
pub fn new(registration: &'a TypeRegistration, registry: &'a TypeRegistry) -> Self {
231231
Self {
232-
type_info,
232+
registration,
233233
registry,
234234
}
235235
}
@@ -242,19 +242,15 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
242242
where
243243
D: serde::Deserializer<'de>,
244244
{
245-
// Handle both Value case and types that have a custom `ReflectDeserialize`
246-
let type_id = self.type_info.type_id();
247-
let type_name = self.type_info.type_name();
248-
let registration = self.registry.get(type_id).ok_or_else(|| {
249-
de::Error::custom(format_args!("no registration found for {}", type_name))
250-
})?;
245+
let type_name = self.registration.type_name();
251246

252-
if let Some(deserialize_reflect) = registration.data::<ReflectDeserialize>() {
247+
// Handle both Value case and types that have a custom `ReflectDeserialize`
248+
if let Some(deserialize_reflect) = self.registration.data::<ReflectDeserialize>() {
253249
let value = deserialize_reflect.deserialize(deserializer)?;
254250
return Ok(value);
255251
}
256252

257-
match self.type_info {
253+
match self.registration.type_info() {
258254
TypeInfo::Struct(struct_info) => {
259255
let mut dynamic_struct = deserializer.deserialize_struct(
260256
struct_info.name(),
@@ -395,19 +391,19 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
395391
let mut index = 0usize;
396392
let mut tuple_struct = DynamicTupleStruct::default();
397393

398-
let get_field_info = |index: usize| -> Result<&'static TypeInfo, V::Error> {
394+
let get_field_registration = |index: usize| -> Result<&'a TypeRegistration, V::Error> {
399395
let field = self.tuple_struct_info.field_at(index).ok_or_else(|| {
400396
de::Error::custom(format_args!(
401397
"no field at index {} on tuple {}",
402398
index,
403399
self.tuple_struct_info.type_name(),
404400
))
405401
})?;
406-
get_type_info(field.type_id(), field.type_name(), self.registry)
402+
get_registration(field.type_id(), field.type_name(), self.registry)
407403
};
408404

409405
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
410-
type_info: get_field_info(index)?,
406+
registration: get_field_registration(index)?,
411407
registry: self.registry,
412408
})? {
413409
tuple_struct.insert_boxed(value);
@@ -465,13 +461,13 @@ impl<'a, 'de> Visitor<'de> for ArrayVisitor<'a> {
465461
V: SeqAccess<'de>,
466462
{
467463
let mut vec = Vec::with_capacity(seq.size_hint().unwrap_or_default());
468-
let type_info = get_type_info(
464+
let registration = get_registration(
469465
self.array_info.item_type_id(),
470466
self.array_info.item_type_name(),
471467
self.registry,
472468
)?;
473469
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
474-
type_info,
470+
registration,
475471
registry: self.registry,
476472
})? {
477473
vec.push(value);
@@ -505,13 +501,13 @@ impl<'a, 'de> Visitor<'de> for ListVisitor<'a> {
505501
V: SeqAccess<'de>,
506502
{
507503
let mut list = DynamicList::default();
508-
let type_info = get_type_info(
504+
let registration = get_registration(
509505
self.list_info.item_type_id(),
510506
self.list_info.item_type_name(),
511507
self.registry,
512508
)?;
513509
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
514-
type_info,
510+
registration,
515511
registry: self.registry,
516512
})? {
517513
list.push_box(value);
@@ -537,22 +533,22 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
537533
V: MapAccess<'de>,
538534
{
539535
let mut dynamic_map = DynamicMap::default();
540-
let key_type_info = get_type_info(
536+
let key_registration = get_registration(
541537
self.map_info.key_type_id(),
542538
self.map_info.key_type_name(),
543539
self.registry,
544540
)?;
545-
let value_type_info = get_type_info(
541+
let value_registration = get_registration(
546542
self.map_info.value_type_id(),
547543
self.map_info.value_type_name(),
548544
self.registry,
549545
)?;
550546
while let Some(key) = map.next_key_seed(TypedReflectDeserializer {
551-
type_info: key_type_info,
547+
registration: key_registration,
552548
registry: self.registry,
553549
})? {
554550
let value = map.next_value_seed(TypedReflectDeserializer {
555-
type_info: value_type_info,
551+
registration: value_registration,
556552
registry: self.registry,
557553
})?;
558554
dynamic_map.insert_boxed(key, value);
@@ -596,9 +592,11 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
596592
)?
597593
.into(),
598594
VariantInfo::Tuple(tuple_info) if tuple_info.field_len() == 1 => {
599-
let type_info = get_newtype_info(tuple_info, self.registry)?;
595+
let field = tuple_info.field_at(0).unwrap();
596+
let registration =
597+
get_registration(field.type_id(), field.type_name(), self.registry)?;
600598
let value = variant.newtype_variant_seed(TypedReflectDeserializer {
601-
type_info,
599+
registration,
602600
registry: self.registry,
603601
})?;
604602
let mut dynamic_tuple = DynamicTuple::default();
@@ -681,9 +679,11 @@ impl<'a, 'de> Visitor<'de> for OptionVisitor<'a> {
681679
let variant_info = self.enum_info.variant("Some").unwrap();
682680
match variant_info {
683681
VariantInfo::Tuple(tuple_info) if tuple_info.field_len() == 1 => {
684-
let type_info = get_newtype_info(tuple_info, self.registry)?;
682+
let field = tuple_info.field_at(0).unwrap();
683+
let registration =
684+
get_registration(field.type_id(), field.type_name(), self.registry)?;
685685
let de = TypedReflectDeserializer {
686-
type_info,
686+
registration,
687687
registry: self.registry,
688688
};
689689
let mut value = DynamicTuple::default();
@@ -723,9 +723,9 @@ where
723723
let field = info
724724
.get_field(&key)
725725
.ok_or_else(|| Error::unknown_field(&key, info.get_field_names()))?;
726-
let type_info = get_type_info(field.type_id(), field.type_name(), registry)?;
726+
let registration = get_registration(field.type_id(), field.type_name(), registry)?;
727727
let value = map.next_value_seed(TypedReflectDeserializer {
728-
type_info,
728+
registration,
729729
registry,
730730
})?;
731731
dynamic_struct.insert_boxed(&key, value);
@@ -746,15 +746,15 @@ where
746746
let mut tuple = DynamicTuple::default();
747747
let mut index = 0usize;
748748

749-
let get_field_info = |index: usize| -> Result<&TypeInfo, V::Error> {
749+
let get_field_registration = |index: usize| -> Result<&TypeRegistration, V::Error> {
750750
let field = info.get_field(index).ok_or_else(|| {
751751
Error::invalid_length(index, &info.get_field_len().to_string().as_str())
752752
})?;
753-
get_type_info(field.type_id(), field.type_name(), registry)
753+
get_registration(field.type_id(), field.type_name(), registry)
754754
};
755755

756756
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
757-
type_info: get_field_info(index)?,
757+
registration: get_field_registration(index)?,
758758
registry,
759759
})? {
760760
tuple.insert_boxed(value);
@@ -776,32 +776,23 @@ where
776776
Ok(tuple)
777777
}
778778

779-
fn get_newtype_info<E: Error>(
780-
tuple_info: &'static TupleVariantInfo,
781-
registry: &TypeRegistry,
782-
) -> Result<&'static TypeInfo, E> {
783-
let field = tuple_info.field_at(0).unwrap();
784-
registry.get_type_info(field.type_id()).ok_or_else(|| {
785-
Error::custom(format_args!(
786-
"no registration found for type {}",
787-
field.type_name()
788-
))
789-
})
790-
}
791-
792-
fn get_type_info<E: de::Error>(
779+
fn get_registration<'a, E: Error>(
793780
type_id: TypeId,
794781
type_name: &str,
795-
registry: &TypeRegistry,
796-
) -> Result<&'static TypeInfo, E> {
782+
registry: &'a TypeRegistry,
783+
) -> Result<&'a TypeRegistration, E> {
797784
let registration = registry.get(type_id).ok_or_else(|| {
798-
de::Error::custom(format_args!("no registration found for type {}", type_name))
785+
Error::custom(format_args!(
786+
"no registration found for type `{}`",
787+
type_name
788+
))
799789
})?;
800-
Ok(registration.type_info())
790+
Ok(registration)
801791
}
802792

803793
#[cfg(test)]
804794
mod tests {
795+
use std::any::TypeId;
805796
use std::f32::consts::PI;
806797

807798
use serde::de::DeserializeSeed;
@@ -811,7 +802,7 @@ mod tests {
811802

812803
use crate as bevy_reflect;
813804
use crate::serde::{TypedReflectDeserializer, UntypedReflectDeserializer};
814-
use crate::{DynamicEnum, FromReflect, Reflect, ReflectDeserialize, TypeRegistry, Typed};
805+
use crate::{DynamicEnum, FromReflect, Reflect, ReflectDeserialize, TypeRegistry};
815806

816807
#[derive(Reflect, FromReflect, Debug, PartialEq)]
817808
struct MyStruct {
@@ -997,7 +988,8 @@ mod tests {
997988

998989
let mut registry = get_registry();
999990
registry.register::<Foo>();
1000-
let reflect_deserializer = TypedReflectDeserializer::new(Foo::type_info(), &registry);
991+
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
992+
let reflect_deserializer = TypedReflectDeserializer::new(registration, &registry);
1001993
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
1002994
let dynamic_output = reflect_deserializer
1003995
.deserialize(&mut ron_deserializer)

0 commit comments

Comments
 (0)