utatane.tea@gmail.com | 9971c63 | 2016-03-01 02:30:46 +0000 | [diff] [blame] | 1 | |
| 2 | function mathFloorOnIntegers(value) |
| 3 | { |
| 4 | return Math.floor(value); |
| 5 | } |
| 6 | noInline(mathFloorOnIntegers); |
| 7 | |
| 8 | function mathFloorOnDoubles(value) |
| 9 | { |
| 10 | return Math.floor(value); |
| 11 | } |
| 12 | noInline(mathFloorOnDoubles); |
| 13 | |
| 14 | function mathFloorOnBooleans(value) |
| 15 | { |
| 16 | return Math.floor(value); |
| 17 | } |
| 18 | noInline(mathFloorOnBooleans); |
| 19 | |
| 20 | // The trivial cases first. |
| 21 | for (var i = 1; i < 1e4; ++i) { |
| 22 | var flooredValue = mathFloorOnIntegers(i); |
| 23 | if (flooredValue !== i) |
| 24 | throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue); |
| 25 | |
| 26 | var flooredValue = mathFloorOnIntegers(-i); |
| 27 | if (flooredValue !== -i) |
| 28 | throw new Error("mathFloorOnIntegers(" + -i + ") = " + flooredValue); |
| 29 | |
| 30 | var doubleLow = i + 0.4; |
| 31 | var flooredValue = mathFloorOnDoubles(doubleLow); |
| 32 | if (flooredValue !== i) |
| 33 | throw new Error("mathFloorOnDoubles(" + doubleLow + ") = " + flooredValue); |
| 34 | |
| 35 | var doubleHigh = i + 0.6; |
| 36 | var flooredValue = mathFloorOnDoubles(doubleHigh); |
| 37 | if (flooredValue !== i) |
| 38 | throw new Error("mathFloorOnDoubles(" + doubleHigh + ") = " + flooredValue); |
| 39 | |
| 40 | var doubleMid = i + 0.5; |
| 41 | var flooredValue = mathFloorOnDoubles(doubleMid); |
| 42 | if (flooredValue !== i) |
| 43 | throw new Error("mathFloorOnDoubles(" + doubleMid + ") = " + flooredValue); |
| 44 | |
| 45 | var flooredValue = mathFloorOnDoubles(-0.6); |
| 46 | if (flooredValue !== -1.0) |
| 47 | throw new Error("mathFloorOnDoubles(-0.6) = " + flooredValue); |
| 48 | } |
| 49 | |
| 50 | // Some more interesting cases, some of them well OSR exit when the return value is zero. |
| 51 | for (var i = 0; i < 1e4; ++i) { |
| 52 | var flooredValue = mathFloorOnIntegers(i); |
| 53 | if (flooredValue !== i) |
| 54 | throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue); |
| 55 | |
| 56 | var flooredValue = mathFloorOnIntegers(-i); |
| 57 | if (flooredValue !== -i) |
| 58 | throw new Error("mathFloorOnIntegers(-" + i + ") = " + flooredValue); |
| 59 | |
| 60 | var flooredValue = mathFloorOnDoubles(-0.4); |
| 61 | if (flooredValue !== -1.00) |
| 62 | throw new Error("mathFloorOnDoubles(-0.4) = " + flooredValue); |
| 63 | |
| 64 | var flooredValue = mathFloorOnDoubles(-0.5); |
| 65 | if (flooredValue !== -1.0) |
| 66 | throw new Error("mathFloorOnDoubles(-0.5) = " + flooredValue); |
| 67 | |
| 68 | var flooredValue = mathFloorOnDoubles(-0); |
| 69 | if (!(flooredValue === 0 && (1/flooredValue) === -Infinity)) |
| 70 | throw new Error("mathFloorOnDoubles(-0) = " + flooredValue); |
| 71 | |
| 72 | var flooredValue = mathFloorOnDoubles(NaN); |
| 73 | if (flooredValue === flooredValue) |
| 74 | throw new Error("mathFloorOnDoubles(NaN) = " + flooredValue); |
| 75 | |
| 76 | var flooredValue = mathFloorOnDoubles(Number.POSITIVE_INFINITY); |
| 77 | if (flooredValue !== Number.POSITIVE_INFINITY) |
| 78 | throw new Error("mathFloorOnDoubles(Number.POSITIVE_INFINITY) = " + flooredValue); |
| 79 | |
| 80 | var flooredValue = mathFloorOnDoubles(Number.NEGATIVE_INFINITY); |
| 81 | if (flooredValue !== Number.NEGATIVE_INFINITY) |
| 82 | throw new Error("mathFloorOnDoubles(Number.NEGATIVE_INFINITY) = " + flooredValue); |
| 83 | |
| 84 | var boolean = !!(i % 2); |
| 85 | var flooredBoolean = mathFloorOnBooleans(boolean); |
| 86 | if (flooredBoolean != boolean) |
| 87 | throw new Error("mathFloorOnDoubles(" + boolean + ") = " + flooredBoolean); |
| 88 | } |
| 89 | |
| 90 | function uselessMathFloor(value) |
| 91 | { |
| 92 | return Math.floor(value|0); |
| 93 | } |
| 94 | noInline(uselessMathFloor); |
| 95 | |
| 96 | for (var i = 0; i < 1e4; ++i) { |
| 97 | var flooredValue = uselessMathFloor(i); |
| 98 | if (flooredValue !== i) |
| 99 | throw new Error("uselessMathFloor(" + i + ") = " + flooredValue); |
| 100 | |
| 101 | var doubleLow = i + 0.4; |
| 102 | var flooredValue = uselessMathFloor(doubleLow); |
| 103 | if (flooredValue !== i) |
| 104 | throw new Error("uselessMathFloor(" + doubleLow + ") = " + flooredValue); |
| 105 | |
| 106 | var doubleHigh = i + 0.6; |
| 107 | var flooredValue = uselessMathFloor(doubleHigh); |
| 108 | if (flooredValue !== i) |
| 109 | throw new Error("uselessMathFloor(" + doubleHigh + ") = " + flooredValue); |
| 110 | |
| 111 | var doubleMid = i + 0.5; |
| 112 | var flooredValue = uselessMathFloor(doubleMid); |
| 113 | if (flooredValue !== i) |
| 114 | throw new Error("uselessMathFloor(" + doubleMid + ") = " + flooredValue); |
| 115 | |
| 116 | var flooredValue = uselessMathFloor(-0.4); |
| 117 | if (flooredValue !== 0) |
| 118 | throw new Error("uselessMathFloor(-0.4) = " + flooredValue); |
| 119 | |
| 120 | var flooredValue = uselessMathFloor(-0.5); |
| 121 | if (flooredValue !== 0) |
| 122 | throw new Error("uselessMathFloor(-0.5) = " + flooredValue); |
| 123 | |
| 124 | var flooredValue = uselessMathFloor(-0.6); |
| 125 | if (flooredValue !== 0) |
| 126 | throw new Error("uselessMathFloor(-0.6) = " + flooredValue); |
| 127 | } |
| 128 | |
| 129 | function mathFloorWithOverflow(value) |
| 130 | { |
| 131 | return Math.floor(value); |
| 132 | } |
| 133 | noInline(mathFloorWithOverflow); |
| 134 | |
| 135 | for (var i = 0; i < 1e4; ++i) { |
| 136 | var bigValue = 1000000000000; |
| 137 | var flooredValue = mathFloorWithOverflow(bigValue); |
| 138 | if (flooredValue !== bigValue) |
| 139 | throw new Error("mathFloorWithOverflow(" + bigValue + ") = " + flooredValue); |
| 140 | } |
| 141 | |
| 142 | function mathFloorConsumedAsDouble(value) |
| 143 | { |
| 144 | return Math.floor(value) * 0.5; |
| 145 | } |
| 146 | noInline(mathFloorConsumedAsDouble); |
| 147 | |
| 148 | for (var i = 0; i < 1e4; ++i) { |
| 149 | var doubleValue = i + 0.1; |
| 150 | var flooredValue = mathFloorConsumedAsDouble(doubleValue); |
| 151 | if (flooredValue !== (i * 0.5)) |
| 152 | throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue); |
| 153 | |
| 154 | var doubleValue = i + 0.6; |
| 155 | var flooredValue = mathFloorConsumedAsDouble(doubleValue); |
| 156 | if (flooredValue !== (i * 0.5)) |
| 157 | throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue); |
| 158 | |
| 159 | } |
| 160 | |
| 161 | function mathFloorDoesNotCareAboutMinusZero(value) |
| 162 | { |
| 163 | return Math.floor(value)|0; |
| 164 | } |
| 165 | noInline(mathFloorDoesNotCareAboutMinusZero); |
| 166 | |
| 167 | for (var i = 0; i < 1e4; ++i) { |
| 168 | var doubleMid = i + 0.5; |
| 169 | var flooredValue = mathFloorDoesNotCareAboutMinusZero(doubleMid); |
| 170 | if (flooredValue !== i) |
| 171 | throw new Error("mathFloorDoesNotCareAboutMinusZero(" + doubleMid + ") = " + flooredValue); |
| 172 | } |
| 173 | |
| 174 | |
| 175 | // *** Function arguments. *** |
| 176 | function mathFloorNoArguments() |
| 177 | { |
| 178 | return Math.floor(); |
| 179 | } |
| 180 | noInline(mathFloorNoArguments); |
| 181 | |
| 182 | function mathFloorTooManyArguments(a, b, c) |
| 183 | { |
| 184 | return Math.floor(a, b, c); |
| 185 | } |
| 186 | noInline(mathFloorTooManyArguments); |
| 187 | |
| 188 | for (var i = 0; i < 1e4; ++i) { |
| 189 | var value = mathFloorNoArguments(); |
| 190 | if (value === value) |
| 191 | throw new Error("mathFloorNoArguments() = " + value); |
| 192 | |
| 193 | var value = mathFloorTooManyArguments(2.1, 3, 5); |
| 194 | if (value !== 2) |
| 195 | throw new Error("mathFloorTooManyArguments() = " + value); |
| 196 | } |
| 197 | |
| 198 | |
| 199 | // *** Constant as arguments. *** |
| 200 | function testMathFloorOnConstants() |
| 201 | { |
| 202 | var value = Math.floor(0); |
| 203 | if (value !== 0) |
| 204 | throw new Error("Math.floor(0) = " + value); |
| 205 | var value = Math.floor(-0); |
| 206 | if (!(value === 0 && (1/value) === -Infinity)) |
| 207 | throw new Error("Math.floor(-0) = " + value); |
| 208 | var value = Math.floor(1); |
| 209 | if (value !== 1) |
| 210 | throw new Error("Math.floor(1) = " + value); |
| 211 | var value = Math.floor(-1); |
| 212 | if (value !== -1) |
| 213 | throw new Error("Math.floor(-1) = " + value); |
| 214 | var value = Math.floor(42); |
| 215 | if (value !== 42) |
| 216 | throw new Error("Math.floor(42) = " + value); |
| 217 | var value = Math.floor(-42.2); |
| 218 | if (value !== -43) |
| 219 | throw new Error("Math.floor(-42.2) = " + value); |
| 220 | var value = Math.floor(NaN); |
| 221 | if (value === value) |
| 222 | throw new Error("Math.floor(NaN) = " + value); |
benjamin@webkit.org | 6c17223 | 2016-06-03 21:13:34 +0000 | [diff] [blame] | 223 | var value = Math.floor(Number.POSITIVE_INFINITY); |
| 224 | if (value !== Infinity) |
| 225 | throw new Error("Math.floor(Number.POSITIVE_INFINITY) = " + value); |
| 226 | var value = Math.floor(Number.NEGATIVE_INFINITY); |
| 227 | if (value !== -Infinity) |
| 228 | throw new Error("Math.floor(Number.NEGATIVE_INFINITY) = " + value); |
utatane.tea@gmail.com | 9971c63 | 2016-03-01 02:30:46 +0000 | [diff] [blame] | 229 | var value = Math.floor(Math.E); |
| 230 | if (value !== 2) |
| 231 | throw new Error("Math.floor(Math.E) = " + value); |
| 232 | } |
| 233 | noInline(testMathFloorOnConstants); |
| 234 | |
| 235 | for (var i = 0; i < 1e4; ++i) { |
| 236 | testMathFloorOnConstants(); |
| 237 | } |
| 238 | |
| 239 | |
| 240 | // *** Struct transition. *** |
| 241 | function mathFloorStructTransition(value) |
| 242 | { |
| 243 | return Math.floor(value); |
| 244 | } |
| 245 | noInline(mathFloorStructTransition); |
| 246 | |
| 247 | for (var i = 0; i < 1e4; ++i) { |
| 248 | var value = mathFloorStructTransition(42.5); |
| 249 | if (value !== 42) |
| 250 | throw new Error("mathFloorStructTransition(42.5) = " + value); |
| 251 | } |
| 252 | |
| 253 | Math.floor = function() { return arguments[0] + 5; } |
| 254 | |
| 255 | var value = mathFloorStructTransition(42); |
| 256 | if (value !== 47) |
| 257 | throw new Error("mathFloorStructTransition(42) after transition = " + value); |