OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 | 2 |
3 #include <stdlib.h> | 3 #include <stdlib.h> |
4 | 4 |
5 #include "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "platform.h" | 7 #include "platform.h" |
8 #include "cctest.h" | 8 #include "cctest.h" |
9 | 9 |
10 using namespace v8::internal; | 10 using namespace v8::internal; |
(...skipping 23 matching lines...) Expand all Loading... |
34 CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX | ALLOW_OCTALS)); | 34 CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX | ALLOW_OCTALS)); |
35 CHECK_EQ(8.0, StringToDouble("010", ALLOW_HEX | ALLOW_OCTALS)); | 35 CHECK_EQ(8.0, StringToDouble("010", ALLOW_HEX | ALLOW_OCTALS)); |
36 CHECK_EQ(63.0, StringToDouble("077", ALLOW_HEX | ALLOW_OCTALS)); | 36 CHECK_EQ(63.0, StringToDouble("077", ALLOW_HEX | ALLOW_OCTALS)); |
37 | 37 |
38 CHECK_EQ(0.0, StringToDouble("0", ALLOW_HEX)); | 38 CHECK_EQ(0.0, StringToDouble("0", ALLOW_HEX)); |
39 CHECK_EQ(0.0, StringToDouble("00", ALLOW_HEX)); | 39 CHECK_EQ(0.0, StringToDouble("00", ALLOW_HEX)); |
40 CHECK_EQ(1.0, StringToDouble("01", ALLOW_HEX)); | 40 CHECK_EQ(1.0, StringToDouble("01", ALLOW_HEX)); |
41 CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX)); | 41 CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX)); |
42 CHECK_EQ(10.0, StringToDouble("010", ALLOW_HEX)); | 42 CHECK_EQ(10.0, StringToDouble("010", ALLOW_HEX)); |
43 CHECK_EQ(77.0, StringToDouble("077", ALLOW_HEX)); | 43 CHECK_EQ(77.0, StringToDouble("077", ALLOW_HEX)); |
| 44 |
| 45 const double x = 010000000000; // Power of 2, no rounding errors. |
| 46 CHECK_EQ(x * x * x * x * x, StringToDouble("01" "0000000000" "0000000000" |
| 47 "0000000000" "0000000000" "0000000000", ALLOW_OCTALS)); |
44 } | 48 } |
45 | 49 |
46 | 50 |
47 TEST(MalformedOctal) { | 51 TEST(MalformedOctal) { |
48 CHECK_EQ(8.0, StringToDouble("08", ALLOW_HEX | ALLOW_OCTALS)); | 52 CHECK_EQ(8.0, StringToDouble("08", ALLOW_HEX | ALLOW_OCTALS)); |
49 CHECK_EQ(81.0, StringToDouble("081", ALLOW_HEX | ALLOW_OCTALS)); | 53 CHECK_EQ(81.0, StringToDouble("081", ALLOW_HEX | ALLOW_OCTALS)); |
50 CHECK_EQ(78.0, StringToDouble("078", ALLOW_HEX | ALLOW_OCTALS)); | 54 CHECK_EQ(78.0, StringToDouble("078", ALLOW_HEX | ALLOW_OCTALS)); |
51 | 55 |
52 CHECK(isnan(StringToDouble("07.7", ALLOW_HEX | ALLOW_OCTALS))); | 56 CHECK(isnan(StringToDouble("07.7", ALLOW_HEX | ALLOW_OCTALS))); |
53 CHECK(isnan(StringToDouble("07.8", ALLOW_HEX | ALLOW_OCTALS))); | 57 CHECK(isnan(StringToDouble("07.8", ALLOW_HEX | ALLOW_OCTALS))); |
(...skipping 19 matching lines...) Expand all Loading... |
73 CHECK_EQ(8e7, StringToDouble("08e7", ALLOW_HEX)); | 77 CHECK_EQ(8e7, StringToDouble("08e7", ALLOW_HEX)); |
74 | 78 |
75 CHECK_EQ(0.001, StringToDouble("0.001", ALLOW_HEX)); | 79 CHECK_EQ(0.001, StringToDouble("0.001", ALLOW_HEX)); |
76 CHECK_EQ(0.713, StringToDouble("0.713", ALLOW_HEX)); | 80 CHECK_EQ(0.713, StringToDouble("0.713", ALLOW_HEX)); |
77 } | 81 } |
78 | 82 |
79 | 83 |
80 TEST(TrailingJunk) { | 84 TEST(TrailingJunk) { |
81 CHECK_EQ(8.0, StringToDouble("8q", ALLOW_TRAILING_JUNK)); | 85 CHECK_EQ(8.0, StringToDouble("8q", ALLOW_TRAILING_JUNK)); |
82 CHECK_EQ(63.0, StringToDouble("077qqq", ALLOW_OCTALS | ALLOW_TRAILING_JUNK)); | 86 CHECK_EQ(63.0, StringToDouble("077qqq", ALLOW_OCTALS | ALLOW_TRAILING_JUNK)); |
| 87 CHECK_EQ(10.0, StringToDouble("10e", ALLOW_OCTALS | ALLOW_TRAILING_JUNK)); |
| 88 CHECK_EQ(10.0, StringToDouble("10e-", ALLOW_OCTALS | ALLOW_TRAILING_JUNK)); |
83 } | 89 } |
84 | 90 |
85 | 91 |
86 TEST(NonStrDecimalLiteral) { | 92 TEST(NonStrDecimalLiteral) { |
87 CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value()))); | 93 CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value()))); |
88 CHECK(isnan(StringToDouble("", NO_FLAGS, OS::nan_value()))); | 94 CHECK(isnan(StringToDouble("", NO_FLAGS, OS::nan_value()))); |
89 CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value()))); | 95 CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value()))); |
90 CHECK_EQ(0.0, StringToDouble("", NO_FLAGS)); | 96 CHECK_EQ(0.0, StringToDouble("", NO_FLAGS)); |
91 CHECK_EQ(0.0, StringToDouble(" ", NO_FLAGS)); | 97 CHECK_EQ(0.0, StringToDouble(" ", NO_FLAGS)); |
92 } | 98 } |
93 | 99 |
| 100 TEST(IntegerStrLiteral) { |
| 101 CHECK_EQ(0.0, StringToDouble("0.0", NO_FLAGS)); |
| 102 CHECK_EQ(0.0, StringToDouble("0", NO_FLAGS)); |
| 103 CHECK_EQ(0.0, StringToDouble("00", NO_FLAGS)); |
| 104 CHECK_EQ(0.0, StringToDouble("000", NO_FLAGS)); |
| 105 CHECK_EQ(1.0, StringToDouble("1", NO_FLAGS)); |
| 106 CHECK_EQ(-1.0, StringToDouble("-1", NO_FLAGS)); |
| 107 CHECK_EQ(-1.0, StringToDouble(" - 1 ", NO_FLAGS)); |
| 108 CHECK_EQ(1.0, StringToDouble(" + 1 ", NO_FLAGS)); |
| 109 |
| 110 CHECK_EQ(0.0, StringToDouble("0e0", ALLOW_HEX | ALLOW_OCTALS)); |
| 111 CHECK_EQ(0.0, StringToDouble("0e1", ALLOW_HEX | ALLOW_OCTALS)); |
| 112 CHECK_EQ(0.0, StringToDouble("0e-1", ALLOW_HEX | ALLOW_OCTALS)); |
| 113 CHECK_EQ(0.0, StringToDouble("0e-100000", ALLOW_HEX | ALLOW_OCTALS)); |
| 114 CHECK_EQ(0.0, StringToDouble("0e+100000", ALLOW_HEX | ALLOW_OCTALS)); |
| 115 CHECK_EQ(0.0, StringToDouble("0.", ALLOW_HEX | ALLOW_OCTALS)); |
| 116 } |
| 117 |
| 118 TEST(LongNumberStr) { |
| 119 CHECK_EQ(1e10, StringToDouble("1" "0000000000", NO_FLAGS)); |
| 120 CHECK_EQ(1e20, StringToDouble("1" "0000000000" "0000000000", NO_FLAGS)); |
| 121 |
| 122 CHECK_EQ(1e60, StringToDouble("1" "0000000000" "0000000000" "0000000000" |
| 123 "0000000000" "0000000000" "0000000000", NO_FLAGS)); |
| 124 |
| 125 CHECK_EQ(1e-2, StringToDouble("." "0" "1", NO_FLAGS)); |
| 126 CHECK_EQ(1e-11, StringToDouble("." "0000000000" "1", NO_FLAGS)); |
| 127 CHECK_EQ(1e-21, StringToDouble("." "0000000000" "0000000000" "1", NO_FLAGS)); |
| 128 |
| 129 CHECK_EQ(1e-61, StringToDouble("." "0000000000" "0000000000" "0000000000" |
| 130 "0000000000" "0000000000" "0000000000" "1", NO_FLAGS)); |
| 131 |
| 132 |
| 133 // x = 24414062505131248.0 and y = 24414062505131252.0 are representable in |
| 134 // double. Check chat z = (x + y) / 2 is rounded to x... |
| 135 CHECK_EQ(24414062505131248.0, |
| 136 StringToDouble("24414062505131250.0", NO_FLAGS)); |
| 137 |
| 138 // ... and z = (x + y) / 2 + delta is rounded to y. |
| 139 CHECK_EQ(24414062505131252.0, |
| 140 StringToDouble("24414062505131250.000000001", NO_FLAGS)); |
| 141 } |
| 142 |
| 143 |
| 144 extern "C" double gay_strtod(const char* s00, const char** se); |
| 145 |
| 146 |
| 147 TEST(MaximumSignificantDigits) { |
| 148 char num[] = |
| 149 "4.4501477170144020250819966727949918635852426585926051135169509" |
| 150 "122872622312493126406953054127118942431783801370080830523154578" |
| 151 "251545303238277269592368457430440993619708911874715081505094180" |
| 152 "604803751173783204118519353387964161152051487413083163272520124" |
| 153 "606023105869053620631175265621765214646643181420505164043632222" |
| 154 "668006474326056011713528291579642227455489682133472873831754840" |
| 155 "341397809846934151055619529382191981473003234105366170879223151" |
| 156 "087335413188049110555339027884856781219017754500629806224571029" |
| 157 "581637117459456877330110324211689177656713705497387108207822477" |
| 158 "584250967061891687062782163335299376138075114200886249979505279" |
| 159 "101870966346394401564490729731565935244123171539810221213221201" |
| 160 "847003580761626016356864581135848683152156368691976240370422601" |
| 161 "6998291015625000000000000000000000000000000000e-308"; |
| 162 |
| 163 CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); |
| 164 |
| 165 // Changes the result of strtod (at least in glibc implementation). |
| 166 num[sizeof(num) - 8] = '1'; |
| 167 |
| 168 CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); |
| 169 } |
| 170 |
| 171 |
| 172 TEST(ExponentNumberStr) { |
| 173 CHECK_EQ(1e1, StringToDouble("1e1", NO_FLAGS)); |
| 174 CHECK_EQ(1e1, StringToDouble("1e+1", NO_FLAGS)); |
| 175 CHECK_EQ(1e-1, StringToDouble("1e-1", NO_FLAGS)); |
| 176 CHECK_EQ(1e100, StringToDouble("1e+100", NO_FLAGS)); |
| 177 CHECK_EQ(1e-100, StringToDouble("1e-100", NO_FLAGS)); |
| 178 CHECK_EQ(1e-106, StringToDouble(".000001e-100", NO_FLAGS)); |
| 179 } |
| 180 |
94 class OneBit1: public BitField<uint32_t, 0, 1> {}; | 181 class OneBit1: public BitField<uint32_t, 0, 1> {}; |
95 class OneBit2: public BitField<uint32_t, 7, 1> {}; | 182 class OneBit2: public BitField<uint32_t, 7, 1> {}; |
96 class EightBit1: public BitField<uint32_t, 0, 8> {}; | 183 class EightBit1: public BitField<uint32_t, 0, 8> {}; |
97 class EightBit2: public BitField<uint32_t, 13, 8> {}; | 184 class EightBit2: public BitField<uint32_t, 13, 8> {}; |
98 | 185 |
99 TEST(BitField) { | 186 TEST(BitField) { |
100 uint32_t x; | 187 uint32_t x; |
101 | 188 |
102 // One bit bit field can hold values 0 and 1. | 189 // One bit bit field can hold values 0 and 1. |
103 CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1))); | 190 CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1))); |
(...skipping 17 matching lines...) Expand all Loading... |
121 CHECK(EightBit1::is_valid(i)); | 208 CHECK(EightBit1::is_valid(i)); |
122 x = EightBit1::encode(i); | 209 x = EightBit1::encode(i); |
123 CHECK_EQ(i, EightBit1::decode(x)); | 210 CHECK_EQ(i, EightBit1::decode(x)); |
124 CHECK(EightBit2::is_valid(i)); | 211 CHECK(EightBit2::is_valid(i)); |
125 x = EightBit2::encode(i); | 212 x = EightBit2::encode(i); |
126 CHECK_EQ(i, EightBit2::decode(x)); | 213 CHECK_EQ(i, EightBit2::decode(x)); |
127 } | 214 } |
128 CHECK(!EightBit1::is_valid(256)); | 215 CHECK(!EightBit1::is_valid(256)); |
129 CHECK(!EightBit2::is_valid(256)); | 216 CHECK(!EightBit2::is_valid(256)); |
130 } | 217 } |
OLD | NEW |