compiler: copy locals slice during inline
Consider function call `f(1, g(2, 3))` when both `f` and `g` are inlined. If `f` contains some locals, inlining `g` will replace them with it's another locals map, because slices in Go reuse storage on `append`. Thus scope needs to be copied.
This commit is contained in:
parent
b66b853285
commit
7577bbef22
3 changed files with 31 additions and 1 deletions
|
@ -131,6 +131,21 @@ func TestInlineInLoop(t *testing.T) {
|
|||
}`
|
||||
eval(t, src, big.NewInt(20))
|
||||
})
|
||||
t.Run("inlined argument", func(t *testing.T) {
|
||||
src := `package foo
|
||||
import "github.com/nspcc-dev/neo-go/pkg/interop/binary"
|
||||
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline"
|
||||
func Main() int {
|
||||
sum := 0
|
||||
values := []int{10, 11}
|
||||
for _, v := range values {
|
||||
binary.Itoa(v, 10)
|
||||
sum += inline.VarSum(1, 2, 3, binary.Atoi("4", 10))
|
||||
}
|
||||
return sum
|
||||
}`
|
||||
eval(t, src, big.NewInt(20))
|
||||
})
|
||||
t.Run("check clean stack on return", func(t *testing.T) {
|
||||
src := `package foo
|
||||
import "github.com/nspcc-dev/neo-go/pkg/interop/binary"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue