Skip to content

Commit d6892f3

Browse files
committed
Convert all flat type construction to zero-copy iterators
1 parent a5e936c commit d6892f3

File tree

5 files changed

+51
-65
lines changed

5 files changed

+51
-65
lines changed

crates/wasmtime/src/runtime/func.rs

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,12 +1291,11 @@ impl Func {
12911291
let flat_params = ty
12921292
.params()
12931293
.into_iter()
1294-
.map(|x| x.to_wasm_type().byte_size())
1295-
.collect::<Vec<_>>();
1294+
.map(|x| x.to_wasm_type().byte_size());
12961295

12971296
rr::core_hooks::record_and_replay_validate_host_func_entry(
12981297
values_vec,
1299-
&flat_params,
1298+
flat_params,
13001299
&mut caller.store.0,
13011300
)?;
13021301

@@ -1322,13 +1321,8 @@ impl Func {
13221321
let flat_results = ty
13231322
.results()
13241323
.into_iter()
1325-
.map(|x| x.to_wasm_type().byte_size())
1326-
.collect::<Vec<_>>();
1327-
rr::core_hooks::record_host_func_return(
1328-
values_vec,
1329-
&flat_results,
1330-
&mut caller.store.0,
1331-
)?;
1324+
.map(|x| x.to_wasm_type().byte_size());
1325+
rr::core_hooks::record_host_func_return(values_vec, flat_results, &mut caller.store.0)?;
13321326
} else {
13331327
rr::core_hooks::replay_host_func_return(values_vec, &mut caller.store.0)?;
13341328
}
@@ -2430,30 +2424,23 @@ impl HostContext {
24302424
};
24312425
let func = &state.func;
24322426

2433-
let (flat_size_params, flat_size_results) = {
2434-
let type_index = state._ty.index();
2435-
let wasm_func_subtype = caller.engine().signatures().borrow(type_index).unwrap();
2436-
let wasm_func_type = wasm_func_subtype.unwrap_func();
2437-
(
2438-
wasm_func_type
2439-
.params()
2440-
.into_iter()
2441-
.map(|x| x.byte_size())
2442-
.collect::<Vec<_>>(),
2443-
wasm_func_type
2444-
.returns()
2445-
.into_iter()
2446-
.map(|x| x.byte_size())
2447-
.collect::<Vec<_>>(),
2448-
)
2449-
};
2450-
let (num_params, num_results) = (flat_size_params.len(), flat_size_results.len());
2427+
let type_index = state._ty.index();
2428+
let wasm_func_subtype = caller.engine().signatures().borrow(type_index).unwrap();
2429+
let wasm_func_type = wasm_func_subtype.unwrap_func();
2430+
let (num_params, flat_size_params) = (
2431+
wasm_func_type.params().len(),
2432+
wasm_func_type.params().into_iter().map(|x| x.byte_size()),
2433+
);
2434+
let (num_results, flat_size_results) = (
2435+
wasm_func_type.returns().len(),
2436+
wasm_func_type.returns().into_iter().map(|x| x.byte_size()),
2437+
);
24512438

24522439
// Record/replay(validation) of the raw parameter arguments
24532440
// Don't need auto-assert GC store here since we aren't using P, just raw args
24542441
rr::core_hooks::record_and_replay_validate_host_func_entry(
24552442
unsafe { &args.as_ref()[..num_params] },
2456-
flat_size_params.as_slice(),
2443+
flat_size_params,
24572444
caller.store.0,
24582445
)?;
24592446

@@ -2498,7 +2485,7 @@ impl HostContext {
24982485
// Record the return values
24992486
rr::core_hooks::record_host_func_return(
25002487
unsafe { &args.as_ref()[..num_results] },
2501-
flat_size_results.as_slice(),
2488+
flat_size_results,
25022489
caller.store.0,
25032490
)?;
25042491
} else {

crates/wasmtime/src/runtime/rr/core/events.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ impl fmt::Debug for RRFuncArgVals {
6262

6363
impl RRFuncArgVals {
6464
/// Construct [`RRFuncArgVals`] from raw value buffer and a flat size iterator
65-
pub fn from_raw_slice<T>(args: &[T], flat: impl Iterator<Item = u8>) -> RRFuncArgVals
65+
#[inline]
66+
pub fn from_flat_iter<T>(args: &[T], flat: impl Iterator<Item = u8>) -> RRFuncArgVals
6667
where
6768
T: FlatBytes,
6869
{
@@ -77,22 +78,16 @@ impl RRFuncArgVals {
7778

7879
/// Construct [`RRFuncArgVals`] from raw value buffer and a [`FlatTypesStorage`]
7980
#[cfg(feature = "rr-component")]
81+
#[inline]
8082
pub fn from_flat_storage<T>(args: &[T], flat: FlatTypesStorage) -> RRFuncArgVals
8183
where
8284
T: FlatBytes,
8385
{
84-
RRFuncArgVals::from_raw_slice(args, flat.iter32())
85-
}
86-
87-
/// Construct [`RRFuncArgVals`] from raw value buffer and a `[&u8]` slice
88-
pub fn from_flat_u8<T>(args: &[T], flat: &[u8]) -> RRFuncArgVals
89-
where
90-
T: FlatBytes,
91-
{
92-
RRFuncArgVals::from_raw_slice(args, flat.iter().copied())
86+
RRFuncArgVals::from_flat_iter(args, flat.iter32())
9387
}
9488

9589
/// Encode [`RRFuncArgVals`] back into raw value buffer
90+
#[inline]
9691
pub fn into_raw_slice<T>(self, raw_args: &mut [T])
9792
where
9893
T: FlatBytes,
@@ -104,7 +99,8 @@ impl RRFuncArgVals {
10499
}
105100
}
106101

107-
/// Generate a vector of [`crate::Val`] from [`RRFuncArgVals`]
102+
/// Generate a vector of [`crate::Val`] from [`RRFuncArgVals`] and [`ValType`]s
103+
#[inline]
108104
pub fn to_val_vec(self, mut store: impl AsContextMut, val_types: Vec<ValType>) -> Vec<Val> {
109105
let mut pos = 0;
110106
let mut vals = Vec::new();

crates/wasmtime/src/runtime/rr/hooks/component_hooks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ where
5656
&InterfaceType::Tuple(types[type_idx].results),
5757
MAX_FLAT_RESULTS,
5858
);
59-
let result = result.map(|_| RRFuncArgVals::from_raw_slice(args, flat_results.iter32()));
59+
let result = result.map(|_| RRFuncArgVals::from_flat_iter(args, flat_results.iter32()));
6060
store.0.record_event_validation(|| {
6161
WasmFuncReturnEvent(ResultEvent::from_anyhow_result(&result))
6262
})?;

crates/wasmtime/src/runtime/rr/hooks/core_hooks.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,11 @@ where
3434
.unwrap()
3535
.checksum();
3636
store.0.record_event(|| {
37-
let flat = ty
38-
.params()
39-
.map(|t| t.to_wasm_type().byte_size())
40-
.collect::<Vec<u8>>();
37+
let flat = ty.params().map(|t| t.to_wasm_type().byte_size());
4138
WasmFuncEntryEvent {
4239
module: checksum,
4340
origin,
44-
args: RRFuncArgVals::from_flat_u8(args, &flat),
41+
args: RRFuncArgVals::from_flat_iter(args, flat),
4542
}
4643
})?;
4744
}
@@ -50,11 +47,8 @@ where
5047
#[cfg(all(feature = "rr", feature = "rr-validate"))]
5148
{
5249
if origin.is_some() {
53-
let flat = ty
54-
.results()
55-
.map(|t| t.to_wasm_type().byte_size())
56-
.collect::<Vec<u8>>();
57-
let result = result.map(|_| RRFuncArgVals::from_raw_slice(args, flat.iter().copied()));
50+
let flat = ty.results().map(|t| t.to_wasm_type().byte_size());
51+
let result = result.map(|_| RRFuncArgVals::from_flat_iter(args, flat));
5852
store.0.record_event_validation(|| {
5953
WasmFuncReturnEvent(ResultEvent::from_anyhow_result(&result))
6054
})?;
@@ -75,38 +69,47 @@ where
7569
#[inline]
7670
pub fn record_and_replay_validate_host_func_entry<T>(
7771
args: &[T],
78-
flat: &[u8],
72+
flat: impl Iterator<Item = u8>,
7973
store: &mut StoreOpaque,
8074
) -> Result<()>
8175
where
8276
T: FlatBytes,
8377
{
78+
let _ = (args, &flat, &store);
8479
#[cfg(all(feature = "rr", feature = "rr-validate"))]
8580
{
8681
// Record/replay the raw parameter args
87-
store.record_event_validation(|| HostFuncEntryEvent {
88-
args: RRFuncArgVals::from_flat_u8(args, flat),
89-
})?;
90-
store.next_replay_event_validation::<HostFuncEntryEvent, _, _>(|| HostFuncEntryEvent {
91-
args: RRFuncArgVals::from_flat_u8(args, flat),
92-
})?;
82+
if store.replay_enabled() {
83+
store.next_replay_event_validation::<HostFuncEntryEvent, _, _>(|| {
84+
HostFuncEntryEvent {
85+
args: RRFuncArgVals::from_flat_iter(args, flat),
86+
}
87+
})?;
88+
} else {
89+
store.record_event_validation(|| HostFuncEntryEvent {
90+
args: RRFuncArgVals::from_flat_iter(args, flat),
91+
})?;
92+
}
9393
}
94-
let _ = (args, flat, store);
9594
Ok(())
9695
}
9796

9897
/// Record hook operation for host function return events
9998
#[inline]
100-
pub fn record_host_func_return<T>(args: &[T], flat: &[u8], store: &mut StoreOpaque) -> Result<()>
99+
pub fn record_host_func_return<T>(
100+
args: &[T],
101+
flat: impl Iterator<Item = u8>,
102+
store: &mut StoreOpaque,
103+
) -> Result<()>
101104
where
102105
T: FlatBytes,
103106
{
107+
let _ = (args, &flat, &store);
104108
// Record the return values
105109
#[cfg(feature = "rr")]
106110
store.record_event(|| HostFuncReturnEvent {
107-
args: RRFuncArgVals::from_flat_u8(args, flat),
111+
args: RRFuncArgVals::from_flat_iter(args, flat),
108112
})?;
109-
let _ = (args, flat, store);
110113
Ok(())
111114
}
112115

crates/wasmtime/src/runtime/rr/replay_driver.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::rr::{
66
RREvent, ReplayError, Validate, component_hooks::ReplayLoweringPhase, core_events,
77
};
88
use crate::{
9-
AsContextMut, Engine, Module, ReplayReader, ReplaySettings, Store, ValRaw, ValType, prelude::*,
9+
AsContextMut, Engine, Module, ReplayReader, ReplaySettings, Store, ValRaw, prelude::*,
1010
};
1111
use alloc::collections::BTreeMap;
1212
use core::mem::MaybeUninit;
@@ -251,7 +251,7 @@ impl<'a> ReplayInstance<'a> {
251251
.into_func()
252252
.ok_or(ReplayError::InvalidCoreFuncIndex(entity))?;
253253

254-
let params_ty = func.ty(&store).params().collect::<Vec<ValType>>();
254+
let params_ty = func.ty(&store).params().collect::<Vec<_>>();
255255

256256
// Obtain the argument values for function call
257257
let mut results = vec![crate::Val::I64(0); func.ty(&store).results().len()];

0 commit comments

Comments
 (0)