mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: track pragmas in lexer rather than global variables
By using a Pragma bit set (8 bits) rather than 8 booleans, also reduce Func type size by 8 bytes (208B -> 200B on 64bit platforms, 116B -> 108B on 32bit platforms). Change-Id: Ibb7e1f8c418a0b5bc6ff813cbdde7bc6f0013b5a Reviewed-on: https://go-review.googlesource.com/19966 Reviewed-by: Dave Cheney <dave@cheney.net>
This commit is contained in:
parent
071e43a958
commit
3c0fae5306
10 changed files with 50 additions and 67 deletions
|
|
@ -1893,25 +1893,21 @@ func (p *parser) xfndcl() *Node {
|
|||
}
|
||||
|
||||
p.want(LFUNC)
|
||||
f := p.fndcl()
|
||||
f := p.fndcl(p.pragma&Nointerface != 0)
|
||||
body := p.fnbody()
|
||||
|
||||
if f == nil {
|
||||
return nil
|
||||
}
|
||||
if noescape && body != nil {
|
||||
Yyerror("can only use //go:noescape with external func implementations")
|
||||
}
|
||||
|
||||
f.Nbody = body
|
||||
f.Noescape = p.pragma&Noescape != 0
|
||||
if f.Noescape && body != nil {
|
||||
Yyerror("can only use //go:noescape with external func implementations")
|
||||
}
|
||||
f.Func.Pragma = p.pragma
|
||||
f.Func.Endlineno = lineno
|
||||
f.Noescape = noescape
|
||||
f.Func.Norace = norace
|
||||
f.Func.Nosplit = nosplit
|
||||
f.Func.Noinline = noinline
|
||||
f.Func.Nowritebarrier = nowritebarrier
|
||||
f.Func.Nowritebarrierrec = nowritebarrierrec
|
||||
f.Func.Systemstack = systemstack
|
||||
|
||||
funcbody(f)
|
||||
|
||||
return f
|
||||
|
|
@ -1922,7 +1918,7 @@ func (p *parser) xfndcl() *Node {
|
|||
// Function = Signature FunctionBody .
|
||||
// MethodDecl = "func" Receiver MethodName ( Function | Signature ) .
|
||||
// Receiver = Parameters .
|
||||
func (p *parser) fndcl() *Node {
|
||||
func (p *parser) fndcl(nointerface bool) *Node {
|
||||
if trace && Debug['x'] != 0 {
|
||||
defer p.trace("fndcl")()
|
||||
}
|
||||
|
|
@ -2058,8 +2054,7 @@ func (p *parser) hidden_fndcl() *Node {
|
|||
ss.Type = functype(s2.N, s6, s8)
|
||||
|
||||
checkwidth(ss.Type)
|
||||
addmethod(s4, ss.Type, false, nointerface)
|
||||
nointerface = false
|
||||
addmethod(s4, ss.Type, false, false)
|
||||
funchdr(ss)
|
||||
|
||||
// inl.C's inlnode in on a dotmeth node expects to find the inlineable body as
|
||||
|
|
@ -2140,18 +2135,10 @@ loop:
|
|||
testdclstack()
|
||||
}
|
||||
|
||||
noescape = false
|
||||
noinline = false
|
||||
nointerface = false
|
||||
norace = false
|
||||
nosplit = false
|
||||
nowritebarrier = false
|
||||
nowritebarrierrec = false
|
||||
systemstack = false
|
||||
// Reset p.pragma BEFORE advancing to the next token (consuming ';')
|
||||
// since comments before may set pragmas for the next function decl.
|
||||
p.pragma = 0
|
||||
|
||||
// Consume ';' AFTER resetting the above flags since
|
||||
// it may read the subsequent comment line which may
|
||||
// set the flags for the next function declaration.
|
||||
if p.tok != EOF && !p.got(';') {
|
||||
p.syntax_error("after top level declaration")
|
||||
p.advance(LVAR, LCONST, LTYPE, LFUNC)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue