OLD | NEW |
1 // Copyright 2011 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 |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 // Identity used in error reporting. | 373 // Identity used in error reporting. |
374 AllocationSpace identity() { return id_; } | 374 AllocationSpace identity() { return id_; } |
375 | 375 |
376 // Returns allocated size. | 376 // Returns allocated size. |
377 virtual intptr_t Size() = 0; | 377 virtual intptr_t Size() = 0; |
378 | 378 |
379 // Returns size of objects. Can differ from the allocated size | 379 // Returns size of objects. Can differ from the allocated size |
380 // (e.g. see LargeObjectSpace). | 380 // (e.g. see LargeObjectSpace). |
381 virtual intptr_t SizeOfObjects() { return Size(); } | 381 virtual intptr_t SizeOfObjects() { return Size(); } |
382 | 382 |
383 #ifdef ENABLE_HEAP_PROTECTION | |
384 // Protect/unprotect the space by marking it read-only/writable. | |
385 virtual void Protect() = 0; | |
386 virtual void Unprotect() = 0; | |
387 #endif | |
388 | |
389 #ifdef DEBUG | 383 #ifdef DEBUG |
390 virtual void Print() = 0; | 384 virtual void Print() = 0; |
391 #endif | 385 #endif |
392 | 386 |
393 // After calling this we can allocate a certain number of bytes using only | 387 // After calling this we can allocate a certain number of bytes using only |
394 // linear allocation (with a LinearAllocationScope and an AlwaysAllocateScope) | 388 // linear allocation (with a LinearAllocationScope and an AlwaysAllocateScope) |
395 // without using freelists or causing a GC. This is used by partial | 389 // without using freelists or causing a GC. This is used by partial |
396 // snapshots. It returns true of space was reserved or false if a GC is | 390 // snapshots. It returns true of space was reserved or false if a GC is |
397 // needed. For paged spaces the space requested must include the space wasted | 391 // needed. For paged spaces the space requested must include the space wasted |
398 // at the end of each when allocating linearly. | 392 // at the end of each when allocating linearly. |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 | 628 |
635 // Relinks list of pages owned by space to make it chunk-ordered. | 629 // Relinks list of pages owned by space to make it chunk-ordered. |
636 // Returns new first and last pages of space. | 630 // Returns new first and last pages of space. |
637 // Also returns last page in relinked list which has WasInUsedBeforeMC | 631 // Also returns last page in relinked list which has WasInUsedBeforeMC |
638 // flag set. | 632 // flag set. |
639 void RelinkPageListInChunkOrder(PagedSpace* space, | 633 void RelinkPageListInChunkOrder(PagedSpace* space, |
640 Page** first_page, | 634 Page** first_page, |
641 Page** last_page, | 635 Page** last_page, |
642 Page** last_page_in_use); | 636 Page** last_page_in_use); |
643 | 637 |
644 #ifdef ENABLE_HEAP_PROTECTION | |
645 // Protect/unprotect a block of memory by marking it read-only/writable. | |
646 inline void Protect(Address start, size_t size); | |
647 inline void Unprotect(Address start, size_t size, | |
648 Executability executable); | |
649 | |
650 // Protect/unprotect a chunk given a page in the chunk. | |
651 inline void ProtectChunkFromPage(Page* page); | |
652 inline void UnprotectChunkFromPage(Page* page); | |
653 #endif | |
654 | |
655 #ifdef DEBUG | 638 #ifdef DEBUG |
656 // Reports statistic info of the space. | 639 // Reports statistic info of the space. |
657 void ReportStatistics(); | 640 void ReportStatistics(); |
658 #endif | 641 #endif |
659 | 642 |
660 // Due to encoding limitation, we can only have 8K chunks. | 643 // Due to encoding limitation, we can only have 8K chunks. |
661 static const int kMaxNofChunks = 1 << kPageSizeBits; | 644 static const int kMaxNofChunks = 1 << kPageSizeBits; |
662 // If a chunk has at least 16 pages, the maximum heap size is about | 645 // If a chunk has at least 16 pages, the maximum heap size is about |
663 // 8K * 8K * 16 = 1G bytes. | 646 // 8K * 8K * 16 = 1G bytes. |
664 #ifdef V8_TARGET_ARCH_X64 | 647 #ifdef V8_TARGET_ARCH_X64 |
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 // Updates the allocation pointer to the relocation top after a mark-compact | 1133 // Updates the allocation pointer to the relocation top after a mark-compact |
1151 // collection. | 1134 // collection. |
1152 virtual void MCCommitRelocationInfo() = 0; | 1135 virtual void MCCommitRelocationInfo() = 0; |
1153 | 1136 |
1154 // Releases half of unused pages. | 1137 // Releases half of unused pages. |
1155 void Shrink(); | 1138 void Shrink(); |
1156 | 1139 |
1157 // Ensures that the capacity is at least 'capacity'. Returns false on failure. | 1140 // Ensures that the capacity is at least 'capacity'. Returns false on failure. |
1158 bool EnsureCapacity(int capacity); | 1141 bool EnsureCapacity(int capacity); |
1159 | 1142 |
1160 #ifdef ENABLE_HEAP_PROTECTION | |
1161 // Protect/unprotect the space by marking it read-only/writable. | |
1162 void Protect(); | |
1163 void Unprotect(); | |
1164 #endif | |
1165 | |
1166 #ifdef DEBUG | 1143 #ifdef DEBUG |
1167 // Print meta info and objects in this space. | 1144 // Print meta info and objects in this space. |
1168 virtual void Print(); | 1145 virtual void Print(); |
1169 | 1146 |
1170 // Verify integrity of this space. | 1147 // Verify integrity of this space. |
1171 virtual void Verify(ObjectVisitor* visitor); | 1148 virtual void Verify(ObjectVisitor* visitor); |
1172 | 1149 |
1173 // Overridden by subclasses to verify space-specific object | 1150 // Overridden by subclasses to verify space-specific object |
1174 // properties (e.g., only maps or free-list nodes are in map space). | 1151 // properties (e.g., only maps or free-list nodes are in map space). |
1175 virtual void VerifyObject(HeapObject* obj) {} | 1152 virtual void VerifyObject(HeapObject* obj) {} |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 | 1362 |
1386 virtual bool ReserveSpace(int bytes) { | 1363 virtual bool ReserveSpace(int bytes) { |
1387 UNREACHABLE(); | 1364 UNREACHABLE(); |
1388 return false; | 1365 return false; |
1389 } | 1366 } |
1390 | 1367 |
1391 bool is_committed() { return committed_; } | 1368 bool is_committed() { return committed_; } |
1392 bool Commit(); | 1369 bool Commit(); |
1393 bool Uncommit(); | 1370 bool Uncommit(); |
1394 | 1371 |
1395 #ifdef ENABLE_HEAP_PROTECTION | |
1396 // Protect/unprotect the space by marking it read-only/writable. | |
1397 virtual void Protect() {} | |
1398 virtual void Unprotect() {} | |
1399 #endif | |
1400 | |
1401 #ifdef DEBUG | 1372 #ifdef DEBUG |
1402 virtual void Print(); | 1373 virtual void Print(); |
1403 virtual void Verify(); | 1374 virtual void Verify(); |
1404 #endif | 1375 #endif |
1405 | 1376 |
1406 // Returns the current capacity of the semi space. | 1377 // Returns the current capacity of the semi space. |
1407 int Capacity() { return capacity_; } | 1378 int Capacity() { return capacity_; } |
1408 | 1379 |
1409 // Returns the maximum capacity of the semi space. | 1380 // Returns the maximum capacity of the semi space. |
1410 int MaximumCapacity() { return maximum_capacity_; } | 1381 int MaximumCapacity() { return maximum_capacity_; } |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 bool ToSpaceContains(Address a) { return to_space_.Contains(a); } | 1592 bool ToSpaceContains(Address a) { return to_space_.Contains(a); } |
1622 bool FromSpaceContains(Address a) { return from_space_.Contains(a); } | 1593 bool FromSpaceContains(Address a) { return from_space_.Contains(a); } |
1623 | 1594 |
1624 virtual bool ReserveSpace(int bytes); | 1595 virtual bool ReserveSpace(int bytes); |
1625 | 1596 |
1626 // Resizes a sequential string which must be the most recent thing that was | 1597 // Resizes a sequential string which must be the most recent thing that was |
1627 // allocated in new space. | 1598 // allocated in new space. |
1628 template <typename StringType> | 1599 template <typename StringType> |
1629 inline void ShrinkStringAtAllocationBoundary(String* string, int len); | 1600 inline void ShrinkStringAtAllocationBoundary(String* string, int len); |
1630 | 1601 |
1631 #ifdef ENABLE_HEAP_PROTECTION | |
1632 // Protect/unprotect the space by marking it read-only/writable. | |
1633 virtual void Protect(); | |
1634 virtual void Unprotect(); | |
1635 #endif | |
1636 | |
1637 #ifdef DEBUG | 1602 #ifdef DEBUG |
1638 // Verify the active semispace. | 1603 // Verify the active semispace. |
1639 virtual void Verify(); | 1604 virtual void Verify(); |
1640 // Print the active semispace. | 1605 // Print the active semispace. |
1641 virtual void Print() { to_space_.Print(); } | 1606 virtual void Print() { to_space_.Print(); } |
1642 #endif | 1607 #endif |
1643 | 1608 |
1644 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) | 1609 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) |
1645 // Iterates the active semispace to collect statistics. | 1610 // Iterates the active semispace to collect statistics. |
1646 void CollectStatistics(); | 1611 void CollectStatistics(); |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2289 bool Contains(HeapObject* obj); | 2254 bool Contains(HeapObject* obj); |
2290 | 2255 |
2291 // Checks whether the space is empty. | 2256 // Checks whether the space is empty. |
2292 bool IsEmpty() { return first_chunk_ == NULL; } | 2257 bool IsEmpty() { return first_chunk_ == NULL; } |
2293 | 2258 |
2294 // See the comments for ReserveSpace in the Space class. This has to be | 2259 // See the comments for ReserveSpace in the Space class. This has to be |
2295 // called after ReserveSpace has been called on the paged spaces, since they | 2260 // called after ReserveSpace has been called on the paged spaces, since they |
2296 // may use some memory, leaving less for large objects. | 2261 // may use some memory, leaving less for large objects. |
2297 virtual bool ReserveSpace(int bytes); | 2262 virtual bool ReserveSpace(int bytes); |
2298 | 2263 |
2299 #ifdef ENABLE_HEAP_PROTECTION | |
2300 // Protect/unprotect the space by marking it read-only/writable. | |
2301 void Protect(); | |
2302 void Unprotect(); | |
2303 #endif | |
2304 | |
2305 #ifdef DEBUG | 2264 #ifdef DEBUG |
2306 virtual void Verify(); | 2265 virtual void Verify(); |
2307 virtual void Print(); | 2266 virtual void Print(); |
2308 void ReportStatistics(); | 2267 void ReportStatistics(); |
2309 void CollectCodeStatistics(); | 2268 void CollectCodeStatistics(); |
2310 #endif | 2269 #endif |
2311 // Checks whether an address is in the object area in this space. It | 2270 // Checks whether an address is in the object area in this space. It |
2312 // iterates all objects in the space. May be slow. | 2271 // iterates all objects in the space. May be slow. |
2313 bool SlowContains(Address addr) { return !FindObject(addr)->IsFailure(); } | 2272 bool SlowContains(Address addr) { return !FindObject(addr)->IsFailure(); } |
2314 | 2273 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 } | 2319 } |
2361 // Must be small, since an iteration is used for lookup. | 2320 // Must be small, since an iteration is used for lookup. |
2362 static const int kMaxComments = 64; | 2321 static const int kMaxComments = 64; |
2363 }; | 2322 }; |
2364 #endif | 2323 #endif |
2365 | 2324 |
2366 | 2325 |
2367 } } // namespace v8::internal | 2326 } } // namespace v8::internal |
2368 | 2327 |
2369 #endif // V8_SPACES_H_ | 2328 #endif // V8_SPACES_H_ |
OLD | NEW |