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);