go-pcre
go-pcre copied to clipboard
Protect re.extra damage from intensive CG working
I try this test:
func TestBulkMatcher(t *testing.T) {
var res []Regexp
for step := 0; step < 10000000; step++ {
pattern := fmt.Sprintf("%s", `(?us) *Начислено за расчётный +(?:Объём +)?[CС]умма без\R`)
newPattern, flags := ParseFlags(pattern)
flags |= NEWLINE_ANY
//log.Printf("Flags: %x", flags)
re := MustCompile(newPattern, flags)
studyFlags := 0 // STUDY_JIT_COMPILE
err := re.Study(studyFlags)
if err != nil {
t.Fatalf("Study error: %s\n", err)
}
res = append(res, re)
{
subject := fmt.Sprintf("%s", "Начислено за расчётный Объём Cумма без\r\n")
m := res[0].NewMatcherString(subject, NO_UTF8_CHECK)
if !m.Matches {
t.Errorf("The match should be matched (run step: %d)", step)
break
}
}
{
subject := fmt.Sprintf("%s", "Начислено за расчётный Объём Cумма без\r\n")
m := re.NewMatcherString(subject, NO_UTF8_CHECK)
if !m.Matches {
t.Errorf("The match should be matched (run step: %d)", step)
break
}
}
if step%10000 == 0 {
t.Logf("Run step: %d", step)
}
}
}
It fails after random cycles.
I checking it yet. May be Study returns nil when need return data.