Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Unified Diff: src/js/v8natives.js

Issue 2117273002: Revert of [intrinsic] Drop the %_ValueOf intrinsic. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/js/symbol.js ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/js/v8natives.js
diff --git a/src/js/v8natives.js b/src/js/v8natives.js
index 9026cfe684596649756bc58abdc57fcd1cbd7551..6db941bffe90f6166bd2943c80e04be55a4e1703 100644
--- a/src/js/v8natives.js
+++ b/src/js/v8natives.js
@@ -222,6 +222,124 @@
// ----------------------------------------------------------------------------
// Number
+// ES6 Number.prototype.toString([ radix ])
+function NumberToStringJS(radix) {
+ // NOTE: Both Number objects and values can enter here as
+ // 'this'. This is not as dictated by ECMA-262.
+ var number = this;
+ if (!IS_NUMBER(this)) {
+ if (!IS_NUMBER_WRAPPER(this)) {
+ throw MakeTypeError(kNotGeneric, 'Number.prototype.toString');
+ }
+ // Get the value of this number in case it's an object.
+ number = %_ValueOf(this);
+ }
+ // Fast case: Convert number in radix 10.
+ if (IS_UNDEFINED(radix) || radix === 10) {
+ return %_NumberToString(number);
+ }
+
+ // Convert the radix to an integer and check the range.
+ radix = TO_INTEGER(radix);
+ if (radix < 2 || radix > 36) throw MakeRangeError(kToRadixFormatRange);
+ // Convert the number to a string in the given radix.
+ return %NumberToRadixString(number, radix);
+}
+
+
+// ES6 20.1.3.4 Number.prototype.toLocaleString([reserved1 [, reserved2]])
+function NumberToLocaleString() {
+ return %_Call(NumberToStringJS, this);
+}
+
+
+// ES6 20.1.3.7 Number.prototype.valueOf()
+function NumberValueOf() {
+ // NOTE: Both Number objects and values can enter here as
+ // 'this'. This is not as dictated by ECMA-262.
+ if (!IS_NUMBER(this) && !IS_NUMBER_WRAPPER(this)) {
+ throw MakeTypeError(kNotGeneric, 'Number.prototype.valueOf');
+ }
+ return %_ValueOf(this);
+}
+
+
+// ES6 20.1.3.3 Number.prototype.toFixed(fractionDigits)
+function NumberToFixedJS(fractionDigits) {
+ var x = this;
+ if (!IS_NUMBER(this)) {
+ if (!IS_NUMBER_WRAPPER(this)) {
+ throw MakeTypeError(kIncompatibleMethodReceiver,
+ "Number.prototype.toFixed", this);
+ }
+ // Get the value of this number in case it's an object.
+ x = %_ValueOf(this);
+ }
+ var f = TO_INTEGER(fractionDigits);
+
+ if (f < 0 || f > 20) {
+ throw MakeRangeError(kNumberFormatRange, "toFixed() digits");
+ }
+
+ if (NUMBER_IS_NAN(x)) return "NaN";
+ if (x == INFINITY) return "Infinity";
+ if (x == -INFINITY) return "-Infinity";
+
+ return %NumberToFixed(x, f);
+}
+
+
+// ES6 20.1.3.2 Number.prototype.toExponential(fractionDigits)
+function NumberToExponentialJS(fractionDigits) {
+ var x = this;
+ if (!IS_NUMBER(this)) {
+ if (!IS_NUMBER_WRAPPER(this)) {
+ throw MakeTypeError(kIncompatibleMethodReceiver,
+ "Number.prototype.toExponential", this);
+ }
+ // Get the value of this number in case it's an object.
+ x = %_ValueOf(this);
+ }
+ var f = IS_UNDEFINED(fractionDigits) ? UNDEFINED : TO_INTEGER(fractionDigits);
+
+ if (NUMBER_IS_NAN(x)) return "NaN";
+ if (x == INFINITY) return "Infinity";
+ if (x == -INFINITY) return "-Infinity";
+
+ if (IS_UNDEFINED(f)) {
+ f = -1; // Signal for runtime function that f is not defined.
+ } else if (f < 0 || f > 20) {
+ throw MakeRangeError(kNumberFormatRange, "toExponential()");
+ }
+ return %NumberToExponential(x, f);
+}
+
+
+// ES6 20.1.3.5 Number.prototype.toPrecision(precision)
+function NumberToPrecisionJS(precision) {
+ var x = this;
+ if (!IS_NUMBER(this)) {
+ if (!IS_NUMBER_WRAPPER(this)) {
+ throw MakeTypeError(kIncompatibleMethodReceiver,
+ "Number.prototype.toPrecision", this);
+ }
+ // Get the value of this number in case it's an object.
+ x = %_ValueOf(this);
+ }
+ if (IS_UNDEFINED(precision)) return TO_STRING(x);
+ var p = TO_INTEGER(precision);
+
+ if (NUMBER_IS_NAN(x)) return "NaN";
+ if (x == INFINITY) return "Infinity";
+ if (x == -INFINITY) return "-Infinity";
+
+ if (p < 1 || p > 21) {
+ throw MakeRangeError(kToPrecisionFormatRange);
+ }
+ return %NumberToPrecision(x, p);
+}
+
+
// Harmony isFinite.
function NumberIsFinite(number) {
return IS_NUMBER(number) && NUMBER_IS_FINITE(number);
@@ -253,6 +371,13 @@
// ----------------------------------------------------------------------------
+
+%FunctionSetPrototype(GlobalNumber, new GlobalNumber(0));
+
+%OptimizeObjectForAddingMultipleProperties(GlobalNumber.prototype, 8);
+// Set up the constructor property on the Number prototype object.
+%AddNamedProperty(GlobalNumber.prototype, "constructor", GlobalNumber,
+ DONT_ENUM);
utils.InstallConstants(GlobalNumber, [
// ECMA-262 section 15.7.3.1.
@@ -273,6 +398,16 @@
"EPSILON", 2.220446049250313e-16,
]);
+// Set up non-enumerable functions on the Number prototype object.
+utils.InstallFunctions(GlobalNumber.prototype, DONT_ENUM, [
+ "toString", NumberToStringJS,
+ "toLocaleString", NumberToLocaleString,
+ "valueOf", NumberValueOf,
+ "toFixed", NumberToFixedJS,
+ "toExponential", NumberToExponentialJS,
+ "toPrecision", NumberToPrecisionJS
+]);
+
// Harmony Number constructor additions
utils.InstallFunctions(GlobalNumber, DONT_ENUM, [
"isFinite", NumberIsFinite,
« no previous file with comments | « src/js/symbol.js ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698