| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| 11 // with the distribution. | 11 // with the distribution. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 35 #include "spaces.h" | 35 #include "spaces.h" |
| 36 #include "splay-tree-inl.h" | 36 #include "splay-tree-inl.h" |
| 37 #include "v8-counters.h" | 37 #include "v8-counters.h" |
| 38 | 38 |
| 39 namespace v8 { | 39 namespace v8 { |
| 40 namespace internal { | 40 namespace internal { |
| 41 | 41 |
| 42 | 42 |
| 43 // Defines all the roots in Heap. | 43 // Defines all the roots in Heap. |
| 44 #define STRONG_ROOT_LIST(V) \ | 44 #define STRONG_ROOT_LIST(V) \ |
| 45 /* Put the byte array map early. We need it to be in place by the time */ \ | |
| 46 /* the deserializer hits the next page, since it wants to put a byte */ \ | |
| 47 /* array in the unused space at the end of the page. */ \ | |
| 48 V(Map, byte_array_map, ByteArrayMap) \ | 45 V(Map, byte_array_map, ByteArrayMap) \ |
| 46 V(Map, free_space_map, FreeSpaceMap) \ |
| 49 V(Map, one_pointer_filler_map, OnePointerFillerMap) \ | 47 V(Map, one_pointer_filler_map, OnePointerFillerMap) \ |
| 50 V(Map, two_pointer_filler_map, TwoPointerFillerMap) \ | 48 V(Map, two_pointer_filler_map, TwoPointerFillerMap) \ |
| 51 /* Cluster the most popular ones in a few cache lines here at the top. */ \ | 49 /* Cluster the most popular ones in a few cache lines here at the top. */ \ |
| 52 V(Smi, store_buffer_top, StoreBufferTop) \ | 50 V(Smi, store_buffer_top, StoreBufferTop) \ |
| 53 V(Object, undefined_value, UndefinedValue) \ | 51 V(Object, undefined_value, UndefinedValue) \ |
| 54 V(Object, the_hole_value, TheHoleValue) \ | 52 V(Object, the_hole_value, TheHoleValue) \ |
| 55 V(Object, null_value, NullValue) \ | 53 V(Object, null_value, NullValue) \ |
| 56 V(Object, true_value, TrueValue) \ | 54 V(Object, true_value, TrueValue) \ |
| 57 V(Object, false_value, FalseValue) \ | 55 V(Object, false_value, FalseValue) \ |
| 58 V(Object, arguments_marker, ArgumentsMarker) \ | 56 V(Object, arguments_marker, ArgumentsMarker) \ |
| (...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 // A cache is used for ascii codes. | 482 // A cache is used for ascii codes. |
| 485 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation | 483 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation |
| 486 // failed. Please note this does not perform a garbage collection. | 484 // failed. Please note this does not perform a garbage collection. |
| 487 MUST_USE_RESULT static MaybeObject* LookupSingleCharacterStringFromCode( | 485 MUST_USE_RESULT static MaybeObject* LookupSingleCharacterStringFromCode( |
| 488 uint16_t code); | 486 uint16_t code); |
| 489 | 487 |
| 490 // Allocate a byte array of the specified length | 488 // Allocate a byte array of the specified length |
| 491 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation | 489 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation |
| 492 // failed. | 490 // failed. |
| 493 // Please note this does not perform a garbage collection. | 491 // Please note this does not perform a garbage collection. |
| 494 MUST_USE_RESULT static MaybeObject* AllocateByteArray(int length, | 492 MUST_USE_RESULT static MaybeObject* AllocateByteArray( |
| 495 PretenureFlag pretenure); | 493 int length, |
| 494 PretenureFlag pretenure); |
| 496 | 495 |
| 497 // Allocate a non-tenured byte array of the specified length | 496 // Allocate a non-tenured byte array of the specified length |
| 498 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation | 497 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation |
| 499 // failed. | 498 // failed. |
| 500 // Please note this does not perform a garbage collection. | 499 // Please note this does not perform a garbage collection. |
| 501 MUST_USE_RESULT static MaybeObject* AllocateByteArray(int length); | 500 MUST_USE_RESULT static MaybeObject* AllocateByteArray(int length); |
| 502 | 501 |
| 503 // Allocates an external array of the specified length and type. | 502 // Allocates an external array of the specified length and type. |
| 504 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation | 503 // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation |
| 505 // failed. | 504 // failed. |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 // Performs garbage collection operation. | 754 // Performs garbage collection operation. |
| 756 // Returns whether there is a chance that another major GC could | 755 // Returns whether there is a chance that another major GC could |
| 757 // collect more garbage. | 756 // collect more garbage. |
| 758 static bool CollectGarbage(AllocationSpace space, GarbageCollector collector); | 757 static bool CollectGarbage(AllocationSpace space, GarbageCollector collector); |
| 759 | 758 |
| 760 // Performs garbage collection operation. | 759 // Performs garbage collection operation. |
| 761 // Returns whether there is a chance that another major GC could | 760 // Returns whether there is a chance that another major GC could |
| 762 // collect more garbage. | 761 // collect more garbage. |
| 763 inline static bool CollectGarbage(AllocationSpace space); | 762 inline static bool CollectGarbage(AllocationSpace space); |
| 764 | 763 |
| 765 // Performs a full garbage collection. Force compaction if the | 764 static const int kNoGCFlags = 0; |
| 766 // parameter is true. | 765 static const int kForceCompactionMask = 1; |
| 767 static void CollectAllGarbage(bool force_compaction); | 766 static const int kMakeHeapIterableMask = 2; |
| 767 |
| 768 // Performs a full garbage collection. If (flags & kForceCompactionMask) is |
| 769 // non-zero then force compaction. If (flags & kMakeHeapIterableMask) is non- |
| 770 // zero, then the slower precise sweeper is used, which leaves the heap in a |
| 771 // state where we can iterate over the heap visiting all objects. |
| 772 static void CollectAllGarbage(int flags); |
| 773 |
| 774 // Ensure that we have swept all spaces in such a way that we can iterate |
| 775 // over all objects. May cause a GC. |
| 776 static void EnsureHeapIsIterable(); |
| 768 | 777 |
| 769 // Last hope GC, should try to squeeze as much as possible. | 778 // Last hope GC, should try to squeeze as much as possible. |
| 770 static void CollectAllAvailableGarbage(); | 779 static void CollectAllAvailableGarbage(); |
| 771 | 780 |
| 772 // Notify the heap that a context has been disposed. | 781 // Notify the heap that a context has been disposed. |
| 773 static int NotifyContextDisposed() { return ++contexts_disposed_; } | 782 static int NotifyContextDisposed() { return ++contexts_disposed_; } |
| 774 | 783 |
| 775 // Utility to invoke the scavenger. This is needed in test code to | 784 // Utility to invoke the scavenger. This is needed in test code to |
| 776 // ensure correct callback for weak global handles. | 785 // ensure correct callback for weak global handles. |
| 777 static void PerformScavenge(); | 786 static void PerformScavenge(); |
| (...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 ObjectIterator* CreateIterator(); | 1616 ObjectIterator* CreateIterator(); |
| 1608 | 1617 |
| 1609 int current_space_; // from enum AllocationSpace. | 1618 int current_space_; // from enum AllocationSpace. |
| 1610 ObjectIterator* iterator_; // object iterator for the current space. | 1619 ObjectIterator* iterator_; // object iterator for the current space. |
| 1611 HeapObjectCallback size_func_; | 1620 HeapObjectCallback size_func_; |
| 1612 }; | 1621 }; |
| 1613 | 1622 |
| 1614 | 1623 |
| 1615 // A HeapIterator provides iteration over the whole heap. It | 1624 // A HeapIterator provides iteration over the whole heap. It |
| 1616 // aggregates the specific iterators for the different spaces as | 1625 // aggregates the specific iterators for the different spaces as |
| 1617 // these can only iterate over one space only. | 1626 // these can only iterate over one space only. It can only be guaranteed |
| 1627 // to iterate over live objects. |
| 1618 // | 1628 // |
| 1619 // HeapIterator can skip free list nodes (that is, de-allocated heap | 1629 // HeapIterator can skip free list nodes (that is, de-allocated heap |
| 1620 // objects that still remain in the heap). As implementation of free | 1630 // objects that still remain in the heap). As implementation of free |
| 1621 // nodes filtering uses GC marks, it can't be used during MS/MC GC | 1631 // nodes filtering uses GC marks, it can't be used during MS/MC GC |
| 1622 // phases. Also, it is forbidden to interrupt iteration in this mode, | 1632 // phases. Also, it is forbidden to interrupt iteration in this mode, |
| 1623 // as this will leave heap objects marked (and thus, unusable). | 1633 // as this will leave heap objects marked (and thus, unusable). |
| 1624 class HeapObjectsFilter; | 1634 class HeapObjectsFilter; |
| 1625 | 1635 |
| 1626 class HeapIterator BASE_EMBEDDED { | 1636 class HeapIterator BASE_EMBEDDED { |
| 1627 public: | 1637 public: |
| 1628 enum HeapObjectsFiltering { | |
| 1629 kNoFiltering, | |
| 1630 kFilterFreeListNodes, | |
| 1631 kFilterUnreachable | |
| 1632 }; | |
| 1633 | |
| 1634 HeapIterator(); | 1638 HeapIterator(); |
| 1635 explicit HeapIterator(HeapObjectsFiltering filtering); | |
| 1636 ~HeapIterator(); | 1639 ~HeapIterator(); |
| 1637 | 1640 |
| 1638 HeapObject* next(); | 1641 HeapObject* Next(); |
| 1639 void reset(); | 1642 void Reset(); |
| 1640 | 1643 |
| 1641 private: | 1644 private: |
| 1642 // Perform the initialization. | 1645 // Perform the initialization. |
| 1643 void Init(); | 1646 void Init(); |
| 1644 // Perform all necessary shutdown (destruction) work. | 1647 // Perform all necessary shutdown (destruction) work. |
| 1645 void Shutdown(); | 1648 void Shutdown(); |
| 1646 HeapObject* NextObject(); | |
| 1647 | 1649 |
| 1648 HeapObjectsFiltering filtering_; | |
| 1649 HeapObjectsFilter* filter_; | |
| 1650 // Space iterator for iterating all the spaces. | 1650 // Space iterator for iterating all the spaces. |
| 1651 SpaceIterator* space_iterator_; | 1651 SpaceIterator* space_iterator_; |
| 1652 // Object iterator for the space currently being iterated. | 1652 // Object iterator for the space currently being iterated. |
| 1653 ObjectIterator* object_iterator_; | 1653 ObjectIterator* object_iterator_; |
| 1654 }; | 1654 }; |
| 1655 | 1655 |
| 1656 | 1656 |
| 1657 // Cache for mapping (map, property name) into field offset. | 1657 // Cache for mapping (map, property name) into field offset. |
| 1658 // Cleared at startup and prior to mark sweep collection. | 1658 // Cleared at startup and prior to mark sweep collection. |
| 1659 class KeyedLookupCache { | 1659 class KeyedLookupCache { |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2235 | 2235 |
| 2236 AssertNoAllocation no_alloc; // i.e. no gc allowed. | 2236 AssertNoAllocation no_alloc; // i.e. no gc allowed. |
| 2237 | 2237 |
| 2238 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); | 2238 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); |
| 2239 }; | 2239 }; |
| 2240 #endif // DEBUG || LIVE_OBJECT_LIST | 2240 #endif // DEBUG || LIVE_OBJECT_LIST |
| 2241 | 2241 |
| 2242 } } // namespace v8::internal | 2242 } } // namespace v8::internal |
| 2243 | 2243 |
| 2244 #endif // V8_HEAP_H_ | 2244 #endif // V8_HEAP_H_ |
| OLD | NEW |