Chromium Code Reviews| Index: src/scanner-base.cc |
| diff --git a/src/scanner-base.cc b/src/scanner-base.cc |
| index 9715ca995c65c784c5a0959396ec9de8bf965536..d06d05558431280f95636a910a70ee03d5a3e69d 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. |
| + |
| + // At some point, parse RegExps more throughly to capture |
|
Mads Ager (chromium)
2011/05/06 10:32:45
Put in TODO(bugnumber) here?
Lasse Reichstein
2011/05/06 11:39:24
Done.
|
| + // octal esacpes in strict mode. |
| } else { // Unescaped character. |
| if (c0_ == '[') in_character_class = true; |
| if (c0_ == ']') in_character_class = false; |