Reviewers: marja,

Message:
PTAL

Description:
Speed up string scanning

BUG=

Please review this at https://codereview.chromium.org/975043002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+24, -7 lines):
  M src/scanner.h
  M src/scanner.cc


Index: src/scanner.cc
diff --git a/src/scanner.cc b/src/scanner.cc
index a141f8aa0208a9144a0732071a6db307c621a5cd..e5dd0b9c4f4b334e436049691621b4d57e8ac428 100644
--- a/src/scanner.cc
+++ b/src/scanner.cc
@@ -790,9 +790,26 @@ uc32 Scanner::ScanOctalEscape(uc32 c, int length) {

 Token::Value Scanner::ScanString() {
   uc32 quote = c0_;
-  Advance();  // consume quote
+  Advance<false, false>();  // consume quote

   LiteralScope literal(this);
+  while (true) {
+    if (c0_ > 127) {
+      HandleLeadSurrogate();
+      break;
+    }
+    if (c0_ < 0 || c0_ == '\n' || c0_ == '\r') return Token::ILLEGAL;
+    if (c0_ == quote) {
+      literal.Complete();
+      Advance<false, false>();
+      return Token::STRING;
+    }
+    uc32 c = c0_;
+    if (c == '\\') break;
+    Advance<false, false>();
+    AddLiteralChar(c);
+  }
+
   while (c0_ != quote && c0_ >= 0
          && !unicode_cache_->IsLineTerminator(c0_)) {
     uc32 c = c0_;
@@ -993,11 +1010,11 @@ Token::Value Scanner::ScanNumber(bool seen_period) {
             c0_ != '.' && c0_ != 'e' && c0_ != 'E') {
           smi_value_ = value;
           literal.Complete();
-          HandleLeadSurrugate();
+          HandleLeadSurrogate();

           return Token::SMI;
         }
-        HandleLeadSurrugate();
+        HandleLeadSurrogate();
       }

       ScanDecimalDigits();  // optional
@@ -1230,7 +1247,7 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
                                       harmony_classes_);
     }

-    HandleLeadSurrugate();
+    HandleLeadSurrogate();
   } else if (IsInRange(c0_, 'A', 'Z') || c0_ == '_' || c0_ == '$') {
     do {
       uc32 first_char = c0_;
@@ -1243,7 +1260,7 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
       return Token::IDENTIFIER;
     }

-    HandleLeadSurrugate();
+    HandleLeadSurrogate();
   } else if (c0_ == '\\') {
     // Scan identifier start character.
     uc32 c = ScanIdentifierUnicodeEscape();
Index: src/scanner.h
diff --git a/src/scanner.h b/src/scanner.h
index 94f9102c042cddbbffe03865e7c533128017179b..2e96a99d874d8f22d4cf7524768f68c5fb3cd921 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -571,10 +571,10 @@ class Scanner {
       AddRawLiteralChar(c0_);
     }
     c0_ = source_->Advance();
-    if (check_surrogate) HandleLeadSurrugate();
+    if (check_surrogate) HandleLeadSurrogate();
   }

-  void HandleLeadSurrugate() {
+  void HandleLeadSurrogate() {
     if (unibrow::Utf16::IsLeadSurrogate(c0_)) {
       uc32 c1 = source_->Advance();
       if (!unibrow::Utf16::IsTrailSurrogate(c1)) {


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to