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

Unified Diff: src/v8natives.js

Issue 7830036: Optimize isFinite and isNaN. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Made the change general by moving putting it in the NUMBER_IS_FINITE macro. Created 9 years, 3 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/uri.js ('k') | src/weakmap.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/v8natives.js
diff --git a/src/v8natives.js b/src/v8natives.js
index 03d1585a041acc0f973da82c3269a1b374a45c8f..04bd8d8e9917e1f5f677977cb54c44c0f8b6309b 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -41,7 +41,6 @@
const $isNaN = GlobalIsNaN;
const $isFinite = GlobalIsFinite;
-
// ----------------------------------------------------------------------------
@@ -75,64 +74,26 @@ function InstallFunctions(object, attributes, functions) {
// functions on String.prototype etc. and then restore the old function
// with delete. See http://code.google.com/p/chromium/issues/detail?id=1717
function InstallFunctionsOnHiddenPrototype(object, attributes, functions) {
- %CheckIsBootstrapping();
var hidden_prototype = new $Object();
%SetHiddenPrototype(object, hidden_prototype);
InstallFunctions(hidden_prototype, attributes, functions);
}
-// Prevents changes to the prototype of a built-infunction.
-// The "prototype" property of the function object is made non-configurable,
-// and the prototype object is made non-extensible. The latter prevents
-// changing the __proto__ property.
-function SetUpLockedPrototype(constructor, fields, methods) {
- %CheckIsBootstrapping();
- var prototype = constructor.prototype;
- // Install functions first, because this function is used to initialize
- // PropertyDescriptor itself.
- var property_count = (methods.length >> 1) + (fields ? fields.length : 0);
- if (property_count >= 4) {
- %OptimizeObjectForAddingMultipleProperties(prototype, property_count);
- }
- if (fields) {
- for (var i = 0; i < fields.length; i++) {
- %SetProperty(prototype, fields[i], void 0, DONT_ENUM | DONT_DELETE);
- }
- }
- for (var i = 0; i < methods.length; i += 2) {
- var key = methods[i];
- var f = methods[i + 1];
- %SetProperty(prototype, key, f, DONT_ENUM | DONT_DELETE | READ_ONLY);
- %SetNativeFlag(f);
- }
- prototype.__proto__ = null;
- %PreventExtensions(prototype);
- %ToFastProperties(prototype);
-
- var desc = GetOwnProperty(constructor, "prototype");
- desc.setWritable(false);
- desc.setConfigurable(false);
- DefineOwnProperty(constructor, "prototype", desc, false);
-}
-
-
// ----------------------------------------------------------------------------
// ECMA 262 - 15.1.4
function GlobalIsNaN(number) {
- var n = ToNumber(number);
- return NUMBER_IS_NAN(n);
+ if (!IS_NUMBER(number)) number = NonNumberToNumber(number);
+ return NUMBER_IS_NAN(number);
}
// ECMA 262 - 15.1.5
function GlobalIsFinite(number) {
if (!IS_NUMBER(number)) number = NonNumberToNumber(number);
-
- // NaN - NaN == NaN, Infinity - Infinity == NaN, -Infinity - -Infinity == NaN.
- return %_IsSmi(number) || number - number == 0;
+ return NUMBER_IS_FINITE(number);
}
@@ -151,16 +112,13 @@ function GlobalParseInt(string, radix) {
// Truncate number.
return string | 0;
}
- string = TO_STRING_INLINE(string);
radix = radix | 0;
} else {
- // The spec says ToString should be evaluated before ToInt32.
- string = TO_STRING_INLINE(string);
radix = TO_INT32(radix);
if (!(radix == 0 || (2 <= radix && radix <= 36)))
return $NaN;
}
-
+ string = TO_STRING_INLINE(string);
if (%_HasCachedArrayIndex(string) &&
(radix == 0 || radix == 10)) {
return %_GetCachedArrayIndex(string);
@@ -207,9 +165,8 @@ function GlobalEval(x) {
// ----------------------------------------------------------------------------
-// Set up global object.
-function SetUpGlobal() {
- %CheckIsBootstrapping();
+
+function SetupGlobal() {
// ECMA 262 - 15.1.1.1.
%SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE);
@@ -219,7 +176,7 @@ function SetUpGlobal() {
// ECMA-262 - 15.1.1.3.
%SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE);
- // Set up non-enumerable function on the global object.
+ // Setup non-enumerable function on the global object.
InstallFunctions(global, DONT_ENUM, $Array(
"isNaN", GlobalIsNaN,
"isFinite", GlobalIsFinite,
@@ -229,7 +186,8 @@ function SetUpGlobal() {
));
}
-SetUpGlobal();
+SetupGlobal();
+
// ----------------------------------------------------------------------------
// Boolean (first part of definition)
@@ -526,83 +484,106 @@ function PropertyDescriptor() {
this.hasSetter_ = false;
}
-SetUpLockedPrototype(PropertyDescriptor, $Array(
- "value_",
- "hasValue_",
- "writable_",
- "hasWritable_",
- "enumerable_",
- "hasEnumerable_",
- "configurable_",
- "hasConfigurable_",
- "get_",
- "hasGetter_",
- "set_",
- "hasSetter_"
- ), $Array(
- "toString", function() {
- return "[object PropertyDescriptor]";
- },
- "setValue", function(value) {
- this.value_ = value;
- this.hasValue_ = true;
- },
- "getValue", function() {
- return this.value_;
- },
- "hasValue", function() {
- return this.hasValue_;
- },
- "setEnumerable", function(enumerable) {
- this.enumerable_ = enumerable;
- this.hasEnumerable_ = true;
- },
- "isEnumerable", function () {
- return this.enumerable_;
- },
- "hasEnumerable", function() {
- return this.hasEnumerable_;
- },
- "setWritable", function(writable) {
- this.writable_ = writable;
- this.hasWritable_ = true;
- },
- "isWritable", function() {
- return this.writable_;
- },
- "hasWritable", function() {
- return this.hasWritable_;
- },
- "setConfigurable", function(configurable) {
- this.configurable_ = configurable;
- this.hasConfigurable_ = true;
- },
- "hasConfigurable", function() {
- return this.hasConfigurable_;
- },
- "isConfigurable", function() {
- return this.configurable_;
- },
- "setGet", function(get) {
- this.get_ = get;
- this.hasGetter_ = true;
- },
- "getGet", function() {
- return this.get_;
- },
- "hasGetter", function() {
- return this.hasGetter_;
- },
- "setSet", function(set) {
- this.set_ = set;
- this.hasSetter_ = true;
- },
- "getSet", function() {
- return this.set_;
- },
- "hasSetter", function() {
- return this.hasSetter_;
- }));
+PropertyDescriptor.prototype.__proto__ = null;
+
+PropertyDescriptor.prototype.toString = function() {
+ return "[object PropertyDescriptor]";
+};
+
+PropertyDescriptor.prototype.setValue = function(value) {
+ this.value_ = value;
+ this.hasValue_ = true;
+}
+
+
+PropertyDescriptor.prototype.getValue = function() {
+ return this.value_;
+}
+
+
+PropertyDescriptor.prototype.hasValue = function() {
+ return this.hasValue_;
+}
+
+
+PropertyDescriptor.prototype.setEnumerable = function(enumerable) {
+ this.enumerable_ = enumerable;
+ this.hasEnumerable_ = true;
+}
+
+
+PropertyDescriptor.prototype.isEnumerable = function () {
+ return this.enumerable_;
+}
+
+
+PropertyDescriptor.prototype.hasEnumerable = function() {
+ return this.hasEnumerable_;
+}
+
+
+PropertyDescriptor.prototype.setWritable = function(writable) {
+ this.writable_ = writable;
+ this.hasWritable_ = true;
+}
+
+
+PropertyDescriptor.prototype.isWritable = function() {
+ return this.writable_;
+}
+
+
+PropertyDescriptor.prototype.hasWritable = function() {
+ return this.hasWritable_;
+}
+
+
+PropertyDescriptor.prototype.setConfigurable = function(configurable) {
+ this.configurable_ = configurable;
+ this.hasConfigurable_ = true;
+}
+
+
+PropertyDescriptor.prototype.hasConfigurable = function() {
+ return this.hasConfigurable_;
+}
+
+
+PropertyDescriptor.prototype.isConfigurable = function() {
+ return this.configurable_;
+}
+
+
+PropertyDescriptor.prototype.setGet = function(get) {
+ this.get_ = get;
+ this.hasGetter_ = true;
+}
+
+
+PropertyDescriptor.prototype.getGet = function() {
+ return this.get_;
+}
+
+
+PropertyDescriptor.prototype.hasGetter = function() {
+ return this.hasGetter_;
+}
+
+
+PropertyDescriptor.prototype.setSet = function(set) {
+ this.set_ = set;
+ this.hasSetter_ = true;
+}
+
+
+PropertyDescriptor.prototype.getSet = function() {
+ return this.set_;
+}
+
+
+PropertyDescriptor.prototype.hasSetter = function() {
+ return this.hasSetter_;
+}
// Converts an array returned from Runtime_GetOwnProperty to an actual
@@ -1190,11 +1171,10 @@ function ObjectIsExtensible(obj) {
%SetExpectedNumberOfProperties($Object, 4);
// ----------------------------------------------------------------------------
-// Object
-function SetUpObject() {
- %CheckIsBootstrapping();
- // Set Up non-enumerable functions on the Object.prototype object.
+
+function SetupObject() {
+ // Setup non-enumerable functions on the Object.prototype object.
InstallFunctions($Object.prototype, DONT_ENUM, $Array(
"toString", ObjectToString,
"toLocaleString", ObjectToLocaleString,
@@ -1224,7 +1204,8 @@ function SetUpObject() {
));
}
-SetUpObject();
+SetupObject();
+
// ----------------------------------------------------------------------------
// Boolean
@@ -1255,16 +1236,14 @@ function BooleanValueOf() {
// ----------------------------------------------------------------------------
-function SetUpBoolean () {
- %CheckIsBootstrapping();
+function SetupBoolean() {
InstallFunctions($Boolean.prototype, DONT_ENUM, $Array(
"toString", BooleanToString,
"valueOf", BooleanValueOf
));
}
-SetUpBoolean();
-
+SetupBoolean();
// ----------------------------------------------------------------------------
// Number
@@ -1378,10 +1357,9 @@ function NumberToPrecision(precision) {
// ----------------------------------------------------------------------------
-function SetUpNumber() {
- %CheckIsBootstrapping();
+function SetupNumber() {
%OptimizeObjectForAddingMultipleProperties($Number.prototype, 8);
- // Set up the constructor property on the Number prototype object.
+ // Setup the constructor property on the Number prototype object.
%SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM);
%OptimizeObjectForAddingMultipleProperties($Number, 5);
@@ -1410,7 +1388,7 @@ function SetUpNumber() {
DONT_ENUM | DONT_DELETE | READ_ONLY);
%ToFastProperties($Number);
- // Set up non-enumerable functions on the Number prototype object.
+ // Setup non-enumerable functions on the Number prototype object.
InstallFunctions($Number.prototype, DONT_ENUM, $Array(
"toString", NumberToString,
"toLocaleString", NumberToLocaleString,
@@ -1421,7 +1399,7 @@ function SetUpNumber() {
));
}
-SetUpNumber();
+SetupNumber();
// ----------------------------------------------------------------------------
@@ -1550,12 +1528,11 @@ function NewFunction(arg1) { // length == 1
// ----------------------------------------------------------------------------
-function SetUpFunction() {
- %CheckIsBootstrapping();
+function SetupFunction() {
InstallFunctions($Function.prototype, DONT_ENUM, $Array(
"bind", FunctionBind,
"toString", FunctionToString
));
}
-SetUpFunction();
+SetupFunction();
« no previous file with comments | « src/uri.js ('k') | src/weakmap.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698