| Index: src/scanner-base.cc
|
| diff --git a/src/scanner-base.cc b/src/scanner-base.cc
|
| index 9715ca995c65c784c5a0959396ec9de8bf965536..7af88cbbfff576ba1d3beafddb7786abbcdd73c4 100644
|
| --- a/src/scanner-base.cc
|
| +++ b/src/scanner-base.cc
|
| @@ -38,8 +38,7 @@ namespace internal {
|
| // Scanner
|
|
|
| Scanner::Scanner(UnicodeCache* unicode_cache)
|
| - : unicode_cache_(unicode_cache),
|
| - octal_pos_(kNoOctalLocation) { }
|
| + : unicode_cache_(unicode_cache) { }
|
|
|
|
|
| uc32 Scanner::ScanHexEscape(uc32 c, int length) {
|
| @@ -70,34 +69,12 @@ uc32 Scanner::ScanHexEscape(uc32 c, int length) {
|
| }
|
|
|
|
|
| -// Octal escapes of the forms '\0xx' and '\xxx' are not a part of
|
| -// ECMA-262. Other JS VMs support them.
|
| -uc32 Scanner::ScanOctalEscape(uc32 c, int length) {
|
| - uc32 x = c - '0';
|
| - int i = 0;
|
| - for (; i < length; i++) {
|
| - int d = c0_ - '0';
|
| - if (d < 0 || d > 7) break;
|
| - int nx = x * 8 + d;
|
| - if (nx >= 256) break;
|
| - x = nx;
|
| - Advance();
|
| - }
|
| - // Anything excelt '\0' is an octal escape sequence, illegal in strict mode.
|
| - // Remember the position of octal escape sequences so that better error
|
| - // can be reported later (in strict mode).
|
| - if (c != '0' || i > 0) {
|
| - octal_pos_ = source_pos() - i - 1; // Already advanced
|
| - }
|
| - return x;
|
| -}
|
| -
|
|
|
| // ----------------------------------------------------------------------------
|
| // JavaScriptScanner
|
|
|
| JavaScriptScanner::JavaScriptScanner(UnicodeCache* scanner_contants)
|
| - : Scanner(scanner_contants) { }
|
| + : Scanner(scanner_contants), octal_pos_(Location::invalid()) { }
|
|
|
|
|
| Token::Value JavaScriptScanner::Next() {
|
| @@ -518,6 +495,31 @@ void JavaScriptScanner::ScanEscape() {
|
| }
|
|
|
|
|
| +// Octal escapes of the forms '\0xx' and '\xxx' are not a part of
|
| +// ECMA-262. Other JS VMs support them.
|
| +uc32 JavaScriptScanner::ScanOctalEscape(uc32 c, int length) {
|
| + uc32 x = c - '0';
|
| + int i = 0;
|
| + for (; i < length; i++) {
|
| + int d = c0_ - '0';
|
| + if (d < 0 || d > 7) break;
|
| + int nx = x * 8 + d;
|
| + if (nx >= 256) break;
|
| + x = nx;
|
| + Advance();
|
| + }
|
| + // Anything except '\0' is an octal escape sequence, illegal in strict mode.
|
| + // Remember the position of octal escape sequences so that an error
|
| + // can be reported later (in strict mode).
|
| + // We don't report the error immediately, because the octal escape can
|
| + // occur before the "use strict" directive.
|
| + if (c != '0' || i > 0) {
|
| + octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1);
|
| + }
|
| + return x;
|
| +}
|
| +
|
| +
|
| Token::Value JavaScriptScanner::ScanString() {
|
| uc32 quote = c0_;
|
| Advance(); // consume quote
|
| @@ -586,7 +588,7 @@ Token::Value JavaScriptScanner::ScanNumber(bool seen_period) {
|
| }
|
| if (c0_ < '0' || '7' < c0_) {
|
| // Octal literal finished.
|
| - octal_pos_ = next_.location.beg_pos;
|
| + octal_pos_ = next_.location;
|
| break;
|
| }
|
| AddLiteralCharAdvance();
|
| @@ -729,6 +731,9 @@ bool JavaScriptScanner::ScanRegExpPattern(bool seen_equal) {
|
| // worrying whether the following characters are part of the escape
|
| // or not, since any '/', '\\' or '[' is guaranteed to not be part
|
| // of the escape sequence.
|
| +
|
| + // TODO(896): At some point, parse RegExps more throughly to capture
|
| + // octal esacpes in strict mode.
|
| } else { // Unescaped character.
|
| if (c0_ == '[') in_character_class = true;
|
| if (c0_ == ']') in_character_class = false;
|
|
|