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

Side by Side Diff: src/heap/spaces.h

Issue 1924223002: Provide tagged allocation top pointer (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_HEAP_SPACES_H_ 5 #ifndef V8_HEAP_SPACES_H_
6 #define V8_HEAP_SPACES_H_ 6 #define V8_HEAP_SPACES_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/atomic-utils.h" 9 #include "src/atomic-utils.h"
10 #include "src/base/atomicops.h" 10 #include "src/base/atomicops.h"
(...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 1562
1563 1563
1564 // ----------------------------------------------------------------------------- 1564 // -----------------------------------------------------------------------------
1565 // A space has a circular list of pages. The next page can be accessed via 1565 // A space has a circular list of pages. The next page can be accessed via
1566 // Page::next_page() call. 1566 // Page::next_page() call.
1567 1567
1568 // An abstraction of allocation and relocation pointers in a page-structured 1568 // An abstraction of allocation and relocation pointers in a page-structured
1569 // space. 1569 // space.
1570 class AllocationInfo { 1570 class AllocationInfo {
1571 public: 1571 public:
1572 AllocationInfo() : top_(nullptr), limit_(nullptr) {} 1572 AllocationInfo() { Reset(nullptr, nullptr); }
1573 AllocationInfo(Address top, Address limit) : top_(top), limit_(limit) {} 1573 AllocationInfo(Address top, Address limit) { Reset(top, limit); }
1574 1574
1575 void Reset(Address top, Address limit) { 1575 void Reset(Address top, Address limit) {
1576 set_top(top); 1576 set_top(top);
1577 set_limit(limit); 1577 set_limit(limit);
1578 } 1578 }
1579 1579
1580 INLINE(void set_top(Address top)) { 1580 inline void set_top(Address top) {
1581 SLOW_DCHECK(top == NULL || 1581 SLOW_DCHECK((reinterpret_cast<intptr_t>(top) & kHeapObjectTagMask) == 0);
1582 (reinterpret_cast<intptr_t>(top) & kHeapObjectTagMask) == 0); 1582 top_ = reinterpret_cast<intptr_t>(top) + kHeapObjectTag;
1583 top_ = top;
1584 } 1583 }
1585 1584
1586 INLINE(Address top()) const { 1585 inline Address top() const {
1587 SLOW_DCHECK(top_ == NULL || 1586 SLOW_DCHECK((reinterpret_cast<intptr_t>(top_) & kHeapObjectTagMask) ==
1588 (reinterpret_cast<intptr_t>(top_) & kHeapObjectTagMask) == 0); 1587 kHeapObjectTag);
1589 return top_; 1588 return reinterpret_cast<Address>(top_ - kHeapObjectTag);
1590 } 1589 }
1591 1590
1592 Address* top_address() { return &top_; } 1591 Address* top_address() { return reinterpret_cast<Address*>(&top_); }
1593 1592
1594 INLINE(void set_limit(Address limit)) { 1593 inline void set_limit(Address limit) {
1595 limit_ = limit; 1594 limit_ = reinterpret_cast<intptr_t>(limit);
1596 } 1595 }
1597 1596
1598 INLINE(Address limit()) const { 1597 inline Address limit() const { return reinterpret_cast<Address>(limit_); }
1599 return limit_;
1600 }
1601 1598
1602 Address* limit_address() { return &limit_; } 1599 Address* limit_address() { return reinterpret_cast<Address*>(&limit_); }
1603
1604 #ifdef DEBUG
1605 bool VerifyPagedAllocation() {
1606 return (Page::FromAllocationAreaAddress(top_) ==
1607 Page::FromAllocationAreaAddress(limit_)) &&
1608 (top_ <= limit_);
1609 }
1610 #endif
1611 1600
1612 private: 1601 private:
1613 // Current allocation top. 1602 // Current tagged allocation top.
1614 Address top_; 1603 intptr_t top_;
Michael Lippautz 2016/04/28 16:58:08 Pointer arithmetic out of object bounds is undefin
Hannes Payer (out of office) 2016/04/29 14:13:31 Oh boy!
1615 // Current allocation limit. 1604 // Current allocation limit.
1616 Address limit_; 1605 intptr_t limit_;
1617 }; 1606 };
1618 1607
1619 1608
1620 // An abstraction of the accounting statistics of a page-structured space. 1609 // An abstraction of the accounting statistics of a page-structured space.
1621 // 1610 //
1622 // The stats are only set by functions that ensure they stay balanced. These 1611 // The stats are only set by functions that ensure they stay balanced. These
1623 // functions increase or decrease one of the non-capacity stats in conjunction 1612 // functions increase or decrease one of the non-capacity stats in conjunction
1624 // with capacity, or else they always balance increases and decreases to the 1613 // with capacity, or else they always balance increases and decreases to the
1625 // non-capacity stats. 1614 // non-capacity stats.
1626 class AllocationStats BASE_EMBEDDED { 1615 class AllocationStats BASE_EMBEDDED {
(...skipping 1411 matching lines...) Expand 10 before | Expand all | Expand 10 after
3038 count = 0; 3027 count = 0;
3039 } 3028 }
3040 // Must be small, since an iteration is used for lookup. 3029 // Must be small, since an iteration is used for lookup.
3041 static const int kMaxComments = 64; 3030 static const int kMaxComments = 64;
3042 }; 3031 };
3043 #endif 3032 #endif
3044 } // namespace internal 3033 } // namespace internal
3045 } // namespace v8 3034 } // namespace v8
3046 3035
3047 #endif // V8_HEAP_SPACES_H_ 3036 #endif // V8_HEAP_SPACES_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698