diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2015-10-31 00:59:47 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2015-10-31 00:59:47 +0000 |
commit | af146490bb04205107cb23e301ec7a8ff927b5fc (patch) | |
tree | 13beeaed3698c61903fe93fb1ce70bd9b18d4e7f /libgo/go/regexp/exec.go | |
parent | 725e1be3406315d9bcc8195d7eef0a7082b3c7cc (diff) | |
download | gcc-af146490bb04205107cb23e301ec7a8ff927b5fc.zip gcc-af146490bb04205107cb23e301ec7a8ff927b5fc.tar.gz gcc-af146490bb04205107cb23e301ec7a8ff927b5fc.tar.bz2 |
runtime: Remove now unnecessary pad field from ParFor.
It is not needed due to the removal of the ctx field.
Reviewed-on: https://go-review.googlesource.com/16525
From-SVN: r229616
Diffstat (limited to 'libgo/go/regexp/exec.go')
-rw-r--r-- | libgo/go/regexp/exec.go | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/libgo/go/regexp/exec.go b/libgo/go/regexp/exec.go index c4cb201..5182720 100644 --- a/libgo/go/regexp/exec.go +++ b/libgo/go/regexp/exec.go @@ -35,13 +35,15 @@ type thread struct { // A machine holds all the state during an NFA simulation for p. type machine struct { - re *Regexp // corresponding Regexp - p *syntax.Prog // compiled program - op *onePassProg // compiled onepass program, or notOnePass - q0, q1 queue // two queues for runq, nextq - pool []*thread // pool of available threads - matched bool // whether a match was found - matchcap []int // capture information for the match + re *Regexp // corresponding Regexp + p *syntax.Prog // compiled program + op *onePassProg // compiled onepass program, or notOnePass + maxBitStateLen int // max length of string to search with bitstate + b *bitState // state for backtracker, allocated lazily + q0, q1 queue // two queues for runq, nextq + pool []*thread // pool of available threads + matched bool // whether a match was found + matchcap []int // capture information for the match // cached inputs, to avoid allocation inputBytes inputBytes @@ -76,6 +78,9 @@ func progMachine(p *syntax.Prog, op *onePassProg) *machine { if ncap < 2 { ncap = 2 } + if op == notOnePass { + m.maxBitStateLen = maxBitStateLen(p) + } m.matchcap = make([]int, ncap) return m } @@ -422,18 +427,29 @@ var empty = make([]int, 0) func (re *Regexp) doExecute(r io.RuneReader, b []byte, s string, pos int, ncap int) []int { m := re.get() var i input + var size int if r != nil { i = m.newInputReader(r) } else if b != nil { i = m.newInputBytes(b) + size = len(b) } else { i = m.newInputString(s) + size = len(s) } if m.op != notOnePass { if !m.onepass(i, pos) { re.put(m) return nil } + } else if size < m.maxBitStateLen && r == nil { + if m.b == nil { + m.b = newBitState(m.p) + } + if !m.backtrack(i, pos, size, ncap) { + re.put(m) + return nil + } } else { m.init(ncap) if !m.match(i, pos) { |