diff --git a/_demo/defer/main.go b/_demo/defer/main.go new file mode 100644 index 00000000..d46620a9 --- /dev/null +++ b/_demo/defer/main.go @@ -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 +} diff --git a/compiler/ssa/eh.go b/compiler/ssa/eh.go index 2e2e01ae..7bb3a568 100644 --- a/compiler/ssa/eh.go +++ b/compiler/ssa/eh.go @@ -294,10 +294,11 @@ func (b Builder) callDefer(self *aDefer, typ Type, fn Expr, args []Expr) { b.Call(fn, args...) return } + prog := b.Prog 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 - 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 { fn = b.getField(data, 1) offset++