github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/imports/emscripten/emscripten_example_test.go (about)

     1  package emscripten_test
     2  
     3  import (
     4  	"context"
     5  	_ "embed"
     6  
     7  	"github.com/bananabytelabs/wazero"
     8  	"github.com/bananabytelabs/wazero/imports/emscripten"
     9  	"github.com/bananabytelabs/wazero/imports/wasi_snapshot_preview1"
    10  )
    11  
    12  //go:embed testdata/invoke.wasm
    13  var invokeWasm []byte
    14  
    15  // This shows how to instantiate Emscripten function imports.
    16  func Example_instantiateForModule() {
    17  	ctx := context.Background()
    18  
    19  	r := wazero.NewRuntime(ctx)
    20  	defer r.Close(ctx) // This closes everything this Runtime created.
    21  
    22  	// Add WASI which is typically required when using Emscripten.
    23  	wasi_snapshot_preview1.MustInstantiate(ctx, r)
    24  
    25  	// Compile the WASM so wazero can handle dynamically generated imports.
    26  	compiled, err := r.CompileModule(ctx, invokeWasm)
    27  	if err != nil {
    28  		panic(err)
    29  	}
    30  
    31  	envCloser, err := emscripten.InstantiateForModule(ctx, r, compiled)
    32  	if err != nil {
    33  		panic(err)
    34  	}
    35  	defer envCloser.Close(ctx) // This closes the env module.
    36  
    37  	// Output:
    38  }
    39  
    40  // This shows how to instantiate Emscripten function imports when you also need
    41  // other functions in the "env" module.
    42  func Example_functionExporter() {
    43  	ctx := context.Background()
    44  
    45  	r := wazero.NewRuntime(ctx)
    46  	defer r.Close(ctx) // This closes everything this Runtime created.
    47  
    48  	// Add WASI which is typically required when using Emscripten.
    49  	wasi_snapshot_preview1.MustInstantiate(ctx, r)
    50  
    51  	// Compile the WASM so wazero can handle dynamically generated imports.
    52  	compiled, err := r.CompileModule(ctx, invokeWasm)
    53  	if err != nil {
    54  		panic(err)
    55  	}
    56  	exporter, err := emscripten.NewFunctionExporterForModule(compiled)
    57  	if err != nil {
    58  		panic(err)
    59  	}
    60  	// Next, construct your own module builder for "env" with any functions
    61  	// you need.
    62  	envBuilder := r.NewHostModuleBuilder("env").
    63  		NewFunctionBuilder().
    64  		WithFunc(func() uint32 { return 1 }).
    65  		Export("get_int")
    66  
    67  	// Now, add Emscripten special function imports into it.
    68  	exporter.ExportFunctions(envBuilder)
    69  	// Output:
    70  }