<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[209761] trunk/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/209761">209761</a></dd>
<dt>Author</dt> <dd>jfbastien@apple.com</dd>
<dt>Date</dt> <dd>2016-12-13 11:15:05 -0800 (Tue, 13 Dec 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>[WTF] Turn tryMakeString(), makeString() into variadic templates
https://bugs.webkit.org/show_bug.cgi?id=147142
Reviewed by Mark Lam.
Source/JavaScriptCore:
* runtime/JSStringBuilder.h:
(JSC::jsMakeNontrivialString): remove WTF:: prefix, it isn't needed anymore
* runtime/Lookup.cpp:
(JSC::reifyStaticAccessor): remove WTF:: prefix, it isn't needed anymore
* runtime/ObjectPrototype.cpp:
(JSC::objectProtoFuncToString): remove WTF:: prefix, it isn't needed anymore
Source/WTF:
I wrote this patch while improving WebAssembly's error messages,
and only found this bug afterwards. My implementation does the
bare minimum to make this code variadic without changing
behavior. I think it's better to go with this baby step first, and
improve the code later.
Notable, for my WebAssembly patch I also taught the code to handle
integers and other types (including WebAssembly types). A
follow-up could rely on ADL magic to pretty-format these other
types.
* wtf/text/StringConcatenate.h:
(WTF::sumWithOverflow): This unconditionally does the sum for all
inputs, which the compiler is more likely to appreciate (because
it's the common case) compared to testing for overflow and bailing
on each addition
(WTF::are8Bit): are: the plural of is!
(WTF::makeStringAccumulator): accumulate strings
(WTF::tryMakeStringFromAdapters): a small helper which creates the string adapters
(WTF::tryMakeString): expose out of WTF, since it's part of this file's used API
(WTF::makeString): make it variadic</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSStringBuilderh">trunk/Source/JavaScriptCore/runtime/JSStringBuilder.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLookupcpp">trunk/Source/JavaScriptCore/runtime/Lookup.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeObjectPrototypecpp">trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtftextStringConcatenateh">trunk/Source/WTF/wtf/text/StringConcatenate.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-12-13 JF Bastien <jfbastien@apple.com>
+
+ [WTF] Turn tryMakeString(), makeString() into variadic templates
+ https://bugs.webkit.org/show_bug.cgi?id=147142
+
+ Reviewed by Mark Lam.
+
+ * runtime/JSStringBuilder.h:
+ (JSC::jsMakeNontrivialString): remove WTF:: prefix, it isn't needed anymore
+ * runtime/Lookup.cpp:
+ (JSC::reifyStaticAccessor): remove WTF:: prefix, it isn't needed anymore
+ * runtime/ObjectPrototype.cpp:
+ (JSC::objectProtoFuncToString): remove WTF:: prefix, it isn't needed anymore
+
</ins><span class="cx"> 2016-12-12 Mark Lam <mark.lam@apple.com>
</span><span class="cx">
</span><span class="cx"> Rename BytecodeGenerator's ControlFlowContext to ControlFlowScope.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSStringBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSStringBuilder.h (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSStringBuilder.h        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/JavaScriptCore/runtime/JSStringBuilder.h        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -130,7 +130,7 @@
</span><span class="cx"> {
</span><span class="cx"> VM& vm = exec->vm();
</span><span class="cx"> auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>- String result = WTF::tryMakeString(string, strings...);
</del><ins>+ String result = tryMakeString(string, strings...);
</ins><span class="cx"> if (UNLIKELY(!result || !JSString::isValidLength(result.length())))
</span><span class="cx"> return throwOutOfMemoryError(exec, scope);
</span><span class="cx"> return jsNontrivialString(exec, WTFMove(result));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLookupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Lookup.cpp (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> JSGlobalObject* globalObject = thisObject.globalObject();
</span><span class="cx"> GetterSetter* accessor = GetterSetter::create(vm, globalObject);
</span><span class="cx"> if (value.accessorGetter()) {
</span><del>- String getterName = WTF::tryMakeString(ASCIILiteral("get "), String(*propertyName.publicName()));
</del><ins>+ String getterName = tryMakeString(ASCIILiteral("get "), String(*propertyName.publicName()));
</ins><span class="cx"> if (!getterName)
</span><span class="cx"> return;
</span><span class="cx"> accessor->setGetter(vm, globalObject, value.attributes() & Builtin
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeObjectPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -337,7 +337,7 @@
</span><span class="cx">
</span><span class="cx"> String tag = thisObject->methodTable(vm)->toStringName(thisObject, exec);
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, { });
</span><del>- String newString = WTF::tryMakeString("[object ", WTFMove(tag), "]");
</del><ins>+ String newString = tryMakeString("[object ", WTFMove(tag), "]");
</ins><span class="cx"> if (!newString)
</span><span class="cx"> return throwOutOfMemoryError(exec, scope);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/WTF/ChangeLog        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2016-12-13 JF Bastien <jfbastien@apple.com>
+
+ [WTF] Turn tryMakeString(), makeString() into variadic templates
+ https://bugs.webkit.org/show_bug.cgi?id=147142
+
+ Reviewed by Mark Lam.
+
+ I wrote this patch while improving WebAssembly's error messages,
+ and only found this bug afterwards. My implementation does the
+ bare minimum to make this code variadic without changing
+ behavior. I think it's better to go with this baby step first, and
+ improve the code later.
+
+ Notable, for my WebAssembly patch I also taught the code to handle
+ integers and other types (including WebAssembly types). A
+ follow-up could rely on ADL magic to pretty-format these other
+ types.
+
+ * wtf/text/StringConcatenate.h:
+ (WTF::sumWithOverflow): This unconditionally does the sum for all
+ inputs, which the compiler is more likely to appreciate (because
+ it's the common case) compared to testing for overflow and bailing
+ on each addition
+ (WTF::are8Bit): are: the plural of is!
+ (WTF::makeStringAccumulator): accumulate strings
+ (WTF::tryMakeStringFromAdapters): a small helper which creates the string adapters
+ (WTF::tryMakeString): expose out of WTF, since it's part of this file's used API
+ (WTF::makeString): make it variadic
+
</ins><span class="cx"> 2016-12-13 Konstantin Tokarev <annulen@yandex.ru>
</span><span class="cx">
</span><span class="cx"> Unreviewed, silence -Wsuggest-attribute for GCC with pragmas
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringConcatenateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringConcatenate.h (209760 => 209761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringConcatenate.h        2016-12-13 18:47:01 UTC (rev 209760)
+++ trunk/Source/WTF/wtf/text/StringConcatenate.h        2016-12-13 19:15:05 UTC (rev 209761)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2010-2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2010-2016 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx"> while (m_characters[length])
</span><span class="cx"> ++length;
</span><span class="cx">
</span><del>- if (length > std::numeric_limits<unsigned>::max())
</del><ins>+ if (length > std::numeric_limits<unsigned>::max()) // FIXME this is silly https://bugs.webkit.org/show_bug.cgi?id=165790
</ins><span class="cx"> CRASH();
</span><span class="cx">
</span><span class="cx"> m_length = length;
</span><span class="lines">@@ -152,7 +152,7 @@
</span><span class="cx">
</span><span class="cx"> NO_RETURN_DUE_TO_CRASH void writeTo(LChar*) const
</span><span class="cx"> {
</span><del>- CRASH();
</del><ins>+ CRASH(); // FIXME make this a compile-time failure https://bugs.webkit.org/show_bug.cgi?id=165791
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void writeTo(UChar* destination) const
</span><span class="lines">@@ -259,7 +259,7 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-inline void sumWithOverflow(unsigned& total, unsigned addend, bool& overflow)
</del><ins>+inline void sumWithOverflow(bool& overflow, unsigned& total, unsigned addend)
</ins><span class="cx"> {
</span><span class="cx"> unsigned oldTotal = total;
</span><span class="cx"> total = oldTotal + addend;
</span><span class="lines">@@ -267,308 +267,57 @@
</span><span class="cx"> overflow = true;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2>
-String tryMakeString(StringType1 string1, StringType2 string2)
</del><ins>+template<typename... Unsigned>
+inline void sumWithOverflow(bool& overflow, unsigned& total, unsigned addend, Unsigned ...addends)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
-
- if (adapter1.length() && !adapter2.length())
- return adapter1.toString();
- if (!adapter1.length() && adapter2.length())
- return adapter2.toString();
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ unsigned oldTotal = total;
+ total = oldTotal + addend;
+ if (total < oldTotal)
+ overflow = true;
+ sumWithOverflow(overflow, total, addends...);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3)
</del><ins>+template<typename Adapter>
+inline bool are8Bit(Adapter adapter)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer = 0;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ return adapter.is8Bit();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4)
</del><ins>+template<typename Adapter, typename... Adapters>
+inline bool are8Bit(Adapter adapter, Adapters ...adapters)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ return adapter.is8Bit() && are8Bit(adapters...);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5)
</del><ins>+template<typename ResultType, typename Adapter>
+inline void makeStringAccumulator(ResultType* result, Adapter adapter)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
- StringTypeAdapter<StringType5> adapter5(string5);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- sumWithOverflow(length, adapter5.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit() && adapter5.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ adapter.writeTo(result);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6)
</del><ins>+template<typename ResultType, typename Adapter, typename... Adapters>
+inline void makeStringAccumulator(ResultType* result, Adapter adapter, Adapters ...adapters)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
- StringTypeAdapter<StringType5> adapter5(string5);
- StringTypeAdapter<StringType6> adapter6(string6);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- sumWithOverflow(length, adapter5.length(), overflow);
- sumWithOverflow(length, adapter6.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit() && adapter5.is8Bit() && adapter6.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ adapter.writeTo(result);
+ makeStringAccumulator(result + adapter.length(), adapters...);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7)
</del><ins>+template<typename StringTypeAdapter, typename... StringTypeAdapters>
+String tryMakeStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
- StringTypeAdapter<StringType5> adapter5(string5);
- StringTypeAdapter<StringType6> adapter6(string6);
- StringTypeAdapter<StringType7> adapter7(string7);
-
</del><span class="cx"> bool overflow = false;
</span><del>- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- sumWithOverflow(length, adapter5.length(), overflow);
- sumWithOverflow(length, adapter6.length(), overflow);
- sumWithOverflow(length, adapter7.length(), overflow);
</del><ins>+ unsigned length = adapter.length();
+ sumWithOverflow(overflow, length, adapters.length()...);
</ins><span class="cx"> if (overflow)
</span><span class="cx"> return String();
</span><span class="cx">
</span><del>- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit() && adapter5.is8Bit() && adapter6.is8Bit() && adapter7.is8Bit()) {
</del><ins>+ if (are8Bit(adapter, adapters...)) {
</ins><span class="cx"> LChar* buffer;
</span><span class="cx"> RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
</span><span class="cx"> if (!resultImpl)
</span><span class="cx"> return String();
</span><span class="cx">
</span><del>- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
</del><ins>+ makeStringAccumulator(buffer, adapter, adapters...);
</ins><span class="cx">
</span><span class="cx"> return WTFMove(resultImpl);
</span><span class="cx"> }
</span><span class="lines">@@ -578,263 +327,37 @@
</span><span class="cx"> if (!resultImpl)
</span><span class="cx"> return String();
</span><span class="cx">
</span><del>- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
</del><ins>+ makeStringAccumulator(buffer, adapter, adapters...);
</ins><span class="cx">
</span><span class="cx"> return WTFMove(resultImpl);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7, typename StringType8>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7, StringType8 string8)
</del><ins>+template<typename... StringTypes>
+String tryMakeString(StringTypes ...strings)
</ins><span class="cx"> {
</span><del>- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
- StringTypeAdapter<StringType5> adapter5(string5);
- StringTypeAdapter<StringType6> adapter6(string6);
- StringTypeAdapter<StringType7> adapter7(string7);
- StringTypeAdapter<StringType8> adapter8(string8);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- sumWithOverflow(length, adapter5.length(), overflow);
- sumWithOverflow(length, adapter6.length(), overflow);
- sumWithOverflow(length, adapter7.length(), overflow);
- sumWithOverflow(length, adapter8.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit() && adapter5.is8Bit() && adapter6.is8Bit() && adapter7.is8Bit() && adapter8.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
- result += adapter7.length();
- adapter8.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
- result += adapter7.length();
- adapter8.writeTo(result);
-
- return WTFMove(resultImpl);
</del><ins>+ return tryMakeStringFromAdapters(StringTypeAdapter<StringTypes>(strings)...);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7, typename StringType8, typename StringType9>
-String tryMakeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7, StringType8 string8, StringType9 string9)
-{
- StringTypeAdapter<StringType1> adapter1(string1);
- StringTypeAdapter<StringType2> adapter2(string2);
- StringTypeAdapter<StringType3> adapter3(string3);
- StringTypeAdapter<StringType4> adapter4(string4);
- StringTypeAdapter<StringType5> adapter5(string5);
- StringTypeAdapter<StringType6> adapter6(string6);
- StringTypeAdapter<StringType7> adapter7(string7);
- StringTypeAdapter<StringType8> adapter8(string8);
- StringTypeAdapter<StringType9> adapter9(string9);
-
- bool overflow = false;
- unsigned length = adapter1.length();
- sumWithOverflow(length, adapter2.length(), overflow);
- sumWithOverflow(length, adapter3.length(), overflow);
- sumWithOverflow(length, adapter4.length(), overflow);
- sumWithOverflow(length, adapter5.length(), overflow);
- sumWithOverflow(length, adapter6.length(), overflow);
- sumWithOverflow(length, adapter7.length(), overflow);
- sumWithOverflow(length, adapter8.length(), overflow);
- sumWithOverflow(length, adapter9.length(), overflow);
- if (overflow)
- return String();
-
- if (adapter1.is8Bit() && adapter2.is8Bit() && adapter3.is8Bit() && adapter4.is8Bit() && adapter5.is8Bit() && adapter6.is8Bit() && adapter7.is8Bit() && adapter8.is8Bit() && adapter9.is8Bit()) {
- LChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- LChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
- result += adapter7.length();
- adapter8.writeTo(result);
- result += adapter8.length();
- adapter9.writeTo(result);
-
- return WTFMove(resultImpl);
- }
-
- UChar* buffer;
- RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
- if (!resultImpl)
- return String();
-
- UChar* result = buffer;
- adapter1.writeTo(result);
- result += adapter1.length();
- adapter2.writeTo(result);
- result += adapter2.length();
- adapter3.writeTo(result);
- result += adapter3.length();
- adapter4.writeTo(result);
- result += adapter4.length();
- adapter5.writeTo(result);
- result += adapter5.length();
- adapter6.writeTo(result);
- result += adapter6.length();
- adapter7.writeTo(result);
- result += adapter7.length();
- adapter8.writeTo(result);
- result += adapter8.length();
- adapter9.writeTo(result);
-
- return WTFMove(resultImpl);
-}
-
-
</del><span class="cx"> // Convenience only.
</span><del>-template<typename StringType1>
-String makeString(StringType1 string1)
</del><ins>+template<typename StringType>
+String makeString(StringType string)
</ins><span class="cx"> {
</span><del>- return String(string1);
</del><ins>+ return String(string);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2>
-String makeString(StringType1 string1, StringType2 string2)
</del><ins>+template<typename... StringTypes>
+String makeString(StringTypes... strings)
</ins><span class="cx"> {
</span><del>- String result = tryMakeString(string1, string2);
</del><ins>+ String result = tryMakeString(strings...);
</ins><span class="cx"> if (!result)
</span><span class="cx"> CRASH();
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename StringType1, typename StringType2, typename StringType3>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3)
-{
- String result = tryMakeString(string1, string2, string3);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4)
-{
- String result = tryMakeString(string1, string2, string3, string4);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5)
-{
- String result = tryMakeString(string1, string2, string3, string4, string5);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6)
-{
- String result = tryMakeString(string1, string2, string3, string4, string5, string6);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7)
-{
- String result = tryMakeString(string1, string2, string3, string4, string5, string6, string7);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7, typename StringType8>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7, StringType8 string8)
-{
- String result = tryMakeString(string1, string2, string3, string4, string5, string6, string7, string8);
- if (!result)
- CRASH();
- return result;
-}
-
-template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6, typename StringType7, typename StringType8, typename StringType9>
-String makeString(StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6, StringType7 string7, StringType8 string8, StringType9 string9)
-{
- String result = tryMakeString(string1, string2, string3, string4, string5, string6, string7, string8, string9);
- if (!result)
- CRASH();
- return result;
-}
-
</del><span class="cx"> } // namespace WTF
</span><span class="cx">
</span><span class="cx"> using WTF::makeString;
</span><ins>+using WTF::tryMakeString;
</ins><span class="cx">
</span><span class="cx"> #include <wtf/text/StringOperators.h>
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>
</body>
</html>