change order of serialization of Span by serializing to temporary buffer

This commit is contained in:
Moritz Hölting 2025-02-12 15:18:05 +01:00
parent 116a15e8ea
commit 5b5465488f
2 changed files with 15 additions and 9 deletions

View File

@ -30,6 +30,7 @@ chksum-md5 = { version = "0.1.0", optional = true }
colored = "3.0.0" colored = "3.0.0"
derive_more = { version = "2.0.1", default-features = false, features = ["deref", "deref_mut", "from"] } derive_more = { version = "2.0.1", default-features = false, features = ["deref", "deref_mut", "from"] }
enum-as-inner = "0.6.0" enum-as-inner = "0.6.0"
flexbuffers = "25.2.10"
getset = "0.1.2" getset = "0.1.2"
itertools = "0.14.0" itertools = "0.14.0"
mlua = { version = "0.10.2", features = ["lua54", "vendored"], optional = true } mlua = { version = "0.10.2", features = ["lua54", "vendored"], optional = true }

View File

@ -1,7 +1,7 @@
//! Utilities for (de-)serializing //! Utilities for (de-)serializing
use std::{ use std::{
collections::HashMap, collections::BTreeMap,
marker::PhantomData, marker::PhantomData,
sync::{Arc, LazyLock, Mutex, RwLock}, sync::{Arc, LazyLock, Mutex, RwLock},
}; };
@ -36,13 +36,18 @@ where
{ {
*DEDUPLICATE_SOURCE_FILES.write().unwrap() = true; *DEDUPLICATE_SOURCE_FILES.write().unwrap() = true;
SERIALIZE_DATA.lock().unwrap().clear(); SERIALIZE_DATA.lock().unwrap().clear();
let mut s = serializer.serialize_struct("SourceFileWrapper", 2)?; let mut serialized_data = flexbuffers::FlexbufferSerializer::new();
s.serialize_field("data", &self.0)?; self.0
*DEDUPLICATE_SOURCE_FILES.write().unwrap() = false; .serialize(&mut serialized_data)
.map_err(|_| serde::ser::Error::custom("could not buffer serialization"))?;
drop(serialized_data);
let mut s = serializer.serialize_struct("SerdeWrapper", 3)?;
s.serialize_field( s.serialize_field(
"source_files", "source_files",
&SERIALIZE_DATA.lock().unwrap().id_to_source_file, &SERIALIZE_DATA.lock().unwrap().id_to_source_file,
)?; )?;
s.serialize_field("data", &self.0)?;
*DEDUPLICATE_SOURCE_FILES.write().unwrap() = false;
s.end() s.end()
} }
} }
@ -78,7 +83,7 @@ where
where where
V: de::SeqAccess<'de>, V: de::SeqAccess<'de>,
{ {
let source_files: HashMap<usize, SourceFile> = seq let source_files: BTreeMap<usize, SourceFile> = seq
.next_element()? .next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?; .ok_or_else(|| de::Error::invalid_length(0, &self))?;
*DESERIALIZE_DATA.write().unwrap() = Some(DeserializeData { *DESERIALIZE_DATA.write().unwrap() = Some(DeserializeData {
@ -98,7 +103,7 @@ where
where where
V: de::MapAccess<'de>, V: de::MapAccess<'de>,
{ {
let mut source_files: Option<HashMap<usize, SourceFile>> = None; let mut source_files: Option<BTreeMap<usize, SourceFile>> = None;
let mut data = None; let mut data = None;
while let Some(key) = map.next_key()? { while let Some(key) = map.next_key()? {
@ -147,8 +152,8 @@ where
#[derive(Debug, Default)] #[derive(Debug, Default)]
struct SerializeData { struct SerializeData {
id_counter: usize, id_counter: usize,
ptr_to_id: HashMap<usize, usize>, ptr_to_id: BTreeMap<usize, usize>,
id_to_source_file: HashMap<usize, SourceFile>, id_to_source_file: BTreeMap<usize, SourceFile>,
} }
impl SerializeData { impl SerializeData {
@ -198,7 +203,7 @@ impl Serialize for Span {
#[derive(Debug, Default)] #[derive(Debug, Default)]
struct DeserializeData { struct DeserializeData {
id_to_source_file: HashMap<usize, Arc<SourceFile>>, id_to_source_file: BTreeMap<usize, Arc<SourceFile>>,
} }
impl<'de> Deserialize<'de> for Span { impl<'de> Deserialize<'de> for Span {