@@ -1623,8 +1623,6 @@ void Heap::Scavenge() {
16231623
16241624 SelectScavengingVisitorsTable ();
16251625
1626- PrepareArrayBufferDiscoveryInNewSpace ();
1627-
16281626 // Flip the semispaces. After flipping, to space is empty, from space has
16291627 // live objects.
16301628 new_space_.Flip ();
@@ -1706,8 +1704,6 @@ void Heap::Scavenge() {
17061704 new_space_.LowerInlineAllocationLimit (
17071705 new_space_.inline_allocation_limit_step ());
17081706
1709- FreeDeadArrayBuffers (true );
1710-
17111707 // Update how much has survived scavenge.
17121708 IncrementYoungSurvivorsCounter (static_cast <int >(
17131709 (PromotedSpaceSizeOfObjects () - survived_watermark) + new_space_.Size ()));
@@ -1801,122 +1797,46 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
18011797}
18021798
18031799
1804- void Heap::RegisterNewArrayBufferHelper (std::map<void *, size_t >& live_buffers,
1805- void * data, size_t length) {
1806- live_buffers[data] = length;
1807- }
1808-
1809-
1810- void Heap::UnregisterArrayBufferHelper (
1811- std::map<void *, size_t >& live_buffers,
1812- std::map<void *, size_t >& not_yet_discovered_buffers, void * data) {
1813- DCHECK (live_buffers.count (data) > 0 );
1814- live_buffers.erase (data);
1815- not_yet_discovered_buffers.erase (data);
1816- }
1817-
1818-
1819- void Heap::RegisterLiveArrayBufferHelper (
1820- std::map<void *, size_t >& not_yet_discovered_buffers, void * data) {
1821- not_yet_discovered_buffers.erase (data);
1822- }
1823-
1824-
1825- size_t Heap::FreeDeadArrayBuffersHelper (
1826- Isolate* isolate, std::map<void *, size_t >& live_buffers,
1827- std::map<void *, size_t >& not_yet_discovered_buffers) {
1828- size_t freed_memory = 0 ;
1829- for (auto buffer = not_yet_discovered_buffers.begin ();
1830- buffer != not_yet_discovered_buffers.end (); ++buffer) {
1831- isolate->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1832- freed_memory += buffer->second ;
1833- live_buffers.erase (buffer->first );
1834- }
1835- not_yet_discovered_buffers = live_buffers;
1836- return freed_memory;
1837- }
1838-
1839-
1840- void Heap::TearDownArrayBuffersHelper (
1841- Isolate* isolate, std::map<void *, size_t >& live_buffers,
1842- std::map<void *, size_t >& not_yet_discovered_buffers) {
1843- for (auto buffer = live_buffers.begin (); buffer != live_buffers.end ();
1844- ++buffer) {
1845- isolate->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1846- }
1847- live_buffers.clear ();
1848- not_yet_discovered_buffers.clear ();
1849- }
1850-
1851-
1852- void Heap::RegisterNewArrayBuffer (bool in_new_space, void * data,
1853- size_t length) {
1800+ void Heap::RegisterNewArrayBuffer (void * data, size_t length) {
18541801 if (!data) return ;
1855- RegisterNewArrayBufferHelper (
1856- in_new_space ? live_new_array_buffers_ : live_array_buffers_, data,
1857- length);
1802+ live_array_buffers_[data] = length;
18581803 reinterpret_cast <v8::Isolate*>(isolate_)
18591804 ->AdjustAmountOfExternalAllocatedMemory (length);
18601805}
18611806
18621807
1863- void Heap::UnregisterArrayBuffer (bool in_new_space, void * data) {
1808+ void Heap::UnregisterArrayBuffer (void * data) {
18641809 if (!data) return ;
1865- UnregisterArrayBufferHelper (
1866- in_new_space ? live_new_array_buffers_ : live_array_buffers_,
1867- in_new_space ? not_yet_discovered_new_array_buffers_
1868- : not_yet_discovered_array_buffers_,
1869- data);
1810+ DCHECK (live_array_buffers_.count (data) > 0 );
1811+ live_array_buffers_.erase (data);
1812+ not_yet_discovered_array_buffers_.erase (data);
18701813}
18711814
18721815
1873- void Heap::RegisterLiveArrayBuffer (bool in_new_space, void * data) {
1874- // ArrayBuffer might be in the middle of being constructed.
1875- if (data == undefined_value ()) return ;
1876- RegisterLiveArrayBufferHelper (in_new_space
1877- ? not_yet_discovered_new_array_buffers_
1878- : not_yet_discovered_array_buffers_,
1879- data);
1816+ void Heap::RegisterLiveArrayBuffer (void * data) {
1817+ not_yet_discovered_array_buffers_.erase (data);
18801818}
18811819
18821820
1883- void Heap::FreeDeadArrayBuffers (bool in_new_space) {
1884- size_t freed_memory = FreeDeadArrayBuffersHelper (
1885- isolate_, in_new_space ? live_new_array_buffers_ : live_array_buffers_,
1886- in_new_space ? not_yet_discovered_new_array_buffers_
1887- : not_yet_discovered_array_buffers_);
1888- if (freed_memory) {
1889- reinterpret_cast <v8::Isolate*>(isolate_)
1890- ->AdjustAmountOfExternalAllocatedMemory (
1891- -static_cast <int64_t >(freed_memory));
1821+ void Heap::FreeDeadArrayBuffers () {
1822+ for (auto buffer = not_yet_discovered_array_buffers_.begin ();
1823+ buffer != not_yet_discovered_array_buffers_.end (); ++buffer) {
1824+ isolate_->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1825+ // Don't use the API method here since this could trigger another GC.
1826+ amount_of_external_allocated_memory_ -= buffer->second ;
1827+ live_array_buffers_.erase (buffer->first );
18921828 }
1829+ not_yet_discovered_array_buffers_ = live_array_buffers_;
18931830}
18941831
18951832
18961833void Heap::TearDownArrayBuffers () {
1897- TearDownArrayBuffersHelper (isolate_, live_array_buffers_,
1898- not_yet_discovered_array_buffers_);
1899- TearDownArrayBuffersHelper (isolate_, live_new_array_buffers_,
1900- not_yet_discovered_new_array_buffers_);
1901- }
1902-
1903-
1904- void Heap::PrepareArrayBufferDiscoveryInNewSpace () {
1905- not_yet_discovered_new_array_buffers_ = live_new_array_buffers_;
1906- }
1907-
1908-
1909- void Heap::PromoteArrayBuffer (Object* obj) {
1910- JSArrayBuffer* buffer = JSArrayBuffer::cast (obj);
1911- if (buffer->is_external ()) return ;
1912- void * data = buffer->backing_store ();
1913- if (!data) return ;
1914- // ArrayBuffer might be in the middle of being constructed.
1915- if (data == undefined_value ()) return ;
1916- DCHECK (live_new_array_buffers_.count (data) > 0 );
1917- live_array_buffers_[data] = live_new_array_buffers_[data];
1918- live_new_array_buffers_.erase (data);
1919- not_yet_discovered_new_array_buffers_.erase (data);
1834+ for (auto buffer = live_array_buffers_.begin ();
1835+ buffer != live_array_buffers_.end (); ++buffer) {
1836+ isolate_->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1837+ }
1838+ live_array_buffers_.clear ();
1839+ not_yet_discovered_array_buffers_.clear ();
19201840}
19211841
19221842
@@ -2169,7 +2089,6 @@ class ScavengingVisitor : public StaticVisitorBase {
21692089 table_.Register (kVisitFixedDoubleArray , &EvacuateFixedDoubleArray);
21702090 table_.Register (kVisitFixedTypedArray , &EvacuateFixedTypedArray);
21712091 table_.Register (kVisitFixedFloat64Array , &EvacuateFixedFloat64Array);
2172- table_.Register (kVisitJSArrayBuffer , &EvacuateJSArrayBuffer);
21732092
21742093 table_.Register (
21752094 kVisitNativeContext ,
@@ -2199,6 +2118,9 @@ class ScavengingVisitor : public StaticVisitorBase {
21992118 table_.Register (kVisitJSWeakCollection ,
22002119 &ObjectEvacuationStrategy<POINTER_OBJECT >::Visit);
22012120
2121+ table_.Register (kVisitJSArrayBuffer ,
2122+ &ObjectEvacuationStrategy<POINTER_OBJECT >::Visit);
2123+
22022124 table_.Register (kVisitJSTypedArray ,
22032125 &ObjectEvacuationStrategy<POINTER_OBJECT >::Visit);
22042126
@@ -2426,18 +2348,6 @@ class ScavengingVisitor : public StaticVisitorBase {
24262348 }
24272349
24282350
2429- static inline void EvacuateJSArrayBuffer (Map* map, HeapObject** slot,
2430- HeapObject* object) {
2431- ObjectEvacuationStrategy<POINTER_OBJECT >::Visit (map, slot, object);
2432-
2433- Heap* heap = map->GetHeap ();
2434- MapWord map_word = object->map_word ();
2435- DCHECK (map_word.IsForwardingAddress ());
2436- HeapObject* target = map_word.ToForwardingAddress ();
2437- if (!heap->InNewSpace (target)) heap->PromoteArrayBuffer (target);
2438- }
2439-
2440-
24412351 static inline void EvacuateByteArray (Map* map, HeapObject** slot,
24422352 HeapObject* object) {
24432353 int object_size = reinterpret_cast <ByteArray*>(object)->ByteArraySize ();
0 commit comments