Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
de465562
wa
项目概览
wa-lang
/
wa
10 个月 前同步成功
通知
68
Star
655
Fork
45
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
wa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
de465562
编写于
6月 21, 2023
作者:
chai2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化 api.RunCode
上级
d93a368d
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
48 addition
and
34 deletion
+48
-34
api/api_nowasm.go
api/api_nowasm.go
+14
-14
api/api_nowasm_test.go
api/api_nowasm_test.go
+1
-1
api/hello.go
api/hello.go
+1
-1
internal/wazero/module.go
internal/wazero/module.go
+14
-16
internal/wazero/module_test.go
internal/wazero/module_test.go
+2
-2
internal/wazero/util.go
internal/wazero/util.go
+16
-0
未找到文件。
api/api_nowasm.go
浏览文件 @
de465562
...
...
@@ -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
,
arg
s
...
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
}
api/api_nowasm_test.go
浏览文件 @
de465562
...
...
@@ -11,7 +11,7 @@ import (
func
ExampleRunCode
()
{
const
code
=
`
var
gBase: i32 = 1000
global
gBase: i32 = 1000
func main() {
println(add(40, 2) + gBase)
...
...
api/hello.go
浏览文件 @
de465562
...
...
@@ -31,7 +31,7 @@ func main() {
}
const
code
=
`
func main
()
{
func main {
println(add(40, 2))
}
...
...
internal/wazero/module.go
浏览文件 @
de465562
...
...
@@ -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
,
)
}
internal/wazero/module_test.go
浏览文件 @
de465562
...
...
@@ -32,8 +32,8 @@ func add(a:i32, b:i32) => i32 {
}
defer
m
.
Close
()
//
init+
main 执行
stdout
,
_
,
err
:=
m
.
Run
InitOnce
()
// main 执行
stdout
,
_
,
err
:=
m
.
Run
Main
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
...
...
internal/wazero/util.go
0 → 100644
浏览文件 @
de465562
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录