mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-04-12 19:14:01 +00:00
compiler: use new defer stack for inlined functions, fix #2281
Inlined functions shouldn't care about outer scope defer statements, they can't.
This commit is contained in:
parent
cddd5e1f6d
commit
f12f871432
2 changed files with 22 additions and 0 deletions
|
@ -50,6 +50,24 @@ func TestDefer(t *testing.T) {
|
||||||
func f() { a += 2 }`
|
func f() { a += 2 }`
|
||||||
eval(t, src, big.NewInt(10))
|
eval(t, src, big.NewInt(10))
|
||||||
})
|
})
|
||||||
|
t.Run("DeferAfterInterop", func(t *testing.T) {
|
||||||
|
src := `package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Main() {
|
||||||
|
defer func() {
|
||||||
|
}()
|
||||||
|
storage.GetContext()
|
||||||
|
}`
|
||||||
|
vm := vmAndCompile(t, src)
|
||||||
|
err := vm.Run()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, 0, vm.Estack().Len(), "stack contains unexpected items")
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("MultipleDefers", func(t *testing.T) {
|
t.Run("MultipleDefers", func(t *testing.T) {
|
||||||
src := `package main
|
src := `package main
|
||||||
var a int
|
var a int
|
||||||
|
|
|
@ -99,6 +99,8 @@ func (c *codegen) inlineCall(f *funcScope, n *ast.CallExpr) {
|
||||||
|
|
||||||
c.pkgInfoInline = append(c.pkgInfoInline, pkg)
|
c.pkgInfoInline = append(c.pkgInfoInline, pkg)
|
||||||
oldMap := c.importMap
|
oldMap := c.importMap
|
||||||
|
oldDefers := c.scope.deferStack
|
||||||
|
c.scope.deferStack = nil
|
||||||
c.fillImportMap(f.file, pkg.Pkg)
|
c.fillImportMap(f.file, pkg.Pkg)
|
||||||
ast.Inspect(f.decl, c.scope.analyzeVoidCalls)
|
ast.Inspect(f.decl, c.scope.analyzeVoidCalls)
|
||||||
ast.Walk(c, f.decl.Body)
|
ast.Walk(c, f.decl.Body)
|
||||||
|
@ -107,6 +109,8 @@ func (c *codegen) inlineCall(f *funcScope, n *ast.CallExpr) {
|
||||||
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
emit.Opcodes(c.prog.BinWriter, opcode.DROP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
c.processDefers()
|
||||||
|
c.scope.deferStack = oldDefers
|
||||||
c.importMap = oldMap
|
c.importMap = oldMap
|
||||||
c.pkgInfoInline = c.pkgInfoInline[:len(c.pkgInfoInline)-1]
|
c.pkgInfoInline = c.pkgInfoInline[:len(c.pkgInfoInline)-1]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue