Added a large object space.
Added a large object space.
1.1 --- a/jitcraft/Heap-inl.h Fri Jul 06 09:45:21 2012 -0400
1.2 +++ b/jitcraft/Heap-inl.h Fri Jul 06 18:57:27 2012 -0400
1.3 @@ -94,6 +94,11 @@
1.4 inline Address
1.5 Heap::newLargeObject(size_t bytes)
1.6 {
1.7 + if (Address address = largeSpace_.allocate(bytes))
1.8 + return address;
1.9 +
1.10 + reclaim();
1.11 +
1.12 return largeSpace_.allocate(bytes);
1.13 }
1.14
2.1 --- a/jitcraft/Spaces.cpp Fri Jul 06 09:45:21 2012 -0400
2.2 +++ b/jitcraft/Spaces.cpp Fri Jul 06 18:57:27 2012 -0400
2.3 @@ -108,17 +108,44 @@
2.4 }
2.5 }
2.6
2.7 +LargeObjectSpace::LargeObjectSpace()
2.8 + : first_(NULL),
2.9 + last_(NULL)
2.10 +{
2.11 +}
2.12 +
2.13 +LargeObjectSpace::~LargeObjectSpace()
2.14 +{
2.15 + while (first_) {
2.16 + HeapChunk *temp = first_->next();
2.17 + HeapChunk::Destroy(first_);
2.18 + first_ = temp;
2.19 + }
2.20 +}
2.21 +
2.22 +bool
2.23 +LargeObjectSpace::initialize()
2.24 +{
2.25 + return true;
2.26 +}
2.27
2.28 Address
2.29 LargeObjectSpace::allocate(size_t nbytes)
2.30 {
2.31 assert(IsAligned(nbytes, kObjectAlignment));
2.32
2.33 - if (last_) {
2.34 - if (Address addr = last_->allocate(nbytes))
2.35 - return addr;
2.36 - }
2.37 + // Always allocate a new chunk for large objects.
2.38 + HeapChunk *chunk = HeapChunk::New(last_, nbytes);
2.39 + if (!chunk)
2.40 + return NULL;
2.41
2.42 + if (!first_)
2.43 + first_ = chunk;
2.44 + last_ = chunk;
2.45
2.46 + Address address = chunk->allocate(nbytes);
2.47 + assert(address);
2.48 +
2.49 + return address;
2.50 }
2.51