11package goja
22
33import (
4+ "errors"
45 "fmt"
56 "regexp"
7+ "regexp/syntax"
68 "strings"
79 "unicode/utf16"
810 "unicode/utf8"
@@ -242,8 +244,8 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
242244 patternStr = convertRegexpToUtf16 (patternStr )
243245 }
244246
245- re2Str , err1 := parser .TransformRegExp (patternStr , dotAll , unicode )
246- if err1 == nil {
247+ re2Str , err := parser .TransformRegExp (patternStr , dotAll , unicode )
248+ if err == nil {
247249 re2flags := ""
248250 if multiline {
249251 re2flags += "m"
@@ -260,15 +262,22 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
260262
261263 pattern , err1 := regexp .Compile (re2Str )
262264 if err1 != nil {
263- err = fmt .Errorf ("Invalid regular expression (re2): %s (%v)" , re2Str , err1 )
264- return
265+ var syntaxError * syntax.Error
266+ if ! errors .As (err1 , & syntaxError ) || syntaxError .Code != syntax .ErrInvalidRepeatSize {
267+ err = fmt .Errorf ("Invalid regular expression (re2): %s (%v)" , re2Str , err1 )
268+ return
269+ }
270+ } else {
271+ wrapper = (* regexpWrapper )(pattern )
265272 }
266- wrapper = (* regexpWrapper )(pattern )
267273 } else {
268- if _ , incompat := err1 .( parser.RegexpErrorIncompatible ); ! incompat {
269- err = err1
274+ var incompat parser.RegexpErrorIncompatible
275+ if ! errors . As ( err , & incompat ) {
270276 return
271277 }
278+ }
279+
280+ if wrapper == nil {
272281 wrapper2 , err = compileRegexp2 (patternStr , multiline , dotAll , ignoreCase , unicode )
273282 if err != nil {
274283 err = fmt .Errorf ("Invalid regular expression (regexp2): %s (%v)" , patternStr , err )
0 commit comments