Skip to content

Commit 4cf65f4

Browse files
chore: use FromIterator for ValueCounts
Signed-off-by: Henry <mail@henrygressmann.de>
1 parent 4b4f7ba commit 4cf65f4

5 files changed

Lines changed: 20 additions & 17 deletions

File tree

crates/parser/src/module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl ModuleReader {
181181
let funcs = self.code.into_iter().zip(self.code_type_addrs).enumerate().map(
182182
|(func_idx, ((instructions, mut data, locals), ty_idx))| {
183183
let ty = self.func_types.get(ty_idx as usize).expect("No func type for func, this is a bug").clone();
184-
let params = ValueCounts::from(&ty.params);
184+
let params = ValueCounts::from_iter(&ty.params);
185185
let self_func = (imported_func_count + func_idx) as u32;
186186
let instructions = optimize::optimize_instructions(instructions, &mut data, self_func, options);
187187
WasmFunction { instructions: ArcSlice::from(instructions), data, locals, params, ty }

crates/tinywasm/src/imports.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ impl Extern {
193193
Ok(result.into_wasm_value_tuple())
194194
};
195195

196-
let ty = tinywasm_types::FuncType { params: P::val_types(), results: R::val_types() };
196+
let results = R::val_types();
197+
let ty = tinywasm_types::FuncType { params: P::val_types(), results };
197198
Self::Function(Function::Host(Rc::new(HostFunction { func: Box::new(inner_func), ty })))
198199
}
199200

crates/tinywasm/src/interpreter/executor.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,8 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
148148
JumpIfZero(ip) => if self.exec_jump_if_zero(*ip) { continue; },
149149
JumpIfNonZero(ip) => if self.exec_jump_if_non_zero(*ip) { continue; },
150150
DropKeepSmall { base32, keep32, base64, keep64, base128, keep128, base_ref, keep_ref } => {
151-
let stack_base = self.cf.stack_base();
152-
self.store.stack.values.stack_32.truncate_keep((stack_base.s32 + *base32 as u32) as usize, *keep32 as usize);
153-
self.store.stack.values.stack_64.truncate_keep((stack_base.s64 + *base64 as u32) as usize, *keep64 as usize);
154-
self.store.stack.values.stack_128.truncate_keep((stack_base.s128 + *base128 as u32) as usize, *keep128 as usize);
155-
self.store.stack.values.stack_ref.truncate_keep((stack_base.sref + *base_ref as u32) as usize, *keep_ref as usize);
151+
let mut base = self.cf.stack_base(); base.s32 += *base32 as u32; base.s64 += *base64 as u32; base.s128 += *base128 as u32; base.sref += *base_ref as u32;
152+
self.store.stack.values.truncate_keep_counts(base, ValueCounts { c32: *keep32 as u16, c64: *keep64 as u16, c128: *keep128 as u16, cref: *keep_ref as u16 });
156153
}
157154
DropKeep32(base, keep) => self.store.stack.values.stack_32.truncate_keep((self.cf.stack_base().s32 + *base as u32) as usize, *keep as usize),
158155
DropKeep64(base, keep) => self.store.stack.values.stack_64.truncate_keep((self.cf.stack_base().s64 + *base as u32) as usize, *keep as usize),
@@ -822,9 +819,8 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
822819
}
823820

824821
fn exec_return(&mut self) -> bool {
825-
let result_counts = ValueCounts::from(self.func.ty.results.iter());
826-
self.store.stack.values.truncate_keep_counts(self.cf.locals_base, result_counts);
827-
822+
let results = ValueCounts::from_iter(&self.func.ty.results);
823+
self.store.stack.values.truncate_keep_counts(self.cf.locals_base, results);
828824
let Some(cf) = self.store.stack.call_stack.pop() else { return true };
829825

830826
if cf.func_addr != self.cf.func_addr {

crates/tinywasm/src/interpreter/stack/value_stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ impl ValueStack {
228228
}
229229

230230
pub(crate) fn truncate_keep_counts(&mut self, base: StackBase, keep: ValueCounts) {
231-
if keep.c32 == 0 && keep.c64 == 0 && keep.c128 == 0 && keep.cref == 0 {
231+
if keep.is_empty() {
232232
self.stack_32.len = base.s32 as usize;
233233
self.stack_64.len = base.s64 as usize;
234234
self.stack_128.len = base.s128 as usize;

crates/types/src/lib.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,19 +214,25 @@ pub struct ValueCounts {
214214
pub cref: u16,
215215
}
216216

217-
impl<'a, T: IntoIterator<Item = &'a ValType>> From<T> for ValueCounts {
217+
impl ValueCounts {
218218
#[inline]
219-
fn from(types: T) -> Self {
220-
let mut counts = Self::default();
221-
for ty in types {
219+
pub fn is_empty(&self) -> bool {
220+
self.c32 == 0 && self.c64 == 0 && self.c128 == 0 && self.cref == 0
221+
}
222+
}
223+
224+
impl<'a> FromIterator<&'a ValType> for ValueCounts {
225+
#[inline]
226+
fn from_iter<I: IntoIterator<Item = &'a ValType>>(iter: I) -> Self {
227+
iter.into_iter().fold(Self::default(), |mut counts, ty| {
222228
match ty {
223229
ValType::I32 | ValType::F32 => counts.c32 += 1,
224230
ValType::I64 | ValType::F64 => counts.c64 += 1,
225231
ValType::V128 => counts.c128 += 1,
226232
ValType::RefExtern | ValType::RefFunc => counts.cref += 1,
227233
}
228-
}
229-
counts
234+
counts
235+
})
230236
}
231237
}
232238

0 commit comments

Comments
 (0)