|
@@ -1,8 +1,10 @@
|
|
|
package goja
|
|
package goja
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "errors"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"regexp"
|
|
"regexp"
|
|
|
|
|
+ "regexp/syntax"
|
|
|
"strings"
|
|
"strings"
|
|
|
"unicode/utf16"
|
|
"unicode/utf16"
|
|
|
"unicode/utf8"
|
|
"unicode/utf8"
|
|
@@ -242,8 +244,8 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
|
|
|
patternStr = convertRegexpToUtf16(patternStr)
|
|
patternStr = convertRegexpToUtf16(patternStr)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- re2Str, err1 := parser.TransformRegExp(patternStr, dotAll, unicode)
|
|
|
|
|
- if err1 == nil {
|
|
|
|
|
|
|
+ re2Str, err := parser.TransformRegExp(patternStr, dotAll, unicode)
|
|
|
|
|
+ if err == nil {
|
|
|
re2flags := ""
|
|
re2flags := ""
|
|
|
if multiline {
|
|
if multiline {
|
|
|
re2flags += "m"
|
|
re2flags += "m"
|
|
@@ -260,15 +262,22 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
|
|
|
|
|
|
|
|
pattern, err1 := regexp.Compile(re2Str)
|
|
pattern, err1 := regexp.Compile(re2Str)
|
|
|
if err1 != nil {
|
|
if err1 != nil {
|
|
|
- err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1)
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ var syntaxError *syntax.Error
|
|
|
|
|
+ if !errors.As(err1, &syntaxError) || syntaxError.Code != syntax.ErrInvalidRepeatSize {
|
|
|
|
|
+ err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ wrapper = (*regexpWrapper)(pattern)
|
|
|
}
|
|
}
|
|
|
- wrapper = (*regexpWrapper)(pattern)
|
|
|
|
|
} else {
|
|
} else {
|
|
|
- if _, incompat := err1.(parser.RegexpErrorIncompatible); !incompat {
|
|
|
|
|
- err = err1
|
|
|
|
|
|
|
+ var incompat parser.RegexpErrorIncompatible
|
|
|
|
|
+ if !errors.As(err, &incompat) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if wrapper == nil {
|
|
|
wrapper2, err = compileRegexp2(patternStr, multiline, dotAll, ignoreCase, unicode)
|
|
wrapper2, err = compileRegexp2(patternStr, multiline, dotAll, ignoreCase, unicode)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Invalid regular expression (regexp2): %s (%v)", patternStr, err)
|
|
err = fmt.Errorf("Invalid regular expression (regexp2): %s (%v)", patternStr, err)
|