From 8ad9960e208fbff07317d8b34883774edbe9b82b Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 10 Feb 2026 14:08:06 -0800 Subject: [PATCH 1/2] Implement `serde` support for our OOM-handling `SecondaryMap` --- cranelift/entity/src/map.rs | 15 ++++++ crates/core/src/alloc/vec.rs | 6 +++ .../environ/src/collections/secondary_map.rs | 46 ++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/cranelift/entity/src/map.rs b/cranelift/entity/src/map.rs index 15db457ebf45..c576b4673ee3 100644 --- a/cranelift/entity/src/map.rs +++ b/cranelift/entity/src/map.rs @@ -212,6 +212,21 @@ where } } +impl From> for SecondaryMap +where + K: EntityRef, + V: Clone + Default, +{ + fn from(elems: Vec) -> Self { + let default = Default::default(); + Self { + elems, + default, + unused: PhantomData, + } + } +} + impl FromIterator<(K, V)> for SecondaryMap where K: EntityRef, diff --git a/crates/core/src/alloc/vec.rs b/crates/core/src/alloc/vec.rs index b4a904acb3d7..dc66a921fb9e 100644 --- a/crates/core/src/alloc/vec.rs +++ b/crates/core/src/alloc/vec.rs @@ -264,6 +264,12 @@ impl<'a, T> IntoIterator for &'a mut Vec { } } +impl From> for StdVec { + fn from(v: Vec) -> Self { + v.inner + } +} + impl From> for Vec { fn from(inner: StdVec) -> Self { Self { inner } diff --git a/crates/environ/src/collections/secondary_map.rs b/crates/environ/src/collections/secondary_map.rs index 6667010f6528..cfa1c961c234 100644 --- a/crates/environ/src/collections/secondary_map.rs +++ b/crates/environ/src/collections/secondary_map.rs @@ -1,6 +1,7 @@ -use crate::error::OutOfMemory; +use crate::{collections::Vec, error::OutOfMemory}; use core::{fmt, ops::Index}; use cranelift_entity::{EntityRef, SecondaryMap as Inner}; +use serde::ser::SerializeSeq; /// Like [`cranelift_entity::SecondaryMap`] but all allocation is fallible. pub struct SecondaryMap @@ -142,3 +143,46 @@ where &self.inner[k] } } + +impl From> for SecondaryMap +where + K: EntityRef, + V: Clone + Default, +{ + fn from(values: Vec) -> Self { + let values: alloc::vec::Vec = values.into(); + let inner = Inner::from(values); + Self { inner } + } +} + +impl serde::ser::Serialize for SecondaryMap +where + K: EntityRef, + V: Clone + serde::ser::Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut seq = serializer.serialize_seq(Some(self.capacity()))?; + for elem in self.values() { + seq.serialize_element(elem)?; + } + seq.end() + } +} + +impl<'de, K, V> serde::de::Deserialize<'de> for SecondaryMap +where + K: EntityRef, + V: Clone + Default + serde::de::Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let values: Vec = serde::de::Deserialize::deserialize(deserializer)?; + Ok(Self::from(values)) + } +} From 87ae93c189728113bfe0c5a725fe043b6fd060ba Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 11 Feb 2026 11:21:09 -0800 Subject: [PATCH 2/2] remove duplicate impl from bad rebase --- crates/core/src/alloc/vec.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/core/src/alloc/vec.rs b/crates/core/src/alloc/vec.rs index dc66a921fb9e..27128c9f9455 100644 --- a/crates/core/src/alloc/vec.rs +++ b/crates/core/src/alloc/vec.rs @@ -276,12 +276,6 @@ impl From> for Vec { } } -impl From> for StdVec { - fn from(v: Vec) -> Self { - v.inner - } -} - impl From> for Vec { fn from(boxed_slice: Box<[T]>) -> Self { Self::from(StdVec::from(boxed_slice))