diff options
Diffstat (limited to 'libgo/go/regexp/onepass.go')
-rw-r--r-- | libgo/go/regexp/onepass.go | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/libgo/go/regexp/onepass.go b/libgo/go/regexp/onepass.go index 1b0564c..3ceb461 100644 --- a/libgo/go/regexp/onepass.go +++ b/libgo/go/regexp/onepass.go @@ -222,9 +222,10 @@ func onePassCopy(prog *syntax.Prog) *onePassProg { p := &onePassProg{ Start: prog.Start, NumCap: prog.NumCap, + Inst: make([]onePassInst, len(prog.Inst)), } - for _, inst := range prog.Inst { - p.Inst = append(p.Inst, onePassInst{Inst: inst}) + for i, inst := range prog.Inst { + p.Inst[i] = onePassInst{Inst: inst} } // rewrites one or more common Prog constructs that enable some otherwise @@ -304,13 +305,13 @@ func makeOnePass(p *onePassProg) *onePassProg { var ( instQueue = newQueue(len(p.Inst)) visitQueue = newQueue(len(p.Inst)) - check func(uint32, map[uint32]bool) bool + check func(uint32, []bool) bool onePassRunes = make([][]rune, len(p.Inst)) ) // check that paths from Alt instructions are unambiguous, and rebuild the new // program as a onepass program - check = func(pc uint32, m map[uint32]bool) (ok bool) { + check = func(pc uint32, m []bool) (ok bool) { ok = true inst := &p.Inst[pc] if visitQueue.contains(pc) { @@ -349,21 +350,20 @@ func makeOnePass(p *onePassProg) *onePassProg { m[pc] = m[inst.Out] // pass matching runes back through these no-ops. onePassRunes[pc] = append([]rune{}, onePassRunes[inst.Out]...) - inst.Next = []uint32{} - for i := len(onePassRunes[pc]) / 2; i >= 0; i-- { - inst.Next = append(inst.Next, inst.Out) + inst.Next = make([]uint32, len(onePassRunes[pc])/2+1) + for i := range inst.Next { + inst.Next[i] = inst.Out } case syntax.InstEmptyWidth: ok = check(inst.Out, m) m[pc] = m[inst.Out] onePassRunes[pc] = append([]rune{}, onePassRunes[inst.Out]...) - inst.Next = []uint32{} - for i := len(onePassRunes[pc]) / 2; i >= 0; i-- { - inst.Next = append(inst.Next, inst.Out) + inst.Next = make([]uint32, len(onePassRunes[pc])/2+1) + for i := range inst.Next { + inst.Next[i] = inst.Out } case syntax.InstMatch, syntax.InstFail: m[pc] = inst.Op == syntax.InstMatch - break case syntax.InstRune: m[pc] = false if len(inst.Next) > 0 { @@ -387,9 +387,9 @@ func makeOnePass(p *onePassProg) *onePassProg { runes = append(runes, inst.Rune...) } onePassRunes[pc] = runes - inst.Next = []uint32{} - for i := len(onePassRunes[pc]) / 2; i >= 0; i-- { - inst.Next = append(inst.Next, inst.Out) + inst.Next = make([]uint32, len(onePassRunes[pc])/2+1) + for i := range inst.Next { + inst.Next[i] = inst.Out } inst.Op = syntax.InstRune case syntax.InstRune1: @@ -411,9 +411,9 @@ func makeOnePass(p *onePassProg) *onePassProg { runes = append(runes, inst.Rune[0], inst.Rune[0]) } onePassRunes[pc] = runes - inst.Next = []uint32{} - for i := len(onePassRunes[pc]) / 2; i >= 0; i-- { - inst.Next = append(inst.Next, inst.Out) + inst.Next = make([]uint32, len(onePassRunes[pc])/2+1) + for i := range inst.Next { + inst.Next[i] = inst.Out } inst.Op = syntax.InstRune case syntax.InstRuneAny: @@ -431,9 +431,9 @@ func makeOnePass(p *onePassProg) *onePassProg { } instQueue.insert(inst.Out) onePassRunes[pc] = append([]rune{}, anyRuneNotNL...) - inst.Next = []uint32{} - for i := len(onePassRunes[pc]) / 2; i >= 0; i-- { - inst.Next = append(inst.Next, inst.Out) + inst.Next = make([]uint32, len(onePassRunes[pc])/2+1) + for i := range inst.Next { + inst.Next[i] = inst.Out } } return @@ -441,7 +441,7 @@ func makeOnePass(p *onePassProg) *onePassProg { instQueue.clear() instQueue.insert(uint32(p.Start)) - m := make(map[uint32]bool, len(p.Inst)) + m := make([]bool, len(p.Inst)) for !instQueue.empty() { visitQueue.clear() pc := instQueue.next() |