Browse Source

RegExp source escaping should pass escaped characters through. Fixes #184.

Dmitry Panov 5 years ago
parent
commit
379ac97e7e
2 changed files with 14 additions and 0 deletions
  1. 7 0
      builtin_regexp.go
  2. 7 0
      regexp_test.go

+ 7 - 0
builtin_regexp.go

@@ -450,12 +450,19 @@ func (r *regexpObject) writeEscapedSource(sb *valueStringBuilder) bool {
 	pos := 0
 	lastPos := 0
 	rd := &lenientUtf16Decoder{utf16Reader: r.source.utf16Reader(0)}
+L:
 	for {
 		c, size, err := rd.ReadRune()
 		if err != nil {
 			break
 		}
 		switch c {
+		case '\\':
+			pos++
+			_, size, err = rd.ReadRune()
+			if err != nil {
+				break L
+			}
 		case '/', '\u000a', '\u000d', '\u2028', '\u2029':
 			sb.WriteSubstring(r.source, lastPos, pos)
 			sb.WriteRune('\\')

+ 7 - 0
regexp_test.go

@@ -359,6 +359,13 @@ func TestRegexpToString(t *testing.T) {
 	testScript1(SCRIPT, asciiString("/foo/bar"), t)
 }
 
+func TestRegexpEscapeSource(t *testing.T) {
+	const SCRIPT = `
+	/href="(.+?)(\/.*\/\S+?)\/"/.source;
+	`
+	testScript1(SCRIPT, asciiString(`href="(.+?)(\/.*\/\S+?)\/"`), t)
+}
+
 func BenchmarkRegexpSplitWithBackRef(b *testing.B) {
 	const SCRIPT = `
 	"aaaaaaaaaaaaaaaaaaaaaaaaa++bbbbbbbbbbbbbbbbbbbbbb+-ccccccccccccccccccccccc".split(/([+-])\1/)