land/cmd/land/main.go

51 lines
919 B
Go

package main
import (
"context"
"flag"
"os"
"github.com/Xe/ln"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
flag.Parse()
if flag.NArg() != 1 {
ln.Fatal(ctx, ln.Info("please pass a webassembly file to run"))
}
fname := flag.Arg(0)
fin, err := os.Open(fname)
if err != nil {
ln.FatalErr(ctx, err, ln.F{"msg": "can't open file", "fname": fname})
}
defer fin.Close()
p, err := NewProcess(fin)
if err != nil {
ln.FatalErr(ctx, err, ln.F{"msg": "can't create process", "fname": fname})
}
foundMain := false
mainID := uint32(0)
for name, entry := range p.mod.Export.Entries {
if name == "main" && entry.FieldStr == "main" {
mainID = entry.Index
foundMain = true
break
}
}
if !foundMain {
ln.Fatal(ctx, ln.F{"msg": "no main function exported"})
}
_, err = p.vm.ExecCode(int64(mainID))
if err != nil {
ln.FatalErr(ctx, err)
}
}