Skip to content

Commit f3d9155

Browse files
committed
update to use Slots
Signed-off-by: Andrew Duffy <andrew@a10y.dev>
1 parent afe2d51 commit f3d9155

File tree

8 files changed

+231
-153
lines changed

8 files changed

+231
-153
lines changed

vortex-array/public-api.lock

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3352,7 +3352,7 @@ pub fn vortex_array::arrays::patched::Patched::build(dtype: &vortex_array::dtype
33523352

33533353
pub fn vortex_array::arrays::patched::Patched::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef
33543354

3355-
pub fn vortex_array::arrays::patched::Patched::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String
3355+
pub fn vortex_array::arrays::patched::Patched::child_name(array: &Self::Array, idx: usize) -> alloc::string::String
33563356

33573357
pub fn vortex_array::arrays::patched::Patched::deserialize(bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Metadata>
33583358

@@ -3370,19 +3370,23 @@ pub fn vortex_array::arrays::patched::Patched::metadata(array: &Self::Array) ->
33703370

33713371
pub fn vortex_array::arrays::patched::Patched::nbuffers(_array: &Self::Array) -> usize
33723372

3373-
pub fn vortex_array::arrays::patched::Patched::nchildren(_array: &Self::Array) -> usize
3373+
pub fn vortex_array::arrays::patched::Patched::nchildren(array: &Self::Array) -> usize
33743374

33753375
pub fn vortex_array::arrays::patched::Patched::reduce(array: &vortex_array::vtable::Array<Self>) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
33763376

33773377
pub fn vortex_array::arrays::patched::Patched::reduce_parent(array: &vortex_array::vtable::Array<Self>, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
33783378

33793379
pub fn vortex_array::arrays::patched::Patched::serialize(metadata: Self::Metadata) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
33803380

3381+
pub fn vortex_array::arrays::patched::Patched::slot_name(_array: &Self::Array, idx: usize) -> alloc::string::String
3382+
3383+
pub fn vortex_array::arrays::patched::Patched::slots(array: &Self::Array) -> &[core::option::Option<vortex_array::ArrayRef>]
3384+
33813385
pub fn vortex_array::arrays::patched::Patched::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_>
33823386

33833387
pub fn vortex_array::arrays::patched::Patched::vtable(_array: &Self::Array) -> &Self
33843388

3385-
pub fn vortex_array::arrays::patched::Patched::with_children(array: &mut Self::Array, children: alloc::vec::Vec<vortex_array::ArrayRef>) -> vortex_error::VortexResult<()>
3389+
pub fn vortex_array::arrays::patched::Patched::with_slots(array: &mut Self::Array, slots: alloc::vec::Vec<core::option::Option<vortex_array::ArrayRef>>) -> vortex_error::VortexResult<()>
33863390

33873391
impl vortex_array::vtable::ValidityChild<vortex_array::arrays::patched::Patched> for vortex_array::arrays::patched::Patched
33883392

@@ -3392,6 +3396,16 @@ pub struct vortex_array::arrays::patched::PatchedArray
33923396

33933397
impl vortex_array::arrays::patched::PatchedArray
33943398

3399+
pub fn vortex_array::arrays::patched::PatchedArray::base_array(&self) -> &vortex_array::ArrayRef
3400+
3401+
pub fn vortex_array::arrays::patched::PatchedArray::lane_offsets(&self) -> &vortex_array::ArrayRef
3402+
3403+
pub fn vortex_array::arrays::patched::PatchedArray::patch_indices(&self) -> &vortex_array::ArrayRef
3404+
3405+
pub fn vortex_array::arrays::patched::PatchedArray::patch_values(&self) -> &vortex_array::ArrayRef
3406+
3407+
impl vortex_array::arrays::patched::PatchedArray
3408+
33953409
pub fn vortex_array::arrays::patched::PatchedArray::from_array_and_patches(inner: vortex_array::ArrayRef, patches: &vortex_array::patches::Patches, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<Self>
33963410

33973411
impl vortex_array::arrays::patched::PatchedArray
@@ -7292,7 +7306,7 @@ pub fn vortex_array::arrays::patched::Patched::build(dtype: &vortex_array::dtype
72927306

72937307
pub fn vortex_array::arrays::patched::Patched::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef
72947308

7295-
pub fn vortex_array::arrays::patched::Patched::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String
7309+
pub fn vortex_array::arrays::patched::Patched::child_name(array: &Self::Array, idx: usize) -> alloc::string::String
72967310

72977311
pub fn vortex_array::arrays::patched::Patched::deserialize(bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Metadata>
72987312

@@ -7310,19 +7324,23 @@ pub fn vortex_array::arrays::patched::Patched::metadata(array: &Self::Array) ->
73107324

73117325
pub fn vortex_array::arrays::patched::Patched::nbuffers(_array: &Self::Array) -> usize
73127326

7313-
pub fn vortex_array::arrays::patched::Patched::nchildren(_array: &Self::Array) -> usize
7327+
pub fn vortex_array::arrays::patched::Patched::nchildren(array: &Self::Array) -> usize
73147328

73157329
pub fn vortex_array::arrays::patched::Patched::reduce(array: &vortex_array::vtable::Array<Self>) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
73167330

73177331
pub fn vortex_array::arrays::patched::Patched::reduce_parent(array: &vortex_array::vtable::Array<Self>, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
73187332

73197333
pub fn vortex_array::arrays::patched::Patched::serialize(metadata: Self::Metadata) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
73207334

7335+
pub fn vortex_array::arrays::patched::Patched::slot_name(_array: &Self::Array, idx: usize) -> alloc::string::String
7336+
7337+
pub fn vortex_array::arrays::patched::Patched::slots(array: &Self::Array) -> &[core::option::Option<vortex_array::ArrayRef>]
7338+
73217339
pub fn vortex_array::arrays::patched::Patched::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_>
73227340

73237341
pub fn vortex_array::arrays::patched::Patched::vtable(_array: &Self::Array) -> &Self
73247342

7325-
pub fn vortex_array::arrays::patched::Patched::with_children(array: &mut Self::Array, children: alloc::vec::Vec<vortex_array::ArrayRef>) -> vortex_error::VortexResult<()>
7343+
pub fn vortex_array::arrays::patched::Patched::with_slots(array: &mut Self::Array, slots: alloc::vec::Vec<core::option::Option<vortex_array::ArrayRef>>) -> vortex_error::VortexResult<()>
73267344

73277345
impl vortex_array::vtable::ValidityChild<vortex_array::arrays::patched::Patched> for vortex_array::arrays::patched::Patched
73287346

@@ -7332,6 +7350,16 @@ pub struct vortex_array::arrays::PatchedArray
73327350

73337351
impl vortex_array::arrays::patched::PatchedArray
73347352

7353+
pub fn vortex_array::arrays::patched::PatchedArray::base_array(&self) -> &vortex_array::ArrayRef
7354+
7355+
pub fn vortex_array::arrays::patched::PatchedArray::lane_offsets(&self) -> &vortex_array::ArrayRef
7356+
7357+
pub fn vortex_array::arrays::patched::PatchedArray::patch_indices(&self) -> &vortex_array::ArrayRef
7358+
7359+
pub fn vortex_array::arrays::patched::PatchedArray::patch_values(&self) -> &vortex_array::ArrayRef
7360+
7361+
impl vortex_array::arrays::patched::PatchedArray
7362+
73357363
pub fn vortex_array::arrays::patched::PatchedArray::from_array_and_patches(inner: vortex_array::ArrayRef, patches: &vortex_array::patches::Patches, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<Self>
73367364

73377365
impl vortex_array::arrays::patched::PatchedArray
@@ -22542,7 +22570,7 @@ pub fn vortex_array::arrays::patched::Patched::build(dtype: &vortex_array::dtype
2254222570

2254322571
pub fn vortex_array::arrays::patched::Patched::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef
2254422572

22545-
pub fn vortex_array::arrays::patched::Patched::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String
22573+
pub fn vortex_array::arrays::patched::Patched::child_name(array: &Self::Array, idx: usize) -> alloc::string::String
2254622574

2254722575
pub fn vortex_array::arrays::patched::Patched::deserialize(bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Metadata>
2254822576

@@ -22560,19 +22588,23 @@ pub fn vortex_array::arrays::patched::Patched::metadata(array: &Self::Array) ->
2256022588

2256122589
pub fn vortex_array::arrays::patched::Patched::nbuffers(_array: &Self::Array) -> usize
2256222590

22563-
pub fn vortex_array::arrays::patched::Patched::nchildren(_array: &Self::Array) -> usize
22591+
pub fn vortex_array::arrays::patched::Patched::nchildren(array: &Self::Array) -> usize
2256422592

2256522593
pub fn vortex_array::arrays::patched::Patched::reduce(array: &vortex_array::vtable::Array<Self>) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
2256622594

2256722595
pub fn vortex_array::arrays::patched::Patched::reduce_parent(array: &vortex_array::vtable::Array<Self>, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
2256822596

2256922597
pub fn vortex_array::arrays::patched::Patched::serialize(metadata: Self::Metadata) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
2257022598

22599+
pub fn vortex_array::arrays::patched::Patched::slot_name(_array: &Self::Array, idx: usize) -> alloc::string::String
22600+
22601+
pub fn vortex_array::arrays::patched::Patched::slots(array: &Self::Array) -> &[core::option::Option<vortex_array::ArrayRef>]
22602+
2257122603
pub fn vortex_array::arrays::patched::Patched::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_>
2257222604

2257322605
pub fn vortex_array::arrays::patched::Patched::vtable(_array: &Self::Array) -> &Self
2257422606

22575-
pub fn vortex_array::arrays::patched::Patched::with_children(array: &mut Self::Array, children: alloc::vec::Vec<vortex_array::ArrayRef>) -> vortex_error::VortexResult<()>
22607+
pub fn vortex_array::arrays::patched::Patched::with_slots(array: &mut Self::Array, slots: alloc::vec::Vec<core::option::Option<vortex_array::ArrayRef>>) -> vortex_error::VortexResult<()>
2257622608

2257722609
impl vortex_array::vtable::VTable for vortex_array::arrays::scalar_fn::ScalarFnVTable
2257822610

@@ -23982,7 +24014,7 @@ pub fn vortex_array::arrays::patched::Patched::build(dtype: &vortex_array::dtype
2398224014

2398324015
pub fn vortex_array::arrays::patched::Patched::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef
2398424016

23985-
pub fn vortex_array::arrays::patched::Patched::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String
24017+
pub fn vortex_array::arrays::patched::Patched::child_name(array: &Self::Array, idx: usize) -> alloc::string::String
2398624018

2398724019
pub fn vortex_array::arrays::patched::Patched::deserialize(bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Metadata>
2398824020

@@ -24000,19 +24032,23 @@ pub fn vortex_array::arrays::patched::Patched::metadata(array: &Self::Array) ->
2400024032

2400124033
pub fn vortex_array::arrays::patched::Patched::nbuffers(_array: &Self::Array) -> usize
2400224034

24003-
pub fn vortex_array::arrays::patched::Patched::nchildren(_array: &Self::Array) -> usize
24035+
pub fn vortex_array::arrays::patched::Patched::nchildren(array: &Self::Array) -> usize
2400424036

2400524037
pub fn vortex_array::arrays::patched::Patched::reduce(array: &vortex_array::vtable::Array<Self>) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
2400624038

2400724039
pub fn vortex_array::arrays::patched::Patched::reduce_parent(array: &vortex_array::vtable::Array<Self>, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult<core::option::Option<vortex_array::ArrayRef>>
2400824040

2400924041
pub fn vortex_array::arrays::patched::Patched::serialize(metadata: Self::Metadata) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
2401024042

24043+
pub fn vortex_array::arrays::patched::Patched::slot_name(_array: &Self::Array, idx: usize) -> alloc::string::String
24044+
24045+
pub fn vortex_array::arrays::patched::Patched::slots(array: &Self::Array) -> &[core::option::Option<vortex_array::ArrayRef>]
24046+
2401124047
pub fn vortex_array::arrays::patched::Patched::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_>
2401224048

2401324049
pub fn vortex_array::arrays::patched::Patched::vtable(_array: &Self::Array) -> &Self
2401424050

24015-
pub fn vortex_array::arrays::patched::Patched::with_children(array: &mut Self::Array, children: alloc::vec::Vec<vortex_array::ArrayRef>) -> vortex_error::VortexResult<()>
24051+
pub fn vortex_array::arrays::patched::Patched::with_slots(array: &mut Self::Array, slots: alloc::vec::Vec<core::option::Option<vortex_array::ArrayRef>>) -> vortex_error::VortexResult<()>
2401624052

2401724053
impl vortex_array::vtable::VTable for vortex_array::arrays::scalar_fn::ScalarFnVTable
2401824054

vortex-array/src/arrays/patched/array.rs

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::ops::Range;
55

66
use vortex_buffer::Buffer;
77
use vortex_buffer::BufferMut;
8+
use vortex_error::VortexExpect;
89
use vortex_error::VortexResult;
910
use vortex_error::vortex_ensure;
1011
use vortex_error::vortex_err;
@@ -92,10 +93,22 @@ use crate::validity::Validity;
9293
///
9394
/// It turns out that this layout is optimal for executing patching on GPUs, because the
9495
/// `lane_offsets` allows each thread in a warp to seek to its patches in constant time.
96+
pub(super) const INNER_SLOT: usize = 0;
97+
pub(super) const LANE_OFFSETS_SLOT: usize = 1;
98+
pub(super) const INDICES_SLOT: usize = 2;
99+
pub(super) const VALUES_SLOT: usize = 3;
100+
pub(super) const NUM_SLOTS: usize = 4;
101+
pub(super) const SLOT_NAMES: [&str; NUM_SLOTS] =
102+
["inner", "lane_offsets", "patch_indices", "patch_values"];
103+
95104
#[derive(Debug, Clone)]
96105
pub struct PatchedArray {
97-
/// The inner array that is being patched. This is the zeroth child.
98-
pub(super) inner: ArrayRef,
106+
/// Child arrays stored as slots:
107+
/// 0: inner - the inner array being patched
108+
/// 1: lane_offsets - u32 array for indexing into indices/values
109+
/// 2: indices - u16 array of chunk indices
110+
/// 3: values - array of patch values
111+
pub(super) slots: Vec<Option<ArrayRef>>,
99112

100113
/// Number of lanes the patch indices and values have been split into. Each of the `n_chunks`
101114
/// of 1024 values is split into `n_lanes` lanes horizontally, each lane having 1024 / n_lanes
@@ -111,13 +124,6 @@ pub struct PatchedArray {
111124
/// Length of the array
112125
pub(super) len: usize,
113126

114-
/// lane offsets. The PType of these MUST be u32
115-
pub(super) lane_offsets: ArrayRef,
116-
/// indices within a 1024-element chunk. The PType of these MUST be u16
117-
pub(super) indices: ArrayRef,
118-
/// patch values corresponding to the indices. The ptype is specified by `values_ptype`.
119-
pub(super) values: ArrayRef,
120-
121127
pub(super) stats_set: ArrayStats,
122128
}
123129

@@ -186,18 +192,49 @@ impl PatchedArray {
186192
let len = inner.len();
187193

188194
Ok(Self {
189-
inner,
195+
slots: vec![Some(inner), Some(lane_offsets), Some(indices), Some(values)],
190196
n_lanes,
191197
offset: 0,
192198
len,
193-
lane_offsets,
194-
indices,
195-
values,
196199
stats_set: ArrayStats::default(),
197200
})
198201
}
199202
}
200203

204+
impl PatchedArray {
205+
/// Returns a reference to the base array being patched.
206+
#[inline]
207+
pub fn base_array(&self) -> &ArrayRef {
208+
self.slots[INNER_SLOT]
209+
.as_ref()
210+
.vortex_expect("PatchedArray inner slot")
211+
}
212+
213+
/// Returns a reference to the lane offsets array (u32).
214+
#[inline]
215+
pub fn lane_offsets(&self) -> &ArrayRef {
216+
self.slots[LANE_OFFSETS_SLOT]
217+
.as_ref()
218+
.vortex_expect("PatchedArray lane_offsets slot")
219+
}
220+
221+
/// Returns a reference to the indices array (u16).
222+
#[inline]
223+
pub fn patch_indices(&self) -> &ArrayRef {
224+
self.slots[INDICES_SLOT]
225+
.as_ref()
226+
.vortex_expect("PatchedArray indices slot")
227+
}
228+
229+
/// Returns a reference to the patch values array.
230+
#[inline]
231+
pub fn patch_values(&self) -> &ArrayRef {
232+
self.slots[VALUES_SLOT]
233+
.as_ref()
234+
.vortex_expect("PatchedArray values slot")
235+
}
236+
}
237+
201238
impl PatchedArray {
202239
/// Get a range of indices that can be used to access the `indices` and `values` children
203240
/// to retrieve all patches for a specified lane.
@@ -209,9 +246,9 @@ impl PatchedArray {
209246
assert!(chunk * 1024 <= self.len + self.offset);
210247
assert!(lane < self.n_lanes);
211248

212-
let start = self.lane_offsets.scalar_at(chunk * self.n_lanes + lane)?;
249+
let start = self.lane_offsets().scalar_at(chunk * self.n_lanes + lane)?;
213250
let stop = self
214-
.lane_offsets
251+
.lane_offsets()
215252
.scalar_at(chunk * self.n_lanes + lane + 1)?;
216253

217254
let start = start
@@ -233,10 +270,10 @@ impl PatchedArray {
233270
let lane_offsets_stop = chunks.end * self.n_lanes + 1;
234271

235272
let sliced_lane_offsets = self
236-
.lane_offsets
273+
.lane_offsets()
237274
.slice(lane_offsets_start..lane_offsets_stop)?;
238-
let indices = self.indices.clone();
239-
let values = self.values.clone();
275+
let indices = self.patch_indices().clone();
276+
let values = self.patch_values().clone();
240277

241278
// Find the new start/end for slicing the inner array.
242279
// The inner array has already been sliced to start at position `offset` in absolute terms,
@@ -248,18 +285,20 @@ impl PatchedArray {
248285

249286
let offset = if chunks.start == 0 { self.offset } else { 0 };
250287

251-
let inner = self.inner.slice(begin..end)?;
288+
let inner = self.base_array().slice(begin..end)?;
252289

253290
let len = end - begin;
254291

255292
Ok(PatchedArray {
256-
inner,
293+
slots: vec![
294+
Some(inner),
295+
Some(sliced_lane_offsets),
296+
Some(indices),
297+
Some(values),
298+
],
257299
n_lanes: self.n_lanes,
258300
offset,
259301
len,
260-
indices,
261-
values,
262-
lane_offsets: sliced_lane_offsets,
263302
stats_set: ArrayStats::default(),
264303
})
265304
}

vortex-array/src/arrays/patched/compute/compare.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl CompareKernel for Patched {
4141
// NOTE: due to offset, it's possible that the inner.len != array.len.
4242
// We slice the inner before performing the comparison.
4343
let result = lhs
44-
.inner
44+
.base_array()
4545
.binary(
4646
ConstantArray::new(constant.clone(), lhs.len()).into_array(),
4747
operator.into(),
@@ -58,9 +58,9 @@ impl CompareKernel for Patched {
5858

5959
let mut bits = BitBufferMut::from_buffer(bits.unwrap_host().into_mut(), offset, len);
6060

61-
let lane_offsets = lhs.lane_offsets.clone().execute::<PrimitiveArray>(ctx)?;
62-
let indices = lhs.indices.clone().execute::<PrimitiveArray>(ctx)?;
63-
let values = lhs.values.clone().execute::<PrimitiveArray>(ctx)?;
61+
let lane_offsets = lhs.lane_offsets().clone().execute::<PrimitiveArray>(ctx)?;
62+
let indices = lhs.patch_indices().clone().execute::<PrimitiveArray>(ctx)?;
63+
let values = lhs.patch_values().clone().execute::<PrimitiveArray>(ctx)?;
6464
let n_lanes = lhs.n_lanes;
6565

6666
match_each_native_ptype!(values.ptype(), |V| {

vortex-array/src/arrays/patched/compute/take.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ impl TakeExecute for Patched {
3131

3232
// Perform take on the inner array, including the placeholders.
3333
let inner = array
34-
.inner
34+
.base_array()
3535
.take(indices.clone())?
3636
.execute::<PrimitiveArray>(ctx)?;
3737

@@ -46,9 +46,18 @@ impl TakeExecute for Patched {
4646
match_each_unsigned_integer_ptype!(indices_ptype, |I| {
4747
match_each_native_ptype!(ptype, |V| {
4848
let indices = indices.clone().execute::<PrimitiveArray>(ctx)?;
49-
let lane_offsets = array.lane_offsets.clone().execute::<PrimitiveArray>(ctx)?;
50-
let patch_indices = array.indices.clone().execute::<PrimitiveArray>(ctx)?;
51-
let patch_values = array.values.clone().execute::<PrimitiveArray>(ctx)?;
49+
let lane_offsets = array
50+
.lane_offsets()
51+
.clone()
52+
.execute::<PrimitiveArray>(ctx)?;
53+
let patch_indices = array
54+
.patch_indices()
55+
.clone()
56+
.execute::<PrimitiveArray>(ctx)?;
57+
let patch_values = array
58+
.patch_values()
59+
.clone()
60+
.execute::<PrimitiveArray>(ctx)?;
5261
let mut output = Buffer::<V>::from_byte_buffer(buffer.unwrap_host()).into_mut();
5362
take_map(
5463
output.as_mut(),

0 commit comments

Comments
 (0)