diff --git a/fuzz/fuzz_targets/bench/lib.rs b/fuzz/fuzz_targets/bench/lib.rs index 7e2b86f53..a9fa1c6ea 100644 --- a/fuzz/fuzz_targets/bench/lib.rs +++ b/fuzz/fuzz_targets/bench/lib.rs @@ -22,7 +22,7 @@ const ARRAY_UNINIT_LEN: usize = usize::MAX; const FLATTEN_CONFLICT_MSG: &str = "ron::fuzz::FlattenFieldConflict"; -pub fn roundtrip_arbitrary_typed_ron_or_panic(data: &[u8]) -> Option { +pub fn roundtrip_arbitrary_typed_ron_or_panic(data: &[u8]) -> Option> { if let Ok(typed_value) = TypedSerdeData::arbitrary(&mut Unstructured::new(data)) { let options = ron::Options::default().with_recursion_limit(RECURSION_LIMIT); diff --git a/src/de/mod.rs b/src/de/mod.rs index 1dd019134..8b1884ecf 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -28,9 +28,6 @@ mod tag; mod tests; mod value; -const SERDE_CONTENT_CANARY: &str = "serde::__private::de::content::Content"; -const SERDE_TAG_KEY_CANARY: &str = "serde::__private::de::content::TagOrContent"; - /// The RON deserializer. /// /// If you just want to simply deserialize a value, @@ -179,8 +176,8 @@ impl<'de> Deserializer<'de> { { // HACK: switch to JSON enum semantics for JSON content // Robust impl blocked on https://github.com/serde-rs/serde/pull/2420 - let is_serde_content = core::any::type_name::() == SERDE_CONTENT_CANARY - || core::any::type_name::() == SERDE_TAG_KEY_CANARY; + let is_serde_content = + is_serde_content::() || is_serde_tag_or_content::(); let old_serde_content_newtype = self.serde_content_newtype; self.serde_content_newtype = false; @@ -857,8 +854,7 @@ impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> { K: DeserializeSeed<'de>, { if self.has_element()? { - self.inside_internally_tagged_enum = - core::any::type_name::() == SERDE_TAG_KEY_CANARY; + self.inside_internally_tagged_enum = is_serde_tag_or_content::(); match self.terminator { Terminator::Struct => guard_recursion! { self.de => @@ -883,9 +879,7 @@ impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> { if self.de.parser.consume_char(':') { self.de.parser.skip_ws()?; - let res = if self.inside_internally_tagged_enum - && core::any::type_name::() != SERDE_CONTENT_CANARY - { + let res = if self.inside_internally_tagged_enum && !is_serde_content::() { guard_recursion! { self.de => seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))? } @@ -1052,3 +1046,19 @@ impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> { result } } + +// ensure that these are the same as in the 449_tagged_enum test +fn is_serde_content() -> bool { + matches!( + core::any::type_name::(), + "serde::__private::de::content::Content" | "serde::__private::de::content::Content<'_>" + ) +} + +fn is_serde_tag_or_content() -> bool { + matches!( + core::any::type_name::(), + "serde::__private::de::content::TagOrContent" + | "serde::__private::de::content::TagOrContent<'_>" + ) +} diff --git a/tests/449_tagged_enum.rs b/tests/449_tagged_enum.rs index 907e5952a..07439412f 100644 --- a/tests/449_tagged_enum.rs +++ b/tests/449_tagged_enum.rs @@ -43,16 +43,29 @@ enum OuterEnumUntagged { #[test] fn test_serde_content_hack() { - assert_eq!( + assert!(matches!( std::any::type_name::(), - "serde::__private::de::content::Content" - ); + "serde::__private::de::content::Content" | "serde::__private::de::content::Content<'_>" + )); } #[test] fn test_serde_internally_tagged_hack() { - const SERDE_CONTENT_CANARY: &str = "serde::__private::de::content::Content"; - const SERDE_TAG_KEY_CANARY: &str = "serde::__private::de::content::TagOrContent"; + // ensure that these are the same as in ron::de module + fn is_serde_content() -> bool { + matches!( + core::any::type_name::(), + "serde::__private::de::content::Content" | "serde::__private::de::content::Content<'_>" + ) + } + + fn is_serde_tag_or_content() -> bool { + matches!( + core::any::type_name::(), + "serde::__private::de::content::TagOrContent" + | "serde::__private::de::content::TagOrContent<'_>" + ) + } struct Deserializer { tag_key: Option, @@ -87,7 +100,7 @@ fn test_serde_internally_tagged_hack() { where K: serde::de::DeserializeSeed<'de>, { - assert_eq!(std::any::type_name::(), SERDE_TAG_KEY_CANARY); + assert!(is_serde_tag_or_content::()); if let Some(tag_key) = self.tag_key.take() { return seed @@ -109,11 +122,11 @@ fn test_serde_internally_tagged_hack() { V: serde::de::DeserializeSeed<'de>, { if self.field_key.is_some() { - assert_ne!(std::any::type_name::(), SERDE_CONTENT_CANARY); + assert!(!is_serde_content::()); return seed.deserialize(serde::de::value::StrDeserializer::new(&self.tag_value)); } - assert_eq!(std::any::type_name::(), SERDE_CONTENT_CANARY); + assert!(is_serde_content::()); seed.deserialize(serde::de::value::I32Deserializer::new(self.field_value)) }