| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_ZONE_ZONE_SEGMENT_H_ |
| #define V8_ZONE_ZONE_SEGMENT_H_ |
| |
| #include "src/v8.h" |
| |
| // Segments represent chunks of memory: They have starting address |
| // (encoded in the this pointer) and a size in bytes. Segments are |
| // chained together forming a LIFO structure with the newest segment |
| // available as segment_head_. Segments are allocated using malloc() |
| // and de-allocated using free(). |
| namespace v8 { |
| namespace internal { |
| |
| // Forward declaration |
| class Zone; |
| |
| class Segment { |
| public: |
| void Initialize(size_t size) { size_ = size; } |
| |
| Zone* zone() const { return zone_; } |
| void set_zone(Zone* const zone) { zone_ = zone; } |
| |
| Segment* next() const { return next_; } |
| void set_next(Segment* const next) { next_ = next; } |
| |
| size_t size() const { return size_; } |
| size_t capacity() const { return size_ - sizeof(Segment); } |
| |
| Address start() const { return address(sizeof(Segment)); } |
| Address end() const { return address(size_); } |
| |
| // Zap the contents of the segment (but not the header). |
| void ZapContents(); |
| // Zaps the header and makes the segment unusable this way. |
| void ZapHeader(); |
| |
| private: |
| #ifdef DEBUG |
| // Constant byte value used for zapping dead memory in debug mode. |
| static const unsigned char kZapDeadByte = 0xcd; |
| #endif |
| |
| // Computes the address of the nth byte in this segment. |
| Address address(size_t n) const { return Address(this) + n; } |
| |
| Zone* zone_; |
| Segment* next_; |
| size_t size_; |
| }; |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_ZONE_ZONE_SEGMENT_H_ |