blob: ca1177f33cd93ba97f535d5d79c88b4593bbea05 [file] [log] [blame]
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001// Copyright 2006-2010 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_SPACES_INL_H_
29#define V8_SPACES_INL_H_
30
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000031#include "isolate.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000032#include "spaces.h"
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000033#include "v8memory.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000034
kasperl@chromium.org71affb52009-05-26 05:44:31 +000035namespace v8 {
36namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000037
38
39// -----------------------------------------------------------------------------
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000040// PageIterator
41
42bool PageIterator::has_next() {
kasperl@chromium.orgb3284ad2009-05-18 06:12:45 +000043 return prev_page_ != stop_page_;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000044}
45
46
47Page* PageIterator::next() {
48 ASSERT(has_next());
kasperl@chromium.orgb3284ad2009-05-18 06:12:45 +000049 prev_page_ = (prev_page_ == NULL)
50 ? space_->first_page_
51 : prev_page_->next_page();
52 return prev_page_;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000053}
54
55
56// -----------------------------------------------------------------------------
57// Page
58
59Page* Page::next_page() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000060 return heap_->isolate()->memory_allocator()->GetNextPage(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000061}
62
63
64Address Page::AllocationTop() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000065 PagedSpace* owner = heap_->isolate()->memory_allocator()->PageOwner(this);
ager@chromium.org9258b6b2008-09-11 09:11:10 +000066 return owner->PageAllocationTop(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000067}
68
69
ricow@chromium.org30ce4112010-05-31 10:38:25 +000070Address Page::AllocationWatermark() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000071 PagedSpace* owner = heap_->isolate()->memory_allocator()->PageOwner(this);
ricow@chromium.org30ce4112010-05-31 10:38:25 +000072 if (this == owner->AllocationTopPage()) {
73 return owner->top();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000074 }
ricow@chromium.org30ce4112010-05-31 10:38:25 +000075 return address() + AllocationWatermarkOffset();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000076}
77
78
ricow@chromium.org30ce4112010-05-31 10:38:25 +000079uint32_t Page::AllocationWatermarkOffset() {
80 return static_cast<uint32_t>((flags_ & kAllocationWatermarkOffsetMask) >>
81 kAllocationWatermarkOffsetShift);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000082}
83
84
ricow@chromium.org30ce4112010-05-31 10:38:25 +000085void Page::SetAllocationWatermark(Address allocation_watermark) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000086 if ((heap_->gc_state() == Heap::SCAVENGE) && IsWatermarkValid()) {
ricow@chromium.org30ce4112010-05-31 10:38:25 +000087 // When iterating intergenerational references during scavenge
88 // we might decide to promote an encountered young object.
89 // We will allocate a space for such an object and put it
90 // into the promotion queue to process it later.
91 // If space for object was allocated somewhere beyond allocation
92 // watermark this might cause garbage pointers to appear under allocation
93 // watermark. To avoid visiting them during dirty regions iteration
94 // which might be still in progress we store a valid allocation watermark
95 // value and mark this page as having an invalid watermark.
96 SetCachedAllocationWatermark(AllocationWatermark());
97 InvalidateWatermark(true);
98 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000099
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000100 flags_ = (flags_ & kFlagsMask) |
101 Offset(allocation_watermark) << kAllocationWatermarkOffsetShift;
102 ASSERT(AllocationWatermarkOffset()
103 == static_cast<uint32_t>(Offset(allocation_watermark)));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000104}
105
106
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000107void Page::SetCachedAllocationWatermark(Address allocation_watermark) {
108 mc_first_forwarded = allocation_watermark;
109}
110
111
112Address Page::CachedAllocationWatermark() {
113 return mc_first_forwarded;
114}
115
116
117uint32_t Page::GetRegionMarks() {
118 return dirty_regions_;
119}
120
121
122void Page::SetRegionMarks(uint32_t marks) {
123 dirty_regions_ = marks;
124}
125
126
127int Page::GetRegionNumberForAddress(Address addr) {
128 // Each page is divided into 256 byte regions. Each region has a corresponding
129 // dirty mark bit in the page header. Region can contain intergenerational
130 // references iff its dirty mark is set.
131 // A normal 8K page contains exactly 32 regions so all region marks fit
132 // into 32-bit integer field. To calculate a region number we just divide
133 // offset inside page by region size.
134 // A large page can contain more then 32 regions. But we want to avoid
135 // additional write barrier code for distinguishing between large and normal
136 // pages so we just ignore the fact that addr points into a large page and
137 // calculate region number as if addr pointed into a normal 8K page. This way
138 // we get a region number modulo 32 so for large pages several regions might
139 // be mapped to a single dirty mark.
140 ASSERT_PAGE_ALIGNED(this->address());
141 STATIC_ASSERT((kPageAlignmentMask >> kRegionSizeLog2) < kBitsPerInt);
142
143 // We are using masking with kPageAlignmentMask instead of Page::Offset()
144 // to get an offset to the beginning of 8K page containing addr not to the
145 // beginning of actual page which can be bigger then 8K.
146 intptr_t offset_inside_normal_page = OffsetFrom(addr) & kPageAlignmentMask;
147 return static_cast<int>(offset_inside_normal_page >> kRegionSizeLog2);
148}
149
150
151uint32_t Page::GetRegionMaskForAddress(Address addr) {
152 return 1 << GetRegionNumberForAddress(addr);
153}
154
155
ager@chromium.org2cc82ae2010-06-14 07:35:38 +0000156uint32_t Page::GetRegionMaskForSpan(Address start, int length_in_bytes) {
157 uint32_t result = 0;
158 if (length_in_bytes >= kPageSize) {
159 result = kAllRegionsDirtyMarks;
160 } else if (length_in_bytes > 0) {
161 int start_region = GetRegionNumberForAddress(start);
162 int end_region =
163 GetRegionNumberForAddress(start + length_in_bytes - kPointerSize);
164 uint32_t start_mask = (~0) << start_region;
165 uint32_t end_mask = ~((~1) << end_region);
166 result = start_mask & end_mask;
167 // if end_region < start_region, the mask is ored.
168 if (result == 0) result = start_mask | end_mask;
169 }
170#ifdef DEBUG
171 if (FLAG_enable_slow_asserts) {
172 uint32_t expected = 0;
173 for (Address a = start; a < start + length_in_bytes; a += kPointerSize) {
174 expected |= GetRegionMaskForAddress(a);
175 }
176 ASSERT(expected == result);
177 }
178#endif
179 return result;
180}
181
182
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000183void Page::MarkRegionDirty(Address address) {
184 SetRegionMarks(GetRegionMarks() | GetRegionMaskForAddress(address));
185}
186
187
188bool Page::IsRegionDirty(Address address) {
189 return GetRegionMarks() & GetRegionMaskForAddress(address);
190}
191
192
193void Page::ClearRegionMarks(Address start, Address end, bool reaches_limit) {
194 int rstart = GetRegionNumberForAddress(start);
195 int rend = GetRegionNumberForAddress(end);
196
197 if (reaches_limit) {
198 end += 1;
199 }
200
201 if ((rend - rstart) == 0) {
202 return;
203 }
204
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000205 uint32_t bitmask = 0;
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000206
207 if ((OffsetFrom(start) & kRegionAlignmentMask) == 0
208 || (start == ObjectAreaStart())) {
209 // First region is fully covered
210 bitmask = 1 << rstart;
211 }
212
213 while (++rstart < rend) {
214 bitmask |= 1 << rstart;
215 }
216
217 if (bitmask) {
218 SetRegionMarks(GetRegionMarks() & ~bitmask);
219 }
220}
221
222
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000223void Page::FlipMeaningOfInvalidatedWatermarkFlag(Heap* heap) {
224 heap->page_watermark_invalidated_mark_ ^= 1 << WATERMARK_INVALIDATED;
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000225}
226
227
228bool Page::IsWatermarkValid() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000229 return (flags_ & (1 << WATERMARK_INVALIDATED)) !=
230 heap_->page_watermark_invalidated_mark_;
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000231}
232
233
234void Page::InvalidateWatermark(bool value) {
235 if (value) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000236 flags_ = (flags_ & ~(1 << WATERMARK_INVALIDATED)) |
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000237 heap_->page_watermark_invalidated_mark_;
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000238 } else {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000239 flags_ =
240 (flags_ & ~(1 << WATERMARK_INVALIDATED)) |
241 (heap_->page_watermark_invalidated_mark_ ^
242 (1 << WATERMARK_INVALIDATED));
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000243 }
244
245 ASSERT(IsWatermarkValid() == !value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000246}
247
248
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000249bool Page::GetPageFlag(PageFlag flag) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000250 return (flags_ & static_cast<intptr_t>(1 << flag)) != 0;
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000251}
252
253
254void Page::SetPageFlag(PageFlag flag, bool value) {
255 if (value) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000256 flags_ |= static_cast<intptr_t>(1 << flag);
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000257 } else {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000258 flags_ &= ~static_cast<intptr_t>(1 << flag);
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000259 }
260}
261
262
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000263void Page::ClearPageFlags() {
264 flags_ = 0;
265}
266
267
268void Page::ClearGCFields() {
269 InvalidateWatermark(true);
270 SetAllocationWatermark(ObjectAreaStart());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000271 if (heap_->gc_state() == Heap::SCAVENGE) {
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000272 SetCachedAllocationWatermark(ObjectAreaStart());
273 }
274 SetRegionMarks(kAllRegionsCleanMarks);
275}
276
277
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000278bool Page::WasInUseBeforeMC() {
279 return GetPageFlag(WAS_IN_USE_BEFORE_MC);
280}
281
282
283void Page::SetWasInUseBeforeMC(bool was_in_use) {
284 SetPageFlag(WAS_IN_USE_BEFORE_MC, was_in_use);
285}
286
287
288bool Page::IsLargeObjectPage() {
289 return !GetPageFlag(IS_NORMAL_PAGE);
290}
291
292
293void Page::SetIsLargeObjectPage(bool is_large_object_page) {
294 SetPageFlag(IS_NORMAL_PAGE, !is_large_object_page);
295}
296
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000297bool Page::IsPageExecutable() {
298 return GetPageFlag(IS_EXECUTABLE);
299}
300
301
302void Page::SetIsPageExecutable(bool is_page_executable) {
303 SetPageFlag(IS_EXECUTABLE, is_page_executable);
304}
305
fschneider@chromium.org013f3e12010-04-26 13:27:52 +0000306
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000307// -----------------------------------------------------------------------------
308// MemoryAllocator
309
kmillikin@chromium.org3cdd9e12010-09-06 11:39:48 +0000310void MemoryAllocator::ChunkInfo::init(Address a, size_t s, PagedSpace* o) {
311 address_ = a;
312 size_ = s;
313 owner_ = o;
314 executable_ = (o == NULL) ? NOT_EXECUTABLE : o->executable();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000315 owner_identity_ = (o == NULL) ? FIRST_SPACE : o->identity();
kmillikin@chromium.org3cdd9e12010-09-06 11:39:48 +0000316}
317
318
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000319bool MemoryAllocator::IsValidChunk(int chunk_id) {
320 if (!IsValidChunkId(chunk_id)) return false;
321
322 ChunkInfo& c = chunks_[chunk_id];
323 return (c.address() != NULL) && (c.size() != 0) && (c.owner() != NULL);
324}
325
326
327bool MemoryAllocator::IsValidChunkId(int chunk_id) {
328 return (0 <= chunk_id) && (chunk_id < max_nof_chunks_);
329}
330
331
332bool MemoryAllocator::IsPageInSpace(Page* p, PagedSpace* space) {
333 ASSERT(p->is_valid());
334
335 int chunk_id = GetChunkId(p);
336 if (!IsValidChunkId(chunk_id)) return false;
337
338 ChunkInfo& c = chunks_[chunk_id];
339 return (c.address() <= p->address()) &&
340 (p->address() < c.address() + c.size()) &&
341 (space == c.owner());
342}
343
344
345Page* MemoryAllocator::GetNextPage(Page* p) {
346 ASSERT(p->is_valid());
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000347 intptr_t raw_addr = p->opaque_header & ~Page::kPageAlignmentMask;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000348 return Page::FromAddress(AddressFrom<Address>(raw_addr));
349}
350
351
352int MemoryAllocator::GetChunkId(Page* p) {
353 ASSERT(p->is_valid());
fschneider@chromium.orgb95b98b2010-02-23 10:34:29 +0000354 return static_cast<int>(p->opaque_header & Page::kPageAlignmentMask);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000355}
356
357
358void MemoryAllocator::SetNextPage(Page* prev, Page* next) {
359 ASSERT(prev->is_valid());
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000360 int chunk_id = GetChunkId(prev);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000361 ASSERT_PAGE_ALIGNED(next->address());
362 prev->opaque_header = OffsetFrom(next->address()) | chunk_id;
363}
364
365
366PagedSpace* MemoryAllocator::PageOwner(Page* page) {
367 int chunk_id = GetChunkId(page);
368 ASSERT(IsValidChunk(chunk_id));
369 return chunks_[chunk_id].owner();
370}
371
372
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000373bool MemoryAllocator::InInitialChunk(Address address) {
374 if (initial_chunk_ == NULL) return false;
375
376 Address start = static_cast<Address>(initial_chunk_->address());
377 return (start <= address) && (address < start + initial_chunk_->size());
378}
379
380
kasper.lund7276f142008-07-30 08:49:36 +0000381// --------------------------------------------------------------------------
382// PagedSpace
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000383
384bool PagedSpace::Contains(Address addr) {
385 Page* p = Page::FromAddress(addr);
whesse@chromium.org4a5224e2010-10-20 12:37:07 +0000386 if (!p->is_valid()) return false;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000387 return heap()->isolate()->memory_allocator()->IsPageInSpace(p, this);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000388}
389
390
kasper.lund7276f142008-07-30 08:49:36 +0000391// Try linear allocation in the page of alloc_info's allocation top. Does
392// not contain slow case logic (eg, move to the next page or try free list
393// allocation) so it can be used by all the allocation functions and for all
394// the paged spaces.
395HeapObject* PagedSpace::AllocateLinearly(AllocationInfo* alloc_info,
396 int size_in_bytes) {
397 Address current_top = alloc_info->top;
398 Address new_top = current_top + size_in_bytes;
399 if (new_top > alloc_info->limit) return NULL;
400
401 alloc_info->top = new_top;
402 ASSERT(alloc_info->VerifyPagedAllocation());
403 accounting_stats_.AllocateBytes(size_in_bytes);
404 return HeapObject::FromAddress(current_top);
405}
406
407
408// Raw allocation.
lrn@chromium.org303ada72010-10-27 09:33:13 +0000409MaybeObject* PagedSpace::AllocateRaw(int size_in_bytes) {
kasper.lund7276f142008-07-30 08:49:36 +0000410 ASSERT(HasBeenSetup());
411 ASSERT_OBJECT_SIZE(size_in_bytes);
412 HeapObject* object = AllocateLinearly(&allocation_info_, size_in_bytes);
413 if (object != NULL) return object;
414
415 object = SlowAllocateRaw(size_in_bytes);
416 if (object != NULL) return object;
417
whesse@chromium.org4a5224e2010-10-20 12:37:07 +0000418 return Failure::RetryAfterGC(identity());
kasper.lund7276f142008-07-30 08:49:36 +0000419}
420
421
422// Reallocating (and promoting) objects during a compacting collection.
lrn@chromium.org303ada72010-10-27 09:33:13 +0000423MaybeObject* PagedSpace::MCAllocateRaw(int size_in_bytes) {
kasper.lund7276f142008-07-30 08:49:36 +0000424 ASSERT(HasBeenSetup());
425 ASSERT_OBJECT_SIZE(size_in_bytes);
426 HeapObject* object = AllocateLinearly(&mc_forwarding_info_, size_in_bytes);
427 if (object != NULL) return object;
428
429 object = SlowMCAllocateRaw(size_in_bytes);
430 if (object != NULL) return object;
431
whesse@chromium.org4a5224e2010-10-20 12:37:07 +0000432 return Failure::RetryAfterGC(identity());
kasper.lund7276f142008-07-30 08:49:36 +0000433}
434
435
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000436// -----------------------------------------------------------------------------
437// LargeObjectChunk
438
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000439Address LargeObjectChunk::GetStartAddress() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000440 // Round the chunk address up to the nearest page-aligned address
441 // and return the heap object in that page.
442 Page* page = Page::FromAddress(RoundUp(address(), Page::kPageSize));
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000443 return page->ObjectAreaStart();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000444}
445
446
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000447void LargeObjectChunk::Free(Executability executable) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000448 Isolate* isolate =
449 Page::FromAddress(RoundUp(address(), Page::kPageSize))->heap_->isolate();
450 isolate->memory_allocator()->FreeRawMemory(address(), size(), executable);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000451}
452
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000453// -----------------------------------------------------------------------------
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000454// NewSpace
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000455
lrn@chromium.org303ada72010-10-27 09:33:13 +0000456MaybeObject* NewSpace::AllocateRawInternal(int size_in_bytes,
457 AllocationInfo* alloc_info) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000458 Address new_top = alloc_info->top + size_in_bytes;
whesse@chromium.org4a5224e2010-10-20 12:37:07 +0000459 if (new_top > alloc_info->limit) return Failure::RetryAfterGC();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000460
461 Object* obj = HeapObject::FromAddress(alloc_info->top);
462 alloc_info->top = new_top;
463#ifdef DEBUG
464 SemiSpace* space =
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000465 (alloc_info == &allocation_info_) ? &to_space_ : &from_space_;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000466 ASSERT(space->low() <= alloc_info->top
467 && alloc_info->top <= space->high()
468 && alloc_info->limit == space->high());
469#endif
470 return obj;
471}
472
ager@chromium.org3811b432009-10-28 14:53:37 +0000473
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000474intptr_t LargeObjectSpace::Available() {
475 return LargeObjectChunk::ObjectSizeFor(
476 heap()->isolate()->memory_allocator()->Available());
477}
478
479
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000480template <typename StringType>
481void NewSpace::ShrinkStringAtAllocationBoundary(String* string, int length) {
482 ASSERT(length <= string->length());
483 ASSERT(string->IsSeqString());
484 ASSERT(string->address() + StringType::SizeFor(string->length()) ==
485 allocation_info_.top);
486 allocation_info_.top =
487 string->address() + StringType::SizeFor(length);
488 string->set_length(length);
489}
490
491
ager@chromium.org3811b432009-10-28 14:53:37 +0000492bool FreeListNode::IsFreeListNode(HeapObject* object) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000493 return object->map() == HEAP->raw_unchecked_byte_array_map()
494 || object->map() == HEAP->raw_unchecked_one_pointer_filler_map()
495 || object->map() == HEAP->raw_unchecked_two_pointer_filler_map();
ager@chromium.org3811b432009-10-28 14:53:37 +0000496}
497
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000498} } // namespace v8::internal
499
500#endif // V8_SPACES_INL_H_