Commit 9e5e3aff authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

[runtime] Cleanup native methods creation in js/collection.js and js/collection-iterator.js.

This CL replaces usages of utils.InstallFunctions and utils.InstallGetter()
with the DEFINE_METHOD* macros that ensure that the native function is
created in proper form from the beginning. Thus the function will not
require further reconfiguring like adding a computed name or removing of
'prototype' property.

This CL is one of a series of cleanup CL which are the preliminary steps for
improving function closures creation.

Bug: v8:6459

fox

Change-Id: I0d95cd28511a84ff2c0a6e4dbf7274f73a0629f4
Reviewed-on: https://chromium-review.googlesource.com/548155
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#46286}
parent a1503030
......@@ -25,7 +25,9 @@ function SetIteratorConstructor(set, kind) {
}
function SetIteratorNextJS() {
DEFINE_METHOD(
SetIterator.prototype,
next() {
if (!IS_SET_ITERATOR(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Set Iterator.prototype.next', this);
......@@ -47,43 +49,42 @@ function SetIteratorNextJS() {
}
return result;
}
}
);
function SetEntries() {
DEFINE_METHODS(
GlobalSet.prototype,
{
entries() {
if (!IS_SET(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Set.prototype.entries', this);
}
return new SetIterator(this, ITERATOR_KIND_ENTRIES);
}
}
function SetValues() {
values() {
if (!IS_SET(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Set.prototype.values', this);
}
return new SetIterator(this, ITERATOR_KIND_VALUES);
}
}
}
);
// -------------------------------------------------------------------
%SetCode(SetIterator, SetIteratorConstructor);
%FunctionSetInstanceClassName(SetIterator, 'Set Iterator');
utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [
'next', SetIteratorNextJS
]);
var SetIteratorNext = SetIterator.prototype.next;
%AddNamedProperty(SetIterator.prototype, toStringTagSymbol,
"Set Iterator", READ_ONLY | DONT_ENUM);
utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [
'entries', SetEntries,
'keys', SetValues,
'values', SetValues
]);
var SetValues = GlobalSet.prototype.values;
%AddNamedProperty(GlobalSet.prototype, "keys", SetValues, DONT_ENUM);
%AddNamedProperty(GlobalSet.prototype, iteratorSymbol, SetValues, DONT_ENUM);
// -------------------------------------------------------------------
......@@ -93,7 +94,9 @@ function MapIteratorConstructor(map, kind) {
}
function MapIteratorNextJS() {
DEFINE_METHOD(
MapIterator.prototype,
next() {
if (!IS_MAP_ITERATOR(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map Iterator.prototype.next', this);
......@@ -116,53 +119,52 @@ function MapIteratorNextJS() {
}
return result;
}
}
);
function MapEntries() {
DEFINE_METHODS(
GlobalMap.prototype,
{
entries() {
if (!IS_MAP(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map.prototype.entries', this);
}
return new MapIterator(this, ITERATOR_KIND_ENTRIES);
}
}
function MapKeys() {
keys() {
if (!IS_MAP(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map.prototype.keys', this);
}
return new MapIterator(this, ITERATOR_KIND_KEYS);
}
}
function MapValues() {
values() {
if (!IS_MAP(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map.prototype.values', this);
}
return new MapIterator(this, ITERATOR_KIND_VALUES);
}
}
}
);
// -------------------------------------------------------------------
%SetCode(MapIterator, MapIteratorConstructor);
%FunctionSetInstanceClassName(MapIterator, 'Map Iterator');
utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [
'next', MapIteratorNextJS
]);
var MapIteratorNext = MapIterator.prototype.next;
%AddNamedProperty(MapIterator.prototype, toStringTagSymbol,
"Map Iterator", READ_ONLY | DONT_ENUM);
utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [
'entries', MapEntries,
'keys', MapKeys,
'values', MapValues
]);
var MapEntries = GlobalMap.prototype.entries;
%AddNamedProperty(GlobalMap.prototype, iteratorSymbol, MapEntries, DONT_ENUM);
// -------------------------------------------------------------------
......@@ -170,8 +172,8 @@ utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [
utils.Export(function(to) {
to.MapEntries = MapEntries;
to.MapIteratorNext = MapIteratorNextJS;
to.SetIteratorNext = SetIteratorNextJS;
to.MapIteratorNext = MapIteratorNext;
to.SetIteratorNext = SetIteratorNext;
to.SetValues = SetValues;
});
......
......@@ -120,7 +120,11 @@ function GetHash(key) {
// -------------------------------------------------------------------
// Harmony Set
function SetAdd(key) {
//Set up the non-enumerable functions on the Set prototype object.
DEFINE_METHODS(
GlobalSet.prototype,
{
add(key) {
if (!IS_SET(this)) {
throw %make_type_error(kIncompatibleMethodReceiver, 'Set.prototype.add', this);
}
......@@ -157,10 +161,9 @@ function SetAdd(key) {
FIXED_ARRAY_SET(table, index, key);
FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry);
return this;
}
}
function SetDelete(key) {
delete(key) {
if (!IS_SET(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Set.prototype.delete', this);
......@@ -180,20 +183,17 @@ function SetDelete(key) {
ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod);
if (nof < (numBuckets >>> 1)) %SetShrink(this);
return true;
}
// Set up the non-enumerable functions on the Set prototype object.
utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [
"add", SetAdd,
"delete", SetDelete,
]);
}
}
);
// -------------------------------------------------------------------
// Harmony Map
function MapSet(key, value) {
//Set up the non-enumerable functions on the Map prototype object.
DEFINE_METHODS(
GlobalMap.prototype,
{
set(key, value) {
if (!IS_MAP(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map.prototype.set', this);
......@@ -238,10 +238,9 @@ function MapSet(key, value) {
FIXED_ARRAY_SET(table, index + 1, value);
FIXED_ARRAY_SET(table, index + 2, chainEntry);
return this;
}
}
function MapDelete(key) {
delete(key) {
if (!IS_MAP(this)) {
throw %make_type_error(kIncompatibleMethodReceiver,
'Map.prototype.delete', this);
......@@ -261,22 +260,18 @@ function MapDelete(key) {
ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod);
if (nof < (numBuckets >>> 1)) %MapShrink(this);
return true;
}
// Set up the non-enumerable functions on the Map prototype object.
utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [
"set", MapSet,
"delete", MapDelete,
]);
}
}
);
// -----------------------------------------------------------------------
// Exports
%InstallToContext([
"map_set", MapSet,
"map_delete", MapDelete,
"set_add", SetAdd,
"set_delete", SetDelete,
"map_set", GlobalMap.prototype.set,
"map_delete", GlobalMap.prototype.delete,
"set_add", GlobalSet.prototype.add,
"set_delete", GlobalSet.prototype.delete,
]);
utils.Export(function(to) {
......
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