From: griesemer Date: Tue, 10 Oct 2017 23:12:52 +0000 (-0700) Subject: cmd/compile/internal/syntax: factor out parsing of func bodies (cleanup) X-Git-Tag: go1.10beta1~797 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=39edffb6b1632e6d22d8e1b399e57cbba7456b9d;p=gostls13.git cmd/compile/internal/syntax: factor out parsing of func bodies (cleanup) Change-Id: If6481a5401940a923fc9a104981dfb90eed0d1ac Reviewed-on: https://go-review.googlesource.com/69750 Run-TryBot: Robert Griesemer Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 845e3f0eb7..c04322890c 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -487,16 +487,28 @@ func (p *parser) funcDeclOrNil() *FuncDecl { f.Name = p.name() f.Type = p.funcType() if p.tok == _Lbrace { - f.Body = p.blockStmt("") - if p.mode&CheckBranches != 0 { - checkBranches(f.Body, p.errh) - } + f.Body = p.funcBody() } f.Pragma = p.pragma return f } +func (p *parser) funcBody() *BlockStmt { + // TODO(gri) If we are in a function we should update p.fnest + // accordingly. Currently p.fnest is always zero and thus not + // used in error recovery. + // Not enabled because it performs worse for some code without + // more fine tuning (see example in #22164). + // p.fnest++ + body := p.blockStmt("") + // p.fnest-- + if p.mode&CheckBranches != 0 { + checkBranches(body, p.errh) + } + return body +} + // ---------------------------------------------------------------------------- // Expressions @@ -712,10 +724,7 @@ func (p *parser) operand(keep_parens bool) Expr { f := new(FuncLit) f.pos = pos f.Type = t - f.Body = p.blockStmt("") - if p.mode&CheckBranches != 0 { - checkBranches(f.Body, p.errh) - } + f.Body = p.funcBody() p.xnest-- return f @@ -1635,16 +1644,12 @@ func (p *parser) labeledStmtOrNil(label *Name) Stmt { return nil // avoids follow-on errors (see e.g., fixedbugs/bug274.go) } +// context must be a non-empty string unless we know that p.tok == _Lbrace. func (p *parser) blockStmt(context string) *BlockStmt { if trace { defer p.trace("blockStmt")() } - // TODO(gri) If we are in a function we should update p.fnest - // accordingly. Currently p.fnest is always zero and thus not - // used in error recovery. - // Not enabled for for because it performs worse for some code - // without more fine tuning (see example in #22164). s := new(BlockStmt) s.pos = p.pos()