1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_ZONE_ZONE_SEGMENT_H_ 6 #define V8_ZONE_ZONE_SEGMENT_H_ 7 8 #include "src/v8.h" 9 10 // Segments represent chunks of memory: They have starting address 11 // (encoded in the this pointer) and a size in bytes. Segments are 12 // chained together forming a LIFO structure with the newest segment 13 // available as segment_head_. Segments are allocated using malloc() 14 // and de-allocated using free(). 15 namespace v8 { 16 namespace internal { 17 18 // Forward declaration 19 class Zone; 20 21 class Segment { 22 public: 23 void Initialize(size_t size) { size_ = size; } 24 25 Zone* zone() const { return zone_; } 26 void set_zone(Zone* const zone) { zone_ = zone; } 27 28 Segment* next() const { return next_; } 29 void set_next(Segment* const next) { next_ = next; } 30 31 size_t size() const { return size_; } 32 size_t capacity() const { return size_ - sizeof(Segment); } 33 34 Address start() const { return address(sizeof(Segment)); } 35 Address end() const { return address(size_); } 36 37 // Zap the contents of the segment (but not the header). 38 void ZapContents(); 39 // Zaps the header and makes the segment unusable this way. 40 void ZapHeader(); 41 42 private: 43 #ifdef DEBUG 44 // Constant byte value used for zapping dead memory in debug mode. 45 static const unsigned char kZapDeadByte = 0xcd; 46 #endif 47 48 // Computes the address of the nth byte in this segment. 49 Address address(size_t n) const { return Address(this) + n; } 50 51 Zone* zone_; 52 Segment* next_; 53 size_t size_; 54 }; 55 } // namespace internal 56 } // namespace v8 57 58 #endif // V8_ZONE_ZONE_SEGMENT_H_ 59