Skip to content

Commit 282546d

Browse files
authored
Implement serde support for our OOM-handling SecondaryMap (#12564)
* Implement `serde` support for our OOM-handling `SecondaryMap` * remove duplicate impl from bad rebase
1 parent 59161c5 commit 282546d

3 files changed

Lines changed: 66 additions & 7 deletions

File tree

cranelift/entity/src/map.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,21 @@ where
212212
}
213213
}
214214

215+
impl<K, V> From<Vec<V>> for SecondaryMap<K, V>
216+
where
217+
K: EntityRef,
218+
V: Clone + Default,
219+
{
220+
fn from(elems: Vec<V>) -> Self {
221+
let default = Default::default();
222+
Self {
223+
elems,
224+
default,
225+
unused: PhantomData,
226+
}
227+
}
228+
}
229+
215230
impl<K, V> FromIterator<(K, V)> for SecondaryMap<K, V>
216231
where
217232
K: EntityRef,

crates/core/src/alloc/vec.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,18 +264,18 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> {
264264
}
265265
}
266266

267-
impl<T> From<StdVec<T>> for Vec<T> {
268-
fn from(inner: StdVec<T>) -> Self {
269-
Self { inner }
270-
}
271-
}
272-
273267
impl<T> From<Vec<T>> for StdVec<T> {
274268
fn from(v: Vec<T>) -> Self {
275269
v.inner
276270
}
277271
}
278272

273+
impl<T> From<StdVec<T>> for Vec<T> {
274+
fn from(inner: StdVec<T>) -> Self {
275+
Self { inner }
276+
}
277+
}
278+
279279
impl<T> From<Box<[T]>> for Vec<T> {
280280
fn from(boxed_slice: Box<[T]>) -> Self {
281281
Self::from(StdVec::from(boxed_slice))

crates/environ/src/collections/secondary_map.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use crate::error::OutOfMemory;
1+
use crate::{collections::Vec, error::OutOfMemory};
22
use core::{fmt, ops::Index};
33
use cranelift_entity::{EntityRef, SecondaryMap as Inner};
4+
use serde::ser::SerializeSeq;
45

56
/// Like [`cranelift_entity::SecondaryMap`] but all allocation is fallible.
67
pub struct SecondaryMap<K, V>
@@ -142,3 +143,46 @@ where
142143
&self.inner[k]
143144
}
144145
}
146+
147+
impl<K, V> From<Vec<V>> for SecondaryMap<K, V>
148+
where
149+
K: EntityRef,
150+
V: Clone + Default,
151+
{
152+
fn from(values: Vec<V>) -> Self {
153+
let values: alloc::vec::Vec<V> = values.into();
154+
let inner = Inner::from(values);
155+
Self { inner }
156+
}
157+
}
158+
159+
impl<K, V> serde::ser::Serialize for SecondaryMap<K, V>
160+
where
161+
K: EntityRef,
162+
V: Clone + serde::ser::Serialize,
163+
{
164+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
165+
where
166+
S: serde::Serializer,
167+
{
168+
let mut seq = serializer.serialize_seq(Some(self.capacity()))?;
169+
for elem in self.values() {
170+
seq.serialize_element(elem)?;
171+
}
172+
seq.end()
173+
}
174+
}
175+
176+
impl<'de, K, V> serde::de::Deserialize<'de> for SecondaryMap<K, V>
177+
where
178+
K: EntityRef,
179+
V: Clone + Default + serde::de::Deserialize<'de>,
180+
{
181+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
182+
where
183+
D: serde::Deserializer<'de>,
184+
{
185+
let values: Vec<V> = serde::de::Deserialize::deserialize(deserializer)?;
186+
Ok(Self::from(values))
187+
}
188+
}

0 commit comments

Comments
 (0)