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

Merge branch 'master' of gitee.com:wa-lang/wa

......@@ -15,6 +15,7 @@ wa native global_constant.wa
wa native global_variable_0.wa
wa native global_variable_1.wa
wa native heart.wa
wa native internal_function.wa
wa native loop_0.wa
wa native loop_1.wa
wa native multi_ret.wa
......
# Test the llvm backend.
# Test anonymous functions and closure functions.
fn main() {
print("Hello, ")
fn() {
println("World!")
}()
var i: int
show := fn() {
println("i = ", i)
}
for i = 0; i < 10; i++ {
show()
}
}
......@@ -21,6 +21,7 @@ type Compiler struct {
output strings.Builder
debug bool
fmts []FmtStr
anofn []*ssa.Function
}
func New(target string, debug bool) *Compiler {
......@@ -142,6 +143,14 @@ func (p *Compiler) compilePackage(pkg *ssa.Package) error {
}
}
// Generate LLVM-IR for each internal function.
for _, v := range p.anofn {
if err := p.compileFunction(v); err != nil {
return err
}
}
p.anofn = []*ssa.Function{}
return nil
}
......
......@@ -387,6 +387,10 @@ func (p *Compiler) compileCall(val *ssa.Call) error {
// Emit the function name.
p.output.WriteString(" @")
callee := val.Call.StaticCallee()
// This callee is an internal function, whose body will be genereated later.
if callee.Parent() != nil {
p.anofn = append(p.anofn, callee)
}
if len(callee.LinkName()) > 0 {
p.output.WriteString(callee.LinkName())
} else {
......
......@@ -52,23 +52,24 @@ func (t Array) EmitLoadFromAddr(addr Value, offset int) (insts []wat.Inst) {
aArray:
**************************************/
type aArray struct {
aValue
underlying aStruct
aStruct
typ Array
}
func newValueArray(name string, kind ValueKind, base_type ValueType, capacity int) *aArray {
var v aArray
array_typ := NewArray(base_type, capacity)
v.aValue = aValue{name: name, kind: kind, typ: array_typ}
v.underlying = *newValueStruct(name, kind, array_typ.Struct)
v.typ = NewArray(base_type, capacity)
v.aStruct = *newValueStruct(name, kind, v.typ.Struct)
return &v
}
func (v *aArray) raw() []wat.Value { return v.underlying.raw() }
func (v *aArray) EmitInit() (insts []wat.Inst) { return v.underlying.EmitInit() }
func (v *aArray) EmitPush() (insts []wat.Inst) { return v.underlying.EmitPush() }
func (v *aArray) EmitPop() (insts []wat.Inst) { return v.underlying.EmitPop() }
func (v *aArray) EmitRelease() (insts []wat.Inst) { return v.underlying.EmitRelease() }
func (v *aArray) Type() ValueType { return v.typ }
func (v *aArray) raw() []wat.Value { return v.aStruct.raw() }
func (v *aArray) EmitInit() (insts []wat.Inst) { return v.aStruct.EmitInit() }
func (v *aArray) EmitPush() (insts []wat.Inst) { return v.aStruct.EmitPush() }
func (v *aArray) EmitPop() (insts []wat.Inst) { return v.aStruct.EmitPop() }
func (v *aArray) EmitRelease() (insts []wat.Inst) { return v.aStruct.EmitRelease() }
func (v *aArray) emitStoreToAddr(addr Value, offset int) (insts []wat.Inst) {
if !addr.Type().(Pointer).Base.Equal(v.Type()) {
......@@ -76,5 +77,5 @@ func (v *aArray) emitStoreToAddr(addr Value, offset int) (insts []wat.Inst) {
return nil
}
return v.underlying.emitStoreToAddr(addr, offset)
return v.aStruct.emitStoreToAddr(addr, offset)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册