@@ -6,19 +6,13 @@ use tinywasm_types::{GlobalAddr, LocalAddr, RefValue, WasmValue};
66pub ( crate ) type Value32 = u32 ;
77pub ( crate ) type Value64 = u64 ;
88
9- #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
9+ #[ derive( Debug , Default , Clone , Copy , PartialEq , Eq ) ]
1010/// Packed internal representation of a WebAssembly reference.
1111///
1212/// Unlike the public [`RefValue`], this stores no explicit reference category.
1313/// Converting it back therefore requires the value's canonical reference type.
1414pub ( crate ) struct ValueRef ( u32 ) ;
1515
16- impl Default for ValueRef {
17- fn default ( ) -> Self {
18- Self :: NULL
19- }
20- }
21-
2216impl ValueRef {
2317 const HOST_ANY_TAG : u32 = 1 << 30 ;
2418 pub ( crate ) const NULL : Self = Self ( 0 ) ;
@@ -100,31 +94,19 @@ pub(crate) enum TinyWasmValue {
10094 ValueRef ( ValueRef ) ,
10195}
10296
103- impl From < & WasmValue > for TinyWasmValue {
104- fn from ( value : & WasmValue ) -> Self {
97+ impl From < WasmValue > for TinyWasmValue {
98+ fn from ( value : WasmValue ) -> Self {
10599 match value {
106- WasmValue :: I32 ( v) => Self :: Value32 ( * v as u32 ) ,
107- WasmValue :: I64 ( v) => Self :: Value64 ( * v as u64 ) ,
100+ WasmValue :: I32 ( v) => Self :: Value32 ( v as u32 ) ,
101+ WasmValue :: I64 ( v) => Self :: Value64 ( v as u64 ) ,
108102 WasmValue :: F32 ( v) => Self :: Value32 ( v. to_bits ( ) ) ,
109103 WasmValue :: F64 ( v) => Self :: Value64 ( v. to_bits ( ) ) ,
110- WasmValue :: Ref ( value) => Self :: ValueRef ( ( * value) . into ( ) ) ,
111- WasmValue :: V128 ( v) => Self :: Value128 ( ( * v ) . into ( ) ) ,
104+ WasmValue :: Ref ( value) => Self :: ValueRef ( value. into ( ) ) ,
105+ WasmValue :: V128 ( v) => Self :: Value128 ( Value128 ( v ) ) ,
112106 }
113107 }
114108}
115109
116- impl From < WasmValue > for TinyWasmValue {
117- fn from ( value : WasmValue ) -> Self {
118- Self :: from ( & value)
119- }
120- }
121-
122- impl From < [ u8 ; 16 ] > for TinyWasmValue {
123- fn from ( value : [ u8 ; 16 ] ) -> Self {
124- Self :: Value128 ( Value128 :: from ( value) )
125- }
126- }
127-
128110mod sealed {
129111 #[ expect( unreachable_pub) ]
130112 pub trait Sealed { }
@@ -148,23 +130,14 @@ pub(crate) trait InternalValue: sealed::Sealed + Copy + Default {
148130macro_rules! impl_internalvalue {
149131 (
150132 $(
151- $variant: ident, $stack: ident, $stack_base: ident, $global_get: ident, $global_set: ident, $outer: ty,
152- |$to_value_v: ident| $to_value: expr,
133+ $stack: ident, $stack_base: ident, $global_get: ident, $global_set: ident, $outer: ty,
153134 |$to_stack_v: ident| $to_stack: expr,
154135 |$from_stack_v: ident| $from_stack: expr
155136 ) *
156137 ) => {
157138 $(
158139 impl sealed:: Sealed for $outer { }
159140
160- impl From <$outer> for TinyWasmValue {
161- #[ inline( always) ]
162- fn from( value: $outer) -> Self {
163- let $to_value_v = value;
164- TinyWasmValue :: $variant( $to_value)
165- }
166- }
167-
168141 impl InternalValue for $outer {
169142 #[ inline( always) ]
170143 fn stack_push( stack: & mut ValueStack , value: Self ) -> Result <( ) , crate :: Trap > {
@@ -175,34 +148,41 @@ macro_rules! impl_internalvalue {
175148
176149 #[ inline( always) ]
177150 fn local_get( stack: & ValueStack , frame: & CallFrame , index: LocalAddr ) -> Self {
178- let $from_stack_v = * stack. $stack. get( frame. locals_base. $stack_base as usize + index as usize ) ;
151+ let $from_stack_v =
152+ * stack. $stack. get( frame. locals_base. $stack_base. wrapping_add( u32 :: from( index) ) as usize ) ;
179153 $from_stack
180154 }
181155
182156 #[ inline( always) ]
183157 fn local_push( stack: & mut ValueStack , frame: & CallFrame , index: LocalAddr ) -> Result <( ) , crate :: Trap > {
184- stack. $stack. push_copy( frame. locals_base. $stack_base as usize + index as usize )
158+ stack. $stack. push_copy( frame. locals_base. $stack_base. wrapping_add ( u32 :: from ( index) ) as usize )
185159 }
186160
187161 #[ inline( always) ]
188162 fn local_set( stack: & mut ValueStack , frame: & CallFrame , index: LocalAddr , value: Self ) {
189163 let $to_stack_v = value;
190- let abs_index = frame. locals_base. $stack_base as usize + index as usize ;
164+ let abs_index = frame. locals_base. $stack_base. wrapping_add ( u32 :: from ( index) ) as usize ;
191165 stack. $stack. set( abs_index, $to_stack) ;
192166 }
193167
194168 #[ inline( always) ]
195- fn local_update( stack: & mut ValueStack , frame: & CallFrame , index: LocalAddr , f: impl FnOnce ( Self ) -> Self ) {
196- let abs_index = frame. locals_base. $stack_base as usize + index as usize ;
169+ fn local_update(
170+ stack: & mut ValueStack ,
171+ frame: & CallFrame ,
172+ index: LocalAddr ,
173+ f: impl FnOnce ( Self ) -> Self ,
174+ ) {
175+ let abs_index = frame. locals_base. $stack_base. wrapping_add( u32 :: from( index) ) as usize ;
197176 let $from_stack_v = * stack. $stack. get( abs_index) ;
198177 let $to_stack_v = f( $from_stack) ;
199178 stack. $stack. set( abs_index, $to_stack) ;
200179 }
201180
202181 #[ inline( always) ]
203182 fn local_copy( stack: & mut ValueStack , frame: & CallFrame , from: LocalAddr , to: LocalAddr ) {
204- let base = frame. locals_base. $stack_base as usize ;
205- stack. $stack. copy( base + from as usize , base + to as usize ) ;
183+ let from = frame. locals_base. $stack_base. wrapping_add( u32 :: from( from) ) as usize ;
184+ let to = frame. locals_base. $stack_base. wrapping_add( u32 :: from( to) ) as usize ;
185+ stack. $stack. copy( from, to) ;
206186 }
207187
208188 #[ inline( always) ]
@@ -245,12 +225,12 @@ macro_rules! impl_internalvalue {
245225}
246226
247227impl_internalvalue ! {
248- Value32 , stack_32, s32, get_32, set_32, u32 , |v| v , |v| v, |v| v
249- Value64 , stack_64, s64, get_64, set_64, u64 , |v| v , |v| v, |v| v
250- Value32 , stack_32, s32, get_32, set_32, i32 , |v| v as u32 , |v| v as u32 , |v| v as i32
251- Value64 , stack_64, s64, get_64, set_64, i64 , |v| v as u64 , |v| v as u64 , |v| v as i64
252- Value32 , stack_32, s32, get_32, set_32, f32 , |v| f32 :: to_bits ( v ) , |v| f32 :: to_bits( v) , |v| f32 :: from_bits( v)
253- Value64 , stack_64, s64, get_64, set_64, f64 , |v| f64 :: to_bits ( v ) , |v| f64 :: to_bits( v) , |v| f64 :: from_bits( v)
254- ValueRef , stack_32, s32, get_32, set_32, ValueRef , |v| v , |v| v. raw( ) , |v| ValueRef ( v)
255- Value128 , stack_128, s128, get_128, set_128, Value128 , |v| v , |v| v, |v| v
228+ stack_32, s32, get_32, set_32, u32 , |v| v, |v| v
229+ stack_64, s64, get_64, set_64, u64 , |v| v, |v| v
230+ stack_32, s32, get_32, set_32, i32 , |v| v as u32 , |v| v as i32
231+ stack_64, s64, get_64, set_64, i64 , |v| v as u64 , |v| v as i64
232+ stack_32, s32, get_32, set_32, f32 , |v| f32 :: to_bits( v) , |v| f32 :: from_bits( v)
233+ stack_64, s64, get_64, set_64, f64 , |v| f64 :: to_bits( v) , |v| f64 :: from_bits( v)
234+ stack_32, s32, get_32, set_32, ValueRef , |v| v. raw( ) , |v| ValueRef ( v)
235+ stack_128, s128, get_128, set_128, Value128 , |v| v, |v| v
256236}
0 commit comments