compiler: count current amount of locals correctly

This commit is contained in:
Evgenii Stratonikov 2020-06-26 13:24:17 +03:00
parent 637f75d9ef
commit c57d4cfff2
2 changed files with 21 additions and 4 deletions

View file

@ -139,16 +139,18 @@ func (c *funcScope) stackSize() int64 {
// newVariable creates a new local variable or argument in the scope of the function. // newVariable creates a new local variable or argument in the scope of the function.
func (c *funcScope) newVariable(t varType, name string) int { func (c *funcScope) newVariable(t varType, name string) int {
c.i++ var n int
switch t { switch t {
case varLocal: case varLocal:
c.locals[name] = c.i n = len(c.locals)
c.locals[name] = n
case varArgument: case varArgument:
c.arguments[name] = c.i n = len(c.arguments)
c.arguments[name] = n
default: default:
panic("invalid type") panic("invalid type")
} }
return c.i return n
} }
// newLocal creates a new local variable into the scope of the function. // newLocal creates a new local variable into the scope of the function.

View file

@ -169,3 +169,18 @@ func TestFunctionWithMultipleArgumentNames(t *testing.T) {
}` }`
eval(t, src, big.NewInt(3)) eval(t, src, big.NewInt(3))
} }
func TestLocalsCount(t *testing.T) {
src := `package foo
func f(a, b, c int) int {
sum := a
for i := 0; i < c; i++ {
sum += b
}
return sum
}
func Main() int {
return f(1, 2, 3)
}`
eval(t, src, big.NewInt(7))
}