_demo/defer
This commit is contained in:
18
_demo/defer/main.go
Normal file
18
_demo/defer/main.go
Normal 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
|
||||||
|
}
|
||||||
@@ -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++
|
||||||
|
|||||||
Reference in New Issue
Block a user