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

优化 api.RunCode

上级 d93a368d
......@@ -6,27 +6,27 @@
package api
import (
"os"
"wa-lang.org/wa/internal/app/apputil"
"wa-lang.org/wa/internal/config"
"wa-lang.org/wa/internal/wabt"
"wa-lang.org/wa/internal/wazero"
)
// 执行凹代码
func RunCode(cfg *config.Config, filename, code string, arg ...string) (stdoutStderr []byte, err error) {
func RunCode(cfg *config.Config, filename, code string, args ...string) (stdoutStderr []byte, err error) {
// 编译为 wat 格式
wat, err := BuildFile(cfg, filename, code)
// wat 写到临时文件
outfile := "a.out.wat"
if !*FlagDebugMode {
defer os.Remove(outfile)
watBytes, err := BuildFile(cfg, filename, code)
if err != nil {
return
}
if err = os.WriteFile(outfile, []byte(wat), 0666); err != nil {
return nil, err
// wat 编译为 wasm
wasmBytes, err := wabt.Wat2Wasm(watBytes)
if err != nil {
return
}
// 执行 wat 文件
stdoutStderr, err = apputil.RunWasm(cfg, outfile, arg...)
// main 执行
stdout, stderr, err := wazero.RunWasm(cfg, filename, wasmBytes, args...)
stdoutStderr = append(stdout, stderr...)
return
}
......@@ -11,7 +11,7 @@ import (
func ExampleRunCode() {
const code = `
var gBase: i32 = 1000
global gBase: i32 = 1000
func main() {
println(add(40, 2) + gBase)
......
......@@ -31,7 +31,7 @@ func main() {
}
const code = `
func main() {
func main {
println(add(40, 2))
}
......
......@@ -55,8 +55,11 @@ func BuildModule(
}
// 执行初始化, 仅执行一次
func (p *Module) RunInitOnce() (stdout, stderr []byte, err error) {
p.wazeroOnce.Do(func() { p.runInitFunc() })
func (p *Module) RunMain() (stdout, stderr []byte, err error) {
p.wazeroModule, p.wazeroInitErr = p.wazeroRuntime.InstantiateModule(
p.wazeroCtx, p.wazeroCompileModule, p.wazeroConf,
)
stdout = p.stdoutBuffer.Bytes()
stderr = p.stderrBuffer.Bytes()
err = p.wazeroInitErr
......@@ -65,8 +68,15 @@ func (p *Module) RunInitOnce() (stdout, stderr []byte, err error) {
// 执行指定函数(init会被强制执行一次)
func (p *Module) RunFunc(name string, args ...uint64) (result []uint64, stdout, stderr []byte, err error) {
stdout, stderr, err = p.RunInitOnce()
if err != nil {
if p.wazeroModule == nil {
p.wazeroModule, p.wazeroInitErr = p.wazeroRuntime.InstantiateModule(
p.wazeroCtx, p.wazeroCompileModule, p.wazeroConf,
)
}
if p.wazeroInitErr != nil {
stdout = p.stdoutBuffer.Bytes()
stderr = p.stderrBuffer.Bytes()
err = p.wazeroInitErr
return
}
......@@ -150,15 +160,3 @@ func (p *Module) buildModule() error {
return nil
}
func (p *Module) runInitFunc() {
if err := p.wazeroInitErr; err != nil {
return
}
if p.wazeroModule != nil {
return
}
p.wazeroModule, p.wazeroInitErr = p.wazeroRuntime.InstantiateModule(
p.wazeroCtx, p.wazeroCompileModule, p.wazeroConf,
)
}
......@@ -32,8 +32,8 @@ func add(a:i32, b:i32) => i32 {
}
defer m.Close()
// init+main 执行
stdout, _, err := m.RunInitOnce()
// main 执行
stdout, _, err := m.RunMain()
if err != nil {
t.Fatal(err)
}
......
package wazero
import (
"wa-lang.org/wa/internal/config"
)
// 单次执行 wasm
func RunWasm(cfg *config.Config, wasmName string, wasmBytes []byte, wasmArgs ...string) (stdout, stderr []byte, err error) {
m, err := BuildModule(cfg, wasmName, wasmBytes, wasmArgs...)
if err != nil {
return
}
defer m.Close()
return m.RunMain()
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册