diff --git a/.test262/Makefile b/.test262/Makefile index 10dc2fa..3bb08cc 100644 --- a/.test262/Makefile +++ b/.test262/Makefile @@ -37,9 +37,11 @@ gauntlet: try: .fail head $< cat shim.js $< | $(otto) + @echo PASS try-tmp: tmp cat shim.js $< | $(otto) + @echo PASS look: .fail cat $< diff --git a/.test262/gauntlet b/.test262/gauntlet index e6bf2c6..41673d4 100755 --- a/.test262/gauntlet +++ b/.test262/gauntlet @@ -3,6 +3,8 @@ use strict; use warnings; +$| = 1; + my $passed = 0; while () { chomp; diff --git a/Makefile b/Makefile index 635bc67..dafa0c6 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,6 @@ TEST := -v --run ParseSuccess TEST := -v --run OttoError TEST := -v --run API TEST := -v --run IsValidRegExp -TEST := -v --run RegExp TEST := -v --run SwitchBreak TEST := -v --run Unicode TEST := -v --run _issue @@ -26,6 +25,7 @@ TEST := -v --run ParseFailure TEST := -v --run Lexer\|Parse TEST := -v --run Lexer TEST := -v --run String_ +TEST := -v --run RegExp TEST := . test: test-i diff --git a/lexer.go b/lexer.go index c92cffe..01bbf9a 100644 --- a/lexer.go +++ b/lexer.go @@ -288,8 +288,6 @@ func (self *_lexer) scanQuoteLiteral() _token { text.WriteRune('\v') case '0': text.WriteRune(0) - default: - text.WriteRune(value) case 'u': result := self.scanHexadecimalRune(4) if result != utf8.RuneError { @@ -305,6 +303,8 @@ func (self *_lexer) scanQuoteLiteral() _token { } else { text.WriteRune(value) } + default: + text.WriteRune(value) } // TODO Octal escaping default: diff --git a/otto_test.go b/otto_test.go index 15b84d0..dce411a 100644 --- a/otto_test.go +++ b/otto_test.go @@ -1562,6 +1562,8 @@ func TestRegExp(t *testing.T) { Is(result._object().Get("1"), "undefined") Is(result._object().Get("2"), "b") Is(result._object().Get("length"), "3") + + test(`/\u0041/.source`, "\\u0041") } func TestNewFunction(t *testing.T) { diff --git a/parse_expression.go b/parse_expression.go index 2c88bbd..2dda1b7 100644 --- a/parse_expression.go +++ b/parse_expression.go @@ -76,13 +76,17 @@ func (self *_parser) ParseRegExpLiteral(token _token) *_regExpNode { flags = self.Consume() } - pattern_ := transformRegExp(pattern) - _, err := regexp.Compile(pattern_) - if err != nil { - panic(token.newSyntaxError("Invalid regular expression: %s", err.Error()[22:])) // Skip redundant "parse regexp error" + { + // Test during parsing that this is a valid regular expression + // Sorry, (?=) and (?!) are invalid (for now) + pattern := transformRegExp(pattern) + _, err := regexp.Compile(pattern) + if err != nil { + panic(token.newSyntaxError("Invalid regular expression: %s", err.Error()[22:])) // Skip redundant "parse regexp error" + } } - node := newRegExpNode(pattern_, flags) + node := newRegExpNode(pattern, flags) self.markNode(node) return node } diff --git a/type_regexp.go b/type_regexp.go index bc497fe..5023783 100644 --- a/type_regexp.go +++ b/type_regexp.go @@ -44,7 +44,7 @@ func (runtime *_runtime) newRegExpObject(pattern string, flags string) *_object } } - re2pattern := pattern // Uhh, ... + re2pattern := transformRegExp(pattern) if len(re2flags) > 0 { re2pattern = fmt.Sprintf("(?%s:%s)", re2flags, re2pattern) }