Commit d2a8454d authored by whessev8's avatar whessev8

This change removes the %AddProperty native JavaScript function from V8.

All uses of %AddProperty are replaced by %SetProperty.  A few uses of
IgnoreAttributesAndSetLocalProperty are added, and the runtime version
of it adds a PropertyAttributes argument.  Only the JSObject class
in objects.cc now uses AddProperty, and it can become private.

Review URL: http://codereview.chromium.org/6445

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@426 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent fbd7acf5
...@@ -67,7 +67,7 @@ function InstantiateFunction(data, name) { ...@@ -67,7 +67,7 @@ function InstantiateFunction(data, name) {
kApiFunctionCache[serialNumber] = fun; kApiFunctionCache[serialNumber] = fun;
var prototype = %GetTemplateField(data, kApiPrototypeTemplateOffset); var prototype = %GetTemplateField(data, kApiPrototypeTemplateOffset);
fun.prototype = prototype ? Instantiate(prototype) : {}; fun.prototype = prototype ? Instantiate(prototype) : {};
%AddProperty(fun.prototype, "constructor", fun, DONT_ENUM); %SetProperty(fun.prototype, "constructor", fun, DONT_ENUM);
var parent = %GetTemplateField(data, kApiParentTemplateOffset); var parent = %GetTemplateField(data, kApiParentTemplateOffset);
if (parent) { if (parent) {
var parent_fun = Instantiate(parent); var parent_fun = Instantiate(parent);
......
...@@ -907,7 +907,7 @@ function InstallFunctions(prototype, attributes, functions) { ...@@ -907,7 +907,7 @@ function InstallFunctions(prototype, attributes, functions) {
var key = functions[i]; var key = functions[i];
var f = functions[i + 1]; var f = functions[i + 1];
%FunctionSetName(f, key); %FunctionSetName(f, key);
%AddProperty(prototype, key, f, attributes); %SetProperty(prototype, key, f, attributes);
} }
} }
...@@ -924,7 +924,7 @@ function UpdateFunctionLengths(lengths) { ...@@ -924,7 +924,7 @@ function UpdateFunctionLengths(lengths) {
function SetupArray() { function SetupArray() {
// Setup non-enumerable constructor property on the Array.prototype // Setup non-enumerable constructor property on the Array.prototype
// object. // object.
%AddProperty($Array.prototype, "constructor", $Array, DONT_ENUM); %SetProperty($Array.prototype, "constructor", $Array, DONT_ENUM);
// Setup non-enumerable functions of the Array.prototype object and // Setup non-enumerable functions of the Array.prototype object and
// set their names. // set their names.
......
...@@ -959,7 +959,7 @@ function SetupDate() { ...@@ -959,7 +959,7 @@ function SetupDate() {
)); ));
// Setup non-enumerable constructor property of the Date prototype object. // Setup non-enumerable constructor property of the Date prototype object.
%AddProperty($Date.prototype, "constructor", $Date, DONT_ENUM); %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM);
// Setup non-enumerable functions of the Date prototype object and // Setup non-enumerable functions of the Date prototype object and
// set their names. // set their names.
......
...@@ -40,7 +40,7 @@ function MathConstructor() {} ...@@ -40,7 +40,7 @@ function MathConstructor() {}
%FunctionSetInstanceClassName(MathConstructor, 'Math'); %FunctionSetInstanceClassName(MathConstructor, 'Math');
const $Math = new MathConstructor(); const $Math = new MathConstructor();
$Math.__proto__ = global.Object.prototype; $Math.__proto__ = global.Object.prototype;
%AddProperty(global, "Math", $Math, DONT_ENUM); %SetProperty(global, "Math", $Math, DONT_ENUM);
// ECMA 262 - 15.8.2.1 // ECMA 262 - 15.8.2.1
function MathAbs(x) { function MathAbs(x) {
...@@ -126,17 +126,41 @@ function MathTan(x) { return %Math_tan(ToNumber(x)); } ...@@ -126,17 +126,41 @@ function MathTan(x) { return %Math_tan(ToNumber(x)); }
function SetupMath() { function SetupMath() {
// Setup math constants. // Setup math constants.
// ECMA-262, section 15.8.1.1. // ECMA-262, section 15.8.1.1.
%AddProperty($Math, "E", 2.7182818284590452354, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Math,
"E",
2.7182818284590452354,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262, section 15.8.1.2. // ECMA-262, section 15.8.1.2.
%AddProperty($Math, "LN10", 2.302585092994046, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Math,
"LN10",
2.302585092994046,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262, section 15.8.1.3. // ECMA-262, section 15.8.1.3.
%AddProperty($Math, "LN2", 0.6931471805599453, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Math,
"LN2",
0.6931471805599453,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262, section 15.8.1.4. // ECMA-262, section 15.8.1.4.
%AddProperty($Math, "LOG2E", 1.4426950408889634, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Math,
%AddProperty($Math, "LOG10E", 0.43429448190325176, DONT_ENUM | DONT_DELETE | READ_ONLY); "LOG2E",
%AddProperty($Math, "PI", 3.1415926535897932, DONT_ENUM | DONT_DELETE | READ_ONLY); 1.4426950408889634,
%AddProperty($Math, "SQRT1_2", 0.7071067811865476, DONT_ENUM | DONT_DELETE | READ_ONLY); DONT_ENUM | DONT_DELETE | READ_ONLY);
%AddProperty($Math, "SQRT2", 1.4142135623730951, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Math,
"LOG10E",
0.43429448190325176,
DONT_ENUM | DONT_DELETE | READ_ONLY);
%SetProperty($Math,
"PI",
3.1415926535897932,
DONT_ENUM | DONT_DELETE | READ_ONLY);
%SetProperty($Math,
"SQRT1_2",
0.7071067811865476,
DONT_ENUM | DONT_DELETE | READ_ONLY);
%SetProperty($Math,
"SQRT2",
1.4142135623730951,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// Setup non-enumerable functions of the Math object and // Setup non-enumerable functions of the Math object and
// set their names. // set their names.
......
...@@ -163,7 +163,7 @@ function MakeGenericError(constructor, type, args) { ...@@ -163,7 +163,7 @@ function MakeGenericError(constructor, type, args) {
* Setup the Script function and constructor. * Setup the Script function and constructor.
*/ */
%FunctionSetInstanceClassName(Script, 'Script'); %FunctionSetInstanceClassName(Script, 'Script');
%AddProperty(Script.prototype, 'constructor', Script, DONT_ENUM); %SetProperty(Script.prototype, 'constructor', Script, DONT_ENUM);
%SetCode(Script, function(x) { %SetCode(Script, function(x) {
// Script objects can only be created by the VM. // Script objects can only be created by the VM.
throw new $Error("Not supported"); throw new $Error("Not supported");
...@@ -633,7 +633,7 @@ function DefineError(f) { ...@@ -633,7 +633,7 @@ function DefineError(f) {
// effects when overwriting the error functions from // effects when overwriting the error functions from
// user code. // user code.
var name = f.name; var name = f.name;
%AddProperty(global, name, f, DONT_ENUM); %SetProperty(global, name, f, DONT_ENUM);
this['$' + name] = f; this['$' + name] = f;
// Configure the error function. // Configure the error function.
// prototype of 'Error' must be as default: new Object(). // prototype of 'Error' must be as default: new Object().
...@@ -663,7 +663,7 @@ DefineError(function URIError() { }); ...@@ -663,7 +663,7 @@ DefineError(function URIError() { });
// Setup extra properties of the Error.prototype object. // Setup extra properties of the Error.prototype object.
$Error.prototype.message = ''; $Error.prototype.message = '';
%AddProperty($Error.prototype, 'toString', function toString() { %SetProperty($Error.prototype, 'toString', function toString() {
var type = this.type; var type = this.type;
if (type && !this.hasOwnProperty("message")) { if (type && !this.hasOwnProperty("message")) {
return this.name + ": " + FormatMessage({ type: type, args: this.arguments }); return this.name + ": " + FormatMessage({ type: type, args: this.arguments });
......
...@@ -290,7 +290,7 @@ var regExpInput = ""; ...@@ -290,7 +290,7 @@ var regExpInput = "";
function SetupRegExp() { function SetupRegExp() {
%FunctionSetInstanceClassName($RegExp, 'RegExp'); %FunctionSetInstanceClassName($RegExp, 'RegExp');
%FunctionSetPrototype($RegExp, new $Object()); %FunctionSetPrototype($RegExp, new $Object());
%AddProperty($RegExp.prototype, 'constructor', $RegExp, DONT_ENUM); %SetProperty($RegExp.prototype, 'constructor', $RegExp, DONT_ENUM);
%SetCode($RegExp, RegExpConstructor); %SetCode($RegExp, RegExpConstructor);
InstallFunctions($RegExp.prototype, DONT_ENUM, $Array( InstallFunctions($RegExp.prototype, DONT_ENUM, $Array(
......
...@@ -504,11 +504,14 @@ static Object* Runtime_InitializeVarGlobal(Arguments args) { ...@@ -504,11 +504,14 @@ static Object* Runtime_InitializeVarGlobal(Arguments args) {
// there, we add the property and take special precautions to always // there, we add the property and take special precautions to always
// add it as a local property even in case of callbacks in the // add it as a local property even in case of callbacks in the
// prototype chain (this rules out using SetProperty). // prototype chain (this rules out using SetProperty).
// We have IgnoreAttributesAndSetLocalProperty for this.
LookupResult lookup; LookupResult lookup;
global->LocalLookup(*name, &lookup); global->LocalLookup(*name, &lookup);
if (!lookup.IsProperty()) { if (!lookup.IsProperty()) {
Object* value = (assign) ? args[1] : Heap::undefined_value(); Object* value = (assign) ? args[1] : Heap::undefined_value();
return global->AddProperty(*name, value, attributes); return global->IgnoreAttributesAndSetLocalProperty(*name,
value,
attributes);
} }
// Determine if this is a redeclaration of something read-only. // Determine if this is a redeclaration of something read-only.
...@@ -568,10 +571,13 @@ static Object* Runtime_InitializeConstGlobal(Arguments args) { ...@@ -568,10 +571,13 @@ static Object* Runtime_InitializeConstGlobal(Arguments args) {
// there, we add the property and take special precautions to always // there, we add the property and take special precautions to always
// add it as a local property even in case of callbacks in the // add it as a local property even in case of callbacks in the
// prototype chain (this rules out using SetProperty). // prototype chain (this rules out using SetProperty).
// We use IgnoreAttributesAndSetLocalProperty instead
LookupResult lookup; LookupResult lookup;
global->LocalLookup(*name, &lookup); global->LocalLookup(*name, &lookup);
if (!lookup.IsProperty()) { if (!lookup.IsProperty()) {
return global->AddProperty(*name, *value, attributes); return global->IgnoreAttributesAndSetLocalProperty(*name,
*value,
attributes);
} }
// Determine if this is a redeclaration of something not // Determine if this is a redeclaration of something not
...@@ -1377,23 +1383,6 @@ Object* Runtime::SetObjectProperty(Handle<Object> object, ...@@ -1377,23 +1383,6 @@ Object* Runtime::SetObjectProperty(Handle<Object> object,
} }
static Object* Runtime_AddProperty(Arguments args) {
NoHandleAllocation ha;
ASSERT(args.length() == 4);
CONVERT_CHECKED(JSObject, object, args[0]);
CONVERT_CHECKED(String, name, args[1]);
RUNTIME_ASSERT(!object->HasLocalProperty(name));
CONVERT_CHECKED(Smi, attr_obj, args[3]);
int attr = attr_obj->value();
RUNTIME_ASSERT((attr & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
PropertyAttributes attributes = static_cast<PropertyAttributes>(attr);
return object->AddProperty(name, args[2], attributes);
}
static Object* Runtime_SetProperty(Arguments args) { static Object* Runtime_SetProperty(Arguments args) {
NoHandleAllocation ha; NoHandleAllocation ha;
RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
...@@ -1406,10 +1395,11 @@ static Object* Runtime_SetProperty(Arguments args) { ...@@ -1406,10 +1395,11 @@ static Object* Runtime_SetProperty(Arguments args) {
PropertyAttributes attributes = NONE; PropertyAttributes attributes = NONE;
if (args.length() == 4) { if (args.length() == 4) {
CONVERT_CHECKED(Smi, value_obj, args[3]); CONVERT_CHECKED(Smi, value_obj, args[3]);
int value = value_obj->value(); int unchecked_value = value_obj->value();
// Only attribute bits should be set. // Only attribute bits should be set.
ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); RUNTIME_ASSERT(
attributes = static_cast<PropertyAttributes>(value); (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
attributes = static_cast<PropertyAttributes>(unchecked_value);
} }
return Runtime::SetObjectProperty(object, key, value, attributes); return Runtime::SetObjectProperty(object, key, value, attributes);
} }
...@@ -1419,12 +1409,22 @@ static Object* Runtime_SetProperty(Arguments args) { ...@@ -1419,12 +1409,22 @@ static Object* Runtime_SetProperty(Arguments args) {
// exist, it will be added with attributes NONE. // exist, it will be added with attributes NONE.
static Object* Runtime_IgnoreAttributesAndSetProperty(Arguments args) { static Object* Runtime_IgnoreAttributesAndSetProperty(Arguments args) {
NoHandleAllocation ha; NoHandleAllocation ha;
ASSERT(args.length() == 3); RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
CONVERT_CHECKED(JSObject, object, args[0]); CONVERT_CHECKED(JSObject, object, args[0]);
CONVERT_CHECKED(String, name, args[1]); CONVERT_CHECKED(String, name, args[1]);
// Compute attributes.
PropertyAttributes attributes = NONE;
if (args.length() == 4) {
CONVERT_CHECKED(Smi, value_obj, args[3]);
int unchecked_value = value_obj->value();
// Only attribute bits should be set.
RUNTIME_ASSERT(
(unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
attributes = static_cast<PropertyAttributes>(unchecked_value);
}
return object->IgnoreAttributesAndSetLocalProperty(name, args[2], NONE); return object->
IgnoreAttributesAndSetLocalProperty(name, args[2], attributes);
} }
......
...@@ -39,7 +39,6 @@ namespace v8 { namespace internal { ...@@ -39,7 +39,6 @@ namespace v8 { namespace internal {
#define RUNTIME_FUNCTION_LIST_ALWAYS(F) \ #define RUNTIME_FUNCTION_LIST_ALWAYS(F) \
/* Property access */ \ /* Property access */ \
F(AddProperty, 4) \
F(GetProperty, 2) \ F(GetProperty, 2) \
F(DeleteProperty, 2) \ F(DeleteProperty, 2) \
F(HasLocalProperty, 2) \ F(HasLocalProperty, 2) \
...@@ -189,7 +188,7 @@ namespace v8 { namespace internal { ...@@ -189,7 +188,7 @@ namespace v8 { namespace internal {
F(EvalReceiver, 1) \ F(EvalReceiver, 1) \
\ \
F(SetProperty, -1 /* 3 or 4 */) \ F(SetProperty, -1 /* 3 or 4 */) \
F(IgnoreAttributesAndSetProperty, 3) \ F(IgnoreAttributesAndSetProperty, -1 /* 3 or 4 */) \
\ \
/* Arrays */ \ /* Arrays */ \
F(RemoveArrayHoles, 1) \ F(RemoveArrayHoles, 1) \
......
...@@ -784,7 +784,7 @@ ReplaceResultBuilder.prototype.generate = function() { ...@@ -784,7 +784,7 @@ ReplaceResultBuilder.prototype.generate = function() {
function SetupString() { function SetupString() {
// Setup the constructor property on the String prototype object. // Setup the constructor property on the String prototype object.
%AddProperty($String.prototype, "constructor", $String, DONT_ENUM); %SetProperty($String.prototype, "constructor", $String, DONT_ENUM);
// Setup the non-enumerable functions on the String object. // Setup the non-enumerable functions on the String object.
......
...@@ -41,15 +41,15 @@ ...@@ -41,15 +41,15 @@
// ECMA 262 - 15.1.1.1. // ECMA 262 - 15.1.1.1.
%AddProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE); %SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE);
// ECMA-262 - 15.1.1.2. // ECMA-262 - 15.1.1.2.
%AddProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE); %SetProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE);
// ECMA-262 - 15.1.1.3. // ECMA-262 - 15.1.1.3.
%AddProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE); %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE);
// ECMA 262 - 15.1.4 // ECMA 262 - 15.1.4
...@@ -57,18 +57,18 @@ function $isNaN(number) { ...@@ -57,18 +57,18 @@ function $isNaN(number) {
var n = ToNumber(number); var n = ToNumber(number);
return NUMBER_IS_NAN(n); return NUMBER_IS_NAN(n);
} }
%AddProperty(global, "isNaN", $isNaN, DONT_ENUM); %SetProperty(global, "isNaN", $isNaN, DONT_ENUM);
// ECMA 262 - 15.1.5 // ECMA 262 - 15.1.5
function $isFinite(number) { function $isFinite(number) {
return %NumberIsFinite(ToNumber(number)); return %NumberIsFinite(ToNumber(number));
} }
%AddProperty(global, "isFinite", $isFinite, DONT_ENUM); %SetProperty(global, "isFinite", $isFinite, DONT_ENUM);
// ECMA-262 - 15.1.2.2 // ECMA-262 - 15.1.2.2
%AddProperty(global, "parseInt", function(string, radix) { %SetProperty(global, "parseInt", function(string, radix) {
if (radix === void 0) { if (radix === void 0) {
radix = 0; radix = 0;
// Some people use parseInt instead of Math.floor. This // Some people use parseInt instead of Math.floor. This
...@@ -93,7 +93,7 @@ function $isFinite(number) { ...@@ -93,7 +93,7 @@ function $isFinite(number) {
// ECMA-262 - 15.1.2.3 // ECMA-262 - 15.1.2.3
%AddProperty(global, "parseFloat", function(string) { %SetProperty(global, "parseFloat", function(string) {
return %StringParseFloat(ToString(string)); return %StringParseFloat(ToString(string));
}, DONT_ENUM); }, DONT_ENUM);
...@@ -112,14 +112,14 @@ function $isFinite(number) { ...@@ -112,14 +112,14 @@ function $isFinite(number) {
%FunctionSetPrototype($Boolean, new $Boolean(false)); %FunctionSetPrototype($Boolean, new $Boolean(false));
%AddProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM); %SetProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Object // Object
$Object.prototype.constructor = $Object; $Object.prototype.constructor = $Object;
%AddProperty($Object.prototype, "toString", function() { %SetProperty($Object.prototype, "toString", function() {
var c = %ClassOf(this); var c = %ClassOf(this);
// Hide Arguments from the outside. // Hide Arguments from the outside.
if (c === 'Arguments') c = 'Object'; if (c === 'Arguments') c = 'Object';
...@@ -128,32 +128,32 @@ $Object.prototype.constructor = $Object; ...@@ -128,32 +128,32 @@ $Object.prototype.constructor = $Object;
// ECMA-262, section 15.2.4.3, page 84. // ECMA-262, section 15.2.4.3, page 84.
%AddProperty($Object.prototype, "toLocaleString", function() { %SetProperty($Object.prototype, "toLocaleString", function() {
return this.toString(); return this.toString();
}, DONT_ENUM); }, DONT_ENUM);
// ECMA-262, section 15.2.4.4, page 85. // ECMA-262, section 15.2.4.4, page 85.
%AddProperty($Object.prototype, "valueOf", function() { %SetProperty($Object.prototype, "valueOf", function() {
return this; return this;
}, DONT_ENUM); }, DONT_ENUM);
// ECMA-262, section 15.2.4.5, page 85. // ECMA-262, section 15.2.4.5, page 85.
%AddProperty($Object.prototype, "hasOwnProperty", function(V) { %SetProperty($Object.prototype, "hasOwnProperty", function(V) {
return %HasLocalProperty(ToObject(this), ToString(V)); return %HasLocalProperty(ToObject(this), ToString(V));
}, DONT_ENUM); }, DONT_ENUM);
// ECMA-262, section 15.2.4.6, page 85. // ECMA-262, section 15.2.4.6, page 85.
%AddProperty($Object.prototype, "isPrototypeOf", function(V) { %SetProperty($Object.prototype, "isPrototypeOf", function(V) {
if (!IS_OBJECT(V) && !IS_FUNCTION(V)) return false; if (!IS_OBJECT(V) && !IS_FUNCTION(V)) return false;
return %IsInPrototypeChain(this, V); return %IsInPrototypeChain(this, V);
}, DONT_ENUM); }, DONT_ENUM);
// ECMA-262, section 15.2.4.6, page 85. // ECMA-262, section 15.2.4.6, page 85.
%AddProperty($Object.prototype, "propertyIsEnumerable", function(V) { %SetProperty($Object.prototype, "propertyIsEnumerable", function(V) {
if (this == null) return false; if (this == null) return false;
if (!IS_OBJECT(this) && !IS_FUNCTION(this)) return false; if (!IS_OBJECT(this) && !IS_FUNCTION(this)) return false;
return %IsPropertyEnumerable(this, ToString(V)); return %IsPropertyEnumerable(this, ToString(V));
...@@ -161,29 +161,43 @@ $Object.prototype.constructor = $Object; ...@@ -161,29 +161,43 @@ $Object.prototype.constructor = $Object;
// Extensions for providing property getters and setters. // Extensions for providing property getters and setters.
%AddProperty($Object.prototype, "__defineGetter__", function(name, fun) { %SetProperty($Object.prototype, "__defineGetter__", function(name, fun) {
if (this == null) throw new $TypeError('Object.prototype.__defineGetter__: this is Null'); if (this == null) {
if (!IS_FUNCTION(fun)) throw new $TypeError('Object.prototype.__defineGetter__: Expecting function'); throw new $TypeError('Object.prototype.__defineGetter__: this is Null');
}
if (!IS_FUNCTION(fun)) {
throw new $TypeError(
'Object.prototype.__defineGetter__: Expecting function');
}
return %DefineAccessor(ToObject(this), ToString(name), GETTER, fun); return %DefineAccessor(ToObject(this), ToString(name), GETTER, fun);
}, DONT_ENUM); }, DONT_ENUM);
%AddProperty($Object.prototype, "__lookupGetter__", function(name) { %SetProperty($Object.prototype, "__lookupGetter__", function(name) {
if (this == null) throw new $TypeError('Object.prototype.__lookupGetter__: this is Null'); if (this == null) {
throw new $TypeError('Object.prototype.__lookupGetter__: this is Null');
}
return %LookupAccessor(ToObject(this), ToString(name), GETTER); return %LookupAccessor(ToObject(this), ToString(name), GETTER);
}, DONT_ENUM); }, DONT_ENUM);
%AddProperty($Object.prototype, "__defineSetter__", function(name, fun) { %SetProperty($Object.prototype, "__defineSetter__", function(name, fun) {
if (this == null) throw new $TypeError('Object.prototype.__defineSetter__: this is Null'); if (this == null) {
if (!IS_FUNCTION(fun)) throw new $TypeError('Object.prototype.__defineSetter__: Expecting function'); throw new $TypeError('Object.prototype.__defineSetter__: this is Null');
}
if (!IS_FUNCTION(fun)) {
throw new $TypeError(
'Object.prototype.__defineSetter__: Expecting function');
}
return %DefineAccessor(ToObject(this), ToString(name), SETTER, fun); return %DefineAccessor(ToObject(this), ToString(name), SETTER, fun);
}, DONT_ENUM); }, DONT_ENUM);
%AddProperty($Object.prototype, "__lookupSetter__", function(name) { %SetProperty($Object.prototype, "__lookupSetter__", function(name) {
if (this == null) throw new $TypeError('Object.prototype.__lookupSetter__: this is Null'); if (this == null) {
throw new $TypeError('Object.prototype.__lookupSetter__: this is Null');
}
return %LookupAccessor(ToObject(this), ToString(name), SETTER); return %LookupAccessor(ToObject(this), ToString(name), SETTER);
}, DONT_ENUM); }, DONT_ENUM);
...@@ -202,7 +216,7 @@ $Object.prototype.constructor = $Object; ...@@ -202,7 +216,7 @@ $Object.prototype.constructor = $Object;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Global stuff... // Global stuff...
%AddProperty(global, "eval", function(x) { %SetProperty(global, "eval", function(x) {
if (!IS_STRING(x)) return x; if (!IS_STRING(x)) return x;
var f = %CompileString(x, 0, true); var f = %CompileString(x, 0, true);
...@@ -213,7 +227,7 @@ $Object.prototype.constructor = $Object; ...@@ -213,7 +227,7 @@ $Object.prototype.constructor = $Object;
// execScript for IE compatibility. // execScript for IE compatibility.
%AddProperty(global, "execScript", function(expr, lang) { %SetProperty(global, "execScript", function(expr, lang) {
// NOTE: We don't care about the character casing. // NOTE: We don't care about the character casing.
if (!lang || /javascript/i.test(lang)) { if (!lang || /javascript/i.test(lang)) {
var f = %CompileString(ToString(expr), 0, false); var f = %CompileString(ToString(expr), 0, false);
...@@ -226,7 +240,7 @@ $Object.prototype.constructor = $Object; ...@@ -226,7 +240,7 @@ $Object.prototype.constructor = $Object;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Boolean // Boolean
%AddProperty($Boolean.prototype, "toString", function() { %SetProperty($Boolean.prototype, "toString", function() {
// NOTE: Both Boolean objects and values can enter here as // NOTE: Both Boolean objects and values can enter here as
// 'this'. This is not as dictated by ECMA-262. // 'this'. This is not as dictated by ECMA-262.
if (!IS_BOOLEAN(this) && %ClassOf(this) !== 'Boolean') if (!IS_BOOLEAN(this) && %ClassOf(this) !== 'Boolean')
...@@ -235,7 +249,7 @@ $Object.prototype.constructor = $Object; ...@@ -235,7 +249,7 @@ $Object.prototype.constructor = $Object;
}, DONT_ENUM); }, DONT_ENUM);
%AddProperty($Boolean.prototype, "valueOf", function() { %SetProperty($Boolean.prototype, "valueOf", function() {
// NOTE: Both Boolean objects and values can enter here as // NOTE: Both Boolean objects and values can enter here as
// 'this'. This is not as dictated by ECMA-262. // 'this'. This is not as dictated by ECMA-262.
if (!IS_BOOLEAN(this) && %ClassOf(this) !== 'Boolean') if (!IS_BOOLEAN(this) && %ClassOf(this) !== 'Boolean')
...@@ -259,25 +273,34 @@ $Object.prototype.constructor = $Object; ...@@ -259,25 +273,34 @@ $Object.prototype.constructor = $Object;
%FunctionSetPrototype($Number, new $Number(0)); %FunctionSetPrototype($Number, new $Number(0));
%AddProperty($Number.prototype, "constructor", $Number, DONT_ENUM); %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM);
// ECMA-262 section 15.7.3.1. // ECMA-262 section 15.7.3.1.
%AddProperty($Number, "MAX_VALUE", 1.7976931348623157e+308, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Number,
"MAX_VALUE",
1.7976931348623157e+308,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262 section 15.7.3.2. // ECMA-262 section 15.7.3.2.
%AddProperty($Number, "MIN_VALUE", 5e-324, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Number, "MIN_VALUE", 5e-324, DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262 section 15.7.3.3. // ECMA-262 section 15.7.3.3.
%AddProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262 section 15.7.3.4. // ECMA-262 section 15.7.3.4.
%AddProperty($Number, "NEGATIVE_INFINITY", -1/0, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Number,
"NEGATIVE_INFINITY",
-1/0,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262 section 15.7.3.5. // ECMA-262 section 15.7.3.5.
%AddProperty($Number, "POSITIVE_INFINITY", 1/0, DONT_ENUM | DONT_DELETE | READ_ONLY); %SetProperty($Number,
"POSITIVE_INFINITY",
1/0,
DONT_ENUM | DONT_DELETE | READ_ONLY);
// ECMA-262 section 15.7.4.2. // ECMA-262 section 15.7.4.2.
%AddProperty($Number.prototype, "toString", function(radix) { %SetProperty($Number.prototype, "toString", function(radix) {
// NOTE: Both Number objects and values can enter here as // NOTE: Both Number objects and values can enter here as
// 'this'. This is not as dictated by ECMA-262. // 'this'. This is not as dictated by ECMA-262.
var number = this; var number = this;
...@@ -303,13 +326,13 @@ $Object.prototype.constructor = $Object; ...@@ -303,13 +326,13 @@ $Object.prototype.constructor = $Object;
// ECMA-262 section 15.7.4.3 // ECMA-262 section 15.7.4.3
%AddProperty($Number.prototype, "toLocaleString", function() { %SetProperty($Number.prototype, "toLocaleString", function() {
return this.toString(); return this.toString();
}, DONT_ENUM); }, DONT_ENUM);
// ECMA-262 section 15.7.4.4 // ECMA-262 section 15.7.4.4
%AddProperty($Number.prototype, "valueOf", function() { %SetProperty($Number.prototype, "valueOf", function() {
// NOTE: Both Number objects and values can enter here as // NOTE: Both Number objects and values can enter here as
// 'this'. This is not as dictated by ECMA-262. // 'this'. This is not as dictated by ECMA-262.
if (!IS_NUMBER(this) && %ClassOf(this) !== 'Number') if (!IS_NUMBER(this) && %ClassOf(this) !== 'Number')
...@@ -319,7 +342,7 @@ $Object.prototype.constructor = $Object; ...@@ -319,7 +342,7 @@ $Object.prototype.constructor = $Object;
// ECMA-262 section 15.7.4.5 // ECMA-262 section 15.7.4.5
%AddProperty($Number.prototype, "toFixed", function(fractionDigits) { %SetProperty($Number.prototype, "toFixed", function(fractionDigits) {
var f = TO_INTEGER(fractionDigits); var f = TO_INTEGER(fractionDigits);
if (f < 0 || f > 20) { if (f < 0 || f > 20) {
throw new $RangeError("toFixed() digits argument must be between 0 and 20"); throw new $RangeError("toFixed() digits argument must be between 0 and 20");
...@@ -330,7 +353,7 @@ $Object.prototype.constructor = $Object; ...@@ -330,7 +353,7 @@ $Object.prototype.constructor = $Object;
// ECMA-262 section 15.7.4.6 // ECMA-262 section 15.7.4.6
%AddProperty($Number.prototype, "toExponential", function(fractionDigits) { %SetProperty($Number.prototype, "toExponential", function(fractionDigits) {
var f = -1; var f = -1;
if (!IS_UNDEFINED(fractionDigits)) { if (!IS_UNDEFINED(fractionDigits)) {
f = TO_INTEGER(fractionDigits); f = TO_INTEGER(fractionDigits);
...@@ -344,7 +367,7 @@ $Object.prototype.constructor = $Object; ...@@ -344,7 +367,7 @@ $Object.prototype.constructor = $Object;
// ECMA-262 section 15.7.4.7 // ECMA-262 section 15.7.4.7
%AddProperty($Number.prototype, "toPrecision", function(precision) { %SetProperty($Number.prototype, "toPrecision", function(precision) {
if (IS_UNDEFINED(precision)) return ToString(%_ValueOf(this)); if (IS_UNDEFINED(precision)) return ToString(%_ValueOf(this));
var p = TO_INTEGER(precision); var p = TO_INTEGER(precision);
if (p < 1 || p > 21) { if (p < 1 || p > 21) {
...@@ -389,7 +412,7 @@ function FunctionSourceString(func) { ...@@ -389,7 +412,7 @@ function FunctionSourceString(func) {
} }
%AddProperty($Function.prototype, "toString", function() { %SetProperty($Function.prototype, "toString", function() {
return FunctionSourceString(this); return FunctionSourceString(this);
}, DONT_ENUM); }, DONT_ENUM);
......
...@@ -34,43 +34,43 @@ const NONE = 0; ...@@ -34,43 +34,43 @@ const NONE = 0;
const READ_ONLY = 1; const READ_ONLY = 1;
// Use DeclareGlobal... // Use DeclareGlobal...
%AddProperty(this.__proto__, "a", "1234", NONE); %SetProperty(this.__proto__, "a", "1234", NONE);
assertEquals(1234, a); assertEquals(1234, a);
eval("var a = 5678;"); eval("var a = 5678;");
assertEquals(5678, a); assertEquals(5678, a);
%AddProperty(this.__proto__, "b", "1234", NONE); %SetProperty(this.__proto__, "b", "1234", NONE);
assertEquals(1234, b); assertEquals(1234, b);
eval("const b = 5678;"); eval("const b = 5678;");
assertEquals(5678, b); assertEquals(5678, b);
%AddProperty(this.__proto__, "c", "1234", READ_ONLY); %SetProperty(this.__proto__, "c", "1234", READ_ONLY);
assertEquals(1234, c); assertEquals(1234, c);
eval("var c = 5678;"); eval("var c = 5678;");
assertEquals(5678, c); assertEquals(5678, c);
%AddProperty(this.__proto__, "d", "1234", READ_ONLY); %SetProperty(this.__proto__, "d", "1234", READ_ONLY);
assertEquals(1234, d); assertEquals(1234, d);
eval("const d = 5678;"); eval("const d = 5678;");
assertEquals(5678, d); assertEquals(5678, d);
// Use DeclareContextSlot... // Use DeclareContextSlot...
%AddProperty(this.__proto__, "x", "1234", NONE); %SetProperty(this.__proto__, "x", "1234", NONE);
assertEquals(1234, x); assertEquals(1234, x);
eval("with({}) { var x = 5678; }"); eval("with({}) { var x = 5678; }");
assertEquals(5678, x); assertEquals(5678, x);
%AddProperty(this.__proto__, "y", "1234", NONE); %SetProperty(this.__proto__, "y", "1234", NONE);
assertEquals(1234, y); assertEquals(1234, y);
eval("with({}) { const y = 5678; }"); eval("with({}) { const y = 5678; }");
assertEquals(5678, y); assertEquals(5678, y);
%AddProperty(this.__proto__, "z", "1234", READ_ONLY); %SetProperty(this.__proto__, "z", "1234", READ_ONLY);
assertEquals(1234, z); assertEquals(1234, z);
eval("with({}) { var z = 5678; }"); eval("with({}) { var z = 5678; }");
assertEquals(5678, z); assertEquals(5678, z);
%AddProperty(this.__proto__, "w", "1234", READ_ONLY); %SetProperty(this.__proto__, "w", "1234", READ_ONLY);
assertEquals(1234, w); assertEquals(1234, w);
eval("with({}) { const w = 5678; }"); eval("with({}) { const w = 5678; }");
assertEquals(5678, w); assertEquals(5678, w);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment