Index: src/v8natives.js |
diff --git a/src/v8natives.js b/src/v8natives.js |
index 96b88c5285c9962d479fa75d0e71031cd0c35b6c..07816aa349d6d0670e43c5f2565de3dd3186585f 100644 |
--- a/src/v8natives.js |
+++ b/src/v8natives.js |
@@ -79,6 +79,21 @@ function InstallGetterSetter(object, name, getter, setter) { |
} |
+// Helper function for installing constant properties on objects. |
+function InstallConstants(object, constants) { |
+ if (constants.length >= 4) { |
+ %OptimizeObjectForAddingMultipleProperties(object, constants.length); |
Michael Starzinger
2014/01/07 16:08:00
I think constants.length should be divided by 2 (i
sof
2014/01/07 21:36:29
Oops, quite right. Done.
|
+ } |
+ var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; |
+ for (var i = 0; i < constants.length; i += 2) { |
+ var name = constants[i]; |
+ var k = constants[i + 1]; |
+ %SetProperty(object, name, k, attributes); |
+ } |
+ %ToFastProperties(object); |
+} |
+ |
+ |
// Prevents changes to the prototype of a built-in function. |
// The "prototype" property of the function object is made non-configurable, |
// and the prototype object is made non-extensible. The latter prevents |
@@ -1624,12 +1639,29 @@ function NumberIsFinite(number) { |
} |
+// Harmony isInteger |
+function NumberIsInteger(number) { |
+ return NumberIsFinite(number) && TO_INTEGER(number) == number; |
+} |
+ |
+ |
// Harmony isNaN. |
function NumberIsNaN(number) { |
return IS_NUMBER(number) && NUMBER_IS_NAN(number); |
} |
+// Harmony isSafeInteger |
+function NumberIsSafeInteger(number) { |
+ if (NumberIsFinite(number)) { |
+ var integral = TO_INTEGER(number); |
+ if (integral == number) |
+ return $Math.abs(integral) <= $Number.MAX_SAFE_INTEGER; |
Michael Starzinger
2014/01/07 16:08:00
Better call "MathAbs" directly here, as "$Math.abs
sof
2014/01/07 21:36:29
Done.
|
+ } |
+ return false; |
+} |
+ |
+ |
// ---------------------------------------------------------------------------- |
function SetUpNumber() { |
@@ -1642,32 +1674,25 @@ function SetUpNumber() { |
// Set up the constructor property on the Number prototype object. |
%SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); |
- %OptimizeObjectForAddingMultipleProperties($Number, 5); |
- // ECMA-262 section 15.7.3.1. |
- %SetProperty($Number, |
- "MAX_VALUE", |
- 1.7976931348623157e+308, |
- DONT_ENUM | DONT_DELETE | READ_ONLY); |
- |
- // ECMA-262 section 15.7.3.2. |
- %SetProperty($Number, "MIN_VALUE", 5e-324, |
- DONT_ENUM | DONT_DELETE | READ_ONLY); |
- |
- // ECMA-262 section 15.7.3.3. |
- %SetProperty($Number, "NaN", NAN, DONT_ENUM | DONT_DELETE | READ_ONLY); |
- |
- // ECMA-262 section 15.7.3.4. |
- %SetProperty($Number, |
- "NEGATIVE_INFINITY", |
- -INFINITY, |
- DONT_ENUM | DONT_DELETE | READ_ONLY); |
- |
- // ECMA-262 section 15.7.3.5. |
- %SetProperty($Number, |
- "POSITIVE_INFINITY", |
- INFINITY, |
- DONT_ENUM | DONT_DELETE | READ_ONLY); |
- %ToFastProperties($Number); |
+ var two_pow_53_1 = 9007199254740991; |
+ InstallConstants($Number, $Array( |
+ // ECMA-262 section 15.7.3.1. |
+ "MAX_VALUE", 1.7976931348623157e+308, |
+ // ECMA-262 section 15.7.3.2. |
+ "MIN_VALUE", 5e-324, |
+ // ECMA-262 section 15.7.3.3. |
+ "NaN", NAN, |
+ // ECMA-262 section 15.7.3.4. |
+ "NEGATIVE_INFINITY", -INFINITY, |
+ // ECMA-262 section 15.7.3.5. |
+ "POSITIVE_INFINITY", INFINITY, |
+ |
+ // --- Harmony constants (no spec refs until settled.) |
+ |
+ "MAX_SAFE_INTEGER", two_pow_53_1, |
Michael Starzinger
2014/01/07 16:08:00
I think it is fine to inline "%_MathPow(2, 53) - 1
sof
2014/01/07 21:36:29
Done, fewer magic values.
|
+ "MIN_SAFE_INTEGER", -two_pow_53_1, |
+ "EPSILON", %_MathPow(2, -52) |
+ )); |
// Set up non-enumerable functions on the Number prototype object. |
InstallFunctions($Number.prototype, DONT_ENUM, $Array( |
@@ -1678,9 +1703,15 @@ function SetUpNumber() { |
"toExponential", NumberToExponential, |
"toPrecision", NumberToPrecision |
)); |
+ |
+ // Harmony Number constructor additions |
InstallFunctions($Number, DONT_ENUM, $Array( |
"isFinite", NumberIsFinite, |
- "isNaN", NumberIsNaN |
+ "isInteger", NumberIsInteger, |
+ "isNaN", NumberIsNaN, |
+ "isSafeInteger", NumberIsSafeInteger, |
+ "parseInt", GlobalParseInt, |
+ "parseFloat", GlobalParseFloat |
)); |
} |