OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 (function(global, utils) { | 5 (function(global, utils) { |
6 | 6 |
7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
8 | 8 |
9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- |
10 // Imports | 10 // Imports |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 "setPrototypeOf", ObjectSetPrototypeOf, | 215 "setPrototypeOf", ObjectSetPrototypeOf, |
216 // getOwnPropertySymbols is added in symbol.js. | 216 // getOwnPropertySymbols is added in symbol.js. |
217 // Others are added in bootstrapper.cc. | 217 // Others are added in bootstrapper.cc. |
218 ]); | 218 ]); |
219 | 219 |
220 | 220 |
221 | 221 |
222 // ---------------------------------------------------------------------------- | 222 // ---------------------------------------------------------------------------- |
223 // Number | 223 // Number |
224 | 224 |
225 // ES6 Number.prototype.toString([ radix ]) | |
226 function NumberToStringJS(radix) { | |
227 // NOTE: Both Number objects and values can enter here as | |
228 // 'this'. This is not as dictated by ECMA-262. | |
229 var number = this; | |
230 if (!IS_NUMBER(this)) { | |
231 if (!IS_NUMBER_WRAPPER(this)) { | |
232 throw MakeTypeError(kNotGeneric, 'Number.prototype.toString'); | |
233 } | |
234 // Get the value of this number in case it's an object. | |
235 number = %_ValueOf(this); | |
236 } | |
237 // Fast case: Convert number in radix 10. | |
238 if (IS_UNDEFINED(radix) || radix === 10) { | |
239 return %_NumberToString(number); | |
240 } | |
241 | |
242 // Convert the radix to an integer and check the range. | |
243 radix = TO_INTEGER(radix); | |
244 if (radix < 2 || radix > 36) throw MakeRangeError(kToRadixFormatRange); | |
245 // Convert the number to a string in the given radix. | |
246 return %NumberToRadixString(number, radix); | |
247 } | |
248 | |
249 | |
250 // ES6 20.1.3.4 Number.prototype.toLocaleString([reserved1 [, reserved2]]) | |
251 function NumberToLocaleString() { | |
252 return %_Call(NumberToStringJS, this); | |
253 } | |
254 | |
255 | |
256 // ES6 20.1.3.7 Number.prototype.valueOf() | |
257 function NumberValueOf() { | |
258 // NOTE: Both Number objects and values can enter here as | |
259 // 'this'. This is not as dictated by ECMA-262. | |
260 if (!IS_NUMBER(this) && !IS_NUMBER_WRAPPER(this)) { | |
261 throw MakeTypeError(kNotGeneric, 'Number.prototype.valueOf'); | |
262 } | |
263 return %_ValueOf(this); | |
264 } | |
265 | |
266 | |
267 // ES6 20.1.3.3 Number.prototype.toFixed(fractionDigits) | |
268 function NumberToFixedJS(fractionDigits) { | |
269 var x = this; | |
270 if (!IS_NUMBER(this)) { | |
271 if (!IS_NUMBER_WRAPPER(this)) { | |
272 throw MakeTypeError(kIncompatibleMethodReceiver, | |
273 "Number.prototype.toFixed", this); | |
274 } | |
275 // Get the value of this number in case it's an object. | |
276 x = %_ValueOf(this); | |
277 } | |
278 var f = TO_INTEGER(fractionDigits); | |
279 | |
280 if (f < 0 || f > 20) { | |
281 throw MakeRangeError(kNumberFormatRange, "toFixed() digits"); | |
282 } | |
283 | |
284 if (NUMBER_IS_NAN(x)) return "NaN"; | |
285 if (x == INFINITY) return "Infinity"; | |
286 if (x == -INFINITY) return "-Infinity"; | |
287 | |
288 return %NumberToFixed(x, f); | |
289 } | |
290 | |
291 | |
292 // ES6 20.1.3.2 Number.prototype.toExponential(fractionDigits) | |
293 function NumberToExponentialJS(fractionDigits) { | |
294 var x = this; | |
295 if (!IS_NUMBER(this)) { | |
296 if (!IS_NUMBER_WRAPPER(this)) { | |
297 throw MakeTypeError(kIncompatibleMethodReceiver, | |
298 "Number.prototype.toExponential", this); | |
299 } | |
300 // Get the value of this number in case it's an object. | |
301 x = %_ValueOf(this); | |
302 } | |
303 var f = IS_UNDEFINED(fractionDigits) ? UNDEFINED : TO_INTEGER(fractionDigits); | |
304 | |
305 if (NUMBER_IS_NAN(x)) return "NaN"; | |
306 if (x == INFINITY) return "Infinity"; | |
307 if (x == -INFINITY) return "-Infinity"; | |
308 | |
309 if (IS_UNDEFINED(f)) { | |
310 f = -1; // Signal for runtime function that f is not defined. | |
311 } else if (f < 0 || f > 20) { | |
312 throw MakeRangeError(kNumberFormatRange, "toExponential()"); | |
313 } | |
314 return %NumberToExponential(x, f); | |
315 } | |
316 | |
317 | |
318 // ES6 20.1.3.5 Number.prototype.toPrecision(precision) | |
319 function NumberToPrecisionJS(precision) { | |
320 var x = this; | |
321 if (!IS_NUMBER(this)) { | |
322 if (!IS_NUMBER_WRAPPER(this)) { | |
323 throw MakeTypeError(kIncompatibleMethodReceiver, | |
324 "Number.prototype.toPrecision", this); | |
325 } | |
326 // Get the value of this number in case it's an object. | |
327 x = %_ValueOf(this); | |
328 } | |
329 if (IS_UNDEFINED(precision)) return TO_STRING(x); | |
330 var p = TO_INTEGER(precision); | |
331 | |
332 if (NUMBER_IS_NAN(x)) return "NaN"; | |
333 if (x == INFINITY) return "Infinity"; | |
334 if (x == -INFINITY) return "-Infinity"; | |
335 | |
336 if (p < 1 || p > 21) { | |
337 throw MakeRangeError(kToPrecisionFormatRange); | |
338 } | |
339 return %NumberToPrecision(x, p); | |
340 } | |
341 | |
342 | |
343 // Harmony isFinite. | 225 // Harmony isFinite. |
344 function NumberIsFinite(number) { | 226 function NumberIsFinite(number) { |
345 return IS_NUMBER(number) && NUMBER_IS_FINITE(number); | 227 return IS_NUMBER(number) && NUMBER_IS_FINITE(number); |
346 } | 228 } |
347 | 229 |
348 | 230 |
349 // Harmony isInteger | 231 // Harmony isInteger |
350 function NumberIsInteger(number) { | 232 function NumberIsInteger(number) { |
351 return NumberIsFinite(number) && TO_INTEGER(number) == number; | 233 return NumberIsFinite(number) && TO_INTEGER(number) == number; |
352 } | 234 } |
(...skipping 12 matching lines...) Expand all Loading... |
365 if (integral == number) { | 247 if (integral == number) { |
366 return -kMaxSafeInteger <= integral && integral <= kMaxSafeInteger; | 248 return -kMaxSafeInteger <= integral && integral <= kMaxSafeInteger; |
367 } | 249 } |
368 } | 250 } |
369 return false; | 251 return false; |
370 } | 252 } |
371 | 253 |
372 | 254 |
373 // ---------------------------------------------------------------------------- | 255 // ---------------------------------------------------------------------------- |
374 | 256 |
375 %FunctionSetPrototype(GlobalNumber, new GlobalNumber(0)); | |
376 | |
377 %OptimizeObjectForAddingMultipleProperties(GlobalNumber.prototype, 8); | |
378 // Set up the constructor property on the Number prototype object. | |
379 %AddNamedProperty(GlobalNumber.prototype, "constructor", GlobalNumber, | |
380 DONT_ENUM); | |
381 | |
382 utils.InstallConstants(GlobalNumber, [ | 257 utils.InstallConstants(GlobalNumber, [ |
383 // ECMA-262 section 15.7.3.1. | 258 // ECMA-262 section 15.7.3.1. |
384 "MAX_VALUE", 1.7976931348623157e+308, | 259 "MAX_VALUE", 1.7976931348623157e+308, |
385 // ECMA-262 section 15.7.3.2. | 260 // ECMA-262 section 15.7.3.2. |
386 "MIN_VALUE", 5e-324, | 261 "MIN_VALUE", 5e-324, |
387 // ECMA-262 section 15.7.3.3. | 262 // ECMA-262 section 15.7.3.3. |
388 "NaN", NaN, | 263 "NaN", NaN, |
389 // ECMA-262 section 15.7.3.4. | 264 // ECMA-262 section 15.7.3.4. |
390 "NEGATIVE_INFINITY", -INFINITY, | 265 "NEGATIVE_INFINITY", -INFINITY, |
391 // ECMA-262 section 15.7.3.5. | 266 // ECMA-262 section 15.7.3.5. |
392 "POSITIVE_INFINITY", INFINITY, | 267 "POSITIVE_INFINITY", INFINITY, |
393 | 268 |
394 // --- Harmony constants (no spec refs until settled.) | 269 // --- Harmony constants (no spec refs until settled.) |
395 | 270 |
396 "MAX_SAFE_INTEGER", 9007199254740991, | 271 "MAX_SAFE_INTEGER", 9007199254740991, |
397 "MIN_SAFE_INTEGER", -9007199254740991, | 272 "MIN_SAFE_INTEGER", -9007199254740991, |
398 "EPSILON", 2.220446049250313e-16, | 273 "EPSILON", 2.220446049250313e-16, |
399 ]); | 274 ]); |
400 | 275 |
401 // Set up non-enumerable functions on the Number prototype object. | |
402 utils.InstallFunctions(GlobalNumber.prototype, DONT_ENUM, [ | |
403 "toString", NumberToStringJS, | |
404 "toLocaleString", NumberToLocaleString, | |
405 "valueOf", NumberValueOf, | |
406 "toFixed", NumberToFixedJS, | |
407 "toExponential", NumberToExponentialJS, | |
408 "toPrecision", NumberToPrecisionJS | |
409 ]); | |
410 | |
411 // Harmony Number constructor additions | 276 // Harmony Number constructor additions |
412 utils.InstallFunctions(GlobalNumber, DONT_ENUM, [ | 277 utils.InstallFunctions(GlobalNumber, DONT_ENUM, [ |
413 "isFinite", NumberIsFinite, | 278 "isFinite", NumberIsFinite, |
414 "isInteger", NumberIsInteger, | 279 "isInteger", NumberIsInteger, |
415 "isNaN", NumberIsNaN, | 280 "isNaN", NumberIsNaN, |
416 "isSafeInteger", NumberIsSafeInteger, | 281 "isSafeInteger", NumberIsSafeInteger, |
417 "parseInt", GlobalParseInt, | 282 "parseInt", GlobalParseInt, |
418 "parseFloat", GlobalParseFloat | 283 "parseFloat", GlobalParseFloat |
419 ]); | 284 ]); |
420 | 285 |
(...skipping 28 matching lines...) Expand all Loading... |
449 to.NumberIsNaN = NumberIsNaN; | 314 to.NumberIsNaN = NumberIsNaN; |
450 to.NumberIsInteger = NumberIsInteger; | 315 to.NumberIsInteger = NumberIsInteger; |
451 to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; | 316 to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; |
452 }); | 317 }); |
453 | 318 |
454 %InstallToContext([ | 319 %InstallToContext([ |
455 "object_value_of", ObjectValueOf, | 320 "object_value_of", ObjectValueOf, |
456 ]); | 321 ]); |
457 | 322 |
458 }) | 323 }) |
OLD | NEW |