mirror of
https://github.com/golang/go
synced 2024-11-22 02:54:39 -07:00
go/types: less closure creations in gcimporter.
Closures are incredibly expensive on linux/arm due to repetitive flush of instruction cache. go test -short on ODROID-X: Before: ok exp/gotype 17.091s ok go/types 2.225s After: ok exp/gotype 7.193s ok go/types 1.143s R=dave, minux.ma, rsc CC=golang-dev, remy https://golang.org/cl/7062045
This commit is contained in:
parent
1e1aea6821
commit
0f545d9ab2
@ -408,18 +408,13 @@ func (p *gcParser) parseField() *Field {
|
||||
func (p *gcParser) parseStructType() Type {
|
||||
var fields []*Field
|
||||
|
||||
parseField := func() {
|
||||
fields = append(fields, p.parseField())
|
||||
}
|
||||
|
||||
p.expectKeyword("struct")
|
||||
p.expect('{')
|
||||
if p.tok != '}' {
|
||||
parseField()
|
||||
for p.tok == ';' {
|
||||
p.next()
|
||||
parseField()
|
||||
for p.tok != '}' {
|
||||
if len(fields) > 0 {
|
||||
p.expect(';')
|
||||
}
|
||||
fields = append(fields, p.parseField())
|
||||
}
|
||||
p.expect('}')
|
||||
|
||||
@ -450,7 +445,11 @@ func (p *gcParser) parseParameter() (par *Var, isVariadic bool) {
|
||||
// ParameterList = { Parameter "," } Parameter .
|
||||
//
|
||||
func (p *gcParser) parseParameters() (list []*Var, isVariadic bool) {
|
||||
parseParameter := func() {
|
||||
p.expect('(')
|
||||
for p.tok != ')' {
|
||||
if len(list) > 0 {
|
||||
p.expect(',')
|
||||
}
|
||||
par, variadic := p.parseParameter()
|
||||
list = append(list, par)
|
||||
if variadic {
|
||||
@ -460,15 +459,6 @@ func (p *gcParser) parseParameters() (list []*Var, isVariadic bool) {
|
||||
isVariadic = true
|
||||
}
|
||||
}
|
||||
|
||||
p.expect('(')
|
||||
if p.tok != ')' {
|
||||
parseParameter()
|
||||
for p.tok == ',' {
|
||||
p.next()
|
||||
parseParameter()
|
||||
}
|
||||
}
|
||||
p.expect(')')
|
||||
|
||||
return
|
||||
@ -509,21 +499,16 @@ func (p *gcParser) parseSignature() *Signature {
|
||||
func (p *gcParser) parseInterfaceType() Type {
|
||||
var methods []*Method
|
||||
|
||||
parseMethod := func() {
|
||||
p.expectKeyword("interface")
|
||||
p.expect('{')
|
||||
for p.tok != '}' {
|
||||
if len(methods) > 0 {
|
||||
p.expect(';')
|
||||
}
|
||||
name := p.parseName()
|
||||
typ := p.parseSignature()
|
||||
methods = append(methods, &Method{name, typ})
|
||||
}
|
||||
|
||||
p.expectKeyword("interface")
|
||||
p.expect('{')
|
||||
if p.tok != '}' {
|
||||
parseMethod()
|
||||
for p.tok == ';' {
|
||||
p.next()
|
||||
parseMethod()
|
||||
}
|
||||
}
|
||||
p.expect('}')
|
||||
|
||||
return &Interface{Methods: methods}
|
||||
|
Loading…
Reference in New Issue
Block a user