1- use crate :: { log, unlikely } ;
1+ use crate :: log;
22use crate :: { Error , Result , Trap } ;
33use alloc:: { vec, vec:: Vec } ;
44use tinywasm_types:: * ;
@@ -36,8 +36,22 @@ impl TableInstance {
3636 } )
3737 }
3838
39+ pub ( crate ) fn fill ( & mut self , func_addrs : & [ u32 ] , addr : usize , len : usize , val : TableElement ) -> Result < ( ) > {
40+ let val = val. map ( |addr| self . resolve_func_ref ( func_addrs, addr) ) ;
41+ let end = addr. checked_add ( len) . ok_or_else ( || self . trap_oob ( addr, len) ) ?;
42+ if end > self . elements . len ( ) {
43+ return Err ( self . trap_oob ( addr, len) ) ;
44+ }
45+
46+ self . elements [ addr..end] . fill ( val) ;
47+ Ok ( ( ) )
48+ }
49+
3950 pub ( crate ) fn get ( & self , addr : TableAddr ) -> Result < & TableElement > {
40- self . elements . get ( addr as usize ) . ok_or_else ( || Error :: Trap ( Trap :: UndefinedElement { index : addr as usize } ) )
51+ // self.elements.get(addr as usize).ok_or_else(|| Error::Trap(Trap::UndefinedElement { index: addr as usize }))
52+ self . elements . get ( addr as usize ) . ok_or_else ( || {
53+ Error :: Trap ( Trap :: TableOutOfBounds { offset : addr as usize , len : 1 , max : self . elements . len ( ) } )
54+ } )
4155 }
4256
4357 pub ( crate ) fn copy_from_slice ( & mut self , dst : usize , src : & [ TableElement ] ) -> Result < ( ) > {
@@ -81,19 +95,28 @@ impl TableInstance {
8195 Ok ( ( ) )
8296 }
8397
84- pub ( crate ) fn set ( & mut self , table_idx : TableAddr , value : Addr ) -> Result < ( ) > {
85- self . grow_to_fit ( table_idx as usize + 1 )
86- . map ( |_| self . elements [ table_idx as usize ] = TableElement :: Initialized ( value) )
98+ pub ( crate ) fn set ( & mut self , table_idx : TableAddr , value : TableElement ) -> Result < ( ) > {
99+ if table_idx as usize >= self . elements . len ( ) {
100+ return Err ( self . trap_oob ( table_idx as usize , 1 ) ) ;
101+ }
102+
103+ self . elements [ table_idx as usize ] = value;
104+ Ok ( ( ) )
87105 }
88106
89- pub ( crate ) fn grow_to_fit ( & mut self , new_size : usize ) -> Result < ( ) > {
90- if new_size > self . elements . len ( ) {
91- if unlikely ( new_size > self . kind . size_max . unwrap_or ( MAX_TABLE_SIZE ) as usize ) {
92- return Err ( crate :: Trap :: TableOutOfBounds { offset : new_size, len : 1 , max : self . elements . len ( ) } . into ( ) ) ;
93- }
107+ pub ( crate ) fn grow ( & mut self , n : i32 , init : TableElement ) -> Result < ( ) > {
108+ let len = n + self . elements . len ( ) as i32 ;
109+ let max = self . kind . size_max . unwrap_or ( MAX_TABLE_SIZE ) as i32 ;
94110
95- self . elements . resize ( new_size, TableElement :: Uninitialized ) ;
111+ if len > max {
112+ return Err ( Error :: Trap ( crate :: Trap :: TableOutOfBounds {
113+ offset : len as usize ,
114+ len : 1 ,
115+ max : self . elements . len ( ) ,
116+ } ) ) ;
96117 }
118+
119+ self . elements . resize ( len as usize , init) ;
97120 Ok ( ( ) )
98121 }
99122
@@ -186,15 +209,21 @@ mod tests {
186209 let kind = dummy_table_type ( ) ;
187210 let mut table_instance = TableInstance :: new ( kind, 0 ) ;
188211
189- table_instance. set ( 0 , 0 ) . expect ( "Setting table element failed" ) ;
212+ table_instance. set ( 0 , TableElement :: Initialized ( 0 ) ) . expect ( "Setting table element failed" ) ;
213+ table_instance. set ( 1 , TableElement :: Uninitialized ) . expect ( "Setting table element failed" ) ;
190214
191215 match table_instance. get_wasm_val ( 0 ) {
192216 Ok ( WasmValue :: RefFunc ( _) ) => { }
193217 _ => assert ! ( false , "get_wasm_val failed to return the correct WasmValue" ) ,
194218 }
195219
220+ match table_instance. get_wasm_val ( 1 ) {
221+ Ok ( WasmValue :: RefNull ( ValType :: RefFunc ) ) => { }
222+ _ => assert ! ( false , "get_wasm_val failed to return the correct WasmValue" ) ,
223+ }
224+
196225 match table_instance. get_wasm_val ( 999 ) {
197- Err ( Error :: Trap ( Trap :: UndefinedElement { .. } ) ) => { }
226+ Err ( Error :: Trap ( Trap :: TableOutOfBounds { .. } ) ) => { }
198227 _ => assert ! ( false , "get_wasm_val failed to handle undefined element correctly" ) ,
199228 }
200229 }
@@ -204,7 +233,7 @@ mod tests {
204233 let kind = dummy_table_type ( ) ;
205234 let mut table_instance = TableInstance :: new ( kind, 0 ) ;
206235
207- let result = table_instance. set ( 0 , 1 ) ;
236+ let result = table_instance. set ( 0 , TableElement :: Initialized ( 1 ) ) ;
208237 assert ! ( result. is_ok( ) , "Setting table element failed" ) ;
209238
210239 let elem = table_instance. get ( 0 ) ;
@@ -219,7 +248,7 @@ mod tests {
219248 let kind = dummy_table_type ( ) ;
220249 let mut table_instance = TableInstance :: new ( kind, 0 ) ;
221250
222- let result = table_instance. set ( 15 , 1 ) ;
251+ let result = table_instance. set ( 15 , TableElement :: Initialized ( 1 ) ) ;
223252 assert ! ( result. is_ok( ) , "Table grow on set failed" ) ;
224253
225254 let size = table_instance. size ( ) ;
0 commit comments