1
- use super :: { CallHooks , FuncInOut , HostFuncEntity , ResourceLimiterRef , StoreInner } ;
2
- use crate :: { core:: hint, CallHook , Error , Instance , Store } ;
1
+ use super :: { typeid, CallHooks , FuncInOut , HostFuncEntity , StoreInner } ;
2
+ use crate :: {
3
+ core:: { hint, MemoryError , TableError , UntypedVal } ,
4
+ CallHook ,
5
+ Error ,
6
+ Instance ,
7
+ Memory ,
8
+ Store ,
9
+ Table ,
10
+ } ;
3
11
use core:: {
4
- any:: { type_name, TypeId } ,
12
+ any:: type_name,
5
13
fmt:: { self , Debug } ,
6
14
mem,
7
15
} ;
@@ -15,25 +23,31 @@ use crate::Engine;
15
23
/// works for [`Store`].
16
24
#[ allow( clippy:: type_complexity) ]
17
25
#[ derive( Copy , Clone ) ]
18
- pub struct RestorePrunedWrapper {
26
+ pub struct PrunedStoreVTable {
19
27
/// Calls the given [`HostFuncEntity`] with the `params` and `results` on `instance`.
20
28
///
21
29
/// # Errors
22
30
///
23
31
/// If the called host function returned an error.
24
32
call_host_func : fn (
25
- /* store: */ & mut PrunedStore ,
26
- /* func: */ & HostFuncEntity ,
27
- /* instance: */ Option < & Instance > ,
28
- /* params_results:*/ FuncInOut ,
29
- /* call_hooks: */ CallHooks ,
33
+ store : & mut PrunedStore ,
34
+ func : & HostFuncEntity ,
35
+ instance : Option < & Instance > ,
36
+ params_results : FuncInOut ,
37
+ call_hooks : CallHooks ,
30
38
) -> Result < ( ) , Error > ,
31
- /// Returns an exclusive reference to [`StoreInner`] and a [`ResourceLimiterRef`].
32
- store_inner_and_resource_limiter_ref :
33
- fn ( & mut PrunedStore ) -> ( & mut StoreInner , ResourceLimiterRef < ' _ > ) ,
39
+ /// Grows `memory` by `delta` pages.
40
+ grow_memory : fn ( & mut PrunedStore , memory : & Memory , delta : u64 ) -> Result < u64 , MemoryError > ,
41
+ /// Grows `table` by `delta` items filling with `init`.
42
+ grow_table : fn (
43
+ & mut PrunedStore ,
44
+ table : & Table ,
45
+ delta : u64 ,
46
+ init : UntypedVal ,
47
+ ) -> Result < u64 , TableError > ,
34
48
}
35
- impl RestorePrunedWrapper {
36
- pub fn new < T : ' static > ( ) -> Self {
49
+ impl PrunedStoreVTable {
50
+ pub fn new < T > ( ) -> Self {
37
51
Self {
38
52
call_host_func : |pruned : & mut PrunedStore ,
39
53
func : & HostFuncEntity ,
@@ -51,15 +65,29 @@ impl RestorePrunedWrapper {
51
65
}
52
66
Ok ( ( ) )
53
67
} ,
54
- store_inner_and_resource_limiter_ref : |pruned : & mut PrunedStore | {
55
- pruned
56
- . restore_or_panic :: < T > ( )
57
- . store_inner_and_resource_limiter_ref ( )
68
+ grow_memory : |pruned : & mut PrunedStore ,
69
+ memory : & Memory ,
70
+ delta : u64 |
71
+ -> Result < u64 , MemoryError > {
72
+ let store: & mut Store < T > = pruned. restore_or_panic ( ) ;
73
+ let ( store, mut resource_limiter) = store. store_inner_and_resource_limiter_ref ( ) ;
74
+ let ( memory, fuel) = store. resolve_memory_and_fuel_mut ( memory) ;
75
+ memory. grow ( delta, Some ( fuel) , & mut resource_limiter)
76
+ } ,
77
+ grow_table : |pruned : & mut PrunedStore ,
78
+ table : & Table ,
79
+ delta : u64 ,
80
+ init : UntypedVal |
81
+ -> Result < u64 , TableError > {
82
+ let store: & mut Store < T > = pruned. restore_or_panic ( ) ;
83
+ let ( store, mut resource_limiter) = store. store_inner_and_resource_limiter_ref ( ) ;
84
+ let ( table, fuel) = store. resolve_table_and_fuel_mut ( table) ;
85
+ table. grow_untyped ( delta, init, Some ( fuel) , & mut resource_limiter)
58
86
} ,
59
87
}
60
88
}
61
89
}
62
- impl RestorePrunedWrapper {
90
+ impl PrunedStoreVTable {
63
91
#[ inline]
64
92
fn call_host_func (
65
93
& self ,
@@ -73,14 +101,27 @@ impl RestorePrunedWrapper {
73
101
}
74
102
75
103
#[ inline]
76
- fn store_inner_and_resource_limiter_ref < ' a > (
104
+ fn grow_memory (
105
+ & self ,
106
+ pruned : & mut PrunedStore ,
107
+ memory : & Memory ,
108
+ delta : u64 ,
109
+ ) -> Result < u64 , MemoryError > {
110
+ ( self . grow_memory ) ( pruned, memory, delta)
111
+ }
112
+
113
+ #[ inline]
114
+ fn grow_table (
77
115
& self ,
78
- pruned : & ' a mut PrunedStore ,
79
- ) -> ( & ' a mut StoreInner , ResourceLimiterRef < ' a > ) {
80
- ( self . store_inner_and_resource_limiter_ref ) ( pruned)
116
+ pruned : & mut PrunedStore ,
117
+ table : & Table ,
118
+ delta : u64 ,
119
+ init : UntypedVal ,
120
+ ) -> Result < u64 , TableError > {
121
+ ( self . grow_table ) ( pruned, table, delta, init)
81
122
}
82
123
}
83
- impl Debug for RestorePrunedWrapper {
124
+ impl Debug for PrunedStoreVTable {
84
125
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
85
126
write ! ( f, "RestorePrunedWrapper" )
86
127
}
@@ -155,23 +196,35 @@ impl PrunedStore {
155
196
)
156
197
}
157
198
158
- /// Returns an exclusive reference to [`StoreInner`] and a [`ResourceLimiterRef`].
199
+ /// Grows the [`Memory`] by `delta` pages and returns the result.
200
+ #[ inline]
201
+ pub fn grow_memory ( & mut self , memory : & Memory , delta : u64 ) -> Result < u64 , MemoryError > {
202
+ self . pruned
203
+ . restore_pruned
204
+ . clone ( )
205
+ . grow_memory ( self , memory, delta)
206
+ }
207
+
208
+ /// Grows the [`Table`] by `delta` items and returns the result.
159
209
#[ inline]
160
- pub fn store_inner_and_resource_limiter_ref (
210
+ pub fn grow_table (
161
211
& mut self ,
162
- ) -> ( & mut StoreInner , ResourceLimiterRef ) {
212
+ table : & Table ,
213
+ delta : u64 ,
214
+ init : UntypedVal ,
215
+ ) -> Result < u64 , TableError > {
163
216
self . pruned
164
217
. restore_pruned
165
218
. clone ( )
166
- . store_inner_and_resource_limiter_ref ( self )
219
+ . grow_table ( self , table , delta , init )
167
220
}
168
221
169
222
/// Restores `self` to a proper [`Store<T>`] if possible.
170
223
///
171
224
/// # Panics
172
225
///
173
226
/// If the `T` of the resulting [`Store<T>`] does not match the given `T`.
174
- fn restore_or_panic < T : ' static > ( & mut self ) -> & mut Store < T > {
227
+ fn restore_or_panic < T > ( & mut self ) -> & mut Store < T > {
175
228
let Ok ( store) = self . restore ( ) else {
176
229
panic ! (
177
230
"failed to convert `PrunedStore` back into `Store<{}>`" ,
@@ -187,8 +240,8 @@ impl PrunedStore {
187
240
///
188
241
/// If the `T` of the resulting [`Store<T>`] does not match the given `T`.
189
242
#[ inline]
190
- fn restore < T : ' static > ( & mut self ) -> Result < & mut Store < T > , PrunedStoreError > {
191
- if hint:: unlikely ( TypeId :: of :: < T > ( ) != self . pruned . id ) {
243
+ fn restore < T > ( & mut self ) -> Result < & mut Store < T > , PrunedStoreError > {
244
+ if hint:: unlikely ( typeid :: of :: < T > ( ) != self . pruned . id ) {
192
245
return Err ( PrunedStoreError ) ;
193
246
}
194
247
let store = {
0 commit comments