_demo/defer

This commit is contained in:
visualfc
2025-02-27 14:32:53 +08:00
parent 3bb51c5d51
commit 00e3b6b5a0
2 changed files with 21 additions and 2 deletions

18
_demo/defer/main.go Normal file
View File

@@ -0,0 +1,18 @@
package main
func main() {
var a int = 5
defer println(a)
defer func() {
println(a)
}()
defer func() {
println(recover().(string))
}()
a = 10
panic("error")
//Output:
// error
// 10
// 5
}

View File

@@ -294,10 +294,11 @@ func (b Builder) callDefer(self *aDefer, typ Type, fn Expr, args []Expr) {
b.Call(fn, args...) b.Call(fn, args...)
return return
} }
prog := b.Prog
ptr := b.Load(self.argsPtr) ptr := b.Load(self.argsPtr)
data := b.Load(Expr{ptr.impl, b.Prog.Pointer(typ)}) data := b.Load(Expr{ptr.impl, prog.Pointer(typ)})
offset := 1 offset := 1
b.Store(self.argsPtr, Expr{b.getField(data, 0).impl, b.Prog.VoidPtr()}) b.Store(self.argsPtr, Expr{b.getField(data, 0).impl, prog.VoidPtr()})
if fn.kind == vkClosure { if fn.kind == vkClosure {
fn = b.getField(data, 1) fn = b.getField(data, 1)
offset++ offset++