Skip to content

Commit efb98a9

Browse files
authored
Implement serialization and deserialization for wasmtime_environ::collections::PrimaryMap (#12560)
1 parent 4897239 commit efb98a9

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

crates/core/src/alloc/vec.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ impl<T> From<StdVec<T>> for Vec<T> {
270270
}
271271
}
272272

273+
impl<T> From<Vec<T>> for StdVec<T> {
274+
fn from(v: Vec<T>) -> Self {
275+
v.inner
276+
}
277+
}
278+
273279
impl<T> From<Box<[T]>> for Vec<T> {
274280
fn from(boxed_slice: Box<[T]>) -> Self {
275281
Self::from(StdVec::from(boxed_slice))

crates/environ/src/collections/primary_map.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use core::{
33
ops::{Index, IndexMut},
44
};
55
use cranelift_entity::EntityRef;
6+
use serde::{Serialize, ser::SerializeSeq};
67
use wasmtime_core::error::OutOfMemory;
78

89
/// Like [`cranelift_entity::PrimaryMap`] but enforces fallible allocation for
910
/// all methods that allocate.
10-
#[derive(Clone, Hash, PartialEq, Eq)]
11+
#[derive(Hash, PartialEq, Eq)]
1112
pub struct PrimaryMap<K, V>
1213
where
1314
K: EntityRef,
@@ -36,6 +37,48 @@ where
3637
}
3738
}
3839

40+
impl<K, V> From<crate::collections::Vec<V>> for PrimaryMap<K, V>
41+
where
42+
K: EntityRef,
43+
{
44+
fn from(values: crate::collections::Vec<V>) -> Self {
45+
let values: ::alloc::vec::Vec<V> = values.into();
46+
let inner = cranelift_entity::PrimaryMap::from(values);
47+
Self { inner }
48+
}
49+
}
50+
51+
impl<K, V> serde::ser::Serialize for PrimaryMap<K, V>
52+
where
53+
K: EntityRef,
54+
V: Serialize,
55+
{
56+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57+
where
58+
S: serde::Serializer,
59+
{
60+
let mut seq = serializer.serialize_seq(Some(self.len()))?;
61+
for val in self.values() {
62+
seq.serialize_element(val)?;
63+
}
64+
seq.end()
65+
}
66+
}
67+
68+
impl<'de, K, V> serde::de::Deserialize<'de> for PrimaryMap<K, V>
69+
where
70+
K: EntityRef,
71+
V: serde::de::Deserialize<'de>,
72+
{
73+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
74+
where
75+
D: serde::Deserializer<'de>,
76+
{
77+
let v: crate::collections::Vec<V> = serde::de::Deserialize::deserialize(deserializer)?;
78+
Ok(Self::from(v))
79+
}
80+
}
81+
3982
impl<K, V> PrimaryMap<K, V>
4083
where
4184
K: EntityRef,

0 commit comments

Comments
 (0)