| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_ZONE_H_ | 5 #ifndef VM_ZONE_H_ |
| 6 #define VM_ZONE_H_ | 6 #define VM_ZONE_H_ |
| 7 | 7 |
| 8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
| 9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
| 10 #include "vm/handles.h" | 10 #include "vm/handles.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 class Segment; | 84 class Segment; |
| 85 | 85 |
| 86 // The current head segment; may be NULL. | 86 // The current head segment; may be NULL. |
| 87 Segment* head_; | 87 Segment* head_; |
| 88 | 88 |
| 89 // List of large segments allocated in this zone; may be NULL. | 89 // List of large segments allocated in this zone; may be NULL. |
| 90 Segment* large_segments_; | 90 Segment* large_segments_; |
| 91 | 91 |
| 92 friend class Zone; | 92 friend class Zone; |
| 93 friend class ApiZone; | 93 friend class ApiZone; |
| 94 template<typename T, typename B> friend class BaseGrowableArray; |
| 94 DISALLOW_COPY_AND_ASSIGN(BaseZone); | 95 DISALLOW_COPY_AND_ASSIGN(BaseZone); |
| 95 }; | 96 }; |
| 96 | 97 |
| 97 | 98 |
| 98 class Zone : public StackResource { | 99 class Zone : public StackResource { |
| 99 public: | 100 public: |
| 100 // Create an empty zone and set is at the current zone for the Isolate. | 101 // Create an empty zone and set is at the current zone for the Isolate. |
| 101 explicit Zone(Isolate* isolate); | 102 explicit Zone(Isolate* isolate); |
| 102 | 103 |
| 103 // Delete all memory associated with the zone. | 104 // Delete all memory associated with the zone. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 120 // Make a copy of the string in the zone allocated area. | 121 // Make a copy of the string in the zone allocated area. |
| 121 char* MakeCopyOfString(const char* str) { | 122 char* MakeCopyOfString(const char* str) { |
| 122 return zone_.MakeCopyOfString(str); | 123 return zone_.MakeCopyOfString(str); |
| 123 } | 124 } |
| 124 | 125 |
| 125 VMHandles* handles() { return &handles_; } | 126 VMHandles* handles() { return &handles_; } |
| 126 | 127 |
| 127 void VisitObjectPointers(ObjectPointerVisitor* visitor); | 128 void VisitObjectPointers(ObjectPointerVisitor* visitor); |
| 128 | 129 |
| 129 private: | 130 private: |
| 131 BaseZone* GetBaseZone() { return &zone_; } |
| 132 |
| 130 BaseZone zone_; | 133 BaseZone zone_; |
| 131 | 134 |
| 132 // Structure for managing handles allocation. | 135 // Structure for managing handles allocation. |
| 133 VMHandles handles_; | 136 VMHandles handles_; |
| 134 | 137 |
| 135 // Used for chaining zones in order to allow unwinding of stacks. | 138 // Used for chaining zones in order to allow unwinding of stacks. |
| 136 Zone* previous_; | 139 Zone* previous_; |
| 140 |
| 141 template<typename T> friend class GrowableArray; |
| 142 template<typename T> friend class ZoneGrowableArray; |
| 143 |
| 137 DISALLOW_IMPLICIT_CONSTRUCTORS(Zone); | 144 DISALLOW_IMPLICIT_CONSTRUCTORS(Zone); |
| 138 }; | 145 }; |
| 139 | 146 |
| 140 | 147 |
| 141 inline uword BaseZone::Allocate(intptr_t size) { | 148 inline uword BaseZone::Allocate(intptr_t size) { |
| 142 ASSERT(size >= 0); | 149 ASSERT(size >= 0); |
| 143 | 150 |
| 144 // Round up the requested size to fit the alignment. | 151 // Round up the requested size to fit the alignment. |
| 145 size = Utils::RoundUp(size, kAlignment); | 152 size = Utils::RoundUp(size, kAlignment); |
| 146 | 153 |
| 147 // Check if the requested size is available without expanding. | 154 // Check if the requested size is available without expanding. |
| 148 uword result; | 155 uword result; |
| 149 intptr_t free_size = (limit_ - position_); | 156 intptr_t free_size = (limit_ - position_); |
| 150 if (free_size >= size) { | 157 if (free_size >= size) { |
| 151 result = position_; | 158 result = position_; |
| 152 position_ += size; | 159 position_ += size; |
| 153 } else { | 160 } else { |
| 154 result = AllocateExpand(size); | 161 result = AllocateExpand(size); |
| 155 } | 162 } |
| 156 | 163 |
| 157 // Check that the result has the proper alignment and return it. | 164 // Check that the result has the proper alignment and return it. |
| 158 ASSERT(Utils::IsAligned(result, kAlignment)); | 165 ASSERT(Utils::IsAligned(result, kAlignment)); |
| 159 return result; | 166 return result; |
| 160 } | 167 } |
| 161 | 168 |
| 162 } // namespace dart | 169 } // namespace dart |
| 163 | 170 |
| 164 #endif // VM_ZONE_H_ | 171 #endif // VM_ZONE_H_ |
| OLD | NEW |