88class ModuleInstance (abc .ABC ):
99 """Web assembly module instance"""
1010
11- """ Instantiated module """
12-
1311 def __init__ (self ):
1412 self .exports = Exports ()
1513 self ._tables = []
@@ -23,6 +21,9 @@ def invoke(self, name, *args):
2321
2422 def table_grow (self , table_idx : int , val : int , size : int ) -> int :
2523 logger .debug (f"table_grow({ table_idx = } , { size = } , { val = } )" )
24+ if size < 0 :
25+ # When i32 is large, it's signed value is negative.
26+ return - 1
2627 table = self ._tables [table_idx ]
2728 return table .grow (val , size )
2829
@@ -31,17 +32,45 @@ def table_size(self, table_idx: int) -> int:
3132 table = self ._tables [table_idx ]
3233 return table .size ()
3334
34- def table_init (self , table_idx : int ) -> None :
35- logger .debug (f"table_init({ table_idx = } )" )
36- # _table = self._tables[table_idx]
37- raise NotImplementedError ()
38- return 0
39-
40- def table_copy (self , table_idx : int ) -> None :
41- logger .debug (f"table_copy({ table_idx = } )" )
42- # _table = self._tables[table_idx]
43- raise NotImplementedError ()
44- return 0
35+ def table_init (
36+ self , table_idx : int , elem_idx : int , d : int , s : int , n : int
37+ ) -> None :
38+ logger .debug (
39+ f"table_init({ table_idx = } , { elem_idx = } , { d = } , { s = } , { n = } )"
40+ )
41+ table = self ._tables [table_idx ]
42+ elem = self ._elems [elem_idx ]
43+ if s + n > elem .size ():
44+ raise ValueError ("s + n > elem.size" )
45+ if d + n > table .size ():
46+ raise ValueError ("d + n > table.size" )
47+ for index in range (n ):
48+ obj = elem .get_item (s + index )
49+ table .set_item (d + index , obj )
50+
51+ def table_copy (
52+ self , x_table_idx : int , y_table_idx : int , d : int , s : int , n : int
53+ ) -> None :
54+ logger .debug (
55+ f"table_copy({ x_table_idx = } , { y_table_idx = } , { d = } , { s = } , { n = } )"
56+ )
57+ x_table = self ._tables [x_table_idx ]
58+ y_table = self ._tables [y_table_idx ]
59+ if d + n > x_table .size ():
60+ raise ValueError ("d + n > x_table.size" )
61+ if s + n > y_table .size ():
62+ raise ValueError ("s + n > y_table.size" )
63+
64+ # Regions may overlap, so check dest and source:
65+ if d <= s :
66+ for index in range (n ):
67+ obj = y_table .get_item (s + index )
68+ x_table .set_item (d + index , obj )
69+ else :
70+ for index2 in range (n ):
71+ index = n - 1 - index2
72+ obj = y_table .get_item (s + index )
73+ x_table .set_item (d + index , obj )
4574
4675 def table_fill (self , table_idx : int , i : int , val : int , n : int ) -> None :
4776 logger .debug (f"table_fill({ table_idx = } , { i = } , { val = } , { n = } )" )
@@ -50,6 +79,9 @@ def table_fill(self, table_idx: int, i: int, val: int, n: int) -> None:
5079 index = i + x
5180 table .set_item (index , val )
5281
82+ def elem_drop (self , elem_idx : int ) -> None :
83+ pass
84+
5385 def memory_grow (self , memory_idx : int , amount : int ) -> int :
5486 """Grow memory and return the old size"""
5587 memory = self ._memories [memory_idx ]
@@ -99,7 +131,7 @@ def set_table_ptr(self, index, table):
99131 raise NotImplementedError ()
100132
101133 @abc .abstractmethod
102- def create_elem (self ):
134+ def create_elem (self , index : int , size : int ):
103135 raise NotImplementedError ()
104136
105137 def eval_expression (self , expr ):
@@ -145,7 +177,9 @@ def load_tables(self, wasm_module):
145177 self .set_table_ptr (index , table )
146178 elif isinstance (definition , components .Elem ):
147179 elems .append (definition )
148- self .create_elem ()
180+ index = len (self ._elems )
181+ size = len (definition .refs )
182+ self ._elems .append (self .create_elem (index , size ))
149183
150184 for index , elem in enumerate (elems ):
151185 if elem .mode :
@@ -191,8 +225,11 @@ def populate_exports(self, module):
191225class ElemInstance (abc .ABC ):
192226 """Runtime element instance"""
193227
194- def __init__ (self ):
195- pass
228+ def __init__ (self , size : int ):
229+ self ._size = size
230+
231+ def size (self ) -> int :
232+ return self ._size
196233
197234 @abc .abstractmethod
198235 def get_item (self , index : int ):
0 commit comments