1- use crate :: { cold, runtime:: RawWasmValue , unlikely, Error , Result } ;
1+ use crate :: { cold, runtime:: WasmValueRepr , unlikely, Error , Result } ;
22use alloc:: vec:: Vec ;
33use tinywasm_types:: { ValType , WasmValue } ;
44
55pub ( crate ) const MIN_VALUE_STACK_SIZE : usize = 1024 * 128 ;
66
77#[ derive( Debug ) ]
8- pub ( crate ) struct ValueStack {
9- stack : Vec < RawWasmValue > ,
10- }
8+ pub ( crate ) struct ValueStack < T > ( Vec < T > ) ;
119
12- impl Default for ValueStack {
10+ impl < T > Default for ValueStack < T > {
1311 fn default ( ) -> Self {
14- Self { stack : Vec :: with_capacity ( MIN_VALUE_STACK_SIZE ) }
12+ Self ( Vec :: with_capacity ( MIN_VALUE_STACK_SIZE ) )
1513 }
1614}
1715
18- impl ValueStack {
16+ impl < T : From < WasmValue > + Copy + WasmValueRepr > ValueStack < T > {
1917 #[ inline]
2018 pub ( crate ) fn extend_from_typed ( & mut self , values : & [ WasmValue ] ) {
21- self . stack . extend ( values. iter ( ) . map ( |v| RawWasmValue :: from ( * v) ) ) ;
19+ self . 0 . extend ( values. iter ( ) . map ( |v| T :: from ( * v) ) ) ;
2220 }
2321
2422 #[ inline( always) ]
25- pub ( crate ) fn replace_top ( & mut self , func : fn ( RawWasmValue ) -> RawWasmValue ) -> Result < ( ) > {
23+ pub ( crate ) fn replace_top ( & mut self , func : fn ( T ) -> T ) -> Result < ( ) > {
2624 let v = self . last_mut ( ) ?;
2725 * v = func ( * v) ;
2826 Ok ( ( ) )
2927 }
3028
3129 #[ inline( always) ]
32- pub ( crate ) fn calculate ( & mut self , func : fn ( RawWasmValue , RawWasmValue ) -> RawWasmValue ) -> Result < ( ) > {
30+ pub ( crate ) fn calculate ( & mut self , func : fn ( T , T ) -> T ) -> Result < ( ) > {
3331 let v2 = self . pop ( ) ?;
3432 let v1 = self . last_mut ( ) ?;
3533 * v1 = func ( * v1, v2) ;
3634 Ok ( ( ) )
3735 }
3836
3937 #[ inline( always) ]
40- pub ( crate ) fn calculate_trap (
41- & mut self ,
42- func : fn ( RawWasmValue , RawWasmValue ) -> Result < RawWasmValue > ,
43- ) -> Result < ( ) > {
38+ pub ( crate ) fn calculate_trap ( & mut self , func : fn ( T , T ) -> Result < T > ) -> Result < ( ) > {
4439 let v2 = self . pop ( ) ?;
4540 let v1 = self . last_mut ( ) ?;
4641 * v1 = func ( * v1, v2) ?;
@@ -49,13 +44,13 @@ impl ValueStack {
4944
5045 #[ inline( always) ]
5146 pub ( crate ) fn len ( & self ) -> usize {
52- self . stack . len ( )
47+ self . 0 . len ( )
5348 }
5449
5550 #[ inline]
5651 pub ( crate ) fn truncate_keep ( & mut self , n : u32 , end_keep : u32 ) {
5752 let total_to_keep = n + end_keep;
58- let len = self . stack . len ( ) as u32 ;
53+ let len = self . 0 . len ( ) as u32 ;
5954 assert ! ( len >= total_to_keep, "Total to keep should be less than or equal to self.top" ) ;
6055
6156 if len <= total_to_keep {
@@ -65,22 +60,22 @@ impl ValueStack {
6560 let items_to_remove = len - total_to_keep;
6661 let remove_start_index = ( len - items_to_remove - end_keep) as usize ;
6762 let remove_end_index = ( len - end_keep) as usize ;
68- self . stack . drain ( remove_start_index..remove_end_index) ;
63+ self . 0 . drain ( remove_start_index..remove_end_index) ;
6964 }
7065
7166 #[ inline( always) ]
72- pub ( crate ) fn push ( & mut self , value : RawWasmValue ) {
73- self . stack . push ( value) ;
67+ pub ( crate ) fn push ( & mut self , value : T ) {
68+ self . 0 . push ( value) ;
7469 }
7570
7671 #[ inline( always) ]
77- pub ( crate ) fn extend_from_slice ( & mut self , values : & [ RawWasmValue ] ) {
78- self . stack . extend_from_slice ( values) ;
72+ pub ( crate ) fn extend_from_slice ( & mut self , values : & [ T ] ) {
73+ self . 0 . extend_from_slice ( values) ;
7974 }
8075
8176 #[ inline]
82- pub ( crate ) fn last_mut ( & mut self ) -> Result < & mut RawWasmValue > {
83- match self . stack . last_mut ( ) {
77+ pub ( crate ) fn last_mut ( & mut self ) -> Result < & mut T > {
78+ match self . 0 . last_mut ( ) {
8479 Some ( v) => Ok ( v) ,
8580 None => {
8681 cold ( ) ;
@@ -90,8 +85,8 @@ impl ValueStack {
9085 }
9186
9287 #[ inline]
93- pub ( crate ) fn last ( & self ) -> Result < & RawWasmValue > {
94- match self . stack . last ( ) {
88+ pub ( crate ) fn last ( & self ) -> Result < & T > {
89+ match self . 0 . last ( ) {
9590 Some ( v) => Ok ( v) ,
9691 None => {
9792 cold ( ) ;
@@ -101,8 +96,8 @@ impl ValueStack {
10196 }
10297
10398 #[ inline( always) ]
104- pub ( crate ) fn pop ( & mut self ) -> Result < RawWasmValue > {
105- match self . stack . pop ( ) {
99+ pub ( crate ) fn pop ( & mut self ) -> Result < T > {
100+ match self . 0 . pop ( ) {
106101 Some ( v) => Ok ( v) ,
107102 None => {
108103 cold ( ) ;
@@ -119,35 +114,36 @@ impl ValueStack {
119114 #[ inline]
120115 pub ( crate ) fn break_to ( & mut self , new_stack_size : u32 , result_count : u8 ) {
121116 let start = new_stack_size as usize ;
122- let end = self . stack . len ( ) - result_count as usize ;
123- self . stack . drain ( start..end) ;
117+ let end = self . 0 . len ( ) - result_count as usize ;
118+ self . 0 . drain ( start..end) ;
124119 }
125120
126121 #[ inline]
127- pub ( crate ) fn last_n ( & self , n : usize ) -> Result < & [ RawWasmValue ] > {
128- let len = self . stack . len ( ) ;
122+ pub ( crate ) fn last_n ( & self , n : usize ) -> Result < & [ T ] > {
123+ let len = self . 0 . len ( ) ;
129124 if unlikely ( len < n) {
130125 return Err ( Error :: ValueStackUnderflow ) ;
131126 }
132- Ok ( & self . stack [ len - n..len] )
127+ Ok ( & self . 0 [ len - n..len] )
133128 }
134129
135130 #[ inline]
136- pub ( crate ) fn pop_n_rev ( & mut self , n : usize ) -> Result < alloc:: vec:: Drain < ' _ , RawWasmValue > > {
137- if unlikely ( self . stack . len ( ) < n) {
131+ pub ( crate ) fn pop_n_rev ( & mut self , n : usize ) -> Result < alloc:: vec:: Drain < ' _ , T > > {
132+ if unlikely ( self . 0 . len ( ) < n) {
138133 return Err ( Error :: ValueStackUnderflow ) ;
139134 }
140- Ok ( self . stack . drain ( ( self . stack . len ( ) - n) ..) )
135+ Ok ( self . 0 . drain ( ( self . 0 . len ( ) - n) ..) )
141136 }
142137}
143138
144139#[ cfg( test) ]
145140mod tests {
146141 use super :: * ;
142+ use crate :: runtime:: RawWasmValue ;
147143
148144 #[ test]
149145 fn test_value_stack ( ) {
150- let mut stack = ValueStack :: default ( ) ;
146+ let mut stack: ValueStack < RawWasmValue > = ValueStack :: default ( ) ;
151147 stack. push ( 1 . into ( ) ) ;
152148 stack. push ( 2 . into ( ) ) ;
153149 stack. push ( 3 . into ( ) ) ;
@@ -165,7 +161,7 @@ mod tests {
165161 macro_rules! test_macro {
166162 ( $( $n: expr, $end_keep: expr, $expected: expr ) ,* ) => {
167163 $(
168- let mut stack = ValueStack :: default ( ) ;
164+ let mut stack: ValueStack < RawWasmValue > = ValueStack :: default ( ) ;
169165 stack. push( 1 . into( ) ) ;
170166 stack. push( 2 . into( ) ) ;
171167 stack. push( 3 . into( ) ) ;
0 commit comments