Title: [205318] trunk/Source/WebCore
Revision
205318
Author
[email protected]
Date
2016-09-01 14:50:32 -0700 (Thu, 01 Sep 2016)

Log Message

Avoid unneeded string copy when parsing URL hosts
https://bugs.webkit.org/show_bug.cgi?id=161511

Reviewed by Tim Horton.

No change in behavior.  Covered by existing API tests.

* platform/URLParser.cpp:
(WebCore::URLParser::parse):
(WebCore::URLParser::parseAuthority):
(WebCore::URLParser::parseHost):
(WebCore::URLParser::authorityEndReached): Deleted.
(WebCore::URLParser::hostEndReached): Deleted.
* platform/URLParser.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (205317 => 205318)


--- trunk/Source/WebCore/ChangeLog	2016-09-01 21:45:52 UTC (rev 205317)
+++ trunk/Source/WebCore/ChangeLog	2016-09-01 21:50:32 UTC (rev 205318)
@@ -1,3 +1,20 @@
+2016-09-01  Alex Christensen  <[email protected]>
+
+        Avoid unneeded string copy when parsing URL hosts
+        https://bugs.webkit.org/show_bug.cgi?id=161511
+
+        Reviewed by Tim Horton.
+
+        No change in behavior.  Covered by existing API tests.
+
+        * platform/URLParser.cpp:
+        (WebCore::URLParser::parse):
+        (WebCore::URLParser::parseAuthority):
+        (WebCore::URLParser::parseHost):
+        (WebCore::URLParser::authorityEndReached): Deleted.
+        (WebCore::URLParser::hostEndReached): Deleted.
+        * platform/URLParser.h:
+
 2016-09-01  Ryosuke Niwa  <[email protected]>
 
         Add "whenDefined" to CustomElementRegistry

Modified: trunk/Source/WebCore/platform/URLParser.cpp (205317 => 205318)


--- trunk/Source/WebCore/platform/URLParser.cpp	2016-09-01 21:45:52 UTC (rev 205317)
+++ trunk/Source/WebCore/platform/URLParser.cpp	2016-09-01 21:50:32 UTC (rev 205318)
@@ -237,11 +237,11 @@
     LOG(URLParser, "Parsing URL <%s> base <%s>", input.utf8().data(), base.string().utf8().data());
     m_url = { };
     m_buffer.clear();
-    m_authorityOrHostBuffer.clear();
 
     auto codePoints = StringView(input).codePoints();
     auto c = codePoints.begin();
     auto end = codePoints.end();
+    auto authorityOrHostBegin = codePoints.begin();
     while (c != end && isC0ControlOrSpace(*c))
         ++c;
     
@@ -371,6 +371,7 @@
             if (*c == '/') {
                 state = State::AuthorityOrHost;
                 ++c;
+                authorityOrHostBegin = c;
             } else
                 state = State::Path;
             break;
@@ -436,30 +437,31 @@
             }
             m_url.m_userStart = m_buffer.length();
             state = State::AuthorityOrHost;
+            authorityOrHostBegin = c;
             break;
         case State::AuthorityOrHost:
             LOG_STATE("AuthorityOrHost");
             if (*c == '@') {
-                authorityEndReached();
+                parseAuthority(authorityOrHostBegin, c);
+                ++c;
+                authorityOrHostBegin = c;
                 state = State::Host;
             } else if (*c == '/' || *c == '?' || *c == '#') {
                 m_url.m_userEnd = m_buffer.length();
                 m_url.m_passwordEnd = m_url.m_userEnd;
-                hostEndReached();
+                parseHost(authorityOrHostBegin, c);
                 state = State::Path;
                 break;
-            } else
-                m_authorityOrHostBuffer.append(*c);
+            }
             ++c;
             break;
         case State::Host:
             LOG_STATE("Host");
             if (*c == '/' || *c == '?' || *c == '#') {
-                hostEndReached();
+                parseHost(authorityOrHostBegin, c);
                 state = State::Path;
                 break;
             }
-            m_authorityOrHostBuffer.append(*c);
             ++c;
             break;
         case State::File:
@@ -589,7 +591,7 @@
     case State::Host:
         if (state == State::Host)
             LOG_FINAL_STATE("Host");
-        hostEndReached();
+        parseHost(authorityOrHostBegin, end);
         m_buffer.append('/');
         m_url.m_pathEnd = m_url.m_portEnd + 1;
         m_url.m_pathAfterLastSlash = m_url.m_pathEnd;
@@ -637,11 +639,8 @@
     return m_url;
 }
 
-void URLParser::authorityEndReached()
+void URLParser::parseAuthority(StringView::CodePoints::Iterator& iterator, const StringView::CodePoints::Iterator& end)
 {
-    auto codePoints = StringView(m_authorityOrHostBuffer.toString()).codePoints();
-    auto iterator = codePoints.begin();
-    auto end = codePoints.end();
     for (; iterator != end; ++iterator) {
         m_buffer.append(*iterator);
         if (*iterator == ':') {
@@ -654,7 +653,6 @@
         m_buffer.append(*iterator);
     m_url.m_passwordEnd = m_buffer.length();
     m_buffer.append('@');
-    m_authorityOrHostBuffer.clear();
 }
 
 static void serializeIPv4(uint32_t address, StringBuilder& buffer)
@@ -925,11 +923,8 @@
     return address;
 }
 
-void URLParser::hostEndReached()
+void URLParser::parseHost(StringView::CodePoints::Iterator& iterator, const StringView::CodePoints::Iterator& end)
 {
-    auto codePoints = StringView(m_authorityOrHostBuffer.toString()).codePoints();
-    auto iterator = codePoints.begin();
-    auto end = codePoints.end();
     if (iterator == end)
         return;
     if (*iterator == '[') {
@@ -966,7 +961,6 @@
     }
     m_url.m_hostEnd = m_buffer.length();
     m_url.m_portEnd = m_url.m_hostEnd;
-    m_authorityOrHostBuffer.clear();
 }
 
 bool URLParser::allValuesEqual(const URL& a, const URL& b)

Modified: trunk/Source/WebCore/platform/URLParser.h (205317 => 205318)


--- trunk/Source/WebCore/platform/URLParser.h	2016-09-01 21:45:52 UTC (rev 205317)
+++ trunk/Source/WebCore/platform/URLParser.h	2016-09-01 21:50:32 UTC (rev 205318)
@@ -42,9 +42,8 @@
 private:
     URL m_url;
     StringBuilder m_buffer;
-    StringBuilder m_authorityOrHostBuffer; // FIXME: Save the iterator at the end of the scheme instead of using a second buffer.
-    void authorityEndReached();
-    void hostEndReached();
+    void parseAuthority(StringView::CodePoints::Iterator&, const StringView::CodePoints::Iterator& end);
+    void parseHost(StringView::CodePoints::Iterator&, const StringView::CodePoints::Iterator& end);
 
     enum class URLPart;
     void copyURLPartsUntil(const URL& base, URLPart);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to