]> Cypherpunks repositories - gostls13.git/commitdiff
text/template/parse: restore the goroutine
authorRob Pike <r@golang.org>
Sat, 2 Jun 2012 01:34:14 +0000 (18:34 -0700)
committerRob Pike <r@golang.org>
Sat, 2 Jun 2012 01:34:14 +0000 (18:34 -0700)
To avoid goroutines during init, the nextItem function was a
clever workaround. Now that init goroutines are permitted,
restore the original, simpler design.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6282043

src/pkg/text/template/parse/lex.go

index 1cf4d739c4c53fa221bc18933516144c75529cd8..62bf6d20093e9618334b553a4a636bcb4ac55d3f 100644 (file)
@@ -195,15 +195,7 @@ func (l *lexer) errorf(format string, args ...interface{}) stateFn {
 
 // nextItem returns the next item from the input.
 func (l *lexer) nextItem() item {
-       for {
-               select {
-               case item := <-l.items:
-                       return item
-               default:
-                       l.state = l.state(l)
-               }
-       }
-       panic("not reached")
+       return <-l.items
 }
 
 // lex creates a new scanner for the input string.
@@ -219,12 +211,19 @@ func lex(name, input, left, right string) *lexer {
                input:      input,
                leftDelim:  left,
                rightDelim: right,
-               state:      lexText,
-               items:      make(chan item, 2), // Two items of buffering is sufficient for all state functions
+               items:      make(chan item),
        }
+       go l.run()
        return l
 }
 
+// run runs the state machine for the lexer.
+func (l *lexer) run() {
+       for l.state = lexText; l.state != nil; {
+               l.state = l.state(l)
+       }
+}
+
 // state functions
 
 const (
@@ -391,7 +390,7 @@ func (l *lexer) atTerminator() bool {
 }
 
 // lexChar scans a character constant. The initial quote is already
-// scanned.  Syntax checking is done by the parse.
+// scanned.  Syntax checking is done by the parser.
 func lexChar(l *lexer) stateFn {
 Loop:
        for {