Skip to content

Commit a8a9ff9

Browse files
authored
ext/wasm: Check exit code on returned error (#2223)
As part of migrating plugins to the official Go toolchain, the wasmtime call pattern needed to be updated. This should be backwards compatible with TinyGo plugins.
1 parent 0cc1aad commit a8a9ff9

File tree

1 file changed

+33
-11
lines changed

1 file changed

+33
-11
lines changed

internal/ext/wasm/wasm.go

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -258,32 +258,54 @@ func (r *Runner) Generate(ctx context.Context, req *plugin.CodeGenRequest) (*plu
258258
store := wasmtime.NewStore(engine)
259259
store.SetWasi(wasiConfig)
260260

261-
linkRegion := trace.StartRegion(ctx, "linker.Instantiate")
262-
instance, err := linker.Instantiate(store, module)
261+
linkRegion := trace.StartRegion(ctx, "linker.DefineModule")
262+
err = linker.DefineModule(store, "", module)
263263
linkRegion.End()
264264
if err != nil {
265265
return nil, fmt.Errorf("define wasi: %w", err)
266266
}
267267

268268
// Run the function
269+
fn, err := linker.GetDefault(store, "")
270+
if err != nil {
271+
return nil, fmt.Errorf("wasi: get default: %w", err)
272+
}
273+
269274
callRegion := trace.StartRegion(ctx, "call _start")
270-
nom := instance.GetExport(store, "_start").Func()
271-
_, err = nom.Call(store)
275+
_, err = fn.Call(store)
272276
callRegion.End()
273-
if err != nil {
274-
// Print WASM stdout
275-
stderrBlob, err := os.ReadFile(stderrPath)
276-
if err == nil && len(stderrBlob) > 0 {
277-
return nil, errors.New(string(stderrBlob))
278-
}
279-
return nil, fmt.Errorf("call: %w", err)
277+
278+
if cerr := checkError(err, stderrPath); cerr != nil {
279+
return nil, cerr
280280
}
281281

282282
// Print WASM stdout
283283
stdoutBlob, err := os.ReadFile(stdoutPath)
284284
if err != nil {
285285
return nil, fmt.Errorf("read file: %w", err)
286286
}
287+
287288
var resp plugin.CodeGenResponse
288289
return &resp, resp.UnmarshalVT(stdoutBlob)
289290
}
291+
292+
func checkError(err error, stderrPath string) error {
293+
if err == nil {
294+
return err
295+
}
296+
297+
var wtError *wasmtime.Error
298+
if errors.As(err, &wtError) {
299+
if code, ok := wtError.ExitStatus(); ok {
300+
if code == 0 {
301+
return nil
302+
}
303+
}
304+
}
305+
// Print WASM stdout
306+
stderrBlob, rferr := os.ReadFile(stderrPath)
307+
if rferr == nil && len(stderrBlob) > 0 {
308+
return errors.New(string(stderrBlob))
309+
}
310+
return fmt.Errorf("call: %w", err)
311+
}

0 commit comments

Comments
 (0)