Skip to content

Commit 9f860ff

Browse files
committed
Deduplicate map lowering with linear_lower_map_to_flat and linear_lower_map_to_memory helpers
1 parent 24c75e0 commit 9f860ff

1 file changed

Lines changed: 54 additions & 50 deletions

File tree

  • crates/wasmtime/src/runtime/component/func

crates/wasmtime/src/runtime/component/func/typed.rs

Lines changed: 54 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2135,19 +2135,7 @@ where
21352135
ty: InterfaceType,
21362136
dst: &mut MaybeUninit<[ValRaw; 2]>,
21372137
) -> Result<()> {
2138-
let (key_ty, value_ty) = match ty {
2139-
InterfaceType::Map(i) => {
2140-
let m = &cx.types[i];
2141-
(m.key, m.value)
2142-
}
2143-
_ => bad_type_info(),
2144-
};
2145-
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, self.len(), self.iter())?;
2146-
// See "WRITEPTR64" above for why this is always storing a 64-bit
2147-
// integer.
2148-
map_maybe_uninit!(dst[0]).write(ValRaw::i64(ptr as i64));
2149-
map_maybe_uninit!(dst[1]).write(ValRaw::i64(len as i64));
2150-
Ok(())
2138+
linear_lower_map_to_flat(cx, ty, self.len(), self.iter(), dst)
21512139
}
21522140

21532141
fn linear_lower_to_memory<U>(
@@ -2156,18 +2144,7 @@ where
21562144
ty: InterfaceType,
21572145
offset: usize,
21582146
) -> Result<()> {
2159-
let (key_ty, value_ty) = match ty {
2160-
InterfaceType::Map(i) => {
2161-
let m = &cx.types[i];
2162-
(m.key, m.value)
2163-
}
2164-
_ => bad_type_info(),
2165-
};
2166-
debug_assert!(offset % (Self::ALIGN32 as usize) == 0);
2167-
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, self.len(), self.iter())?;
2168-
*cx.get(offset + 0) = u32::try_from(ptr).unwrap().to_le_bytes();
2169-
*cx.get(offset + 4) = u32::try_from(len).unwrap().to_le_bytes();
2170-
Ok(())
2147+
linear_lower_map_to_memory(cx, ty, self.len(), self.iter(), offset)
21712148
}
21722149
}
21732150

@@ -2207,6 +2184,56 @@ where
22072184
Ok((ptr, len))
22082185
}
22092186

2187+
fn linear_lower_map_to_flat<'a, K, V, U>(
2188+
cx: &mut LowerContext<'_, U>,
2189+
ty: InterfaceType,
2190+
len: usize,
2191+
iter: impl Iterator<Item = (&'a K, &'a V)>,
2192+
dst: &mut MaybeUninit<[ValRaw; 2]>,
2193+
) -> Result<()>
2194+
where
2195+
K: Lower + 'a,
2196+
V: Lower + 'a,
2197+
{
2198+
let (key_ty, value_ty) = match ty {
2199+
InterfaceType::Map(i) => {
2200+
let m = &cx.types[i];
2201+
(m.key, m.value)
2202+
}
2203+
_ => bad_type_info(),
2204+
};
2205+
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, len, iter)?;
2206+
// See "WRITEPTR64" above for why this is always storing a 64-bit integer.
2207+
map_maybe_uninit!(dst[0]).write(ValRaw::i64(ptr as i64));
2208+
map_maybe_uninit!(dst[1]).write(ValRaw::i64(len as i64));
2209+
Ok(())
2210+
}
2211+
2212+
fn linear_lower_map_to_memory<'a, K, V, U>(
2213+
cx: &mut LowerContext<'_, U>,
2214+
ty: InterfaceType,
2215+
len: usize,
2216+
iter: impl Iterator<Item = (&'a K, &'a V)>,
2217+
offset: usize,
2218+
) -> Result<()>
2219+
where
2220+
K: Lower + 'a,
2221+
V: Lower + 'a,
2222+
{
2223+
let (key_ty, value_ty) = match ty {
2224+
InterfaceType::Map(i) => {
2225+
let m = &cx.types[i];
2226+
(m.key, m.value)
2227+
}
2228+
_ => bad_type_info(),
2229+
};
2230+
debug_assert!(offset % (CanonicalAbiInfo::POINTER_PAIR.align32 as usize) == 0);
2231+
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, len, iter)?;
2232+
*cx.get(offset + 0) = u32::try_from(ptr).unwrap().to_le_bytes();
2233+
*cx.get(offset + 4) = u32::try_from(len).unwrap().to_le_bytes();
2234+
Ok(())
2235+
}
2236+
22102237
#[cfg(not(feature = "std"))]
22112238
unsafe impl<K, V> Lift for HashMap<K, V>
22122239
where
@@ -2350,19 +2377,7 @@ where
23502377
ty: InterfaceType,
23512378
dst: &mut MaybeUninit<[ValRaw; 2]>,
23522379
) -> Result<()> {
2353-
let (key_ty, value_ty) = match ty {
2354-
InterfaceType::Map(i) => {
2355-
let m = &cx.types[i];
2356-
(m.key, m.value)
2357-
}
2358-
_ => bad_type_info(),
2359-
};
2360-
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, self.len(), self.iter())?;
2361-
// See "WRITEPTR64" above for why this is always storing a 64-bit
2362-
// integer.
2363-
map_maybe_uninit!(dst[0]).write(ValRaw::i64(ptr as i64));
2364-
map_maybe_uninit!(dst[1]).write(ValRaw::i64(len as i64));
2365-
Ok(())
2380+
linear_lower_map_to_flat(cx, ty, self.len(), self.iter(), dst)
23662381
}
23672382

23682383
fn linear_lower_to_memory<U>(
@@ -2371,18 +2386,7 @@ where
23712386
ty: InterfaceType,
23722387
offset: usize,
23732388
) -> Result<()> {
2374-
let (key_ty, value_ty) = match ty {
2375-
InterfaceType::Map(i) => {
2376-
let m = &cx.types[i];
2377-
(m.key, m.value)
2378-
}
2379-
_ => bad_type_info(),
2380-
};
2381-
debug_assert!(offset % (Self::ALIGN32 as usize) == 0);
2382-
let (ptr, len) = lower_map_iter(cx, key_ty, value_ty, self.len(), self.iter())?;
2383-
*cx.get(offset + 0) = u32::try_from(ptr).unwrap().to_le_bytes();
2384-
*cx.get(offset + 4) = u32::try_from(len).unwrap().to_le_bytes();
2385-
Ok(())
2389+
linear_lower_map_to_memory(cx, ty, self.len(), self.iter(), offset)
23862390
}
23872391
}
23882392

0 commit comments

Comments
 (0)