Commit 3b7f552f authored by Rob Pike's avatar Rob Pike

fix bug in prefix code: must stop one character before any potential match of an empty string

Fixes #308.

R=rsc
CC=golang-dev
https://golang.org/cl/157142
parent b050a1b2
......@@ -95,6 +95,8 @@ var matches = []tester{
tester{`a*(|(b))c*`, "aacc", vec{0, 4, 2, 2, -1, -1}},
tester{`(.*).*`, "ab", vec{0, 2, 0, 2}},
tester{`[.]`, ".", vec{0, 1}},
tester{`/$`, "/abc/", vec{4, 5}},
tester{`/$`, "/abc", vec{}},
}
func compileTest(t *testing.T, expr string, error os.Error) *Regexp {
......
......@@ -633,15 +633,18 @@ func (re *Regexp) setPrefix() {
var utf = make([]byte, utf8.UTFMax);
// First instruction is start; skip that.
i := re.inst.At(0).(instr).next().index();
Loop:
for i < re.inst.Len() {
inst := re.inst.At(i).(instr);
// stop if this is not a char
if inst.kind() != _CHAR {
break
}
// stop if this char starts a closure; liberal but easy test: is an ALT next?
if re.inst.At(inst.next().index()).(instr).kind() == _ALT {
break
// stop if this char can be followed by a match for an empty string,
// which includes closures, ^, and $.
switch re.inst.At(inst.next().index()).(instr).kind() {
case _BOT, _EOT, _ALT:
break Loop
}
n := utf8.EncodeRune(inst.(*_Char).char, utf);
b = bytes.Add(b, utf[0:n]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment