Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
9558eaea
wa
项目概览
wa-lang
/
wa
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
9558eaea
编写于
11月 29, 2022
作者:
chai2010
浏览文件
操作
浏览文件
下载
差异文件
合并分支
上级
5acae3a5
11670ae4
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
130 addition
and
88 deletion
+130
-88
internal/backends/compiler_wat/compile.go
internal/backends/compiler_wat/compile.go
+6
-4
internal/backends/compiler_wat/compile_func.go
internal/backends/compiler_wat/compile_func.go
+28
-19
internal/backends/compiler_wat/compile_global.go
internal/backends/compiler_wat/compile_global.go
+3
-2
internal/backends/compiler_wat/util.go
internal/backends/compiler_wat/util.go
+32
-14
internal/backends/compiler_wat/wir/funcion.go
internal/backends/compiler_wat/wir/funcion.go
+1
-1
internal/backends/compiler_wat/wir/module.go
internal/backends/compiler_wat/wir/module.go
+3
-3
internal/backends/compiler_wat/wir/util.go
internal/backends/compiler_wat/wir/util.go
+33
-4
internal/backends/compiler_wat/wir/value_block.go
internal/backends/compiler_wat/wir/value_block.go
+3
-3
internal/backends/compiler_wat/wir/value_slice.go
internal/backends/compiler_wat/wir/value_slice.go
+2
-2
internal/backends/compiler_wat/wir/value_string.go
internal/backends/compiler_wat/wir/value_string.go
+1
-1
internal/backends/compiler_wat/wir/value_struct.go
internal/backends/compiler_wat/wir/value_struct.go
+3
-25
internal/backends/compiler_wat/wir/wat/function.go
internal/backends/compiler_wat/wir/wat/function.go
+5
-2
internal/backends/compiler_wat/wir/wat/wat.go
internal/backends/compiler_wat/wir/wat/wat.go
+5
-4
internal/backends/compiler_wat/wir/wir.go
internal/backends/compiler_wat/wir/wir.go
+5
-4
未找到文件。
internal/backends/compiler_wat/compile.go
浏览文件 @
9558eaea
...
...
@@ -43,11 +43,13 @@ func (p *Compiler) Compile(prog *loader.Program) (output string, err error) {
{
var
f
wir
.
Function
f
.
Name
=
"_start"
f
.
InternalName
,
f
.
ExternalName
=
"_start"
,
"_start"
f
.
Insts
=
append
(
f
.
Insts
,
wat
.
NewInstCall
(
"$waGlobalAlloc"
))
n
:=
wir
.
GetPkgMangleName
(
prog
.
SSAMainPkg
.
Pkg
.
Path
())
+
"init"
n
,
_
:=
wir
.
GetPkgMangleName
(
prog
.
SSAMainPkg
.
Pkg
.
Path
())
n
+=
".init"
f
.
Insts
=
append
(
f
.
Insts
,
wat
.
NewInstCall
(
n
))
n
=
wir
.
GetPkgMangleName
(
prog
.
SSAMainPkg
.
Pkg
.
Path
())
+
"main"
n
,
_
=
wir
.
GetPkgMangleName
(
prog
.
SSAMainPkg
.
Pkg
.
Path
())
n
+=
".main"
f
.
Insts
=
append
(
f
.
Insts
,
wat
.
NewInstCall
(
n
))
p
.
module
.
AddFunc
(
&
f
)
}
...
...
@@ -106,7 +108,7 @@ func (p *Compiler) CompilePkgFunc(ssaPkg *ssa.Package) {
if
len
(
v
.
LinkName
())
>
0
{
fn_name
=
v
.
LinkName
()
}
else
{
fn_name
=
GetFnMangleName
(
v
)
fn_name
,
_
=
GetFnMangleName
(
v
)
}
sig
:=
wir
.
NewFnSigFromSignature
(
v
.
Signature
)
...
...
internal/backends/compiler_wat/compile_func.go
浏览文件 @
9558eaea
...
...
@@ -139,7 +139,7 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
return
nv
case
*
ssa
.
Function
:
fn_name
:=
GetFnMangleName
(
v
)
fn_name
,
_
:=
GetFnMangleName
(
v
)
fn_sig
:=
wir
.
NewFnSigFromSignature
(
v
.
Signature
)
return
valueWrap
{
value
:
wir
.
GenConstFnValue
(
fn_name
,
fn_sig
)}
...
...
@@ -152,9 +152,10 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
func
(
g
*
functionGenerator
)
genFunction
(
f
*
ssa
.
Function
)
*
wir
.
Function
{
var
wir_fn
wir
.
Function
if
len
(
f
.
LinkName
())
>
0
{
wir_fn
.
Name
=
f
.
LinkName
()
wir_fn
.
InternalName
=
f
.
LinkName
()
wir_fn
.
ExternalName
=
f
.
LinkName
()
}
else
{
wir_fn
.
Name
=
GetFnMangleName
(
f
)
wir_fn
.
InternalName
,
wir_fn
.
External
Name
=
GetFnMangleName
(
f
)
}
rets
:=
f
.
Signature
.
Results
()
...
...
@@ -451,7 +452,8 @@ func (g *functionGenerator) genCall(inst *ssa.Call) (insts []wat.Inst, ret_type
if
len
(
callee
.
LinkName
())
>
0
{
insts
=
append
(
insts
,
wat
.
NewInstCall
(
callee
.
LinkName
()))
}
else
{
insts
=
append
(
insts
,
wat
.
NewInstCall
(
GetFnMangleName
(
callee
)))
fn_internal_name
,
_
:=
GetFnMangleName
(
callee
)
insts
=
append
(
insts
,
wat
.
NewInstCall
(
fn_internal_name
))
}
case
*
ssa
.
Builtin
:
...
...
@@ -659,10 +661,11 @@ func (g *functionGenerator) genExtract(inst *ssa.Extract) ([]wat.Inst, wir.Value
func
(
g
*
functionGenerator
)
genFiled
(
inst
*
ssa
.
Field
)
([]
wat
.
Inst
,
wir
.
ValueType
)
{
x
:=
g
.
getValue
(
inst
.
X
)
field
:=
inst
.
X
.
Type
()
.
Underlying
()
.
(
*
types
.
Struct
)
.
Field
(
inst
.
Field
)
fieldname
:=
field
.
Name
(
)
fieldname
:=
wir
.
GenSymbolName
(
field
.
Name
()
)
if
field
.
Embedded
()
{
if
_
,
ok
:=
field
.
Type
()
.
(
*
types
.
Named
);
ok
{
fieldname
=
wir
.
GetPkgMangleName
(
field
.
Pkg
()
.
Path
())
+
fieldname
pkgname
,
_
:=
wir
.
GetPkgMangleName
(
field
.
Pkg
()
.
Path
())
fieldname
=
pkgname
+
"."
+
fieldname
}
fieldname
=
"$"
+
fieldname
}
...
...
@@ -672,10 +675,11 @@ func (g *functionGenerator) genFiled(inst *ssa.Field) ([]wat.Inst, wir.ValueType
func
(
g
*
functionGenerator
)
genFieldAddr
(
inst
*
ssa
.
FieldAddr
)
([]
wat
.
Inst
,
wir
.
ValueType
)
{
field
:=
inst
.
X
.
Type
()
.
Underlying
()
.
(
*
types
.
Pointer
)
.
Elem
()
.
Underlying
()
.
(
*
types
.
Struct
)
.
Field
(
inst
.
Field
)
fieldname
:=
field
.
Name
(
)
fieldname
:=
wir
.
GenSymbolName
(
field
.
Name
()
)
if
field
.
Embedded
()
{
if
_
,
ok
:=
field
.
Type
()
.
(
*
types
.
Named
);
ok
{
fieldname
=
wir
.
GetPkgMangleName
(
field
.
Pkg
()
.
Path
())
+
fieldname
pkgname
,
_
:=
wir
.
GetPkgMangleName
(
field
.
Pkg
()
.
Path
())
fieldname
=
pkgname
+
"."
+
fieldname
}
fieldname
=
"$"
+
fieldname
}
...
...
@@ -772,14 +776,16 @@ func (g *functionGenerator) genMakeClosre_Anonymous(inst *ssa.MakeClosure) (inst
feild
:=
wir
.
NewField
(
freevar
.
Name
(),
wir
.
ToWType
(
freevar
.
Type
()))
fields
=
append
(
fields
,
feild
)
}
st_name
:=
GetFnMangleName
(
f
)
+
".$warpdata"
fn_internal_name
,
_
:=
GetFnMangleName
(
f
)
st_name
:=
fn_internal_name
+
".$warpdata"
st_free_data
=
wir
.
NewStruct
(
st_name
,
fields
)
}
var
warp_fn_index
int
{
var
warp_fn
wir
.
Function
warp_fn
.
Name
=
GetFnMangleName
(
f
)
+
".$warpfn"
fn_name
,
_
:=
GetFnMangleName
(
f
)
warp_fn
.
InternalName
=
fn_name
+
".$warpfn"
for
_
,
i
:=
range
f
.
Params
{
pa
:=
valueWrap
{
value
:
wir
.
NewLocal
(
i
.
Name
(),
wir
.
ToWType
(
i
.
Type
()))}
warp_fn
.
Params
=
append
(
warp_fn
.
Params
,
pa
.
value
)
...
...
@@ -797,10 +803,10 @@ func (g *functionGenerator) genMakeClosre_Anonymous(inst *ssa.MakeClosure) (inst
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
i
.
EmitPush
()
...
)
}
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
wat
.
NewInstCall
(
GetFnMangleName
(
f
)
))
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
wat
.
NewInstCall
(
fn_name
))
g
.
module
.
AddFunc
(
&
warp_fn
)
warp_fn_index
=
g
.
module
.
AddTableElem
(
warp_fn
.
Name
)
warp_fn_index
=
g
.
module
.
AddTableElem
(
warp_fn
.
Internal
Name
)
}
closure
:=
g
.
addRegister
(
wir
.
NewClosure
(
wir
.
NewFnSigFromSignature
(
f
.
Signature
)))
...
...
@@ -842,7 +848,8 @@ func (g *functionGenerator) genMakeClosre_Bound(inst *ssa.MakeClosure) (insts []
var
warp_fn_index
int
{
var
warp_fn
wir
.
Function
warp_fn
.
Name
=
GetFnMangleName
(
f
.
Object
())
+
".$bound"
fn_name
,
_
:=
GetFnMangleName
(
f
.
Object
())
warp_fn
.
InternalName
=
fn_name
+
".$bound"
for
_
,
i
:=
range
f
.
Params
{
pa
:=
valueWrap
{
value
:
wir
.
NewLocal
(
i
.
Name
(),
wir
.
ToWType
(
i
.
Type
()))}
warp_fn
.
Params
=
append
(
warp_fn
.
Params
,
pa
.
value
)
...
...
@@ -860,10 +867,10 @@ func (g *functionGenerator) genMakeClosre_Bound(inst *ssa.MakeClosure) (insts []
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
i
.
EmitPush
()
...
)
}
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
wat
.
NewInstCall
(
GetFnMangleName
(
f
.
Object
())
))
warp_fn
.
Insts
=
append
(
warp_fn
.
Insts
,
wat
.
NewInstCall
(
fn_name
))
g
.
module
.
AddFunc
(
&
warp_fn
)
warp_fn_index
=
g
.
module
.
AddTableElem
(
warp_fn
.
Name
)
warp_fn_index
=
g
.
module
.
AddTableElem
(
warp_fn
.
Internal
Name
)
}
closure
:=
g
.
addRegister
(
wir
.
NewClosure
(
wir
.
NewFnSigFromSignature
(
f
.
Signature
)))
...
...
@@ -894,9 +901,10 @@ func (g *functionGenerator) addRegister(typ wir.ValueType) wir.Value {
func
(
g
*
functionGenerator
)
genGetter
(
f
*
ssa
.
Function
)
*
wir
.
Function
{
var
wir_fn
wir
.
Function
if
len
(
f
.
LinkName
())
>
0
{
wir_fn
.
Name
=
f
.
LinkName
()
wir_fn
.
InternalName
=
f
.
LinkName
()
wir_fn
.
ExternalName
=
f
.
LinkName
()
}
else
{
wir_fn
.
Name
=
GetFnMangleName
(
f
)
wir_fn
.
InternalName
,
wir_fn
.
External
Name
=
GetFnMangleName
(
f
)
}
rets
:=
f
.
Signature
.
Results
()
...
...
@@ -927,9 +935,10 @@ func (g *functionGenerator) genGetter(f *ssa.Function) *wir.Function {
func
(
g
*
functionGenerator
)
genSetter
(
f
*
ssa
.
Function
)
*
wir
.
Function
{
var
wir_fn
wir
.
Function
if
len
(
f
.
LinkName
())
>
0
{
wir_fn
.
Name
=
f
.
LinkName
()
wir_fn
.
InternalName
=
f
.
LinkName
()
wir_fn
.
ExternalName
=
f
.
LinkName
()
}
else
{
wir_fn
.
Name
=
GetFnMangleName
(
f
)
wir_fn
.
InternalName
,
wir_fn
.
External
Name
=
GetFnMangleName
(
f
)
}
rets
:=
f
.
Signature
.
Results
()
...
...
internal/backends/compiler_wat/compile_global.go
浏览文件 @
9558eaea
...
...
@@ -12,10 +12,11 @@ func (p *Compiler) compileGlobal(g *ssa.Global) {
if
len
(
g
.
LinkName
())
>
0
{
p
.
module
.
AddGlobal
(
g
.
LinkName
(),
wir
.
ToWType
(
g
.
Type
()
.
(
*
types
.
Pointer
)
.
Elem
()),
false
,
g
)
}
else
{
pkg_name
,
_
:=
wir
.
GetPkgMangleName
(
g
.
Pkg
.
Pkg
.
Path
())
if
g
.
Name
()
==
"init$guard"
{
p
.
module
.
AddGlobal
(
wir
.
GetPkgMangleName
(
g
.
Pkg
.
Pkg
.
Path
())
+
g
.
Name
(),
wir
.
ToWType
(
g
.
Type
()
.
(
*
types
.
Pointer
)
.
Elem
()),
false
,
g
)
p
.
module
.
AddGlobal
(
pkg_name
+
"."
+
g
.
Name
(),
wir
.
ToWType
(
g
.
Type
()
.
(
*
types
.
Pointer
)
.
Elem
()),
false
,
g
)
}
else
{
p
.
module
.
AddGlobal
(
wir
.
GetPkgMangleName
(
g
.
Pkg
.
Pkg
.
Path
())
+
g
.
Name
(
),
wir
.
NewPointer
(
wir
.
ToWType
(
g
.
Type
()
.
(
*
types
.
Pointer
)
.
Elem
())),
true
,
g
)
p
.
module
.
AddGlobal
(
pkg_name
+
"."
+
wir
.
GenSymbolName
(
g
.
Name
()
),
wir
.
NewPointer
(
wir
.
ToWType
(
g
.
Type
()
.
(
*
types
.
Pointer
)
.
Elem
())),
true
,
g
)
}
}
//logger.Fatal("Todo")
...
...
internal/backends/compiler_wat/util.go
浏览文件 @
9558eaea
...
...
@@ -8,45 +8,63 @@ import (
"wa-lang.org/wa/internal/types"
)
func
GetFnMangleName
(
v
interface
{})
string
{
var
name
string
func
GetFnMangleName
(
v
interface
{})
(
internal
string
,
external
string
)
{
switch
f
:=
v
.
(
type
)
{
case
*
ssa
.
Function
:
name
=
wir
.
GetPkgMangleName
(
f
.
Pkg
.
Pkg
.
Path
())
internal
,
external
=
wir
.
GetPkgMangleName
(
f
.
Pkg
.
Pkg
.
Path
())
if
recv
:=
f
.
Signature
.
Recv
();
recv
!=
nil
{
internal
+=
"."
external
+=
"."
switch
rt
:=
recv
.
Type
()
.
(
type
)
{
case
*
types
.
Named
:
name
+=
rt
.
Obj
()
.
Name
()
internal
+=
wir
.
GenSymbolName
(
rt
.
Obj
()
.
Name
())
external
+=
rt
.
Obj
()
.
Name
()
case
*
types
.
Pointer
:
btype
,
ok
:=
rt
.
Elem
()
.
(
*
types
.
Named
)
if
!
ok
{
panic
(
"Unreachable"
)
}
name
+=
btype
.
Obj
()
.
Name
()
internal
+=
wir
.
GenSymbolName
(
btype
.
Obj
()
.
Name
())
external
+=
btype
.
Obj
()
.
Name
()
default
:
panic
(
"Unreachable"
)
}
name
+=
"."
}
name
+=
f
.
Name
()
internal
+=
"."
external
+=
"."
internal
+=
wir
.
GenSymbolName
(
f
.
Name
())
external
+=
f
.
Name
()
case
*
types
.
Func
:
name
=
wir
.
GetPkgMangleName
(
f
.
Pkg
()
.
Path
())
internal
,
external
=
wir
.
GetPkgMangleName
(
f
.
Pkg
()
.
Path
())
sig
:=
f
.
Type
()
.
(
*
types
.
Signature
)
if
recv
:=
sig
.
Recv
();
recv
!=
nil
{
internal
+=
"."
external
+=
"."
switch
rt
:=
recv
.
Type
()
.
(
type
)
{
case
*
types
.
Named
:
name
+=
rt
.
Obj
()
.
Name
()
internal
+=
wir
.
GenSymbolName
(
rt
.
Obj
()
.
Name
())
external
+=
rt
.
Obj
()
.
Name
()
case
*
types
.
Pointer
:
btype
,
ok
:=
rt
.
Elem
()
.
(
*
types
.
Named
)
if
!
ok
{
panic
(
"Unreachable"
)
}
name
+=
btype
.
Obj
()
.
Name
()
internal
+=
wir
.
GenSymbolName
(
btype
.
Obj
()
.
Name
())
external
+=
btype
.
Obj
()
.
Name
()
default
:
panic
(
"Unreachable"
)
}
name
+=
"."
}
name
+=
f
.
Name
()
internal
+=
"."
external
+=
"."
internal
+=
wir
.
GenSymbolName
(
f
.
Name
())
external
+=
f
.
Name
()
}
return
name
return
internal
,
external
}
internal/backends/compiler_wat/wir/funcion.go
浏览文件 @
9558eaea
...
...
@@ -7,7 +7,7 @@ import "wa-lang.org/wa/internal/backends/compiler_wat/wir/wat"
func
(
f
*
Function
)
ToWatFunc
()
*
wat
.
Function
{
var
wat_func
wat
.
Function
wat_func
.
Name
=
f
.
Name
wat_func
.
InternalName
,
wat_func
.
ExternalName
=
f
.
InternalName
,
f
.
External
Name
for
_
,
r
:=
range
f
.
Results
{
wat_func
.
Results
=
append
(
wat_func
.
Results
,
r
.
Raw
()
...
)
...
...
internal/backends/compiler_wat/wir/module.go
浏览文件 @
9558eaea
...
...
@@ -108,9 +108,9 @@ func (m *Module) findFunc(fn_name string) *Function {
}
func
(
m
*
Module
)
AddFunc
(
f
*
Function
)
{
if
m
.
findFunc
(
f
.
Name
)
==
nil
{
if
m
.
findFunc
(
f
.
Internal
Name
)
==
nil
{
m
.
funcs
=
append
(
m
.
funcs
,
f
)
m
.
funcs_map
[
f
.
Name
]
=
f
m
.
funcs_map
[
f
.
Internal
Name
]
=
f
}
}
...
...
@@ -140,7 +140,7 @@ func (m *Module) AddDataSeg(data []byte) (ptr int) {
func
(
m
*
Module
)
genGlobalAlloc
()
*
Function
{
var
f
Function
f
.
Name
=
"$waGlobalAlloc"
f
.
Internal
Name
=
"$waGlobalAlloc"
for
_
,
g
:=
range
m
.
globals
{
if
g
.
Kind
()
!=
ValueKindGlobal_Pointer
{
...
...
internal/backends/compiler_wat/wir/util.go
浏览文件 @
9558eaea
...
...
@@ -3,7 +3,9 @@
package
wir
import
(
"strconv"
"strings"
"unicode/utf8"
"wa-lang.org/wa/internal/types"
...
...
@@ -88,10 +90,12 @@ func ToWType(from types.Type) ValueType {
if
f
.
Embedded
()
{
fs
=
append
(
fs
,
NewField
(
"$"
+
wtyp
.
Name
(),
wtyp
))
}
else
{
fs
=
append
(
fs
,
NewField
(
f
.
Name
(
),
wtyp
))
fs
=
append
(
fs
,
NewField
(
GenSymbolName
(
f
.
Name
()
),
wtyp
))
}
}
return
NewStruct
(
GetPkgMangleName
(
t
.
Obj
()
.
Pkg
()
.
Path
())
+
t
.
Obj
()
.
Name
(),
fs
)
pkg_name
,
_
:=
GetPkgMangleName
(
t
.
Obj
()
.
Pkg
()
.
Path
())
obj_name
:=
GenSymbolName
(
t
.
Obj
()
.
Name
())
return
NewStruct
(
pkg_name
+
"."
+
obj_name
,
fs
)
case
*
types
.
Signature
:
sig
:=
NewFnSigFromSignature
(
ut
)
...
...
@@ -127,8 +131,33 @@ func IsNumber(v Value) bool {
return
false
}
func
GetPkgMangleName
(
pkg_path
string
)
string
{
return
strings
.
ReplaceAll
(
pkg_path
,
"/"
,
"$"
)
+
"."
func
GetPkgMangleName
(
pkg_path
string
)
(
string
,
string
)
{
var
symbol_name
,
exp_name
string
for
i
:=
strings
.
IndexAny
(
pkg_path
,
"/
\\
"
);
i
!=
-
1
;
i
=
strings
.
IndexAny
(
pkg_path
,
"/
\\
"
)
{
p
:=
pkg_path
[
:
i
]
pkg_path
=
pkg_path
[
i
+
1
:
]
exp_name
+=
p
exp_name
+=
"$"
symbol_name
+=
GenSymbolName
(
p
)
symbol_name
+=
"$"
}
exp_name
+=
pkg_path
symbol_name
+=
GenSymbolName
(
pkg_path
)
return
symbol_name
,
exp_name
}
func
GenSymbolName
(
src
string
)
string
{
if
len
(
src
)
==
utf8
.
RuneCountInString
(
src
)
{
return
src
}
s
:=
"$0x"
for
i
:=
0
;
i
<
len
(
src
);
i
++
{
s
+=
strconv
.
FormatUint
(
uint64
(
src
[
i
]),
16
)
}
return
s
}
func
ExtractField
(
x
Value
,
field_name
string
)
Value
{
...
...
internal/backends/compiler_wat/wir/value_block.go
浏览文件 @
9558eaea
...
...
@@ -29,8 +29,8 @@ func (t Block) Equal(u ValueType) bool {
}
func
(
t
Block
)
onFree
()
int
{
var
f
Function
f
.
Name
=
"$"
+
t
.
Name
(
)
+
".$$onFree"
if
i
:=
currentModule
.
findTableElem
(
f
.
Name
);
i
!=
0
{
f
.
InternalName
=
"$"
+
GenSymbolName
(
t
.
Name
()
)
+
".$$onFree"
if
i
:=
currentModule
.
findTableElem
(
f
.
Internal
Name
);
i
!=
0
{
return
i
}
...
...
@@ -45,7 +45,7 @@ func (t Block) onFree() int {
f
.
Insts
=
append
(
f
.
Insts
,
wat
.
NewInstStore
(
wat
.
U32
{},
0
,
1
))
currentModule
.
AddFunc
(
&
f
)
return
currentModule
.
AddTableElem
(
f
.
Name
)
return
currentModule
.
AddTableElem
(
f
.
Internal
Name
)
}
func
(
t
Block
)
EmitLoadFromAddr
(
addr
Value
,
offset
int
)
(
insts
[]
wat
.
Inst
)
{
...
...
internal/backends/compiler_wat/wir/value_slice.go
浏览文件 @
9558eaea
...
...
@@ -113,13 +113,13 @@ func (t Slice) emitGenFromRefOfArray(x *aRef, low, high Value) (insts []wat.Inst
}
func
(
t
Slice
)
genAppendFunc
()
string
{
fn_name
:=
"$"
+
t
.
Name
(
)
+
".append"
fn_name
:=
"$"
+
GenSymbolName
(
t
.
Name
()
)
+
".append"
if
currentModule
.
findFunc
(
fn_name
)
!=
nil
{
return
fn_name
}
var
f
Function
f
.
Name
=
fn_name
f
.
Internal
Name
=
fn_name
x
:=
newValueSlice
(
"x"
,
ValueKindLocal
,
t
.
Base
)
y
:=
newValueSlice
(
"y"
,
ValueKindLocal
,
t
.
Base
)
f
.
Params
=
append
(
f
.
Params
,
x
)
...
...
internal/backends/compiler_wat/wir/value_string.go
浏览文件 @
9558eaea
...
...
@@ -42,7 +42,7 @@ func (t String) genAppendStrFunc() string {
}
var
f
Function
f
.
Name
=
fn_name
f
.
Internal
Name
=
fn_name
x
:=
newValueString
(
"x"
,
ValueKindLocal
)
y
:=
newValueString
(
"y"
,
ValueKindLocal
)
f
.
Params
=
append
(
f
.
Params
,
x
)
...
...
internal/backends/compiler_wat/wir/value_struct.go
浏览文件 @
9558eaea
...
...
@@ -89,9 +89,9 @@ func (t Struct) genRawFree() (ret []fn_offset_pair) {
func
(
t
Struct
)
onFree
()
int
{
var
f
Function
f
.
Name
=
"$"
+
t
.
Name
(
)
+
".$$onFree"
f
.
InternalName
=
"$"
+
GenSymbolName
(
t
.
Name
()
)
+
".$$onFree"
if
i
:=
currentModule
.
findTableElem
(
f
.
Name
);
i
!=
0
{
if
i
:=
currentModule
.
findTableElem
(
f
.
Internal
Name
);
i
!=
0
{
return
i
}
...
...
@@ -113,29 +113,7 @@ func (t Struct) onFree() int {
f
.
Insts
=
append
(
f
.
Insts
,
wat
.
NewInstCallIndirect
(
"$onFree"
))
}
currentModule
.
AddFunc
(
&
f
)
return
currentModule
.
AddTableElem
(
f
.
Name
)
/* has_free := false
for _, member := range t.Members {
member_free_func := member.Type().onFree(module)
if member_free_func == 0 {
continue
}
f.Insts = append(f.Insts, ptr.EmitPush()...)
f.Insts = append(f.Insts, wat.NewInstConst(wat.I32{}, strconv.Itoa(member._start)))
f.Insts = append(f.Insts, wat.NewInstAdd(wat.I32{}))
f.Insts = append(f.Insts, wat.NewInstConst(wat.I32{}, strconv.Itoa(member_free_func)))
f.Insts = append(f.Insts, wat.NewInstCallIndirect("$onFree"))
has_free = true
}
if has_free {
return module.addTableFunc(&f)
}
return 0 //*/
return
currentModule
.
AddTableElem
(
f
.
InternalName
)
}
func
(
t
Struct
)
Raw
()
[]
wat
.
ValueType
{
...
...
internal/backends/compiler_wat/wir/wat/function.go
浏览文件 @
9558eaea
...
...
@@ -3,7 +3,10 @@
package
wat
func
(
f
*
Function
)
Format
(
indent
string
)
string
{
s
:=
indent
+
"(func $"
+
f
.
Name
+
" (export
\"
"
+
f
.
Name
+
"
\"
)"
s
:=
indent
+
"(func $"
+
f
.
InternalName
if
len
(
f
.
ExternalName
)
>
0
{
s
+=
" (export
\"
"
+
f
.
ExternalName
+
"
\"
)"
}
for
_
,
param
:=
range
f
.
Params
{
s
+=
" (param $"
+
param
.
Name
()
+
" "
+
param
.
Type
()
.
Name
()
+
")"
...
...
@@ -28,7 +31,7 @@ func (f *Function) Format(indent string) string {
s
+=
inst
.
Format
(
indent
+
" "
)
+
"
\n
"
}
s
+=
indent
+
") ;;"
+
f
.
Name
s
+=
indent
+
") ;;"
+
f
.
Internal
Name
return
s
}
...
...
internal/backends/compiler_wat/wir/wat/wat.go
浏览文件 @
9558eaea
...
...
@@ -16,10 +16,11 @@ type Import interface {
Function:
**************************************/
type
Function
struct
{
Name
string
Results
[]
ValueType
Params
[]
Value
Locals
[]
Value
InternalName
string
ExternalName
string
Results
[]
ValueType
Params
[]
Value
Locals
[]
Value
Insts
[]
Inst
}
...
...
internal/backends/compiler_wat/wir/wir.go
浏览文件 @
9558eaea
...
...
@@ -12,10 +12,11 @@ var currentModule *Module
Function:
**************************************/
type
Function
struct
{
Name
string
Results
[]
ValueType
Params
[]
Value
Locals
[]
Value
InternalName
string
ExternalName
string
Results
[]
ValueType
Params
[]
Value
Locals
[]
Value
Insts
[]
wat
.
Inst
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录