Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: src/heap.h

Issue 131363008: A64: Synchronize with r15922. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/globals.h ('k') | src/heap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 V(NameDictionary, intrinsic_function_names, IntrinsicFunctionNames) \ 181 V(NameDictionary, intrinsic_function_names, IntrinsicFunctionNames) \
182 V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \ 182 V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \
183 V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset) \ 183 V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset) \
184 V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset) \ 184 V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset) \
185 V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset) \ 185 V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset) \
186 V(JSObject, observation_state, ObservationState) \ 186 V(JSObject, observation_state, ObservationState) \
187 V(Map, external_map, ExternalMap) \ 187 V(Map, external_map, ExternalMap) \
188 V(Symbol, frozen_symbol, FrozenSymbol) \ 188 V(Symbol, frozen_symbol, FrozenSymbol) \
189 V(SeededNumberDictionary, empty_slow_element_dictionary, \ 189 V(SeededNumberDictionary, empty_slow_element_dictionary, \
190 EmptySlowElementDictionary) \ 190 EmptySlowElementDictionary) \
191 V(Symbol, observed_symbol, ObservedSymbol) 191 V(Symbol, observed_symbol, ObservedSymbol) \
192 V(HeapObject, i18n_template_one, I18nTemplateOne) \
193 V(HeapObject, i18n_template_two, I18nTemplateTwo)
192 194
193 #define ROOT_LIST(V) \ 195 #define ROOT_LIST(V) \
194 STRONG_ROOT_LIST(V) \ 196 STRONG_ROOT_LIST(V) \
195 V(StringTable, string_table, StringTable) 197 V(StringTable, string_table, StringTable)
196 198
197 #define INTERNALIZED_STRING_LIST(V) \ 199 #define INTERNALIZED_STRING_LIST(V) \
198 V(Array_string, "Array") \ 200 V(Array_string, "Array") \
199 V(Object_string, "Object") \ 201 V(Object_string, "Object") \
200 V(proto_string, "__proto__") \ 202 V(proto_string, "__proto__") \
201 V(StringImpl_string, "StringImpl") \ 203 V(StringImpl_string, "StringImpl") \
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 // separate from old space strings. 470 // separate from old space strings.
469 List<Object*> new_space_strings_; 471 List<Object*> new_space_strings_;
470 List<Object*> old_space_strings_; 472 List<Object*> old_space_strings_;
471 473
472 Heap* heap_; 474 Heap* heap_;
473 475
474 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); 476 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable);
475 }; 477 };
476 478
477 479
478 // The stack property of an error object is implemented as a getter that
479 // formats the attached raw stack trace into a string. This raw stack trace
480 // keeps code and function objects alive until the getter is called the first
481 // time. To release those objects, we call the getter after each GC for
482 // newly tenured error objects that are kept in a list.
483 class ErrorObjectList {
484 public:
485 inline void Add(JSObject* object);
486
487 inline void Iterate(ObjectVisitor* v);
488
489 void TearDown();
490
491 void RemoveUnmarked(Heap* heap);
492
493 void DeferredFormatStackTrace(Isolate* isolate);
494
495 void UpdateReferences();
496
497 void UpdateReferencesInNewSpace(Heap* heap);
498
499 private:
500 static const int kBudgetPerGC = 16;
501
502 ErrorObjectList() : nested_(false) { }
503
504 friend class Heap;
505
506 List<Object*> list_;
507 bool nested_;
508
509 DISALLOW_COPY_AND_ASSIGN(ErrorObjectList);
510 };
511
512
513 enum ArrayStorageAllocationMode { 480 enum ArrayStorageAllocationMode {
514 DONT_INITIALIZE_ARRAY_ELEMENTS, 481 DONT_INITIALIZE_ARRAY_ELEMENTS,
515 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE 482 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE
516 }; 483 };
517 484
518 class Heap { 485 class Heap {
519 public: 486 public:
520 // Configure heap size before setup. Return false if the heap has been 487 // Configure heap size before setup. Return false if the heap has been
521 // set up already. 488 // set up already.
522 bool ConfigureHeap(int max_semispace_size, 489 bool ConfigureHeap(int max_semispace_size,
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 void CollectAllAvailableGarbage(const char* gc_reason = NULL); 1247 void CollectAllAvailableGarbage(const char* gc_reason = NULL);
1281 1248
1282 // Check whether the heap is currently iterable. 1249 // Check whether the heap is currently iterable.
1283 bool IsHeapIterable(); 1250 bool IsHeapIterable();
1284 1251
1285 // Ensure that we have swept all spaces in such a way that we can iterate 1252 // Ensure that we have swept all spaces in such a way that we can iterate
1286 // over all objects. May cause a GC. 1253 // over all objects. May cause a GC.
1287 void EnsureHeapIsIterable(); 1254 void EnsureHeapIsIterable();
1288 1255
1289 // Notify the heap that a context has been disposed. 1256 // Notify the heap that a context has been disposed.
1290 int NotifyContextDisposed() { 1257 int NotifyContextDisposed();
1291 flush_monomorphic_ics_ = true;
1292 return ++contexts_disposed_;
1293 }
1294 1258
1295 // Utility to invoke the scavenger. This is needed in test code to 1259 // Utility to invoke the scavenger. This is needed in test code to
1296 // ensure correct callback for weak global handles. 1260 // ensure correct callback for weak global handles.
1297 void PerformScavenge(); 1261 void PerformScavenge();
1298 1262
1299 inline void increment_scan_on_scavenge_pages() { 1263 inline void increment_scan_on_scavenge_pages() {
1300 scan_on_scavenge_pages_++; 1264 scan_on_scavenge_pages_++;
1301 if (FLAG_gc_verbose) { 1265 if (FLAG_gc_verbose) {
1302 PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_); 1266 PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_);
1303 } 1267 }
(...skipping 22 matching lines...) Expand all
1326 void RemoveGCEpilogueCallback(GCEpilogueCallback callback); 1290 void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
1327 1291
1328 void SetGlobalGCPrologueCallback(GCCallback callback) { 1292 void SetGlobalGCPrologueCallback(GCCallback callback) {
1329 ASSERT((callback == NULL) ^ (global_gc_prologue_callback_ == NULL)); 1293 ASSERT((callback == NULL) ^ (global_gc_prologue_callback_ == NULL));
1330 global_gc_prologue_callback_ = callback; 1294 global_gc_prologue_callback_ = callback;
1331 } 1295 }
1332 void SetGlobalGCEpilogueCallback(GCCallback callback) { 1296 void SetGlobalGCEpilogueCallback(GCCallback callback) {
1333 ASSERT((callback == NULL) ^ (global_gc_epilogue_callback_ == NULL)); 1297 ASSERT((callback == NULL) ^ (global_gc_epilogue_callback_ == NULL));
1334 global_gc_epilogue_callback_ = callback; 1298 global_gc_epilogue_callback_ = callback;
1335 } 1299 }
1300 void SetI18nTemplateOne(ObjectTemplateInfo* tmpl) {
1301 set_i18n_template_one(tmpl);
1302 }
1303 void SetI18nTemplateTwo(ObjectTemplateInfo* tmpl) {
1304 set_i18n_template_two(tmpl);
1305 }
1336 1306
1337 // Heap root getters. We have versions with and without type::cast() here. 1307 // Heap root getters. We have versions with and without type::cast() here.
1338 // You can't use type::cast during GC because the assert fails. 1308 // You can't use type::cast during GC because the assert fails.
1339 // TODO(1490): Try removing the unchecked accessors, now that GC marking does 1309 // TODO(1490): Try removing the unchecked accessors, now that GC marking does
1340 // not corrupt the map. 1310 // not corrupt the map.
1341 #define ROOT_ACCESSOR(type, name, camel_name) \ 1311 #define ROOT_ACCESSOR(type, name, camel_name) \
1342 type* name() { \ 1312 type* name() { \
1343 return type::cast(roots_[k##camel_name##RootIndex]); \ 1313 return type::cast(roots_[k##camel_name##RootIndex]); \
1344 } \ 1314 } \
1345 type* raw_unchecked_##name() { \ 1315 type* raw_unchecked_##name() { \
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 void ProcessWeakReferences(WeakObjectRetainer* retainer); 1679 void ProcessWeakReferences(WeakObjectRetainer* retainer);
1710 1680
1711 void VisitExternalResources(v8::ExternalResourceVisitor* visitor); 1681 void VisitExternalResources(v8::ExternalResourceVisitor* visitor);
1712 1682
1713 // Helper function that governs the promotion policy from new space to 1683 // Helper function that governs the promotion policy from new space to
1714 // old. If the object's old address lies below the new space's age 1684 // old. If the object's old address lies below the new space's age
1715 // mark or if we've already filled the bottom 1/16th of the to space, 1685 // mark or if we've already filled the bottom 1/16th of the to space,
1716 // we try to promote this object. 1686 // we try to promote this object.
1717 inline bool ShouldBePromoted(Address old_address, int object_size); 1687 inline bool ShouldBePromoted(Address old_address, int object_size);
1718 1688
1719 int MaxObjectSizeInNewSpace() { return kMaxObjectSizeInNewSpace; }
1720
1721 void ClearJSFunctionResultCaches(); 1689 void ClearJSFunctionResultCaches();
1722 1690
1723 void ClearNormalizedMapCaches(); 1691 void ClearNormalizedMapCaches();
1724 1692
1725 GCTracer* tracer() { return tracer_; } 1693 GCTracer* tracer() { return tracer_; }
1726 1694
1727 // Returns the size of objects residing in non new spaces. 1695 // Returns the size of objects residing in non new spaces.
1728 intptr_t PromotedSpaceSizeOfObjects(); 1696 intptr_t PromotedSpaceSizeOfObjects();
1729 1697
1730 double total_regexp_code_generated() { return total_regexp_code_generated_; } 1698 double total_regexp_code_generated() { return total_regexp_code_generated_; }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 bool EnsureSweepersProgressed(int step_size) { 1759 bool EnsureSweepersProgressed(int step_size) {
1792 bool sweeping_complete = old_data_space()->EnsureSweeperProgress(step_size); 1760 bool sweeping_complete = old_data_space()->EnsureSweeperProgress(step_size);
1793 sweeping_complete &= old_pointer_space()->EnsureSweeperProgress(step_size); 1761 sweeping_complete &= old_pointer_space()->EnsureSweeperProgress(step_size);
1794 return sweeping_complete; 1762 return sweeping_complete;
1795 } 1763 }
1796 1764
1797 ExternalStringTable* external_string_table() { 1765 ExternalStringTable* external_string_table() {
1798 return &external_string_table_; 1766 return &external_string_table_;
1799 } 1767 }
1800 1768
1801 ErrorObjectList* error_object_list() {
1802 return &error_object_list_;
1803 }
1804
1805 // Returns the current sweep generation. 1769 // Returns the current sweep generation.
1806 int sweep_generation() { 1770 int sweep_generation() {
1807 return sweep_generation_; 1771 return sweep_generation_;
1808 } 1772 }
1809 1773
1810 inline Isolate* isolate(); 1774 inline Isolate* isolate();
1811 1775
1812 void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags); 1776 void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags);
1813 void CallGCEpilogueCallbacks(GCType gc_type); 1777 void CallGCEpilogueCallbacks(GCType gc_type);
1814 1778
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 1923
1960 // For keeping track of context disposals. 1924 // For keeping track of context disposals.
1961 int contexts_disposed_; 1925 int contexts_disposed_;
1962 1926
1963 int global_ic_age_; 1927 int global_ic_age_;
1964 1928
1965 bool flush_monomorphic_ics_; 1929 bool flush_monomorphic_ics_;
1966 1930
1967 int scan_on_scavenge_pages_; 1931 int scan_on_scavenge_pages_;
1968 1932
1969 #if V8_TARGET_ARCH_X64
1970 static const int kMaxObjectSizeInNewSpace = 1024*KB;
1971 #else
1972 static const int kMaxObjectSizeInNewSpace = 512*KB;
1973 #endif
1974
1975 NewSpace new_space_; 1933 NewSpace new_space_;
1976 OldSpace* old_pointer_space_; 1934 OldSpace* old_pointer_space_;
1977 OldSpace* old_data_space_; 1935 OldSpace* old_data_space_;
1978 OldSpace* code_space_; 1936 OldSpace* code_space_;
1979 MapSpace* map_space_; 1937 MapSpace* map_space_;
1980 CellSpace* cell_space_; 1938 CellSpace* cell_space_;
1981 PropertyCellSpace* property_cell_space_; 1939 PropertyCellSpace* property_cell_space_;
1982 LargeObjectSpace* lo_space_; 1940 LargeObjectSpace* lo_space_;
1983 HeapState gc_state_; 1941 HeapState gc_state_;
1984 int gc_post_processing_depth_; 1942 int gc_post_processing_depth_;
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 2357
2400 // Shared state read by the scavenge collector and set by ScavengeObject. 2358 // Shared state read by the scavenge collector and set by ScavengeObject.
2401 PromotionQueue promotion_queue_; 2359 PromotionQueue promotion_queue_;
2402 2360
2403 // Flag is set when the heap has been configured. The heap can be repeatedly 2361 // Flag is set when the heap has been configured. The heap can be repeatedly
2404 // configured through the API until it is set up. 2362 // configured through the API until it is set up.
2405 bool configured_; 2363 bool configured_;
2406 2364
2407 ExternalStringTable external_string_table_; 2365 ExternalStringTable external_string_table_;
2408 2366
2409 ErrorObjectList error_object_list_;
2410
2411 VisitorDispatchTable<ScavengingCallback> scavenging_visitors_table_; 2367 VisitorDispatchTable<ScavengingCallback> scavenging_visitors_table_;
2412 2368
2413 MemoryChunk* chunks_queued_for_free_; 2369 MemoryChunk* chunks_queued_for_free_;
2414 2370
2415 Mutex* relocation_mutex_; 2371 Mutex* relocation_mutex_;
2416 #ifdef DEBUG 2372 #ifdef DEBUG
2417 bool relocation_mutex_locked_by_optimizer_thread_; 2373 bool relocation_mutex_locked_by_optimizer_thread_;
2418 #endif // DEBUG; 2374 #endif // DEBUG;
2419 2375
2420 friend class Factory; 2376 friend class Factory;
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
3091 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 3047 DisallowHeapAllocation no_allocation; // i.e. no gc allowed.
3092 3048
3093 private: 3049 private:
3094 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 3050 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
3095 }; 3051 };
3096 #endif // DEBUG 3052 #endif // DEBUG
3097 3053
3098 } } // namespace v8::internal 3054 } } // namespace v8::internal
3099 3055
3100 #endif // V8_HEAP_H_ 3056 #endif // V8_HEAP_H_
OLDNEW
« no previous file with comments | « src/globals.h ('k') | src/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698