Skip to content

Commit 32b3077

Browse files
stepanchegfacebook-github-bot
authored andcommitted
Freeze SmallMap without relying on SmallMap internals
Summary: This makes freeze slightly more expensive (recreate index), but allows hiding `VecMap` from `starlark_map` API D40923063. Reviewed By: bobyangyf Differential Revision: D40923062 fbshipit-source-id: 3258f49816992832621d42e58ea70c1388783a10
1 parent dbc6eb7 commit 32b3077

File tree

1 file changed

+10
-23
lines changed

1 file changed

+10
-23
lines changed

starlark/src/values/freeze.rs

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use std::marker::PhantomData;
2121

2222
use gazebo::prelude::*;
2323
use starlark_map::small_map::SmallMap;
24-
use starlark_map::vec_map::VecMap;
2524
use starlark_map::Hashed;
2625

2726
use crate::values::Freezer;
@@ -180,36 +179,24 @@ impl<K: Freeze> Freeze for Hashed<K> {
180179
}
181180
}
182181

183-
impl<K, V> Freeze for VecMap<K, V>
182+
impl<K, V> Freeze for SmallMap<K, V>
184183
where
185184
K: Freeze,
186185
V: Freeze,
187186
{
188-
type Frozen = VecMap<K::Frozen, V::Frozen>;
187+
type Frozen = SmallMap<K::Frozen, V::Frozen>;
189188

190-
fn freeze(self, freezer: &Freezer) -> anyhow::Result<Self::Frozen> {
191-
let mut result = VecMap::with_capacity(self.len());
189+
fn freeze(self, freezer: &Freezer) -> anyhow::Result<SmallMap<K::Frozen, V::Frozen>> {
190+
let mut new = SmallMap::with_capacity(self.len());
192191
for (key, value) in self.into_iter_hashed() {
193-
let key = key.freeze(freezer)?;
192+
let hash = key.hash();
193+
let key = key.into_key().freeze(freezer)?;
194+
// TODO(nga): verify hash unchanged after freeze.
195+
let key = Hashed::new_unchecked(hash, key);
194196
let value = value.freeze(freezer)?;
195-
result.insert_hashed_unique_unchecked(key, value);
197+
new.insert_hashed_unique_unchecked(key, value);
196198
}
197-
Ok(result)
198-
}
199-
}
200-
201-
impl<K, V> Freeze for SmallMap<K, V>
202-
where
203-
K: Freeze,
204-
V: Freeze,
205-
{
206-
type Frozen = SmallMap<K::Frozen, V::Frozen>;
207-
208-
fn freeze(mut self, freezer: &Freezer) -> anyhow::Result<SmallMap<K::Frozen, V::Frozen>> {
209-
self.maybe_drop_index();
210-
let (entries, index) = self.into_raw_parts();
211-
let entries = entries.freeze(freezer)?;
212-
unsafe { Ok(SmallMap::from_raw_parts(entries, index)) }
199+
Ok(new)
213200
}
214201
}
215202

0 commit comments

Comments
 (0)