Skip to content

Commit 684bad1

Browse files
committed
properly use {Read,Write}As traits in Sp's API
1 parent ccc80c1 commit 684bad1

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

crates/core/src/untyped.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ pub trait ReadAs<T> {
3535
fn read_as(&self) -> T;
3636
}
3737

38+
impl ReadAs<UntypedVal> for UntypedVal {
39+
fn read_as(&self) -> UntypedVal {
40+
*self
41+
}
42+
}
43+
3844
macro_rules! impl_read_as_for_int {
3945
( $( $int:ty ),* $(,)? ) => {
4046
$(
@@ -83,6 +89,12 @@ pub trait WriteAs<T> {
8389
fn write_as(&mut self, value: T);
8490
}
8591

92+
impl WriteAs<UntypedVal> for UntypedVal {
93+
fn write_as(&mut self, value: UntypedVal) {
94+
*self = value;
95+
}
96+
}
97+
8698
macro_rules! impl_write_as_for_int {
8799
( $( $int:ty as $as:ty ),* $(,)? ) => {
88100
$(

crates/wasmi/src/engine/executor/handler/state.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
collections::HeadVec,
3-
core::UntypedVal,
3+
core::{ReadAs, UntypedVal, WriteAs},
44
engine::{
55
executor::{handler::utils::extract_mem0, CodeMap},
66
StackConfig,
@@ -118,20 +118,20 @@ impl<'a> From<&'a mut [UntypedVal]> for Sp {
118118
impl Sp {
119119
pub fn get<T>(self, slot: Slot) -> T
120120
where
121-
T: Copy + From<UntypedVal>,
121+
UntypedVal: ReadAs<T>,
122122
{
123123
let index = usize::from(u16::from(slot));
124-
let value = unsafe { *self.value.add(index) };
125-
T::from(value)
124+
let value = unsafe { &*self.value.add(index) };
125+
<UntypedVal as ReadAs<T>>::read_as(value)
126126
}
127127

128128
pub fn set<T>(self, slot: Slot, value: T)
129129
where
130-
T: Copy + Into<UntypedVal>,
130+
UntypedVal: WriteAs<T>,
131131
{
132132
let index = usize::from(u16::from(slot));
133133
let cell = unsafe { &mut *self.value.add(index) };
134-
*cell = value.into();
134+
<UntypedVal as WriteAs<T>>::write_as(cell, value);
135135
}
136136

137137
pub unsafe fn as_slice<'a>(self, len: usize) -> &'a [UntypedVal] {

crates/wasmi/src/engine/executor/handler/utils.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::state::{Ip, Sp, VmState};
22
use crate::{
3-
core::UntypedVal,
3+
core::{ReadAs, UntypedVal, WriteAs},
44
engine::{DedupFuncType, EngineFunc},
55
instance::InstanceEntity,
66
ir::{index, Address, BranchOffset, Offset16, Sign, Slot, SlotSpan},
@@ -53,7 +53,8 @@ impl_get_value!(
5353

5454
impl<T> GetValue<T> for Slot
5555
where
56-
T: Copy + From<UntypedVal>,
56+
T: Copy,
57+
UntypedVal: ReadAs<T>,
5758
{
5859
fn get_value(src: Self, sp: Sp) -> T {
5960
sp.get::<T>(src)
@@ -73,7 +74,7 @@ pub trait SetValue<T> {
7374

7475
impl<T> SetValue<T> for Slot
7576
where
76-
T: Copy + Into<UntypedVal>,
77+
UntypedVal: WriteAs<T>,
7778
{
7879
fn set_value(src: Self, value: T, sp: Sp) {
7980
sp.set::<T>(src, value)

crates/wasmi/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,15 @@ mod core {
124124
Memory as CoreMemory,
125125
MemoryType as CoreMemoryType,
126126
MemoryTypeBuilder as CoreMemoryTypeBuilder,
127+
ReadAs,
127128
ResourceLimiterRef,
128129
Table as CoreTable,
129130
TableType as CoreTableType,
130131
Typed,
131132
TypedVal,
132133
UntypedError,
133134
UntypedVal,
135+
WriteAs,
134136
};
135137
}
136138

0 commit comments

Comments
 (0)