Skip to content

Commit 71c51d0

Browse files
authored
Implement serialization and deserialization for our OOM-handling Vec (#12553)
* Implement serialization and deserialization for our OOM-handling `Vec` * Review feedback
1 parent 1865b37 commit 71c51d0

1 file changed

Lines changed: 68 additions & 2 deletions

File tree

crates/core/src/alloc/vec.rs

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use crate::alloc::{TryClone, try_realloc};
22
use crate::error::OutOfMemory;
3+
use core::marker::PhantomData;
34
use core::{
45
fmt, mem,
56
ops::{Deref, DerefMut, Index, IndexMut},
67
};
8+
use serde::ser::SerializeSeq;
79
use std_alloc::alloc::Layout;
810
use std_alloc::boxed::Box;
911
use std_alloc::vec::Vec as StdVec;
@@ -262,11 +264,75 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> {
262264
}
263265
}
264266

267+
impl<T> From<StdVec<T>> for Vec<T> {
268+
fn from(inner: StdVec<T>) -> Self {
269+
Self { inner }
270+
}
271+
}
272+
265273
impl<T> From<Box<[T]>> for Vec<T> {
266274
fn from(boxed_slice: Box<[T]>) -> Self {
267-
Vec {
268-
inner: StdVec::from(boxed_slice),
275+
Self::from(StdVec::from(boxed_slice))
276+
}
277+
}
278+
279+
impl<T> serde::ser::Serialize for Vec<T>
280+
where
281+
T: serde::ser::Serialize,
282+
{
283+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
284+
where
285+
S: serde::Serializer,
286+
{
287+
let mut seq = serializer.serialize_seq(Some(self.len()))?;
288+
for elem in self {
289+
seq.serialize_element(elem)?;
290+
}
291+
seq.end()
292+
}
293+
}
294+
295+
impl<'de, T> serde::de::Deserialize<'de> for Vec<T>
296+
where
297+
T: serde::de::Deserialize<'de>,
298+
{
299+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
300+
where
301+
D: serde::Deserializer<'de>,
302+
{
303+
struct Visitor<T>(PhantomData<fn() -> Vec<T>>);
304+
305+
impl<'de, T> serde::de::Visitor<'de> for Visitor<T>
306+
where
307+
T: serde::de::Deserialize<'de>,
308+
{
309+
type Value = Vec<T>;
310+
311+
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
312+
f.write_str("a `wasmtime_core::alloc::Vec` sequence")
313+
}
314+
315+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
316+
where
317+
A: serde::de::SeqAccess<'de>,
318+
{
319+
use serde::de::Error as _;
320+
321+
let mut v = Vec::new();
322+
323+
if let Some(len) = seq.size_hint() {
324+
v.reserve_exact(len).map_err(|oom| A::Error::custom(oom))?;
325+
}
326+
327+
while let Some(elem) = seq.next_element()? {
328+
v.push(elem).map_err(|oom| A::Error::custom(oom))?;
329+
}
330+
331+
Ok(v)
332+
}
269333
}
334+
335+
deserializer.deserialize_seq(Visitor(PhantomData))
270336
}
271337
}
272338

0 commit comments

Comments
 (0)