1// Copyright 2011 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28#include <stdlib.h> 29 30#include "src/v8.h" 31 32#include "src/base/platform/platform.h" 33#include "test/cctest/cctest.h" 34 35using namespace v8::internal; 36 37 38TEST(Hex) { 39 UnicodeCache uc; 40 CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 41 CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 42 CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 43 CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 44 CHECK_EQ(255.0, StringToDouble(&uc, "0xff", 45 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 46 CHECK_EQ(175.0, StringToDouble(&uc, "0xAF", 47 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 48 49 CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX)); 50 CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX)); 51 CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX)); 52 CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX)); 53 CHECK_EQ(255.0, StringToDouble(&uc, "0xff", ALLOW_HEX)); 54 CHECK_EQ(175.0, StringToDouble(&uc, "0xAF", ALLOW_HEX)); 55} 56 57 58TEST(Octal) { 59 UnicodeCache uc; 60 CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 61 CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 62 CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 63 CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 64 CHECK_EQ(8.0, StringToDouble(&uc, "0o10", 65 ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 66 CHECK_EQ(63.0, StringToDouble(&uc, "0o77", 67 ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL)); 68 69 CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL)); 70 CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL)); 71 CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL)); 72 CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL)); 73 CHECK_EQ(8.0, StringToDouble(&uc, "0o10", ALLOW_OCTAL)); 74 CHECK_EQ(63.0, StringToDouble(&uc, "0o77", ALLOW_OCTAL)); 75} 76 77 78TEST(ImplicitOctal) { 79 UnicodeCache uc; 80 CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 81 CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 82 CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 83 CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 84 CHECK_EQ(8.0, StringToDouble(&uc, "010", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 85 CHECK_EQ(63.0, StringToDouble(&uc, "077", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 86 87 CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX)); 88 CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX)); 89 CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX)); 90 CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX)); 91 CHECK_EQ(10.0, StringToDouble(&uc, "010", ALLOW_HEX)); 92 CHECK_EQ(77.0, StringToDouble(&uc, "077", ALLOW_HEX)); 93 94 const double x = 010000000000; // Power of 2, no rounding errors. 95 CHECK_EQ(x * x * x * x * x, StringToDouble(&uc, "01" "0000000000" "0000000000" 96 "0000000000" "0000000000" "0000000000", ALLOW_IMPLICIT_OCTAL)); 97} 98 99 100TEST(Binary) { 101 UnicodeCache uc; 102 CHECK_EQ(0.0, StringToDouble(&uc, "0b0", 103 ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL)); 104 CHECK_EQ(0.0, StringToDouble(&uc, "0B0", 105 ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL)); 106 CHECK_EQ(1.0, StringToDouble(&uc, "0b1", 107 ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL)); 108 CHECK_EQ(2.0, StringToDouble(&uc, "0b10", 109 ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL)); 110 CHECK_EQ(3.0, StringToDouble(&uc, "0b11", 111 ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL)); 112 113 CHECK_EQ(0.0, StringToDouble(&uc, "0b0", ALLOW_BINARY)); 114 CHECK_EQ(0.0, StringToDouble(&uc, "0B0", ALLOW_BINARY)); 115 CHECK_EQ(1.0, StringToDouble(&uc, "0b1", ALLOW_BINARY)); 116 CHECK_EQ(2.0, StringToDouble(&uc, "0b10", ALLOW_BINARY)); 117 CHECK_EQ(3.0, StringToDouble(&uc, "0b11", ALLOW_BINARY)); 118} 119 120 121TEST(MalformedOctal) { 122 UnicodeCache uc; 123 CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 124 CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 125 CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 126 127 CHECK(std::isnan(StringToDouble(&uc, "07.7", 128 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL))); 129 CHECK(std::isnan(StringToDouble(&uc, "07.8", 130 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL))); 131 CHECK(std::isnan(StringToDouble(&uc, "07e8", 132 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL))); 133 CHECK(std::isnan(StringToDouble(&uc, "07e7", 134 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL))); 135 136 CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 137 CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 138 139 CHECK_EQ(0.001, StringToDouble(&uc, "0.001", 140 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 141 CHECK_EQ(0.713, StringToDouble(&uc, "0.713", 142 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 143 144 CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX)); 145 CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX)); 146 CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX)); 147 148 CHECK_EQ(7.7, StringToDouble(&uc, "07.7", ALLOW_HEX)); 149 CHECK_EQ(7.8, StringToDouble(&uc, "07.8", ALLOW_HEX)); 150 CHECK_EQ(7e8, StringToDouble(&uc, "07e8", ALLOW_HEX)); 151 CHECK_EQ(7e7, StringToDouble(&uc, "07e7", ALLOW_HEX)); 152 153 CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX)); 154 CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX)); 155 156 CHECK_EQ(0.001, StringToDouble(&uc, "0.001", ALLOW_HEX)); 157 CHECK_EQ(0.713, StringToDouble(&uc, "0.713", ALLOW_HEX)); 158} 159 160 161TEST(TrailingJunk) { 162 UnicodeCache uc; 163 CHECK_EQ(8.0, StringToDouble(&uc, "8q", ALLOW_TRAILING_JUNK)); 164 CHECK_EQ(63.0, StringToDouble(&uc, "077qqq", 165 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK)); 166 CHECK_EQ(10.0, StringToDouble(&uc, "10e", 167 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK)); 168 CHECK_EQ(10.0, StringToDouble(&uc, "10e-", 169 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK)); 170} 171 172 173TEST(NonStrDecimalLiteral) { 174 UnicodeCache uc; 175 CHECK(std::isnan(StringToDouble(&uc, " ", NO_FLAGS, 176 std::numeric_limits<double>::quiet_NaN()))); 177 CHECK(std::isnan(StringToDouble(&uc, "", NO_FLAGS, 178 std::numeric_limits<double>::quiet_NaN()))); 179 CHECK(std::isnan(StringToDouble(&uc, " ", NO_FLAGS, 180 std::numeric_limits<double>::quiet_NaN()))); 181 CHECK_EQ(0.0, StringToDouble(&uc, "", NO_FLAGS)); 182 CHECK_EQ(0.0, StringToDouble(&uc, " ", NO_FLAGS)); 183} 184 185 186TEST(IntegerStrLiteral) { 187 UnicodeCache uc; 188 CHECK_EQ(0.0, StringToDouble(&uc, "0.0", NO_FLAGS)); 189 CHECK_EQ(0.0, StringToDouble(&uc, "0", NO_FLAGS)); 190 CHECK_EQ(0.0, StringToDouble(&uc, "00", NO_FLAGS)); 191 CHECK_EQ(0.0, StringToDouble(&uc, "000", NO_FLAGS)); 192 CHECK_EQ(1.0, StringToDouble(&uc, "1", NO_FLAGS)); 193 CHECK_EQ(-1.0, StringToDouble(&uc, "-1", NO_FLAGS)); 194 CHECK_EQ(-1.0, StringToDouble(&uc, " -1 ", NO_FLAGS)); 195 CHECK_EQ(1.0, StringToDouble(&uc, " +1 ", NO_FLAGS)); 196 CHECK(std::isnan(StringToDouble(&uc, " - 1 ", NO_FLAGS))); 197 CHECK(std::isnan(StringToDouble(&uc, " + 1 ", NO_FLAGS))); 198 199 CHECK_EQ(0.0, StringToDouble(&uc, "0e0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 200 CHECK_EQ(0.0, StringToDouble(&uc, "0e1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 201 CHECK_EQ(0.0, StringToDouble(&uc, "0e-1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 202 CHECK_EQ(0.0, StringToDouble(&uc, "0e-100000", 203 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 204 CHECK_EQ(0.0, StringToDouble(&uc, "0e+100000", 205 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 206 CHECK_EQ(0.0, StringToDouble(&uc, "0.", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)); 207} 208 209 210TEST(LongNumberStr) { 211 UnicodeCache uc; 212 CHECK_EQ(1e10, StringToDouble(&uc, "1" "0000000000", NO_FLAGS)); 213 CHECK_EQ(1e20, StringToDouble(&uc, "1" "0000000000" "0000000000", NO_FLAGS)); 214 215 CHECK_EQ(1e60, StringToDouble(&uc, "1" "0000000000" "0000000000" "0000000000" 216 "0000000000" "0000000000" "0000000000", NO_FLAGS)); 217 218 CHECK_EQ(1e-2, StringToDouble(&uc, "." "0" "1", NO_FLAGS)); 219 CHECK_EQ(1e-11, StringToDouble(&uc, "." "0000000000" "1", NO_FLAGS)); 220 CHECK_EQ(1e-21, StringToDouble(&uc, "." "0000000000" "0000000000" "1", 221 NO_FLAGS)); 222 223 CHECK_EQ(1e-61, StringToDouble(&uc, "." "0000000000" "0000000000" "0000000000" 224 "0000000000" "0000000000" "0000000000" "1", NO_FLAGS)); 225 226 227 // x = 24414062505131248.0 and y = 24414062505131252.0 are representable in 228 // double. Check chat z = (x + y) / 2 is rounded to x... 229 CHECK_EQ(24414062505131248.0, 230 StringToDouble(&uc, "24414062505131250.0", NO_FLAGS)); 231 232 // ... and z = (x + y) / 2 + delta is rounded to y. 233 CHECK_EQ(24414062505131252.0, 234 StringToDouble(&uc, "24414062505131250.000000001", NO_FLAGS)); 235} 236 237 238TEST(MaximumSignificantDigits) { 239 UnicodeCache uc; 240 char num[] = 241 "4.4501477170144020250819966727949918635852426585926051135169509" 242 "122872622312493126406953054127118942431783801370080830523154578" 243 "251545303238277269592368457430440993619708911874715081505094180" 244 "604803751173783204118519353387964161152051487413083163272520124" 245 "606023105869053620631175265621765214646643181420505164043632222" 246 "668006474326056011713528291579642227455489682133472873831754840" 247 "341397809846934151055619529382191981473003234105366170879223151" 248 "087335413188049110555339027884856781219017754500629806224571029" 249 "581637117459456877330110324211689177656713705497387108207822477" 250 "584250967061891687062782163335299376138075114200886249979505279" 251 "101870966346394401564490729731565935244123171539810221213221201" 252 "847003580761626016356864581135848683152156368691976240370422601" 253 "6998291015625000000000000000000000000000000000e-308"; 254 255 CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS)); 256 257 // Changes the result of strtod (at least in glibc implementation). 258 num[sizeof(num) - 8] = '1'; 259 260 CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS)); 261} 262 263 264TEST(MinimumExponent) { 265 UnicodeCache uc; 266 // Same test but with different point-position. 267 char num[] = 268 "445014771701440202508199667279499186358524265859260511351695091" 269 "228726223124931264069530541271189424317838013700808305231545782" 270 "515453032382772695923684574304409936197089118747150815050941806" 271 "048037511737832041185193533879641611520514874130831632725201246" 272 "060231058690536206311752656217652146466431814205051640436322226" 273 "680064743260560117135282915796422274554896821334728738317548403" 274 "413978098469341510556195293821919814730032341053661708792231510" 275 "873354131880491105553390278848567812190177545006298062245710295" 276 "816371174594568773301103242116891776567137054973871082078224775" 277 "842509670618916870627821633352993761380751142008862499795052791" 278 "018709663463944015644907297315659352441231715398102212132212018" 279 "470035807616260163568645811358486831521563686919762403704226016" 280 "998291015625000000000000000000000000000000000e-1108"; 281 282 CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS)); 283 284 // Changes the result of strtod (at least in glibc implementation). 285 num[sizeof(num) - 8] = '1'; 286 287 CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS)); 288} 289 290 291TEST(MaximumExponent) { 292 UnicodeCache uc; 293 char num[] = "0.16e309"; 294 295 CHECK_EQ(1.59999999999999997765e+308, StringToDouble(&uc, num, NO_FLAGS)); 296} 297 298 299TEST(ExponentNumberStr) { 300 UnicodeCache uc; 301 CHECK_EQ(1e1, StringToDouble(&uc, "1e1", NO_FLAGS)); 302 CHECK_EQ(1e1, StringToDouble(&uc, "1e+1", NO_FLAGS)); 303 CHECK_EQ(1e-1, StringToDouble(&uc, "1e-1", NO_FLAGS)); 304 CHECK_EQ(1e100, StringToDouble(&uc, "1e+100", NO_FLAGS)); 305 CHECK_EQ(1e-100, StringToDouble(&uc, "1e-100", NO_FLAGS)); 306 CHECK_EQ(1e-106, StringToDouble(&uc, ".000001e-100", NO_FLAGS)); 307} 308 309 310class OneBit1: public BitField<uint32_t, 0, 1> {}; 311class OneBit2: public BitField<uint32_t, 7, 1> {}; 312class EightBit1: public BitField<uint32_t, 0, 8> {}; 313class EightBit2: public BitField<uint32_t, 13, 8> {}; 314 315TEST(BitField) { 316 uint32_t x; 317 318 // One bit bit field can hold values 0 and 1. 319 CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1))); 320 CHECK(!OneBit2::is_valid(static_cast<uint32_t>(-1))); 321 for (unsigned i = 0; i < 2; i++) { 322 CHECK(OneBit1::is_valid(i)); 323 x = OneBit1::encode(i); 324 CHECK_EQ(i, OneBit1::decode(x)); 325 326 CHECK(OneBit2::is_valid(i)); 327 x = OneBit2::encode(i); 328 CHECK_EQ(i, OneBit2::decode(x)); 329 } 330 CHECK(!OneBit1::is_valid(2)); 331 CHECK(!OneBit2::is_valid(2)); 332 333 // Eight bit bit field can hold values from 0 tp 255. 334 CHECK(!EightBit1::is_valid(static_cast<uint32_t>(-1))); 335 CHECK(!EightBit2::is_valid(static_cast<uint32_t>(-1))); 336 for (unsigned i = 0; i < 256; i++) { 337 CHECK(EightBit1::is_valid(i)); 338 x = EightBit1::encode(i); 339 CHECK_EQ(i, EightBit1::decode(x)); 340 CHECK(EightBit2::is_valid(i)); 341 x = EightBit2::encode(i); 342 CHECK_EQ(i, EightBit2::decode(x)); 343 } 344 CHECK(!EightBit1::is_valid(256)); 345 CHECK(!EightBit2::is_valid(256)); 346} 347 348 349class UpperBits: public BitField64<int, 61, 3> {}; 350class MiddleBits: public BitField64<int, 31, 2> {}; 351 352TEST(BitField64) { 353 uint64_t x; 354 355 // Test most significant bits. 356 x = V8_2PART_UINT64_C(0xE0000000, 00000000); 357 CHECK(x == UpperBits::encode(7)); 358 CHECK_EQ(7, UpperBits::decode(x)); 359 360 // Test the 32/64-bit boundary bits. 361 x = V8_2PART_UINT64_C(0x00000001, 80000000); 362 CHECK(x == MiddleBits::encode(3)); 363 CHECK_EQ(3, MiddleBits::decode(x)); 364} 365 366 367static void CheckNonArrayIndex(bool expected, const char* chars) { 368 auto isolate = CcTest::i_isolate(); 369 auto string = isolate->factory()->NewStringFromAsciiChecked(chars); 370 CHECK_EQ(expected, IsSpecialIndex(isolate->unicode_cache(), *string)); 371} 372 373 374TEST(SpecialIndexParsing) { 375 auto isolate = CcTest::i_isolate(); 376 HandleScope scope(isolate); 377 CheckNonArrayIndex(false, ""); 378 CheckNonArrayIndex(false, "-"); 379 CheckNonArrayIndex(true, "0"); 380 CheckNonArrayIndex(true, "-0"); 381 CheckNonArrayIndex(false, "01"); 382 CheckNonArrayIndex(false, "-01"); 383 CheckNonArrayIndex(true, "0.5"); 384 CheckNonArrayIndex(true, "-0.5"); 385 CheckNonArrayIndex(true, "1"); 386 CheckNonArrayIndex(true, "-1"); 387 CheckNonArrayIndex(true, "10"); 388 CheckNonArrayIndex(true, "-10"); 389 CheckNonArrayIndex(true, "NaN"); 390 CheckNonArrayIndex(true, "Infinity"); 391 CheckNonArrayIndex(true, "-Infinity"); 392 CheckNonArrayIndex(true, "4294967295"); 393 CheckNonArrayIndex(true, "429496.7295"); 394 CheckNonArrayIndex(true, "1.3333333333333333"); 395 CheckNonArrayIndex(false, "1.3333333333333339"); 396 CheckNonArrayIndex(true, "1.333333333333331e+222"); 397 CheckNonArrayIndex(true, "-1.3333333333333211e+222"); 398 CheckNonArrayIndex(false, "-1.3333333333333311e+222"); 399 CheckNonArrayIndex(true, "429496.7295"); 400 CheckNonArrayIndex(false, "43s3"); 401 CheckNonArrayIndex(true, "4294967296"); 402 CheckNonArrayIndex(true, "-4294967296"); 403 CheckNonArrayIndex(true, "999999999999999"); 404 CheckNonArrayIndex(false, "9999999999999999"); 405 CheckNonArrayIndex(true, "-999999999999999"); 406 CheckNonArrayIndex(false, "-9999999999999999"); 407 CheckNonArrayIndex(false, "42949672964294967296429496729694966"); 408} 409