compiler: drop stack after inline

Some control-flow statements drop stack items, for example
`return` when it is used inside of `range` loop.
For inlined calls this `return` should drop only portion of stack
which belongs to inlined call.
This commit is contained in:
Evgeniy Stratonikov 2021-02-26 17:58:08 +03:00
parent 347212c0c5
commit b66b853285
4 changed files with 74 additions and 1 deletions

View file

@ -49,6 +49,9 @@ type codegen struct {
labels map[labelWithType]uint16
// A list of nested label names together with evaluation stack depth.
labelList []labelWithStackSize
// inlineLabelOffsets contains size of labelList at the start of inline call processing.
// For such calls we need to drop only newly created part of stack.
inlineLabelOffsets []int
// A label for the for-loop being currently visited.
currentFor string
@ -607,7 +610,11 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
c.setLabel(l)
cnt := 0
for i := range c.labelList {
start := 0
if len(c.inlineLabelOffsets) > 0 {
start = c.inlineLabelOffsets[len(c.inlineLabelOffsets)-1]
}
for i := start; i < len(c.labelList); i++ {
cnt += c.labelList[i].sz
}
c.dropItems(cnt)