@@ -5,11 +5,13 @@ use genco::prelude::*;
55use crate :: {
66 codegen:: ir:: AnalyzedImports ,
77 go:: {
8- GoIdentifier , comment,
8+ comment,
99 imports:: {
10- CONTEXT_CONTEXT , ERRORS_NEW , SYNC_MUTEX , WAZERO_API_MEMORY , WAZERO_API_MODULE ,
11- WAZERO_COMPILED_MODULE , WAZERO_NEW_MODULE_CONFIG , WAZERO_NEW_RUNTIME , WAZERO_RUNTIME ,
10+ CONTEXT_CONTEXT , ERRORS_NEW , SYNC_MUTEX , WASI_SNAPSHOT_PREVIEW1_MUST_INSTANTIATE ,
11+ WAZERO_API_MEMORY , WAZERO_API_MODULE , WAZERO_COMPILED_MODULE , WAZERO_MODULE_CONFIG ,
12+ WAZERO_NEW_MODULE_CONFIG , WAZERO_NEW_RUNTIME , WAZERO_RUNTIME ,
1213 } ,
14+ GoIdentifier ,
1315 } ,
1416} ;
1517
@@ -148,10 +150,31 @@ impl<'a> FactoryGenerator<'a> {
148150 }
149151 }
150152 $[ '\n' ]
153+ func $( factory_name) WithWasmBytes [ $( generics_with_constraints) ] ( wasmBytes [ ] byte) $options_name[ $generics] {
154+ return func( factory * $factory_name_with_generics) {
155+ factory. wasmBytes = wasmBytes
156+ }
157+ }
158+ $[ '\n' ]
159+ func $( factory_name) WithModuleConfig [ $( generics_with_constraints) ] ( config $WAZERO_MODULE_CONFIG ) $options_name[ $generics] {
160+ return func( factory * $factory_name_with_generics) {
161+ factory. moduleConfig = config
162+ }
163+ }
164+ $[ '\n' ]
165+ func $( factory_name) WithWASI [ $( generics_with_constraints) ] ( ) $options_name[ $generics] {
166+ return func( factory * $factory_name_with_generics) {
167+ factory. enableWASI = true
168+ }
169+ }
170+ $[ '\n' ]
151171 type $factory_name[ $( for ( value_param, pointer_param, pointer_iface) in & type_param_data join ( , ) => $value_param any, $pointer_param $pointer_iface[ $value_param] ) ] struct {
152172 runtime $WAZERO_RUNTIME
153173 module $WAZERO_COMPILED_MODULE
154174 architecture Architecture
175+ wasmBytes [ ] byte
176+ moduleConfig $WAZERO_MODULE_CONFIG
177+ enableWASI bool
155178 $[ '\r' ]
156179 $( for ( _iface_name, _resource_name, prefixed_name, type_param_name) in resource_info. iter( ) join ( $[ '\r' ] ) =>
157180 $( & GoIdentifier :: public( format!( "{}-resource-table" , prefixed_name) ) ) * $( & GoIdentifier :: private( format!( "{}-resource-table" , prefixed_name) ) ) [ $( & GoIdentifier :: public( format!( "t-{}-value" , prefixed_name) ) ) , $( & GoIdentifier :: public( format!( "p-{}" , String :: from( type_param_name) ) ) ) ] )
@@ -164,40 +187,33 @@ impl<'a> FactoryGenerator<'a> {
164187 $[ '\r' ]
165188 opts ...$options_name[ $generics] ,
166189 ) ( * $factory_name[ $( for ( value_param, pointer_param, _) in & type_param_data join ( , ) => $value_param, $pointer_param) ] , error) {
167- $[ '\r' ]
168- wazeroRuntime : = $WAZERO_NEW_RUNTIME ( ctx)
169-
170190 $[ '\r' ]
171191 $( comment( & [ "Initialize resource tables before host module instantiation" ] ) )
172192 $( for ( _iface_name, _resource_name, prefixed_name, type_param_name) in resource_info. iter( ) join ( $[ '\r' ] ) =>
173193 $( & GoIdentifier :: private( format!( "{}_resource_table" , prefixed_name) ) ) : = new$( & GoIdentifier :: public( format!( "{}-resource-table" , prefixed_name) ) ) [ $( & GoIdentifier :: public( format!( "t-{}-value" , prefixed_name) ) ) , $( & GoIdentifier :: public( format!( "p-{}" , String :: from( type_param_name) ) ) ) ] ( ) )
174194 $[ '\r' ]
175195
176- $[ '\r' ]
177- $( comment( & [
178- "Compiling the module takes a LONG time, so we want to do it once and hold" ,
179- "onto it with the Runtime" ,
180- ] ) )
181- module, err : = wazeroRuntime. CompileModule ( ctx, $wasm_var_name)
182- if err != nil {
183- return nil, err
184- }
185- $[ '\r' ]
186-
187196 factory : = & $factory_name[ $( for ( value_param, pointer_param, _) in & type_param_data join ( , ) => $value_param, $pointer_param) ] {
188- runtime: wazeroRuntime,
189- module: module,
190197 $( comment( [ "Initialize architecture to wasm32 by default" ] ) )
191198 architecture: ArchitectureWasm32 ,
192199 $[ '\r' ]
193200 $( for ( _iface_name, _resource_name, prefixed_name, _) in resource_info. iter( ) =>
194201 $( & GoIdentifier :: public( format!( "{}-resource-table" , prefixed_name) ) ) : $( & GoIdentifier :: private( format!( "{}_resource_table" , prefixed_name) ) ) , $[ '\r' ] )
195202 }
196203 $[ '\r' ]
204+ $( comment( & [ "Apply options before instantiation" ] ) )
197205 for _, opt : = range opts {
198206 opt( factory)
199207 }
200208 $[ '\r' ]
209+ wazeroRuntime : = $WAZERO_NEW_RUNTIME ( ctx)
210+ factory. runtime = wazeroRuntime
211+ $[ '\r' ]
212+ $( comment( & [ "Instantiate WASI if enabled" ] ) )
213+ if factory. enableWASI {
214+ $WASI_SNAPSHOT_PREVIEW1_MUST_INSTANTIATE ( ctx, wazeroRuntime)
215+ }
216+ $[ '\r' ]
201217 $( comment( & [ "Instantiate import host modules" ] ) )
202218 $( for chain in self . config. import_chains. values( ) =>
203219 $chain
@@ -209,11 +225,31 @@ impl<'a> FactoryGenerator<'a> {
209225 $chain
210226 $[ '\r' ]
211227 )
228+ $[ '\r' ]
229+ $( comment( & [
230+ "Compiling the module takes a LONG time, so we want to do it once and hold" ,
231+ "onto it with the Runtime" ,
232+ ] ) )
233+ wasmBytes : = $wasm_var_name
234+ if factory. wasmBytes != nil {
235+ wasmBytes = factory. wasmBytes
236+ }
237+ module, err : = wazeroRuntime. CompileModule ( ctx, wasmBytes)
238+ if err != nil {
239+ wazeroRuntime. Close ( ctx)
240+ return nil, err
241+ }
242+ factory. module = module
243+ $[ '\r' ]
212244 return factory, nil
213245 }
214246 $[ '\n' ]
215247 func ( f * $factory_name[ $( for ( value_param, pointer_param, _) in & type_param_data join ( , ) => $value_param, $pointer_param) ] ) Instantiate ( ctx $CONTEXT_CONTEXT ) ( * $instance_name[ $( for ( value_param, pointer_param, _) in & type_param_data join ( , ) => $value_param, $pointer_param) ] , error) {
216- if module, err : = f. runtime. InstantiateModule ( ctx, f. module, $WAZERO_NEW_MODULE_CONFIG ( ) ) ; err != nil {
248+ config : = f. moduleConfig
249+ if f. moduleConfig == nil {
250+ config = $WAZERO_NEW_MODULE_CONFIG ( )
251+ }
252+ if module, err : = f. runtime. InstantiateModule ( ctx, f. module, config) ; err != nil {
217253 return nil, err
218254 } else {
219255 return & $instance_name[ $( for ( value_param, pointer_param, _) in & type_param_data join ( , ) => $value_param, $pointer_param) ] {
@@ -242,10 +278,31 @@ impl<'a> FactoryGenerator<'a> {
242278 }
243279 }
244280 $[ '\n' ]
281+ func $( factory_name) WithWasmBytes ( wasmBytes [ ] byte) $( factory_name) Options {
282+ return func( factory * $factory_name) {
283+ factory. wasmBytes = wasmBytes
284+ }
285+ }
286+ $[ '\n' ]
287+ func $( factory_name) WithModuleConfig ( config $WAZERO_MODULE_CONFIG ) $( factory_name) Options {
288+ return func( factory * $factory_name) {
289+ factory. moduleConfig = config
290+ }
291+ }
292+ $[ '\n' ]
293+ func $( factory_name) WithWASI ( ) $( factory_name) Options {
294+ return func( factory * $factory_name) {
295+ factory. enableWASI = true
296+ }
297+ }
298+ $[ '\n' ]
245299 type $factory_name struct {
246300 runtime $WAZERO_RUNTIME
247301 module $WAZERO_COMPILED_MODULE
248302 architecture Architecture
303+ wasmBytes [ ] byte
304+ moduleConfig $WAZERO_MODULE_CONFIG
305+ enableWASI bool
249306 }
250307 $[ '\n' ]
251308 func $constructor_name(
@@ -254,39 +311,54 @@ impl<'a> FactoryGenerator<'a> {
254311 $( & interface. constructor_param_name) $( & interface. go_interface_name) , )
255312 opts ...$( factory_name) Options ,
256313 ) ( * $factory_name, error) {
257- wazeroRuntime : = $WAZERO_NEW_RUNTIME ( ctx)
258- $[ '\r' ]
259- $( comment( & [
260- "Compiling the module takes a LONG time, so we want to do it once and hold" ,
261- "onto it with the Runtime" ,
262- ] ) )
263- module, err : = wazeroRuntime. CompileModule ( ctx, $wasm_var_name)
264- if err != nil {
265- return nil, err
266- }
267314 factory : = & $factory_name{
268- runtime: wazeroRuntime,
269- module: module,
270315 $( comment( [ "Initialize architecture to wasm32 by default" ] ) )
271316 architecture: ArchitectureWasm32 ,
272317 }
273-
274318 $[ '\r' ]
319+ $( comment( & [ "Apply options before instantiation" ] ) )
275320 for _, opt : = range opts {
276321 opt( factory)
277322 }
278323 $[ '\r' ]
324+ wazeroRuntime : = $WAZERO_NEW_RUNTIME ( ctx)
325+ factory. runtime = wazeroRuntime
326+ $[ '\r' ]
327+ $( comment( & [ "Instantiate WASI if enabled" ] ) )
328+ if factory. enableWASI {
329+ $WASI_SNAPSHOT_PREVIEW1_MUST_INSTANTIATE ( ctx, wazeroRuntime)
330+ }
331+ $[ '\r' ]
279332 $( comment( & [ "Instantiate import host modules" ] ) )
280333 $( for chain in self . config. import_chains. values( ) =>
281- $chain
282- $[ '\r' ]
334+ $chain
335+ $[ '\r' ]
283336 )
284-
337+ $[ '\r' ]
338+ $( comment( & [
339+ "Compiling the module takes a LONG time, so we want to do it once and hold" ,
340+ "onto it with the Runtime" ,
341+ ] ) )
342+ wasmBytes : = $wasm_var_name
343+ if factory. wasmBytes != nil {
344+ wasmBytes = factory. wasmBytes
345+ }
346+ module, err : = wazeroRuntime. CompileModule ( ctx, wasmBytes)
347+ if err != nil {
348+ wazeroRuntime. Close ( ctx)
349+ return nil, err
350+ }
351+ factory. module = module
352+ $[ '\r' ]
285353 return factory, nil
286354 }
287355 $[ '\n' ]
288356 func ( f * $factory_name) Instantiate ( ctx $CONTEXT_CONTEXT ) ( * $instance_name, error) {
289- if module, err : = f. runtime. InstantiateModule ( ctx, f. module, $WAZERO_NEW_MODULE_CONFIG ( ) ) ; err != nil {
357+ config : = f. moduleConfig
358+ if f. moduleConfig == nil {
359+ config = $WAZERO_NEW_MODULE_CONFIG ( )
360+ }
361+ if module, err : = f. runtime. InstantiateModule ( ctx, f. module, config) ; err != nil {
290362 return nil, err
291363 } else {
292364 return & $instance_name{ module, f. architecture} , nil
@@ -618,7 +690,7 @@ mod tests {
618690 use genco:: lang:: go:: Tokens ;
619691
620692 use crate :: {
621- codegen:: { FactoryGenerator , factory:: FactoryConfig , ir:: AnalyzedImports } ,
693+ codegen:: { factory:: FactoryConfig , ir:: AnalyzedImports , FactoryGenerator } ,
622694 go:: GoIdentifier ,
623695 } ;
624696
0 commit comments