| Index: src/scanner-base.cc
|
| diff --git a/src/scanner-base.cc b/src/scanner-base.cc
|
| index e4590b1261ecfe6d2159fa45a0564b57008b1216..14efa687730d23fda66a49004fd62a1583ea5969 100644
|
| --- a/src/scanner-base.cc
|
| +++ b/src/scanner-base.cc
|
| @@ -41,12 +41,12 @@ Scanner::Scanner(UnicodeCache* unicode_cache)
|
| : unicode_cache_(unicode_cache) { }
|
|
|
|
|
| -uc32 Scanner::ScanHexEscape(uc32 c, int length) {
|
| - ASSERT(length <= 4); // prevent overflow
|
| + uc32 Scanner::ScanHexNumber(int expected_length) {
|
| + ASSERT(expected_length <= 4); // prevent overflow
|
|
|
| uc32 digits[4];
|
| uc32 x = 0;
|
| - for (int i = 0; i < length; i++) {
|
| + for (int i = 0; i < expected_length; i++) {
|
| digits[i] = c0_;
|
| int d = HexValue(c0_);
|
| if (d < 0) {
|
| @@ -54,12 +54,11 @@ uc32 Scanner::ScanHexEscape(uc32 c, int length) {
|
| // should be illegal, but other JS VMs just return the
|
| // non-escaped version of the original character.
|
|
|
| - // Push back digits read, except the last one (in c0_).
|
| + // Push back digits that we have advanced past.
|
| for (int j = i-1; j >= 0; j--) {
|
| PushBack(digits[j]);
|
| }
|
| - // Notice: No handling of error - treat it as "\u"->"u".
|
| - return c;
|
| + return unibrow::Utf8::kBadChar;
|
| }
|
| x = x * 16 + d;
|
| Advance();
|
| @@ -638,9 +637,17 @@ void JavaScriptScanner::ScanEscape() {
|
| case 'n' : c = '\n'; break;
|
| case 'r' : c = '\r'; break;
|
| case 't' : c = '\t'; break;
|
| - case 'u' : c = ScanHexEscape(c, 4); break;
|
| + case 'u' : {
|
| + c = ScanHexNumber(4);
|
| + if (c == static_cast<uc32>(unibrow::Utf8::kBadChar)) c = 'u';
|
| + break;
|
| + }
|
| case 'v' : c = '\v'; break;
|
| - case 'x' : c = ScanHexEscape(c, 2); break;
|
| + case 'x' : {
|
| + c = ScanHexNumber(2);
|
| + if (c == static_cast<uc32>(unibrow::Utf8::kBadChar)) c = 'x';
|
| + break;
|
| + }
|
| case '0' : // fall through
|
| case '1' : // fall through
|
| case '2' : // fall through
|
| @@ -802,7 +809,7 @@ uc32 JavaScriptScanner::ScanIdentifierUnicodeEscape() {
|
| Advance();
|
| if (c0_ != 'u') return unibrow::Utf8::kBadChar;
|
| Advance();
|
| - uc32 c = ScanHexEscape('u', 4);
|
| + uc32 c = ScanHexNumber(4);
|
| // We do not allow a unicode escape sequence to start another
|
| // unicode escape sequence.
|
| if (c == '\\') return unibrow::Utf8::kBadChar;
|
|
|