LCOV - code coverage report
Current view: top level - test/cctest - test-conversions.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 238 238 100.0 %
Date: 2017-10-20 Functions: 22 22 100.0 %

          Line data    Source code
       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/base/platform/platform.h"
      31             : #include "src/conversions.h"
      32             : #include "src/factory-inl.h"
      33             : #include "src/isolate.h"
      34             : #include "src/objects.h"
      35             : #include "src/unicode-cache.h"
      36             : #include "src/v8.h"
      37             : #include "test/cctest/cctest.h"
      38             : 
      39             : namespace v8 {
      40             : namespace internal {
      41             : 
      42       23724 : TEST(Hex) {
      43           6 :   UnicodeCache uc;
      44           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      45           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      46           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      47           6 :   CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      48           6 :   CHECK_EQ(255.0, StringToDouble(&uc, "0xff",
      49             :                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      50           6 :   CHECK_EQ(175.0, StringToDouble(&uc, "0xAF",
      51             :                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      52             : 
      53           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX));
      54           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX));
      55           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX));
      56           6 :   CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX));
      57           6 :   CHECK_EQ(255.0, StringToDouble(&uc, "0xff", ALLOW_HEX));
      58           6 :   CHECK_EQ(175.0, StringToDouble(&uc, "0xAF", ALLOW_HEX));
      59           6 : }
      60             : 
      61             : 
      62       23724 : TEST(Octal) {
      63           6 :   UnicodeCache uc;
      64           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      65           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      66           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      67           6 :   CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      68           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "0o10",
      69             :                                ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      70           6 :   CHECK_EQ(63.0, StringToDouble(&uc, "0o77",
      71             :                                 ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
      72             : 
      73           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL));
      74           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL));
      75           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL));
      76           6 :   CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL));
      77           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "0o10", ALLOW_OCTAL));
      78           6 :   CHECK_EQ(63.0, StringToDouble(&uc, "0o77", ALLOW_OCTAL));
      79           6 : }
      80             : 
      81             : 
      82       23724 : TEST(ImplicitOctal) {
      83           6 :   UnicodeCache uc;
      84           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      85           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      86           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      87           6 :   CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      88           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "010", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      89           6 :   CHECK_EQ(63.0, StringToDouble(&uc, "077", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
      90             : 
      91           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX));
      92           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX));
      93           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX));
      94           6 :   CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX));
      95           6 :   CHECK_EQ(10.0, StringToDouble(&uc, "010", ALLOW_HEX));
      96           6 :   CHECK_EQ(77.0, StringToDouble(&uc, "077", ALLOW_HEX));
      97             : 
      98             :   const double x = 010000000000;  // Power of 2, no rounding errors.
      99           6 :   CHECK_EQ(x * x * x * x * x, StringToDouble(&uc, "01" "0000000000" "0000000000"
     100             :       "0000000000" "0000000000" "0000000000", ALLOW_IMPLICIT_OCTAL));
     101           6 : }
     102             : 
     103             : 
     104       23724 : TEST(Binary) {
     105           6 :   UnicodeCache uc;
     106           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0b0",
     107             :                                ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
     108           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0B0",
     109             :                                ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
     110           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0b1",
     111             :                                ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
     112           6 :   CHECK_EQ(2.0, StringToDouble(&uc, "0b10",
     113             :                                ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
     114           6 :   CHECK_EQ(3.0, StringToDouble(&uc, "0b11",
     115             :                                ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
     116             : 
     117           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0b0", ALLOW_BINARY));
     118           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0B0", ALLOW_BINARY));
     119           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "0b1", ALLOW_BINARY));
     120           6 :   CHECK_EQ(2.0, StringToDouble(&uc, "0b10", ALLOW_BINARY));
     121           6 :   CHECK_EQ(3.0, StringToDouble(&uc, "0b11", ALLOW_BINARY));
     122           6 : }
     123             : 
     124             : 
     125       23724 : TEST(MalformedOctal) {
     126           6 :   UnicodeCache uc;
     127           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     128           6 :   CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     129           6 :   CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     130             : 
     131           6 :   CHECK(std::isnan(StringToDouble(&uc, "07.7",
     132             :                                   ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
     133           6 :   CHECK(std::isnan(StringToDouble(&uc, "07.8",
     134             :                                   ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
     135           6 :   CHECK(std::isnan(StringToDouble(&uc, "07e8",
     136             :                                   ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
     137           6 :   CHECK(std::isnan(StringToDouble(&uc, "07e7",
     138             :                                   ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
     139             : 
     140           6 :   CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     141           6 :   CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     142             : 
     143           6 :   CHECK_EQ(0.001, StringToDouble(&uc, "0.001",
     144             :                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     145           6 :   CHECK_EQ(0.713, StringToDouble(&uc, "0.713",
     146             :                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     147             : 
     148           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX));
     149           6 :   CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX));
     150           6 :   CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX));
     151             : 
     152           6 :   CHECK_EQ(7.7, StringToDouble(&uc, "07.7", ALLOW_HEX));
     153           6 :   CHECK_EQ(7.8, StringToDouble(&uc, "07.8", ALLOW_HEX));
     154           6 :   CHECK_EQ(7e8, StringToDouble(&uc, "07e8", ALLOW_HEX));
     155           6 :   CHECK_EQ(7e7, StringToDouble(&uc, "07e7", ALLOW_HEX));
     156             : 
     157           6 :   CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX));
     158           6 :   CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX));
     159             : 
     160           6 :   CHECK_EQ(0.001, StringToDouble(&uc, "0.001", ALLOW_HEX));
     161           6 :   CHECK_EQ(0.713, StringToDouble(&uc, "0.713", ALLOW_HEX));
     162           6 : }
     163             : 
     164             : 
     165       23724 : TEST(TrailingJunk) {
     166           6 :   UnicodeCache uc;
     167           6 :   CHECK_EQ(8.0, StringToDouble(&uc, "8q", ALLOW_TRAILING_JUNK));
     168           6 :   CHECK_EQ(63.0, StringToDouble(&uc, "077qqq",
     169             :                                 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
     170           6 :   CHECK_EQ(10.0, StringToDouble(&uc, "10e",
     171             :                                 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
     172           6 :   CHECK_EQ(10.0, StringToDouble(&uc, "10e-",
     173             :                                 ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
     174           6 : }
     175             : 
     176             : 
     177       23724 : TEST(NonStrDecimalLiteral) {
     178           6 :   UnicodeCache uc;
     179           6 :   CHECK(std::isnan(StringToDouble(&uc, " ", NO_FLAGS,
     180             :                                   std::numeric_limits<double>::quiet_NaN())));
     181           6 :   CHECK(std::isnan(StringToDouble(&uc, "", NO_FLAGS,
     182             :                                   std::numeric_limits<double>::quiet_NaN())));
     183           6 :   CHECK(std::isnan(StringToDouble(&uc, " ", NO_FLAGS,
     184             :                                   std::numeric_limits<double>::quiet_NaN())));
     185           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "", NO_FLAGS));
     186           6 :   CHECK_EQ(0.0, StringToDouble(&uc, " ", NO_FLAGS));
     187           6 : }
     188             : 
     189             : 
     190       23724 : TEST(IntegerStrLiteral) {
     191           6 :   UnicodeCache uc;
     192           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0.0", NO_FLAGS));
     193           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0", NO_FLAGS));
     194           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "00", NO_FLAGS));
     195           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "000", NO_FLAGS));
     196           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "1", NO_FLAGS));
     197           6 :   CHECK_EQ(-1.0, StringToDouble(&uc, "-1", NO_FLAGS));
     198           6 :   CHECK_EQ(-1.0, StringToDouble(&uc, "  -1  ", NO_FLAGS));
     199           6 :   CHECK_EQ(1.0, StringToDouble(&uc, "  +1  ", NO_FLAGS));
     200           6 :   CHECK(std::isnan(StringToDouble(&uc, "  -  1  ", NO_FLAGS)));
     201           6 :   CHECK(std::isnan(StringToDouble(&uc, "  +  1  ", NO_FLAGS)));
     202             : 
     203           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0e0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     204           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0e1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     205           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0e-1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     206           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0e-100000",
     207             :                                ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     208           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0e+100000",
     209             :                                ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     210           6 :   CHECK_EQ(0.0, StringToDouble(&uc, "0.", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
     211           6 : }
     212             : 
     213             : 
     214       23724 : TEST(LongNumberStr) {
     215           6 :   UnicodeCache uc;
     216           6 :   CHECK_EQ(1e10, StringToDouble(&uc, "1" "0000000000", NO_FLAGS));
     217           6 :   CHECK_EQ(1e20, StringToDouble(&uc, "1" "0000000000" "0000000000", NO_FLAGS));
     218             : 
     219           6 :   CHECK_EQ(1e60, StringToDouble(&uc, "1" "0000000000" "0000000000" "0000000000"
     220             :       "0000000000" "0000000000" "0000000000", NO_FLAGS));
     221             : 
     222           6 :   CHECK_EQ(1e-2, StringToDouble(&uc, "." "0" "1", NO_FLAGS));
     223           6 :   CHECK_EQ(1e-11, StringToDouble(&uc, "." "0000000000" "1", NO_FLAGS));
     224           6 :   CHECK_EQ(1e-21, StringToDouble(&uc, "." "0000000000" "0000000000" "1",
     225             :                                  NO_FLAGS));
     226             : 
     227           6 :   CHECK_EQ(1e-61, StringToDouble(&uc, "." "0000000000" "0000000000" "0000000000"
     228             :       "0000000000" "0000000000" "0000000000" "1", NO_FLAGS));
     229             : 
     230             : 
     231             :   // x = 24414062505131248.0 and y = 24414062505131252.0 are representable in
     232             :   // double. Check chat z = (x + y) / 2 is rounded to x...
     233           6 :   CHECK_EQ(24414062505131248.0,
     234             :            StringToDouble(&uc, "24414062505131250.0", NO_FLAGS));
     235             : 
     236             :   // ... and z = (x + y) / 2 + delta is rounded to y.
     237           6 :   CHECK_EQ(24414062505131252.0,
     238             :            StringToDouble(&uc, "24414062505131250.000000001", NO_FLAGS));
     239           6 : }
     240             : 
     241             : 
     242       23724 : TEST(MaximumSignificantDigits) {
     243           6 :   UnicodeCache uc;
     244             :   char num[] =
     245             :       "4.4501477170144020250819966727949918635852426585926051135169509"
     246             :       "122872622312493126406953054127118942431783801370080830523154578"
     247             :       "251545303238277269592368457430440993619708911874715081505094180"
     248             :       "604803751173783204118519353387964161152051487413083163272520124"
     249             :       "606023105869053620631175265621765214646643181420505164043632222"
     250             :       "668006474326056011713528291579642227455489682133472873831754840"
     251             :       "341397809846934151055619529382191981473003234105366170879223151"
     252             :       "087335413188049110555339027884856781219017754500629806224571029"
     253             :       "581637117459456877330110324211689177656713705497387108207822477"
     254             :       "584250967061891687062782163335299376138075114200886249979505279"
     255             :       "101870966346394401564490729731565935244123171539810221213221201"
     256             :       "847003580761626016356864581135848683152156368691976240370422601"
     257           6 :       "6998291015625000000000000000000000000000000000e-308";
     258             : 
     259           6 :   CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS));
     260             : 
     261             :   // Changes the result of strtod (at least in glibc implementation).
     262           6 :   num[sizeof(num) - 8] = '1';
     263             : 
     264           6 :   CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS));
     265           6 : }
     266             : 
     267             : 
     268       23724 : TEST(MinimumExponent) {
     269           6 :   UnicodeCache uc;
     270             :   // Same test but with different point-position.
     271             :   char num[] =
     272             :   "445014771701440202508199667279499186358524265859260511351695091"
     273             :   "228726223124931264069530541271189424317838013700808305231545782"
     274             :   "515453032382772695923684574304409936197089118747150815050941806"
     275             :   "048037511737832041185193533879641611520514874130831632725201246"
     276             :   "060231058690536206311752656217652146466431814205051640436322226"
     277             :   "680064743260560117135282915796422274554896821334728738317548403"
     278             :   "413978098469341510556195293821919814730032341053661708792231510"
     279             :   "873354131880491105553390278848567812190177545006298062245710295"
     280             :   "816371174594568773301103242116891776567137054973871082078224775"
     281             :   "842509670618916870627821633352993761380751142008862499795052791"
     282             :   "018709663463944015644907297315659352441231715398102212132212018"
     283             :   "470035807616260163568645811358486831521563686919762403704226016"
     284           6 :   "998291015625000000000000000000000000000000000e-1108";
     285             : 
     286           6 :   CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS));
     287             : 
     288             :   // Changes the result of strtod (at least in glibc implementation).
     289           6 :   num[sizeof(num) - 8] = '1';
     290             : 
     291           6 :   CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS));
     292           6 : }
     293             : 
     294             : 
     295       23724 : TEST(MaximumExponent) {
     296           6 :   UnicodeCache uc;
     297           6 :   char num[] = "0.16e309";
     298             : 
     299           6 :   CHECK_EQ(1.59999999999999997765e+308, StringToDouble(&uc, num, NO_FLAGS));
     300           6 : }
     301             : 
     302             : 
     303       23724 : TEST(ExponentNumberStr) {
     304           6 :   UnicodeCache uc;
     305           6 :   CHECK_EQ(1e1, StringToDouble(&uc, "1e1", NO_FLAGS));
     306           6 :   CHECK_EQ(1e1, StringToDouble(&uc, "1e+1", NO_FLAGS));
     307           6 :   CHECK_EQ(1e-1, StringToDouble(&uc, "1e-1", NO_FLAGS));
     308           6 :   CHECK_EQ(1e100, StringToDouble(&uc, "1e+100", NO_FLAGS));
     309           6 :   CHECK_EQ(1e-100, StringToDouble(&uc, "1e-100", NO_FLAGS));
     310           6 :   CHECK_EQ(1e-106, StringToDouble(&uc, ".000001e-100", NO_FLAGS));
     311           6 : }
     312             : 
     313             : 
     314             : class OneBit1: public BitField<uint32_t, 0, 1> {};
     315             : class OneBit2: public BitField<uint32_t, 7, 1> {};
     316             : class EightBit1: public BitField<uint32_t, 0, 8> {};
     317             : class EightBit2: public BitField<uint32_t, 13, 8> {};
     318             : 
     319       23724 : TEST(BitField) {
     320             :   uint32_t x;
     321             : 
     322             :   // One bit bit field can hold values 0 and 1.
     323             :   CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1)));
     324             :   CHECK(!OneBit2::is_valid(static_cast<uint32_t>(-1)));
     325          18 :   for (unsigned i = 0; i < 2; i++) {
     326          12 :     CHECK(OneBit1::is_valid(i));
     327             :     x = OneBit1::encode(i);
     328          12 :     CHECK_EQ(i, OneBit1::decode(x));
     329             : 
     330          12 :     CHECK(OneBit2::is_valid(i));
     331             :     x = OneBit2::encode(i);
     332          12 :     CHECK_EQ(i, OneBit2::decode(x));
     333             :   }
     334             :   CHECK(!OneBit1::is_valid(2));
     335             :   CHECK(!OneBit2::is_valid(2));
     336             : 
     337             :   // Eight bit bit field can hold values from 0 tp 255.
     338             :   CHECK(!EightBit1::is_valid(static_cast<uint32_t>(-1)));
     339             :   CHECK(!EightBit2::is_valid(static_cast<uint32_t>(-1)));
     340        1536 :   for (unsigned i = 0; i < 256; i++) {
     341        1536 :     CHECK(EightBit1::is_valid(i));
     342             :     x = EightBit1::encode(i);
     343        1536 :     CHECK_EQ(i, EightBit1::decode(x));
     344        1536 :     CHECK(EightBit2::is_valid(i));
     345             :     x = EightBit2::encode(i);
     346        1536 :     CHECK_EQ(i, EightBit2::decode(x));
     347             :   }
     348             :   CHECK(!EightBit1::is_valid(256));
     349             :   CHECK(!EightBit2::is_valid(256));
     350           6 : }
     351             : 
     352             : 
     353             : class UpperBits: public BitField64<int, 61, 3> {};
     354             : class MiddleBits: public BitField64<int, 31, 2> {};
     355             : 
     356       23724 : TEST(BitField64) {
     357             :   uint64_t x;
     358             : 
     359             :   // Test most significant bits.
     360             :   x = V8_2PART_UINT64_C(0xE0000000, 00000000);
     361             :   CHECK(x == UpperBits::encode(7));
     362             :   CHECK_EQ(7, UpperBits::decode(x));
     363             : 
     364             :   // Test the 32/64-bit boundary bits.
     365             :   x = V8_2PART_UINT64_C(0x00000001, 80000000);
     366             :   CHECK(x == MiddleBits::encode(3));
     367             :   CHECK_EQ(3, MiddleBits::decode(x));
     368           6 : }
     369             : 
     370             : 
     371         186 : static void CheckNonArrayIndex(bool expected, const char* chars) {
     372         186 :   auto isolate = CcTest::i_isolate();
     373         186 :   auto string = isolate->factory()->NewStringFromAsciiChecked(chars);
     374         186 :   CHECK_EQ(expected, IsSpecialIndex(isolate->unicode_cache(), *string));
     375         186 : }
     376             : 
     377             : 
     378       23724 : TEST(SpecialIndexParsing) {
     379             :   auto isolate = CcTest::i_isolate();
     380             :   HandleScope scope(isolate);
     381           6 :   CheckNonArrayIndex(false, "");
     382           6 :   CheckNonArrayIndex(false, "-");
     383           6 :   CheckNonArrayIndex(true, "0");
     384           6 :   CheckNonArrayIndex(true, "-0");
     385           6 :   CheckNonArrayIndex(false, "01");
     386           6 :   CheckNonArrayIndex(false, "-01");
     387           6 :   CheckNonArrayIndex(true, "0.5");
     388           6 :   CheckNonArrayIndex(true, "-0.5");
     389           6 :   CheckNonArrayIndex(true, "1");
     390           6 :   CheckNonArrayIndex(true, "-1");
     391           6 :   CheckNonArrayIndex(true, "10");
     392           6 :   CheckNonArrayIndex(true, "-10");
     393           6 :   CheckNonArrayIndex(true, "NaN");
     394           6 :   CheckNonArrayIndex(true, "Infinity");
     395           6 :   CheckNonArrayIndex(true, "-Infinity");
     396           6 :   CheckNonArrayIndex(true, "4294967295");
     397           6 :   CheckNonArrayIndex(true, "429496.7295");
     398           6 :   CheckNonArrayIndex(true, "1.3333333333333333");
     399           6 :   CheckNonArrayIndex(false, "1.3333333333333339");
     400           6 :   CheckNonArrayIndex(true, "1.333333333333331e+222");
     401           6 :   CheckNonArrayIndex(true, "-1.3333333333333211e+222");
     402           6 :   CheckNonArrayIndex(false, "-1.3333333333333311e+222");
     403           6 :   CheckNonArrayIndex(true, "429496.7295");
     404           6 :   CheckNonArrayIndex(false, "43s3");
     405           6 :   CheckNonArrayIndex(true, "4294967296");
     406           6 :   CheckNonArrayIndex(true, "-4294967296");
     407           6 :   CheckNonArrayIndex(true, "999999999999999");
     408           6 :   CheckNonArrayIndex(false, "9999999999999999");
     409           6 :   CheckNonArrayIndex(true, "-999999999999999");
     410           6 :   CheckNonArrayIndex(false, "-9999999999999999");
     411           6 :   CheckNonArrayIndex(false, "42949672964294967296429496729694966");
     412           6 : }
     413             : 
     414       23724 : TEST(NoHandlesForTryNumberToSize) {
     415             :   i::Isolate* isolate = CcTest::i_isolate();
     416             :   size_t result = 0;
     417             :   {
     418             :     SealHandleScope no_handles(isolate);
     419             :     Smi* smi = Smi::FromInt(1);
     420             :     CHECK(TryNumberToSize(smi, &result));
     421             :     CHECK_EQ(result, 1u);
     422             :   }
     423             :   result = 0;
     424             :   {
     425             :     HandleScope scope(isolate);
     426             :     Handle<HeapNumber> heap_number1 = isolate->factory()->NewHeapNumber(2.0);
     427             :     {
     428             :       SealHandleScope no_handles(isolate);
     429           6 :       CHECK(TryNumberToSize(*heap_number1, &result));
     430           6 :       CHECK_EQ(result, 2u);
     431             :     }
     432             :     Handle<HeapNumber> heap_number2 = isolate->factory()->NewHeapNumber(
     433             :         static_cast<double>(std::numeric_limits<size_t>::max()) + 10000.0);
     434             :     {
     435             :       SealHandleScope no_handles(isolate);
     436           6 :       CHECK(!TryNumberToSize(*heap_number2, &result));
     437             :     }
     438             :   }
     439           6 : }
     440             : 
     441       23724 : TEST(TryNumberToSizeWithMaxSizePlusOne) {
     442             :   i::Isolate* isolate = CcTest::i_isolate();
     443             :   {
     444             :     HandleScope scope(isolate);
     445             :     // 1 << 64, larger than the limit of size_t.
     446             :     double value = 18446744073709551616.0;
     447             :     size_t result = 0;
     448             :     Handle<HeapNumber> heap_number = isolate->factory()->NewHeapNumber(value);
     449           6 :     CHECK(!TryNumberToSize(*heap_number, &result));
     450             :   }
     451           6 : }
     452             : 
     453       23724 : TEST(PositiveNumberToUint32) {
     454             :   i::Isolate* isolate = CcTest::i_isolate();
     455             :   i::Factory* factory = isolate->factory();
     456             :   uint32_t max = std::numeric_limits<uint32_t>::max();
     457             :   HandleScope scope(isolate);
     458             :   // Test Smi conversions.
     459             :   Handle<Object> number = handle(Smi::FromInt(0), isolate);
     460           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     461             :   number = handle(Smi::FromInt(-1), isolate);
     462           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     463             :   number = handle(Smi::FromInt(-1), isolate);
     464           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     465             :   number = handle(Smi::FromInt(Smi::kMinValue), isolate);
     466           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     467             :   number = handle(Smi::FromInt(Smi::kMaxValue), isolate);
     468           6 :   CHECK_EQ(PositiveNumberToUint32(*number),
     469             :            static_cast<uint32_t>(Smi::kMaxValue));
     470             :   // Test Double conversions.
     471             :   number = factory->NewHeapNumber(0.0);
     472           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     473             :   number = factory->NewHeapNumber(0.999);
     474           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     475             :   number = factory->NewHeapNumber(1.999);
     476           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 1u);
     477             :   number = factory->NewHeapNumber(-12.0);
     478           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     479             :   number = factory->NewHeapNumber(12000.0);
     480           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 12000u);
     481             :   number = factory->NewHeapNumber(static_cast<double>(Smi::kMaxValue) + 1);
     482           6 :   CHECK_EQ(PositiveNumberToUint32(*number),
     483             :            static_cast<uint32_t>(Smi::kMaxValue) + 1);
     484             :   number = factory->NewHeapNumber(max);
     485           6 :   CHECK_EQ(PositiveNumberToUint32(*number), max);
     486             :   number = factory->NewHeapNumber(static_cast<double>(max) * 1000);
     487           6 :   CHECK_EQ(PositiveNumberToUint32(*number), max);
     488             :   number = factory->NewHeapNumber(std::numeric_limits<double>::max());
     489           6 :   CHECK_EQ(PositiveNumberToUint32(*number), max);
     490             :   number = factory->NewHeapNumber(std::numeric_limits<double>::infinity());
     491           6 :   CHECK_EQ(PositiveNumberToUint32(*number), max);
     492             :   number =
     493             :       factory->NewHeapNumber(-1.0 * std::numeric_limits<double>::infinity());
     494           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     495             :   number = factory->NewHeapNumber(std::nan(""));
     496           6 :   CHECK_EQ(PositiveNumberToUint32(*number), 0u);
     497           6 : }
     498             : 
     499             : }  // namespace internal
     500       71154 : }  // namespace v8

Generated by: LCOV version 1.10