xfunc.Func.Closure = clo
clo.Func.Closure = xfunc
- oldScope := p.funchdr(xfunc)
-
- body := p.stmts(expr.Body.List)
- if body == nil {
- body = []*Node{nod(OEMPTY, nil, nil)}
- }
- xfunc.Nbody.Set(body)
-
- lineno = p.makeXPos(expr.Body.Rbrace)
- xfunc.Func.Endlineno = lineno
-
- p.funcbody(oldScope)
+ p.funcBody(xfunc, expr.Body)
// closure-specific variables are hanging off the
// ordinary ones in the symbol table; see oldname.
lastCloseScopePos syntax.Pos
}
-func (p *noder) funchdr(n *Node) ScopeID {
- old := p.scope
+func (p *noder) funcBody(fn *Node, block *syntax.BlockStmt) {
+ oldScope := p.scope
p.scope = 0
- funchdr(n)
- return old
-}
+ funchdr(fn)
+
+ if block != nil {
+ body := p.stmts(block.List)
+ if body == nil {
+ body = []*Node{nod(OEMPTY, nil, nil)}
+ }
+ fn.Nbody.Set(body)
+
+ lineno = p.makeXPos(block.Rbrace)
+ fn.Func.Endlineno = lineno
+ }
-func (p *noder) funcbody(old ScopeID) {
funcbody()
- p.scope = old
+ p.scope = oldScope
}
func (p *noder) openScope(pos syntax.Pos) {
declare(f.Func.Nname, PFUNC)
}
- oldScope := p.funchdr(f)
+ p.funcBody(f, fun.Body)
if fun.Body != nil {
if f.Noescape() {
yyerrorl(f.Pos, "can only use //go:noescape with external func implementations")
}
-
- body := p.stmts(fun.Body.List)
- if body == nil {
- body = []*Node{p.nod(fun, OEMPTY, nil, nil)}
- }
- f.Nbody.Set(body)
-
- lineno = p.makeXPos(fun.Body.Rbrace)
- f.Func.Endlineno = lineno
} else {
if pure_go || strings.HasPrefix(f.funcname(), "init.") {
yyerrorl(f.Pos, "missing function body")
}
}
- p.funcbody(oldScope)
return f
}