提交 73ee667a 编写于 作者: chai2010's avatar chai2010

删除 tools/wa-wasmer-run

上级 f72161bc
module github.com/wa-lang/wa/tools/wa-wasmer-run
go 1.18
require github.com/wasmerio/wasmer-go v1.0.4
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/wasmerio/wasmer-go v1.0.4 h1:MnqHoOGfiQ8MMq2RF6wyCeebKOe84G88h5yv+vmxJgs=
github.com/wasmerio/wasmer-go v1.0.4/go.mod h1:0gzVdSfg6pysA6QVp6iVRPTagC6Wq9pOE8J86WKb2Fk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
// 版权 @2022 凹语言 作者。保留所有权利。
package main
import (
"encoding/binary"
"flag"
"fmt"
"os"
"github.com/wasmerio/wasmer-go/wasmer"
)
var flagFile = flag.String("file", "a.out.wasm", "wasm file")
func main() {
flag.Parse()
wasmBytes, err := os.ReadFile(*flagFile)
if err != nil {
fmt.Printf("read %q failed: %v", *flagFile, err)
os.Exit(1)
}
if err = Run(wasmBytes); err != nil {
fmt.Printf("run %q failed: %v", *flagFile, err)
os.Exit(1)
}
}
func Run(wasmBytes []byte) error {
engine := wasmer.NewEngine()
store := wasmer.NewStore(engine)
module, err := wasmer.NewModule(store, wasmBytes)
if err != nil {
return err
}
var memory *wasmer.Memory
// type iov struct { iov_base, iov_len int32 }
// func fd_write(fd int32, id *iov, iovs_len int32, nwritten *int32) (errno int32)
wasiFdWrite := wasmer.NewFunction(store,
wasmer.NewFunctionType(
wasmer.NewValueTypes(wasmer.I32, wasmer.I32, wasmer.I32, wasmer.I32),
wasmer.NewValueTypes(wasmer.I32),
),
func(args []wasmer.Value) ([]wasmer.Value, error) {
var argv []int
for _, arg := range args {
argv = append(argv, int(arg.I32()))
}
iov := argv[1]
iov_base := binary.LittleEndian.Uint32(memory.Data()[iov:][:4])
iov_len := binary.LittleEndian.Uint32(memory.Data()[iov+4:][:4])
msg := string(memory.Data()[iov_base:][:iov_len])
fmt.Print(msg)
return []wasmer.Value{wasmer.NewI32(len(msg))}, nil
},
)
waBuiltinWrite := wasmer.NewFunction(store,
wasmer.NewFunctionType(
wasmer.NewValueTypes(wasmer.I32),
wasmer.NewValueTypes(),
),
func(args []wasmer.Value) ([]wasmer.Value, error) {
if len(args) > 0 {
fmt.Println(args[0].I32())
}
return nil, nil
},
)
importObject := wasmer.NewImportObject()
importObject.Register("wasi_snapshot_preview1", map[string]wasmer.IntoExtern{
"fd_write": wasiFdWrite,
})
importObject.Register("env", map[string]wasmer.IntoExtern{
"__wa_builtin_print_int32": waBuiltinWrite,
})
instance, err := wasmer.NewInstance(module, importObject)
if err != nil {
return err
}
memory, err = instance.Exports.GetMemory("memory")
if err != nil {
return err
}
_start_fn, err := instance.Exports.GetFunction("_start")
if err != nil {
return err
}
if _, err = _start_fn(); err != nil {
return err
}
return nil
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册