<!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>[193679] trunk</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/193679">193679</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-12-07 18:14:29 -0800 (Mon, 07 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[INTL] Implement String.prototype.toLocaleUpperCase in ECMA-402
https://bugs.webkit.org/show_bug.cgi?id=147609

Patch by Andy VanWagoner &lt;thetalecrafter@gmail.com&gt; on 2015-12-07
Reviewed by Benjamin Poulain.

Source/JavaScriptCore:

Refactor most of toLocaleLowerCase to static function used by both
toLocaleUpperCase and toLocaleLowerCase.
Add toLocaleUpperCase using icu u_strToUpper.

* runtime/StringPrototype.cpp:
(JSC::StringPrototype::finishCreation):
(JSC::toLocaleCase):
(JSC::stringProtoFuncToLocaleLowerCase):
(JSC::stringProtoFuncToLocaleUpperCase):

LayoutTests:

* js/script-tests/string-toLocaleUpperCase.js: Added.
* js/string-toLocaleUpperCase-expected.txt: Added.
* js/string-toLocaleUpperCase.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringPrototypecpp">trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsjsscripttestsstringtoLocaleUpperCasejs">trunk/LayoutTests/js/script-tests/string-toLocaleUpperCase.js</a></li>
<li><a href="#trunkLayoutTestsjsstringtoLocaleUpperCaseexpectedtxt">trunk/LayoutTests/js/string-toLocaleUpperCase-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsstringtoLocaleUpperCasehtml">trunk/LayoutTests/js/string-toLocaleUpperCase.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (193678 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-12-08 01:53:21 UTC (rev 193678)
+++ trunk/LayoutTests/ChangeLog        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-12-07  Andy VanWagoner  &lt;thetalecrafter@gmail.com&gt;
+
+        [INTL] Implement String.prototype.toLocaleUpperCase in ECMA-402
+        https://bugs.webkit.org/show_bug.cgi?id=147609
+
+        Reviewed by Benjamin Poulain.
+
+        * js/script-tests/string-toLocaleUpperCase.js: Added.
+        * js/string-toLocaleUpperCase-expected.txt: Added.
+        * js/string-toLocaleUpperCase.html: Added.
+
</ins><span class="cx"> 2015-12-07  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac] Remove Mavericks-specific TestExpectations lines
</span></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsstringtoLocaleUpperCasejs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/script-tests/string-toLocaleUpperCase.js (0 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/string-toLocaleUpperCase.js                                (rev 0)
+++ trunk/LayoutTests/js/script-tests/string-toLocaleUpperCase.js        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+description(&quot;This test checks String.prototype.toLocaleUpperCase().&quot;);
+
+shouldBe(&quot;String.prototype.toLocaleUpperCase.length&quot;, &quot;0&quot;);
+
+// Check empty string optimization.
+shouldBe(&quot;''.toLocaleUpperCase()&quot;, &quot;''&quot;);
+
+// Generic
+shouldBe(&quot;String.prototype.toLocaleUpperCase.call({ toString() { return 'a' } })&quot;, &quot;'A'&quot;);
+shouldThrow(&quot;String.prototype.toLocaleUpperCase.call({ toString() { throw Error('1') } })&quot;, &quot;'Error: 1'&quot;);
+shouldThrow(&quot;String.prototype.toLocaleUpperCase.call(null)&quot;);
+shouldThrow(&quot;String.prototype.toLocaleUpperCase.call(undefined)&quot;);
+
+// Ignores non-object, non-string locale list.
+shouldBe(&quot;'a'.toLocaleUpperCase(9)&quot;, &quot;'A'&quot;);
+// Handles array-like objects with holes.
+shouldBe(&quot;'i'.toLocaleUpperCase({ length: 4, 1: 'az', 3: 'en' })&quot;, &quot;'\\u0130'&quot;);
+// Doesn't throw, but ignores private tags.
+shouldBe(&quot;'a'.toLocaleUpperCase('x-some-thing')&quot;, &quot;'A'&quot;);
+// Throws on problems with length, get, or toString.
+shouldThrow(&quot;'a'.toLocaleUpperCase(Object.create(null, { length: { get() { throw Error('a') } } }))&quot;, &quot;'Error: a'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase(Object.create(null, { length: { value: 1 }, 0: { get() { throw Error('b') } } }))&quot;, &quot;'Error: b'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase([ { toString() { throw Error('c') } } ])&quot;, &quot;'Error: c'&quot;);
+// Throws on bad tags.
+shouldThrow(&quot;'a'.toLocaleUpperCase([ 5 ])&quot;, &quot;'TypeError: locale value must be a string or object'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('')&quot;, &quot;'RangeError: invalid language tag: '&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('a')&quot;, &quot;'RangeError: invalid language tag: a'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('abcdefghij')&quot;, &quot;'RangeError: invalid language tag: abcdefghij'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('#$')&quot;, &quot;'RangeError: invalid language tag: #$'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-@-abc')&quot;, &quot;'RangeError: invalid language tag: en-@-abc'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-u')&quot;, &quot;'RangeError: invalid language tag: en-u'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-u-kn-true-u-ko-true')&quot;, &quot;'RangeError: invalid language tag: en-u-kn-true-u-ko-true'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-x')&quot;, &quot;'RangeError: invalid language tag: en-x'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-*')&quot;, &quot;'RangeError: invalid language tag: en-*'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en-')&quot;, &quot;'RangeError: invalid language tag: en-'&quot;);
+shouldThrow(&quot;'a'.toLocaleUpperCase('en--US')&quot;, &quot;'RangeError: invalid language tag: en--US'&quot;);
+
+// Check ascii and accents.
+shouldBe(&quot;'AbCdEfGhIjKlMnOpQRStuvWXyZ0123456789'.toLocaleUpperCase()&quot;, &quot;'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'&quot;);
+shouldBe(&quot;'àéîöœøūñ'.toLocaleUpperCase()&quot;, &quot;'ÀÉÎÖŒØŪÑ'&quot;);
+
+// Check non-special case for i.
+shouldBe(&quot;'i'.toLocaleUpperCase('und')&quot;, &quot;'I'&quot;);
+
+// Check for special casing of Azeri.
+shouldBe(&quot;'\\u0130'.toLocaleUpperCase('az')&quot;, &quot;'\\u0130'&quot;);
+shouldBe(&quot;'I'.toLocaleUpperCase('az')&quot;, &quot;'I'&quot;);
+shouldBe(&quot;'i'.toLocaleUpperCase('az')&quot;, &quot;'\\u0130'&quot;);
+shouldBe(&quot;'\\u0131'.toLocaleUpperCase('az')&quot;, &quot;'I'&quot;);
+
+// Check for special casing of Lithuanian.
+shouldBe(&quot;'I\\u0307'.toLocaleUpperCase('lt')&quot;, &quot;'I\\u0307'&quot;);
+shouldBe(&quot;'J\\u0307'.toLocaleUpperCase('lt')&quot;, &quot;'J\\u0307'&quot;);
+// Code points with Soft_Dotted property (Unicode 5.1, PropList.txt)
+var softDotted = [
+    &quot;\\u0069&quot;, &quot;\\u006A&quot;,  // LATIN SMALL LETTER I..LATIN SMALL LETTER J
+    &quot;\\u012F&quot;,             // LATIN SMALL LETTER I WITH OGONEK
+    &quot;\\u0249&quot;,             // LATIN SMALL LETTER J WITH STROKE
+    &quot;\\u0268&quot;,             // LATIN SMALL LETTER I WITH STROKE
+    &quot;\\u029D&quot;,             // LATIN SMALL LETTER J WITH CROSSED-TAIL
+    &quot;\\u02B2&quot;,             // MODIFIER LETTER SMALL J
+    &quot;\\u03F3&quot;,             // GREEK LETTER YOT
+    &quot;\\u0456&quot;,             // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+    &quot;\\u0458&quot;,             // CYRILLIC SMALL LETTER JE
+    &quot;\\u1D62&quot;,             // LATIN SUBSCRIPT SMALL LETTER I
+    &quot;\\u1D96&quot;,             // LATIN SMALL LETTER I WITH RETROFLEX HOOK
+    &quot;\\u1DA4&quot;,             // MODIFIER LETTER SMALL I WITH STROKE
+    &quot;\\u1DA8&quot;,             // MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+    &quot;\\u1E2D&quot;,             // LATIN SMALL LETTER I WITH TILDE BELOW
+    &quot;\\u1ECB&quot;,             // LATIN SMALL LETTER I WITH DOT BELOW
+    &quot;\\u2071&quot;,             // SUPERSCRIPT LATIN SMALL LETTER I
+    &quot;\\u2148&quot;, &quot;\\u2149&quot;,  // DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J
+    &quot;\\u2C7C&quot;,             // LATIN SUBSCRIPT SMALL LETTER J
+    &quot;\\uD835\\uDC22&quot;, &quot;\\uD835\\uDC23&quot;,   // MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J
+    &quot;\\uD835\\uDC56&quot;, &quot;\\uD835\\uDC57&quot;,   // MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J
+    &quot;\\uD835\\uDC8A&quot;, &quot;\\uD835\\uDC8B&quot;,   // MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J
+    &quot;\\uD835\\uDCBE&quot;, &quot;\\uD835\\uDCBF&quot;,   // MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J
+    &quot;\\uD835\\uDCF2&quot;, &quot;\\uD835\\uDCF3&quot;,   // MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J
+    &quot;\\uD835\\uDD26&quot;, &quot;\\uD835\\uDD27&quot;,   // MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J
+    &quot;\\uD835\\uDD5A&quot;, &quot;\\uD835\\uDD5B&quot;,   // MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J
+    &quot;\\uD835\\uDD8E&quot;, &quot;\\uD835\\uDD8F&quot;,   // MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J
+    &quot;\\uD835\\uDDC2&quot;, &quot;\\uD835\\uDDC3&quot;,   // MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J
+    &quot;\\uD835\\uDDF6&quot;, &quot;\\uD835\\uDDF7&quot;,   // MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J
+    &quot;\\uD835\\uDE2A&quot;, &quot;\\uD835\\uDE2B&quot;,   // MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
+    &quot;\\uD835\\uDE5E&quot;, &quot;\\uD835\\uDE5F&quot;,   // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+    &quot;\\uD835\\uDE92&quot;, &quot;\\uD835\\uDE93&quot;,   // MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
+];
+// COMBINING DOT ABOVE (U+0307) removed when preceded by Soft_Dotted.
+for (var i = 0; i &lt; softDotted.length; ++i) {
+    shouldBe(&quot;'&quot; + softDotted[i] + &quot;\\u0307'.toLocaleUpperCase('lt')&quot;, &quot;'&quot; + softDotted[i] + &quot;'.toLocaleUpperCase('und')&quot;);
+    shouldBe(&quot;'&quot; + softDotted[i] + &quot;\\u0323\\u0307'.toLocaleUpperCase('lt')&quot;, &quot;'&quot; + softDotted[i] + &quot;'.toLocaleUpperCase('und') + '\\u0323'&quot;);
+    shouldBe(&quot;'&quot; + softDotted[i] + &quot;\\uD800\\uDDFD\\u0307'.toLocaleUpperCase('lt')&quot;, &quot;'&quot; + softDotted[i] + &quot;'.toLocaleUpperCase('und') + '\\uD800\\uDDFD'&quot;);
+}
+
+// Check for special casing of Turkish.
+shouldBe(&quot;'\\u0130'.toLocaleUpperCase('tr')&quot;, &quot;'\\u0130'&quot;);
+shouldBe(&quot;'I'.toLocaleUpperCase('tr')&quot;, &quot;'I'&quot;);
+shouldBe(&quot;'i'.toLocaleUpperCase('tr')&quot;, &quot;'\\u0130'&quot;);
+shouldBe(&quot;'\\u0131'.toLocaleUpperCase('tr')&quot;, &quot;'I'&quot;);
</ins></span></pre></div>
<a id="trunkLayoutTestsjsstringtoLocaleUpperCaseexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/string-toLocaleUpperCase-expected.txt (0 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/string-toLocaleUpperCase-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/string-toLocaleUpperCase-expected.txt        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -0,0 +1,184 @@
</span><ins>+This test checks String.prototype.toLocaleUpperCase().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS String.prototype.toLocaleUpperCase.length is 0
+PASS ''.toLocaleUpperCase() is ''
+PASS String.prototype.toLocaleUpperCase.call({ toString() { return 'a' } }) is 'A'
+PASS String.prototype.toLocaleUpperCase.call({ toString() { throw Error('1') } }) threw exception Error: 1.
+PASS String.prototype.toLocaleUpperCase.call(null) threw exception TypeError: Type error.
+PASS String.prototype.toLocaleUpperCase.call(undefined) threw exception TypeError: Type error.
+PASS 'a'.toLocaleUpperCase(9) is 'A'
+PASS 'i'.toLocaleUpperCase({ length: 4, 1: 'az', 3: 'en' }) is '\u0130'
+PASS 'a'.toLocaleUpperCase('x-some-thing') is 'A'
+PASS 'a'.toLocaleUpperCase(Object.create(null, { length: { get() { throw Error('a') } } })) threw exception Error: a.
+PASS 'a'.toLocaleUpperCase(Object.create(null, { length: { value: 1 }, 0: { get() { throw Error('b') } } })) threw exception Error: b.
+PASS 'a'.toLocaleUpperCase([ { toString() { throw Error('c') } } ]) threw exception Error: c.
+PASS 'a'.toLocaleUpperCase([ 5 ]) threw exception TypeError: locale value must be a string or object.
+PASS 'a'.toLocaleUpperCase('') threw exception RangeError: invalid language tag: .
+PASS 'a'.toLocaleUpperCase('a') threw exception RangeError: invalid language tag: a.
+PASS 'a'.toLocaleUpperCase('abcdefghij') threw exception RangeError: invalid language tag: abcdefghij.
+PASS 'a'.toLocaleUpperCase('#$') threw exception RangeError: invalid language tag: #$.
+PASS 'a'.toLocaleUpperCase('en-@-abc') threw exception RangeError: invalid language tag: en-@-abc.
+PASS 'a'.toLocaleUpperCase('en-u') threw exception RangeError: invalid language tag: en-u.
+PASS 'a'.toLocaleUpperCase('en-u-kn-true-u-ko-true') threw exception RangeError: invalid language tag: en-u-kn-true-u-ko-true.
+PASS 'a'.toLocaleUpperCase('en-x') threw exception RangeError: invalid language tag: en-x.
+PASS 'a'.toLocaleUpperCase('en-*') threw exception RangeError: invalid language tag: en-*.
+PASS 'a'.toLocaleUpperCase('en-') threw exception RangeError: invalid language tag: en-.
+PASS 'a'.toLocaleUpperCase('en--US') threw exception RangeError: invalid language tag: en--US.
+PASS 'AbCdEfGhIjKlMnOpQRStuvWXyZ0123456789'.toLocaleUpperCase() is 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+PASS 'àéîöœøūñ'.toLocaleUpperCase() is 'ÀÉÎÖŒØŪÑ'
+PASS 'i'.toLocaleUpperCase('und') is 'I'
+PASS '\u0130'.toLocaleUpperCase('az') is '\u0130'
+PASS 'I'.toLocaleUpperCase('az') is 'I'
+PASS 'i'.toLocaleUpperCase('az') is '\u0130'
+PASS '\u0131'.toLocaleUpperCase('az') is 'I'
+PASS 'I\u0307'.toLocaleUpperCase('lt') is 'I\u0307'
+PASS 'J\u0307'.toLocaleUpperCase('lt') is 'J\u0307'
+PASS '\u0069\u0307'.toLocaleUpperCase('lt') is '\u0069'.toLocaleUpperCase('und')
+PASS '\u0069\u0323\u0307'.toLocaleUpperCase('lt') is '\u0069'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u0069\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u0069'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u006A\u0307'.toLocaleUpperCase('lt') is '\u006A'.toLocaleUpperCase('und')
+PASS '\u006A\u0323\u0307'.toLocaleUpperCase('lt') is '\u006A'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u006A\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u006A'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u012F\u0307'.toLocaleUpperCase('lt') is '\u012F'.toLocaleUpperCase('und')
+PASS '\u012F\u0323\u0307'.toLocaleUpperCase('lt') is '\u012F'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u012F\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u012F'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u0249\u0307'.toLocaleUpperCase('lt') is '\u0249'.toLocaleUpperCase('und')
+PASS '\u0249\u0323\u0307'.toLocaleUpperCase('lt') is '\u0249'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u0249\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u0249'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u0268\u0307'.toLocaleUpperCase('lt') is '\u0268'.toLocaleUpperCase('und')
+PASS '\u0268\u0323\u0307'.toLocaleUpperCase('lt') is '\u0268'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u0268\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u0268'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u029D\u0307'.toLocaleUpperCase('lt') is '\u029D'.toLocaleUpperCase('und')
+PASS '\u029D\u0323\u0307'.toLocaleUpperCase('lt') is '\u029D'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u029D\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u029D'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u02B2\u0307'.toLocaleUpperCase('lt') is '\u02B2'.toLocaleUpperCase('und')
+PASS '\u02B2\u0323\u0307'.toLocaleUpperCase('lt') is '\u02B2'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u02B2\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u02B2'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u03F3\u0307'.toLocaleUpperCase('lt') is '\u03F3'.toLocaleUpperCase('und')
+PASS '\u03F3\u0323\u0307'.toLocaleUpperCase('lt') is '\u03F3'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u03F3\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u03F3'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u0456\u0307'.toLocaleUpperCase('lt') is '\u0456'.toLocaleUpperCase('und')
+PASS '\u0456\u0323\u0307'.toLocaleUpperCase('lt') is '\u0456'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u0456\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u0456'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u0458\u0307'.toLocaleUpperCase('lt') is '\u0458'.toLocaleUpperCase('und')
+PASS '\u0458\u0323\u0307'.toLocaleUpperCase('lt') is '\u0458'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u0458\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u0458'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1D62\u0307'.toLocaleUpperCase('lt') is '\u1D62'.toLocaleUpperCase('und')
+PASS '\u1D62\u0323\u0307'.toLocaleUpperCase('lt') is '\u1D62'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1D62\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1D62'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1D96\u0307'.toLocaleUpperCase('lt') is '\u1D96'.toLocaleUpperCase('und')
+PASS '\u1D96\u0323\u0307'.toLocaleUpperCase('lt') is '\u1D96'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1D96\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1D96'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1DA4\u0307'.toLocaleUpperCase('lt') is '\u1DA4'.toLocaleUpperCase('und')
+PASS '\u1DA4\u0323\u0307'.toLocaleUpperCase('lt') is '\u1DA4'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1DA4\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1DA4'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1DA8\u0307'.toLocaleUpperCase('lt') is '\u1DA8'.toLocaleUpperCase('und')
+PASS '\u1DA8\u0323\u0307'.toLocaleUpperCase('lt') is '\u1DA8'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1DA8\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1DA8'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1E2D\u0307'.toLocaleUpperCase('lt') is '\u1E2D'.toLocaleUpperCase('und')
+PASS '\u1E2D\u0323\u0307'.toLocaleUpperCase('lt') is '\u1E2D'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1E2D\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1E2D'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u1ECB\u0307'.toLocaleUpperCase('lt') is '\u1ECB'.toLocaleUpperCase('und')
+PASS '\u1ECB\u0323\u0307'.toLocaleUpperCase('lt') is '\u1ECB'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u1ECB\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u1ECB'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u2071\u0307'.toLocaleUpperCase('lt') is '\u2071'.toLocaleUpperCase('und')
+PASS '\u2071\u0323\u0307'.toLocaleUpperCase('lt') is '\u2071'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u2071\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u2071'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u2148\u0307'.toLocaleUpperCase('lt') is '\u2148'.toLocaleUpperCase('und')
+PASS '\u2148\u0323\u0307'.toLocaleUpperCase('lt') is '\u2148'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u2148\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u2148'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u2149\u0307'.toLocaleUpperCase('lt') is '\u2149'.toLocaleUpperCase('und')
+PASS '\u2149\u0323\u0307'.toLocaleUpperCase('lt') is '\u2149'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u2149\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u2149'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u2C7C\u0307'.toLocaleUpperCase('lt') is '\u2C7C'.toLocaleUpperCase('und')
+PASS '\u2C7C\u0323\u0307'.toLocaleUpperCase('lt') is '\u2C7C'.toLocaleUpperCase('und') + '\u0323'
+PASS '\u2C7C\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\u2C7C'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC22\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC22'.toLocaleUpperCase('und')
+PASS '\uD835\uDC22\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC22'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC22\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC22'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC23\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC23'.toLocaleUpperCase('und')
+PASS '\uD835\uDC23\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC23'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC23\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC23'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC56\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC56'.toLocaleUpperCase('und')
+PASS '\uD835\uDC56\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC56'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC56\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC56'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC57\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC57'.toLocaleUpperCase('und')
+PASS '\uD835\uDC57\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC57'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC57\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC57'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC8A\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8A'.toLocaleUpperCase('und')
+PASS '\uD835\uDC8A\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8A'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC8A\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8A'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDC8B\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8B'.toLocaleUpperCase('und')
+PASS '\uD835\uDC8B\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8B'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDC8B\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDC8B'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDCBE\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBE'.toLocaleUpperCase('und')
+PASS '\uD835\uDCBE\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBE'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDCBE\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBE'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDCBF\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBF'.toLocaleUpperCase('und')
+PASS '\uD835\uDCBF\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBF'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDCBF\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCBF'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDCF2\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF2'.toLocaleUpperCase('und')
+PASS '\uD835\uDCF2\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF2'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDCF2\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF2'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDCF3\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF3'.toLocaleUpperCase('und')
+PASS '\uD835\uDCF3\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF3'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDCF3\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDCF3'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD26\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD26'.toLocaleUpperCase('und')
+PASS '\uD835\uDD26\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD26'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD26\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD26'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD27\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD27'.toLocaleUpperCase('und')
+PASS '\uD835\uDD27\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD27'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD27\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD27'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD5A\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5A'.toLocaleUpperCase('und')
+PASS '\uD835\uDD5A\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5A'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD5A\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5A'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD5B\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5B'.toLocaleUpperCase('und')
+PASS '\uD835\uDD5B\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5B'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD5B\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD5B'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD8E\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8E'.toLocaleUpperCase('und')
+PASS '\uD835\uDD8E\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8E'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD8E\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8E'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDD8F\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8F'.toLocaleUpperCase('und')
+PASS '\uD835\uDD8F\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8F'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDD8F\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDD8F'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDDC2\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC2'.toLocaleUpperCase('und')
+PASS '\uD835\uDDC2\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC2'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDDC2\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC2'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDDC3\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC3'.toLocaleUpperCase('und')
+PASS '\uD835\uDDC3\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC3'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDDC3\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDC3'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDDF6\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF6'.toLocaleUpperCase('und')
+PASS '\uD835\uDDF6\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF6'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDDF6\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF6'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDDF7\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF7'.toLocaleUpperCase('und')
+PASS '\uD835\uDDF7\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF7'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDDF7\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDDF7'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE2A\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2A'.toLocaleUpperCase('und')
+PASS '\uD835\uDE2A\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2A'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE2A\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2A'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE2B\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2B'.toLocaleUpperCase('und')
+PASS '\uD835\uDE2B\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2B'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE2B\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE2B'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE5E\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5E'.toLocaleUpperCase('und')
+PASS '\uD835\uDE5E\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5E'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE5E\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5E'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE5F\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5F'.toLocaleUpperCase('und')
+PASS '\uD835\uDE5F\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5F'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE5F\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE5F'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE92\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE92'.toLocaleUpperCase('und')
+PASS '\uD835\uDE92\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE92'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE92\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE92'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\uD835\uDE93\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE93'.toLocaleUpperCase('und')
+PASS '\uD835\uDE93\u0323\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE93'.toLocaleUpperCase('und') + '\u0323'
+PASS '\uD835\uDE93\uD800\uDDFD\u0307'.toLocaleUpperCase('lt') is '\uD835\uDE93'.toLocaleUpperCase('und') + '\uD800\uDDFD'
+PASS '\u0130'.toLocaleUpperCase('tr') is '\u0130'
+PASS 'I'.toLocaleUpperCase('tr') is 'I'
+PASS 'i'.toLocaleUpperCase('tr') is '\u0130'
+PASS '\u0131'.toLocaleUpperCase('tr') is 'I'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsstringtoLocaleUpperCasehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/string-toLocaleUpperCase.html (0 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/string-toLocaleUpperCase.html                                (rev 0)
+++ trunk/LayoutTests/js/string-toLocaleUpperCase.html        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf8&quot;&gt;
+&lt;script src=&quot;../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;script-tests/string-toLocaleUpperCase.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (193678 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-12-08 01:53:21 UTC (rev 193678)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-12-07  Andy VanWagoner  &lt;thetalecrafter@gmail.com&gt;
+
+        [INTL] Implement String.prototype.toLocaleUpperCase in ECMA-402
+        https://bugs.webkit.org/show_bug.cgi?id=147609
+
+        Reviewed by Benjamin Poulain.
+
+        Refactor most of toLocaleLowerCase to static function used by both
+        toLocaleUpperCase and toLocaleLowerCase.
+        Add toLocaleUpperCase using icu u_strToUpper.
+
+        * runtime/StringPrototype.cpp:
+        (JSC::StringPrototype::finishCreation):
+        (JSC::toLocaleCase):
+        (JSC::stringProtoFuncToLocaleLowerCase):
+        (JSC::stringProtoFuncToLocaleUpperCase):
+
</ins><span class="cx"> 2015-12-07  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CRASH: CodeBlock::setOptimizationThresholdBasedOnCompilationResult + 567
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp (193678 => 193679)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp        2015-12-08 01:53:21 UTC (rev 193678)
+++ trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp        2015-12-08 02:14:29 UTC (rev 193679)
</span><span class="lines">@@ -76,6 +76,7 @@
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncToUpperCase(ExecState*);
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncLocaleCompare(ExecState*);
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncToLocaleLowerCase(ExecState*);
</span><ins>+EncodedJSValue JSC_HOST_CALL stringProtoFuncToLocaleUpperCase(ExecState*);
</ins><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncBig(ExecState*);
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncSmall(ExecState*);
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncBlink(ExecState*);
</span><span class="lines">@@ -132,10 +133,11 @@
</span><span class="cx">     JSC_NATIVE_FUNCTION(&quot;localeCompare&quot;, stringProtoFuncLocaleCompare, DontEnum, 1);
</span><span class="cx"> #if ENABLE(INTL)
</span><span class="cx">     JSC_NATIVE_FUNCTION(&quot;toLocaleLowerCase&quot;, stringProtoFuncToLocaleLowerCase, DontEnum, 0);
</span><ins>+    JSC_NATIVE_FUNCTION(&quot;toLocaleUpperCase&quot;, stringProtoFuncToLocaleUpperCase, DontEnum, 0);
</ins><span class="cx"> #else
</span><span class="cx">     JSC_NATIVE_FUNCTION(&quot;toLocaleLowerCase&quot;, stringProtoFuncToLowerCase, DontEnum, 0);
</span><ins>+    JSC_NATIVE_FUNCTION(&quot;toLocaleUpperCase&quot;, stringProtoFuncToUpperCase, DontEnum, 0);
</ins><span class="cx"> #endif
</span><del>-    JSC_NATIVE_FUNCTION(&quot;toLocaleUpperCase&quot;, stringProtoFuncToUpperCase, DontEnum, 0);
</del><span class="cx">     JSC_NATIVE_FUNCTION(&quot;big&quot;, stringProtoFuncBig, DontEnum, 0);
</span><span class="cx">     JSC_NATIVE_FUNCTION(&quot;small&quot;, stringProtoFuncSmall, DontEnum, 0);
</span><span class="cx">     JSC_NATIVE_FUNCTION(&quot;blink&quot;, stringProtoFuncBlink, DontEnum, 0);
</span><span class="lines">@@ -1446,11 +1448,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INTL)
</span><del>-EncodedJSValue JSC_HOST_CALL stringProtoFuncToLocaleLowerCase(ExecState* state)
</del><ins>+static EncodedJSValue toLocaleCase(ExecState* state, int32_t (*convertCase)(UChar*, int32_t, const UChar*, int32_t, const char*, UErrorCode*))
</ins><span class="cx"> {
</span><del>-    // 13.1.2 String.prototype.toLocaleLowerCase ([locales])
-    // http://ecma-international.org/publications/standards/Ecma-402.htm
-
</del><span class="cx">     // 1. Let O be RequireObjectCoercible(this value).
</span><span class="cx">     JSValue thisValue = state-&gt;thisValue();
</span><span class="cx">     if (!checkObjectCoercible(thisValue))
</span><span class="lines">@@ -1502,25 +1501,25 @@
</span><span class="cx">     const StringView view(s);
</span><span class="cx">     const int32_t viewLength = view.length();
</span><span class="cx"> 
</span><del>-    // Delegate the following steps to u_strToLower.
</del><ins>+    // Delegate the following steps to icu u_strToLower or u_strToUpper.
</ins><span class="cx">     // 13. Let cpList be a List containing in order the code points of S as defined in ES2015, 6.1.4, starting at the first element of S.
</span><del>-    // 14. For each code point c in cpList, if the Unicode Character Database provides a lower case equivalent of c that is either language insensitive or for the language locale, then replace c in cpList with that/those equivalent code point(s).
</del><ins>+    // 14. For each code point c in cpList, if the Unicode Character Database provides a lower(/upper) case equivalent of c that is either language insensitive or for the language locale, then replace c in cpList with that/those equivalent code point(s).
</ins><span class="cx">     // 15. Let cuList be a new List.
</span><span class="cx">     // 16. For each code point c in cpList, in order, append to cuList the elements of the UTF-16 Encoding (defined in ES2015, 6.1.4) of c.
</span><span class="cx">     // 17. Let L be a String whose elements are, in order, the elements of cuList.
</span><span class="cx"> 
</span><del>-    // Most strings lower case will be the same size as original, so try that first.
</del><ins>+    // Most strings lower/upper case will be the same size as original, so try that first.
</ins><span class="cx">     UErrorCode error(U_ZERO_ERROR);
</span><span class="cx">     Vector&lt;UChar&gt; buffer(viewLength);
</span><span class="cx">     String lower;
</span><del>-    const int32_t resultLength = u_strToLower(buffer.data(), viewLength, view.upconvertedCharacters(), viewLength, utf8LocaleBuffer.data(), &amp;error);
</del><ins>+    const int32_t resultLength = convertCase(buffer.data(), viewLength, view.upconvertedCharacters(), viewLength, utf8LocaleBuffer.data(), &amp;error);
</ins><span class="cx">     if (U_SUCCESS(error))
</span><span class="cx">         lower = String(buffer.data(), resultLength);
</span><span class="cx">     else if (error == U_BUFFER_OVERFLOW_ERROR) {
</span><del>-        // Lower case needs more space than original. Try again.
</del><ins>+        // Converted case needs more space than original. Try again.
</ins><span class="cx">         UErrorCode error(U_ZERO_ERROR);
</span><span class="cx">         Vector&lt;UChar&gt; buffer(resultLength);
</span><del>-        u_strToLower(buffer.data(), resultLength, view.upconvertedCharacters(), viewLength, utf8LocaleBuffer.data(), &amp;error);
</del><ins>+        convertCase(buffer.data(), resultLength, view.upconvertedCharacters(), viewLength, utf8LocaleBuffer.data(), &amp;error);
</ins><span class="cx">         if (U_FAILURE(error))
</span><span class="cx">             return throwVMTypeError(state, u_errorName(error));
</span><span class="cx">         lower = String(buffer.data(), resultLength);
</span><span class="lines">@@ -1530,6 +1529,21 @@
</span><span class="cx">     // 18. Return L.
</span><span class="cx">     return JSValue::encode(jsString(state, lower));
</span><span class="cx"> }
</span><ins>+
+EncodedJSValue JSC_HOST_CALL stringProtoFuncToLocaleLowerCase(ExecState* state)
+{
+    // 13.1.2 String.prototype.toLocaleLowerCase ([locales])
+    // http://ecma-international.org/publications/standards/Ecma-402.htm
+    return toLocaleCase(state, u_strToLower);
+}
+
+EncodedJSValue JSC_HOST_CALL stringProtoFuncToLocaleUpperCase(ExecState* state)
+{
+    // 13.1.3 String.prototype.toLocaleUpperCase ([locales])
+    // http://ecma-international.org/publications/standards/Ecma-402.htm
+    // This function interprets a string value as a sequence of code points, as described in ES2015, 6.1.4. This function behaves in exactly the same way as String.prototype.toLocaleLowerCase, except that characters are mapped to their uppercase equivalents as specified in the Unicode character database.
+    return toLocaleCase(state, u_strToUpper);
+}
</ins><span class="cx"> #endif // ENABLE(INTL)
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL stringProtoFuncBig(ExecState* exec)
</span></span></pre>
</div>
</div>

</body>
</html>