aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax/scanner.go
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2018-02-20 10:21:41 +0000
committerDaniel Martí <mvdan@mvdan.cc>2018-02-24 00:20:46 +0000
commitc8791538315e633a41461173964a99bd90e103e3 (patch)
tree37d26affa284cdb3d65ef483b08dd9eea1cfa576 /src/cmd/compile/internal/syntax/scanner.go
parentc3935c08d27d3f04a4e211b506f9c7b05a613132 (diff)
downloadgo-c8791538315e633a41461173964a99bd90e103e3.tar.gz
go-c8791538315e633a41461173964a99bd90e103e3.zip
cmd/compile/internal/syntax: use stringer for operators and tokens
With its new -linecomment flag, it is now possible to use stringer on values whose strings aren't valid identifiers. This is the case with tokens and operators in Go. Operator alredy had inline comments with each operator's string representation; only minor modifications were needed. The inline comments were added to each of the token names, using the same strategy. Comments that were previously inline or part of the string arrays were moved to the line immediately before the name they correspond to. Finally, declare tokStrFast as a function that uses the generated arrays directly. Avoiding the branch and strconv call means that we avoid a performance regression in the scanner, perhaps due to the lack of mid-stack inlining. Performance is not affected. Measured with 'go test -run StdLib -fast' on an X1 Carbon Gen2 (i5-4300U @ 1.90GHz, 8GB RAM, SSD), the best of 5 runs before and after the changes are: parsed 1709399 lines (3763 files) in 1.707402159s (1001169 lines/s) allocated 449.282Mb (263.137Mb/s) parsed 1709329 lines (3765 files) in 1.706663154s (1001562 lines/s) allocated 449.290Mb (263.256Mb/s) Change-Id: Idcc4f83393fcadd6579700e3602c09496ea2625b Reviewed-on: https://go-review.googlesource.com/95357 Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/syntax/scanner.go')
-rw-r--r--src/cmd/compile/internal/syntax/scanner.go10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go
index dbb2387f8f..7db33fb6b9 100644
--- a/src/cmd/compile/internal/syntax/scanner.go
+++ b/src/cmd/compile/internal/syntax/scanner.go
@@ -348,7 +348,7 @@ func (s *scanner) ident() {
// possibly a keyword
if len(lit) >= 2 {
- if tok := keywordMap[hash(lit)]; tok != 0 && tokstrings[tok] == string(lit) {
+ if tok := keywordMap[hash(lit)]; tok != 0 && tokStrFast(tok) == string(lit) {
s.nlsemi = contains(1<<_Break|1<<_Continue|1<<_Fallthrough|1<<_Return, tok)
s.tok = tok
return
@@ -360,6 +360,12 @@ func (s *scanner) ident() {
s.tok = _Name
}
+// tokStrFast is a faster version of token.String, which assumes that tok
+// is one of the valid tokens - and can thus skip bounds checks.
+func tokStrFast(tok token) string {
+ return _token_name[_token_index[tok-1]:_token_index[tok]]
+}
+
func (s *scanner) isIdentRune(c rune, first bool) bool {
switch {
case unicode.IsLetter(c) || c == '_':
@@ -387,7 +393,7 @@ var keywordMap [1 << 6]token // size must be power of two
func init() {
// populate keywordMap
for tok := _Break; tok <= _Var; tok++ {
- h := hash([]byte(tokstrings[tok]))
+ h := hash([]byte(tok.String()))
if keywordMap[h] != 0 {
panic("imperfect hash")
}