From: Rob Pike Date: Mon, 23 Nov 2009 22:06:21 +0000 (-0800) Subject: fix bug in prefix code: must stop one character before any potential match of an... X-Git-Tag: weekly.2009-12-07~158 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3b7f552fbb5e762bb84f2466da16faa7f312145c;p=gostls13.git 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 --- diff --git a/src/pkg/regexp/all_test.go b/src/pkg/regexp/all_test.go index fb6f3a0301..6c586ba984 100644 --- a/src/pkg/regexp/all_test.go +++ b/src/pkg/regexp/all_test.go @@ -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 { diff --git a/src/pkg/regexp/regexp.go b/src/pkg/regexp/regexp.go index 8f17954d79..014a9fdc7a 100644 --- a/src/pkg/regexp/regexp.go +++ b/src/pkg/regexp/regexp.go @@ -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]);