| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 V(redeclaration_symbol, "redeclaration") \ | 195 V(redeclaration_symbol, "redeclaration") \ |
| 196 V(failure_symbol, "<failure>") \ | 196 V(failure_symbol, "<failure>") \ |
| 197 V(space_symbol, " ") \ | 197 V(space_symbol, " ") \ |
| 198 V(exec_symbol, "exec") \ | 198 V(exec_symbol, "exec") \ |
| 199 V(zero_symbol, "0") \ | 199 V(zero_symbol, "0") \ |
| 200 V(global_eval_symbol, "GlobalEval") \ | 200 V(global_eval_symbol, "GlobalEval") \ |
| 201 V(identity_hash_symbol, "v8::IdentityHash") \ | 201 V(identity_hash_symbol, "v8::IdentityHash") \ |
| 202 V(closure_symbol, "(closure)") | 202 V(closure_symbol, "(closure)") |
| 203 | 203 |
| 204 | 204 |
| 205 // Forward declaration of the GCTracer class. | 205 // Forward declarations. |
| 206 class GCTracer; | 206 class GCTracer; |
| 207 class HeapStats; | 207 class HeapStats; |
| 208 class WeakObjectRetainer; |
| 208 | 209 |
| 209 | 210 |
| 210 typedef String* (*ExternalStringTableUpdaterCallback)(Object** pointer); | 211 typedef String* (*ExternalStringTableUpdaterCallback)(Object** pointer); |
| 211 | 212 |
| 212 typedef bool (*DirtyRegionCallback)(Address start, | 213 typedef bool (*DirtyRegionCallback)(Address start, |
| 213 Address end, | 214 Address end, |
| 214 ObjectSlotCallback copy_object_func); | 215 ObjectSlotCallback copy_object_func); |
| 215 | 216 |
| 216 | 217 |
| 217 // The all static Heap captures the interface to the global object heap. | 218 // The all static Heap captures the interface to the global object heap. |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 #define SYMBOL_ACCESSOR(name, str) static inline String* name() { \ | 761 #define SYMBOL_ACCESSOR(name, str) static inline String* name() { \ |
| 761 return String::cast(roots_[k##name##RootIndex]); \ | 762 return String::cast(roots_[k##name##RootIndex]); \ |
| 762 } | 763 } |
| 763 SYMBOL_LIST(SYMBOL_ACCESSOR) | 764 SYMBOL_LIST(SYMBOL_ACCESSOR) |
| 764 #undef SYMBOL_ACCESSOR | 765 #undef SYMBOL_ACCESSOR |
| 765 | 766 |
| 766 // The hidden_symbol is special because it is the empty string, but does | 767 // The hidden_symbol is special because it is the empty string, but does |
| 767 // not match the empty string. | 768 // not match the empty string. |
| 768 static String* hidden_symbol() { return hidden_symbol_; } | 769 static String* hidden_symbol() { return hidden_symbol_; } |
| 769 | 770 |
| 771 static void set_global_contexts_list(Object* object) { |
| 772 global_contexts_list_ = object; |
| 773 } |
| 774 static Object* global_contexts_list() { return global_contexts_list_; } |
| 775 |
| 770 // Iterates over all roots in the heap. | 776 // Iterates over all roots in the heap. |
| 771 static void IterateRoots(ObjectVisitor* v, VisitMode mode); | 777 static void IterateRoots(ObjectVisitor* v, VisitMode mode); |
| 772 // Iterates over all strong roots in the heap. | 778 // Iterates over all strong roots in the heap. |
| 773 static void IterateStrongRoots(ObjectVisitor* v, VisitMode mode); | 779 static void IterateStrongRoots(ObjectVisitor* v, VisitMode mode); |
| 774 // Iterates over all the other roots in the heap. | 780 // Iterates over all the other roots in the heap. |
| 775 static void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); | 781 static void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); |
| 776 | 782 |
| 777 enum ExpectedPageWatermarkState { | 783 enum ExpectedPageWatermarkState { |
| 778 WATERMARK_SHOULD_BE_VALID, | 784 WATERMARK_SHOULD_BE_VALID, |
| 779 WATERMARK_CAN_BE_INVALID | 785 WATERMARK_CAN_BE_INVALID |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 863 static void public_set_empty_script(Script* script) { | 869 static void public_set_empty_script(Script* script) { |
| 864 roots_[kEmptyScriptRootIndex] = script; | 870 roots_[kEmptyScriptRootIndex] = script; |
| 865 } | 871 } |
| 866 | 872 |
| 867 // Update the next script id. | 873 // Update the next script id. |
| 868 static inline void SetLastScriptId(Object* last_script_id); | 874 static inline void SetLastScriptId(Object* last_script_id); |
| 869 | 875 |
| 870 // Generated code can embed this address to get access to the roots. | 876 // Generated code can embed this address to get access to the roots. |
| 871 static Object** roots_address() { return roots_; } | 877 static Object** roots_address() { return roots_; } |
| 872 | 878 |
| 879 // Get address of global contexts list for serialization support. |
| 880 static Object** global_contexts_list_address() { |
| 881 return &global_contexts_list_; |
| 882 } |
| 883 |
| 873 #ifdef DEBUG | 884 #ifdef DEBUG |
| 874 static void Print(); | 885 static void Print(); |
| 875 static void PrintHandles(); | 886 static void PrintHandles(); |
| 876 | 887 |
| 877 // Verify the heap is in its normal state before or after a GC. | 888 // Verify the heap is in its normal state before or after a GC. |
| 878 static void Verify(); | 889 static void Verify(); |
| 879 | 890 |
| 880 // Report heap statistics. | 891 // Report heap statistics. |
| 881 static void ReportHeapStatistics(const char* title); | 892 static void ReportHeapStatistics(const char* title); |
| 882 static void ReportCodeStatistics(const char* title); | 893 static void ReportCodeStatistics(const char* title); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 static void CheckNewSpaceExpansionCriteria(); | 1055 static void CheckNewSpaceExpansionCriteria(); |
| 1045 | 1056 |
| 1046 static inline void IncrementYoungSurvivorsCounter(int survived) { | 1057 static inline void IncrementYoungSurvivorsCounter(int survived) { |
| 1047 young_survivors_after_last_gc_ = survived; | 1058 young_survivors_after_last_gc_ = survived; |
| 1048 survived_since_last_expansion_ += survived; | 1059 survived_since_last_expansion_ += survived; |
| 1049 } | 1060 } |
| 1050 | 1061 |
| 1051 static void UpdateNewSpaceReferencesInExternalStringTable( | 1062 static void UpdateNewSpaceReferencesInExternalStringTable( |
| 1052 ExternalStringTableUpdaterCallback updater_func); | 1063 ExternalStringTableUpdaterCallback updater_func); |
| 1053 | 1064 |
| 1065 static void ProcessWeakReferences(WeakObjectRetainer* retainer); |
| 1066 |
| 1054 // Helper function that governs the promotion policy from new space to | 1067 // Helper function that governs the promotion policy from new space to |
| 1055 // old. If the object's old address lies below the new space's age | 1068 // old. If the object's old address lies below the new space's age |
| 1056 // mark or if we've already filled the bottom 1/16th of the to space, | 1069 // mark or if we've already filled the bottom 1/16th of the to space, |
| 1057 // we try to promote this object. | 1070 // we try to promote this object. |
| 1058 static inline bool ShouldBePromoted(Address old_address, int object_size); | 1071 static inline bool ShouldBePromoted(Address old_address, int object_size); |
| 1059 | 1072 |
| 1060 static int MaxObjectSizeInNewSpace() { return kMaxObjectSizeInNewSpace; } | 1073 static int MaxObjectSizeInNewSpace() { return kMaxObjectSizeInNewSpace; } |
| 1061 | 1074 |
| 1062 static void ClearJSFunctionResultCaches(); | 1075 static void ClearJSFunctionResultCaches(); |
| 1063 | 1076 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 | 1163 |
| 1151 // Caches the amount of external memory registered at the last global gc. | 1164 // Caches the amount of external memory registered at the last global gc. |
| 1152 static int amount_of_external_allocated_memory_at_last_global_gc_; | 1165 static int amount_of_external_allocated_memory_at_last_global_gc_; |
| 1153 | 1166 |
| 1154 // Indicates that an allocation has failed in the old generation since the | 1167 // Indicates that an allocation has failed in the old generation since the |
| 1155 // last GC. | 1168 // last GC. |
| 1156 static int old_gen_exhausted_; | 1169 static int old_gen_exhausted_; |
| 1157 | 1170 |
| 1158 static Object* roots_[kRootListLength]; | 1171 static Object* roots_[kRootListLength]; |
| 1159 | 1172 |
| 1173 static Object* global_contexts_list_; |
| 1174 |
| 1160 struct StringTypeTable { | 1175 struct StringTypeTable { |
| 1161 InstanceType type; | 1176 InstanceType type; |
| 1162 int size; | 1177 int size; |
| 1163 RootListIndex index; | 1178 RootListIndex index; |
| 1164 }; | 1179 }; |
| 1165 | 1180 |
| 1166 struct ConstantSymbolTable { | 1181 struct ConstantSymbolTable { |
| 1167 const char* contents; | 1182 const char* contents; |
| 1168 RootListIndex index; | 1183 RootListIndex index; |
| 1169 }; | 1184 }; |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2036 | 2051 |
| 2037 // Notifies the table that only a prefix of the new list is valid. | 2052 // Notifies the table that only a prefix of the new list is valid. |
| 2038 inline static void ShrinkNewStrings(int position); | 2053 inline static void ShrinkNewStrings(int position); |
| 2039 | 2054 |
| 2040 // To speed up scavenge collections new space string are kept | 2055 // To speed up scavenge collections new space string are kept |
| 2041 // separate from old space strings. | 2056 // separate from old space strings. |
| 2042 static List<Object*> new_space_strings_; | 2057 static List<Object*> new_space_strings_; |
| 2043 static List<Object*> old_space_strings_; | 2058 static List<Object*> old_space_strings_; |
| 2044 }; | 2059 }; |
| 2045 | 2060 |
| 2061 |
| 2062 // Abstract base class for checking whether a weak object should be retained. |
| 2063 class WeakObjectRetainer { |
| 2064 public: |
| 2065 virtual ~WeakObjectRetainer() {} |
| 2066 |
| 2067 // Return whether this object should be retained. If NULL is returned the |
| 2068 // object has no references. Otherwise the address of the retained object |
| 2069 // should be returned as in some GC situations the object has been moved. |
| 2070 virtual Object* RetainAs(Object* object) = 0; |
| 2071 }; |
| 2072 |
| 2073 |
| 2046 } } // namespace v8::internal | 2074 } } // namespace v8::internal |
| 2047 | 2075 |
| 2048 #endif // V8_HEAP_H_ | 2076 #endif // V8_HEAP_H_ |
| OLD | NEW |