mirror of
https://github.com/golang/go
synced 2024-11-22 04:24:39 -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:
parent
236f9638b4
commit
6a5a527173
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user