DescriptionES6: Add support for Map/Set forEach
This implements MapIterator and SetIterator which matches
the same constructs in the ES6 spec. However, these 2
iterators are not exposed to user code yet. They are only
used internally to implement Map.prototype.forEach and
Set.prototype.forEach.
Each iterator has a reference to the OrderedHashTable where
it directly accesses the hash table's entries.
The OrderedHashTable has a reference to the newest iterator
and each iterator has a reference to the next and previous
iterator, effectively creating a double linked list.
When the OrderedHashTable is mutated (or replaced) all the
iterators are updated.
When the iterator iterates passed the end of the data table
it closes itself. Closed iterators no longer have a
reference to the OrderedHashTable and they are removed from
the double linked list. In the case of Map/Set forEach, we
manually call Close on the iterator in case an exception was
thrown so that the iterator never reached the end.
At this point the OrderedHashTable keeps all the non finished
iterators alive but since the only thing we currently expose
is forEach there are no unfinished iterators outside a forEach
call. Once we expose the iterators to user code we will need
to make the references from the OrderedHashTable to the
iterators weak and have some mechanism to close an iterator
when it is garbage collected.
BUG=1793, 2323
LOG=Y
R=adamk@chromium.org, mstarzinger@chromium.org
Committed: https://code.google.com/p/v8/source/detail?r=20781
Patch Set 1 #
Total comments: 46
Patch Set 2 : Code review changes #Patch Set 3 : Fix issue with closing the iterator too early #Patch Set 4 : static-ify #
Total comments: 14
Patch Set 5 : Store map in native context and use InObjectPropertyAtPut #Patch Set 6 : Handle-ify and UsedCapacity #
Total comments: 15
Patch Set 7 : less handles #Patch Set 8 : Refactor to pass table into Create and remove CreateIterator #
Total comments: 19
Patch Set 9 : Use IS_SPEC_FUNCTION instead #
Total comments: 2
Patch Set 10 : Michael's code review #Patch Set 11 : Add test that calls gc() #
Messages
Total messages: 32 (0 generated)
|