]> Cypherpunks repositories - gostls13.git/commitdiff
regexp: implement early out for failed anchored search.
authorRob Pike <r@golang.org>
Tue, 4 Jan 2011 20:43:52 +0000 (12:43 -0800)
committerRob Pike <r@golang.org>
Tue, 4 Jan 2011 20:43:52 +0000 (12:43 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/3813045

src/pkg/regexp/regexp.go

index be3ce2028ea7baa08c363579c9feb82795c1c04c..2e03b798ab620ee2632391dfa5a5572c0204cf27 100644 (file)
@@ -783,13 +783,16 @@ func (re *Regexp) doExecute(str string, bytestr []byte, pos int) []int {
                pos += advance
        }
        arena := &matchArena{nil, 2 * (re.nbra + 1)}
-       for pos <= end {
-               if !found {
+       for startPos := pos; pos <= end; {
+               if !found && (pos == startPos || !anchored) {
                        // prime the pump if we haven't seen a match yet
                        match := arena.noMatch()
                        match.m[0] = pos
                        s[out] = arena.addState(s[out], re.start.next, false, match, pos, end)
                        arena.free(match) // if addState saved it, ref was incremented
+               } else if len(s[out]) == 0 {
+                       // machine has completed
+                       break
                }
                in, out = out, in // old out state is new in state
                // clear out old state
@@ -798,10 +801,6 @@ func (re *Regexp) doExecute(str string, bytestr []byte, pos int) []int {
                        arena.free(state.match)
                }
                s[out] = old[0:0] // truncate state vector
-               if found && len(s[in]) == 0 {
-                       // machine has completed
-                       break
-               }
                charwidth := 1
                c := endOfFile
                if pos < end {