bug 1230490 - Allow 16 bit character codes 1/2; r=evilpie
authorMorgan Phillips <winter2718@gmail.com>
Wed, 03 Aug 2016 12:11:38 -0700
changeset 308098 3cf7753c4d5ce44f3ce41f57126b53b8f93560bb
parent 308097 d11e341efcb0473e727fb50f7135a1c18c5b9b66
child 308099 5ee1aee9ddc03d410126796ff28e44a1d8a15ab9
push id80255
push usermphillips@mozilla.com
push dateThu, 04 Aug 2016 02:53:38 +0000
treeherdermozilla-inbound@5ee1aee9ddc0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersevilpie
bugs1230490
milestone51.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
bug 1230490 - Allow 16 bit character codes 1/2; r=evilpie
js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A2.js
js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T1.js
js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T2.js
js/src/vm/Unicode.h
js/src/vm/make_unicode.py
--- a/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A2.js
+++ b/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A2.js
@@ -4,286 +4,278 @@
 /**
  * The MV of StringNumericLiteral ::: StrWhiteSpace is 0
  *
  * @path ch09/9.3/9.3.1/S9.3.1_A2.js
  * @description Strings with various WhiteSpaces convert to Number by explicit transformation
  */
 
 // CHECK#1
-if (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== 0) {
-  $ERROR('#1.1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === 0. Actual: ' + (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")));
+if (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== 0) {
+  $ERROR('#1.1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === 0. Actual: ' + (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")));
 } else {
-  if (1/Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number.POSITIVE_INFINITY) {
-    $ERROR('#1.2: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === +0. Actual: -0');
-  }	
+  if (1/Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number.POSITIVE_INFINITY) {
+    $ERROR('#1.2: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === +0. Actual: -0');
+  }
 }
 
 // CHECK#2
 if (Number(" ") !== 0) {
   $ERROR('#2.1: Number(" ") === 0. Actual: ' + (Number(" ")));
 } else {
   if (1/Number(" ") !== Number.POSITIVE_INFINITY) {
     $ERROR('#2.2: Number(" ") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#3
 if (Number("\t") !== 0) {
   $ERROR('#3.1: Number("\\t") === 0. Actual: ' + (Number("\t")));
 } else {
   if (1/Number("\t") !== Number.POSITIVE_INFINITY) {
     $ERROR('#3.2: Number("\\t") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#4
 if (Number("\r") !== 0) {
   $ERROR('#4.1: Number("\\r") === 0. Actual: ' + (Number("\r")));
 } else {
   if (1/Number("\r") !== Number.POSITIVE_INFINITY) {
     $ERROR('#4.2: Number("\\r") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#5
 if (Number("\n") !== 0) {
   $ERROR('#5.1: Number("\\n") === 0. Actual: ' + (Number("\n")));
 } else {
   if (1/Number("\n") !== Number.POSITIVE_INFINITY) {
     $ERROR('#5.2: Number("\\n") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#6
 if (Number("\f") !== 0) {
   $ERROR('#6.1: Number("\\f") === 0. Actual: ' + (Number("\f")));
 } else {
   if (1/Number("\f") !== Number.POSITIVE_INFINITY) {
     $ERROR('#6.2: Number("\\f") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#7
 if (Number("\u0009") !== 0) {
   $ERROR('#7.1: Number("\\u0009") === 0. Actual: ' + (Number("\u0009")));
 } else {
   if (1/Number("\u0009") !== Number.POSITIVE_INFINITY) {
     $ERROR('#7.2: Number("\\u0009") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#8
 if (Number("\u000A") !== 0) {
   $ERROR('#8.1: Number("\\u000A") === 0. Actual: ' + (Number("\u000A")));
 } else {
   if (1/Number("\u000A") !== Number.POSITIVE_INFINITY) {
     $ERROR('#8.2: Number("\\u000A") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#9
 if (Number("\u000B") !== 0) {
   $ERROR('#9.1: Number("\\u000B") === 0. Actual: ' + (Number("\u000B")));
 } else {
   if (1/Number("\u000B") !== Number.POSITIVE_INFINITY) {
     $ERROR('#9.1.2: Number("\\u000B") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#10
 if (Number("\u000C") !== 0) {
   $ERROR('#10.1: Number("\\u000C") === 0. Actual: ' + (Number("\u000C")));
 } else {
   if (1/Number("\u000C") !== Number.POSITIVE_INFINITY) {
     $ERROR('#10.2: Number("\\u000C") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#11
 if (Number("\u000D") !== 0) {
   $ERROR('#11.1: Number("\\u000D") === 0. Actual: ' + (Number("\u000D")));
 } else {
   if (1/Number("\u000D") !== Number.POSITIVE_INFINITY) {
     $ERROR('#11.2: Number("\\u000D") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#12
 if (Number("\u00A0") !== 0) {
   $ERROR('#12.1: Number("\\u00A0") === 0. Actual: ' + (Number("\u00A0")));
 } else {
   if (1/Number("\u00A0") !== Number.POSITIVE_INFINITY) {
     $ERROR('#12.2: Number("\\u00A0") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#13
 if (Number("\u0020") !== 0) {
   $ERROR('#13.1: Number("\\u0020") === 0. Actual: ' + (Number("\u0020")));
 } else {
   if (1/Number("\u0020") !== Number.POSITIVE_INFINITY) {
     $ERROR('#13.2: Number("\\u0020") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#14
 if (Number("\u2028") !== 0) {
   $ERROR('#14.1: Number("\\u2028") === 0. Actual: ' + (Number("\u2028")));
 } else {
   if (1/Number("\u2028") !== Number.POSITIVE_INFINITY) {
     $ERROR('#14.2: Number("\\u2028") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#15
 if (Number("\u2029") !== 0) {
   $ERROR('#15.1: Number("\\u2029") === 0. Actual: ' + (Number("\u2029")));
 } else {
   if (1/Number("\u2029") !== Number.POSITIVE_INFINITY) {
     $ERROR('#15.2: Number("\\u2029") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#16
 if (Number("\u1680") !== 0) {
   $ERROR('#16.1: Number("\\u1680") === 0. Actual: ' + (Number("\u1680")));
 } else {
   if (1/Number("\u1680") !== Number.POSITIVE_INFINITY) {
     $ERROR('#16.2: Number("\\u1680") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#17
-if (Number("\u180E") !== 0) {
-  $ERROR('#17.1: Number("\\u180E") === 0. Actual: ' + (Number("\u180E")));
-} else {
-  if (1/Number("\u180E") !== Number.POSITIVE_INFINITY) {
-    $ERROR('#17.2: Number("\\u180E") === +0. Actual: -0');
-  }	
+if (!Number.isNaN(Number("\u180E"))) {
+  $ERROR('#17.1: !Number.isNaN(Number("\\u180E")). Actual: ' + (Number("\u180E")));
 }
 
 // CHECK#18
 if (Number("\u2000") !== 0) {
   $ERROR('#18.1: Number("\\u2000") === 0. Actual: ' + (Number("\u2000")));
 } else {
   if (1/Number("\u2000") !== Number.POSITIVE_INFINITY) {
     $ERROR('#18.2: Number("\\u2000") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#19
 if (Number("\u2001") !== 0) {
   $ERROR('#19.1: Number("\\u2001") === 0. Actual: ' + (Number("\u2001")));
 } else {
   if (1/Number("\u2001") !== Number.POSITIVE_INFINITY) {
     $ERROR('#19.2: Number("\\u2001") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#20
 if (Number("\u2002") !== 0) {
   $ERROR('#20.1: Number("\\u2002") === 0. Actual: ' + (Number("\u2002")));
 } else {
   if (1/Number("\u2002") !== Number.POSITIVE_INFINITY) {
     $ERROR('#20.2: Number("\\u2002") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#21
 if (Number("\u2003") !== 0) {
   $ERROR('#21.1: Number("\\u2003") === 0. Actual: ' + (Number("\u2003")));
 } else {
   if (1/Number("\u2003") !== Number.POSITIVE_INFINITY) {
     $ERROR('#21.2: Number("\\u2003") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#22
 if (Number("\u2004") !== 0) {
   $ERROR('#22.1: Number("\\u2004") === 0. Actual: ' + (Number("\u2004")));
 } else {
   if (1/Number("\u2004") !== Number.POSITIVE_INFINITY) {
     $ERROR('#22.2: Number("\\u2004") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#23
 if (Number("\u2005") !== 0) {
   $ERROR('#23.1: Number("\\u2005") === 0. Actual: ' + (Number("\u2005")));
 } else {
   if (1/Number("\u2005") !== Number.POSITIVE_INFINITY) {
     $ERROR('#23.2: Number("\\u2005") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#24
 if (Number("\u2006") !== 0) {
   $ERROR('#24.1: Number("\\u2006") === 0. Actual: ' + (Number("\u2006")));
 } else {
   if (1/Number("\u2006") !== Number.POSITIVE_INFINITY) {
     $ERROR('#24.2: Number("\\u2006") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#25
 if (Number("\u2007") !== 0) {
   $ERROR('#25.1: Number("\\u2007") === 0. Actual: ' + (Number("\u2007")));
 } else {
   if (1/Number("\u2007") !== Number.POSITIVE_INFINITY) {
     $ERROR('#25.2: Number("\\u2007") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#26
 if (Number("\u2008") !== 0) {
   $ERROR('#26.1: Number("\\u2008") === 0. Actual: ' + (Number("\u2008")));
 } else {
   if (1/Number("\u2008") !== Number.POSITIVE_INFINITY) {
     $ERROR('#26.2: Number("\\u2008") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#27
 if (Number("\u2009") !== 0) {
   $ERROR('#27.1: Number("\\u2009") === 0. Actual: ' + (Number("\u2009")));
 } else {
   if (1/Number("\u2009") !== Number.POSITIVE_INFINITY) {
     $ERROR('#27.2: Number("\\u2009") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#28
 if (Number("\u200A") !== 0) {
   $ERROR('#28.1: Number("\\u200A") === 0. Actual: ' + (Number("\u200A")));
 } else {
   if (1/Number("\u200A") !== Number.POSITIVE_INFINITY) {
     $ERROR('#28.2: Number("\\u200A") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#29
 if (Number("\u202F") !== 0) {
   $ERROR('#29.1: Number("\\u202F") === 0. Actual: ' + (Number("\u202F")));
 } else {
   if (1/Number("\u202F") !== Number.POSITIVE_INFINITY) {
     $ERROR('#29.2: Number("\\u202F") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#30
 if (Number("\u205F") !== 0) {
   $ERROR('#30.1: Number("\\u205F") === 0. Actual: ' + (Number("\u205F")));
 } else {
   if (1/Number("\u205F") !== Number.POSITIVE_INFINITY) {
     $ERROR('#30.2: Number("\\u205F") === +0. Actual: -0');
-  }	
+  }
 }
 
 // CHECK#31
-if (Number("\u3000") !== 0) {
-  $ERROR('#31.1: Number("\\u3000") === 0. Actual: ' + (Number("\u3000")));
-} else {
-  if (1/Number("\u3000") !== Number.POSITIVE_INFINITY) {
-    $ERROR('#31.2: Number("\\u3000") === +0. Actual: -0');
-  }	
+if (Number("\u3000") === NaN) {
+  $ERROR('#31.1: Number("\\u3000") === NaN. Actual: ' + (Number("\u3000")));
 }
 
--- a/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T1.js
+++ b/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T1.js
@@ -4,27 +4,27 @@
 /**
  * The MV of StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt is the MV of StrNumericLiteral, no matter whether white space is present or not
  *
  * @path ch09/9.3/9.3.1/S9.3.1_A3_T1.js
  * @description static string
  */
 
 // CHECK#1
-if (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number("")) {
-  $ERROR('#1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("")');
+if (Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number("")) {
+  $ERROR('#1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("")');
 }
 
 // CHECK#2
-if (Number("\u0009\u000C\u0020\u00A0\u000A\u000D\u2028\u2029\u000B\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u30001234567890\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number("1234567890")) {
-  $ERROR('#2: Number("\\u0009\\u000C\\u0020\\u00A0\\u000A\\u000D\\u2028\\u2029\\u000B\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u30001234567890\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("1234567890")');
+if (Number("\u0009\u000C\u0020\u00A0\u000A\u000D\u2028\u2029\u000B\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u30001234567890\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") !== Number("1234567890")) {
+  $ERROR('#2: Number("\\u0009\\u000C\\u0020\\u00A0\\u000A\\u000D\\u2028\\u2029\\u000B\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u30001234567890\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("1234567890")');
 }
 
 // CHECK#3
-if (!(+("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000Infinity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") == Number("Infinity"))) {
-  $ERROR('#3: +("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000Infinity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("Infinity")');
+if (!(+("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000Infinity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") == Number("Infinity"))) {
+  $ERROR('#3: +("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000Infinity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("Infinity")');
 }
 
 // CHECK#4
-if (!(Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000-Infinity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") == Number(-"Infinity"))) {
-  $ERROR('#4: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000-Infinity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("-Infinity")');
+if (!(Number("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000-Infinity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000") == Number(-"Infinity"))) {
+  $ERROR('#4: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000-Infinity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("-Infinity")');
 }
 
--- a/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T2.js
+++ b/js/src/tests/test262/ch09/9.3/9.3.1/S9.3.1_A3_T2.js
@@ -8,27 +8,27 @@
  * @description dynamic string
  */
 
 function dynaString(s1, s2){
   return String(s1)+String(s2);
 }
 
 // CHECK#1
-if (Number(dynaString("\u0009\u000C\u0020\u00A0\u000B", "\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) !== Number("")) {
-  $ERROR('#1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B"+"\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("")');
+if (Number(dynaString("\u0009\u000C\u0020\u00A0\u000B", "\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) !== Number("")) {
+  $ERROR('#1: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B"+"\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("")');
 }
 
 // CHECK#2
-if (+(dynaString("\u0009\u000C\u0020\u00A0\u000A\u000D\u2028\u2029\u000B12345", "67890\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) !== Number("1234567890")) {
-  $ERROR('#2: +("\\u0009\\u000C\\u0020\\u00A0\\u000A\\u000D\\u2028\\u2029\\u000B12345"+"67890\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("1234567890")');
+if (+(dynaString("\u0009\u000C\u0020\u00A0\u000A\u000D\u2028\u2029\u000B12345", "67890\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) !== Number("1234567890")) {
+  $ERROR('#2: +("\\u0009\\u000C\\u0020\\u00A0\\u000A\\u000D\\u2028\\u2029\\u000B12345"+"67890\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") === Number("1234567890")');
 }
 
 // CHECK#3
-if (!(Number(dynaString("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029Infi", "nity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) == Number("Infinity"))) {
-  $ERROR('#3: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029Infi"+"nity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("Infinity")');
+if (!(Number(dynaString("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029Infi", "nity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) == Number("Infinity"))) {
+  $ERROR('#3: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029Infi"+"nity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("Infinity")');
 }
 
 // CHECK#4
-if (!(Number(dynaString("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029-Infi", "nity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) == Number(-"Infinity"))) {
-  $ERROR('#4: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029-Infi"+"nity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("-Infinity")');
+if (!(Number(dynaString("\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029-Infi", "nity\u0009\u000C\u0020\u00A0\u000B\u000A\u000D\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000")) == Number(-"Infinity"))) {
+  $ERROR('#4: Number("\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029-Infi"+"nity\\u0009\\u000C\\u0020\\u00A0\\u000B\\u000A\\u000D\\u2028\\u2029\\u1680\\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000") == Number("-Infinity")');
 }
 
--- a/js/src/vm/Unicode.h
+++ b/js/src/vm/Unicode.h
@@ -98,25 +98,25 @@ class CharacterInfo {
         return flags & CharFlag::LETTER;
     }
 
     inline bool isIdentifierPart() const {
         return flags & (CharFlag::IDENTIFIER_PART | CharFlag::LETTER);
     }
 };
 
-extern const uint8_t index1[];
-extern const uint8_t index2[];
+extern const uint16_t index1[];
+extern const uint16_t index2[];
 extern const CharacterInfo js_charinfo[];
 
 inline const CharacterInfo&
 CharInfo(char16_t code)
 {
-    const size_t shift = 5;
-    size_t index = index1[code >> shift];
+    const size_t shift = 6;
+    uint16_t index = index1[code >> shift];
     index = index2[(index << shift) + (code & ((1 << shift) - 1))];
 
     return js_charinfo[index];
 }
 
 inline bool
 IsIdentifierStart(char16_t ch)
 {
--- a/js/src/vm/make_unicode.py
+++ b/js/src/vm/make_unicode.py
@@ -422,17 +422,17 @@ function test(code, ...equivs) {
     test_icase.write("""
 if (typeof reportCompare === "function")
     reportCompare(true, true);
 """)
 
     index1, index2, shift = splitbins(index)
 
     # Don't forget to update CharInfo in Unicode.cpp if you need to change this
-    assert shift == 5
+    assert shift == 6
 
     same_upper_index1, same_upper_index2, same_upper_shift = splitbins(same_upper_index)
 
     # Don't forget to update CharInfo in Unicode.cpp if you need to change this
     assert same_upper_shift == 6
 
     folding_index1, folding_index2, folding_shift = splitbins(folding_index)
 
@@ -522,23 +522,26 @@ if (typeof reportCompare === "function")
     for d in table:
         data_file.write('    {')
         data_file.write(', '.join((str(e) for e in d)))
         data_file.write('},\n')
     data_file.write('};\n')
     data_file.write('\n')
 
     def dump(data, name, file):
-        file.write('const uint8_t unicode::' + name + '[] = {\n')
+        size = 'uint8_t'
+        if name == 'index1' or name == 'index2':
+            size = 'uint16_t'
+        file.write('const ' + size + ' unicode::' + name + '[] = {\n')
 
         line = pad = ' ' * 4
         lines = []
         for entry in data:
-            assert entry < 256
             s = str(entry)
+            assert len(s) <= 3
             s = s.rjust(3)
 
             if len(line + s) + 5 > 99:
                 lines.append(line.rstrip())
                 line = pad + s + ', '
             else:
                 line = line + s + ', '
         lines.append(line.rstrip())