Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(844)

Unified Diff: src/scanner.cc

Issue 684873002: Scanner: remove PushBack calls when we're going to return ILLEGAL. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebased Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/scanner.cc
diff --git a/src/scanner.cc b/src/scanner.cc
index 0709939dbac8b142a3ad81a2ea948fa681179b34..dc15e37e9a7c1087e56b7e3a57ca26a2703911d4 100644
--- a/src/scanner.cc
+++ b/src/scanner.cc
@@ -57,20 +57,10 @@ void Scanner::Initialize(Utf16CharacterStream* source) {
uc32 Scanner::ScanHexNumber(int expected_length) {
DCHECK(expected_length <= 4); // prevent overflow
- uc32 digits[4] = { 0, 0, 0, 0 };
uc32 x = 0;
for (int i = 0; i < expected_length; i++) {
- digits[i] = c0_;
int d = HexValue(c0_);
if (d < 0) {
- // According to ECMA-262, 3rd, 7.8.4, page 18, these hex escapes
- // should be illegal, but other JS VMs just return the
- // non-escaped version of the original character.
-
- // Push back digits that we have advanced past.
- for (int j = i-1; j >= 0; j--) {
- PushBack(digits[j]);
- }
return -1;
}
x = x * 16 + d;
@@ -894,9 +884,7 @@ uc32 Scanner::ScanIdentifierUnicodeEscape() {
Advance();
if (c0_ != 'u') return -1;
Advance();
- uc32 result = ScanHexNumber(4);
- if (result < 0) PushBack('u');
- return result;
+ return ScanHexNumber(4);
}
@@ -1145,31 +1133,19 @@ bool Scanner::ScanRegExpPattern(bool seen_equal) {
bool Scanner::ScanLiteralUnicodeEscape() {
DCHECK(c0_ == '\\');
- uc32 chars_read[6] = {'\\', 'u', 0, 0, 0, 0};
+ AddLiteralChar(c0_);
Advance();
- int i = 1;
+ int hex_digits_read = 0;
if (c0_ == 'u') {
- i++;
- while (i < 6) {
+ AddLiteralChar(c0_);
+ while (hex_digits_read < 4) {
Advance();
if (!IsHexDigit(c0_)) break;
- chars_read[i] = c0_;
- i++;
- }
- }
- if (i < 6) {
- // Incomplete escape. Undo all advances and return false.
- while (i > 0) {
- i--;
- PushBack(chars_read[i]);
+ AddLiteralChar(c0_);
+ ++hex_digits_read;
}
- return false;
- }
- // Complete escape. Add all chars to current literal buffer.
- for (int i = 0; i < 6; i++) {
- AddLiteralChar(chars_read[i]);
}
- return true;
+ return hex_digits_read == 4;
}
@@ -1181,7 +1157,7 @@ bool Scanner::ScanRegExpFlags() {
AddLiteralCharAdvance();
} else {
if (!ScanLiteralUnicodeEscape()) {
- break;
+ return false;
}
Advance();
}
« no previous file with comments | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698