1
0
mirror of https://github.com/golang/go synced 2024-11-22 09:34:54 -07:00

regexp: implement early out for failed anchored search.

R=rsc
CC=golang-dev
https://golang.org/cl/3813045
This commit is contained in:
Rob Pike 2011-01-04 12:43:52 -08:00
parent 236f9638b4
commit 6a5a527173

View File

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