Index: src/heap.cc |
=================================================================== |
--- src/heap.cc (revision 830) |
+++ src/heap.cc (working copy) |
@@ -392,8 +392,7 @@ |
} |
Counters::objs_since_last_young.Set(0); |
- // Process weak handles post gc. |
- GlobalHandles::PostGarbageCollectionProcessing(); |
+ PostGarbageCollectionProcessing(); |
if (collector == MARK_COMPACTOR) { |
// Register the amount of external allocated memory. |
@@ -408,6 +407,14 @@ |
} |
+void Heap::PostGarbageCollectionProcessing() { |
+ // Process weak handles post gc. |
+ GlobalHandles::PostGarbageCollectionProcessing(); |
+ // Update flat string readers. |
+ FlatStringReader::PostGarbageCollectionProcessing(); |
+} |
+ |
+ |
void Heap::MarkCompact(GCTracer* tracer) { |
gc_state_ = MARK_COMPACT; |
mc_count_++; |
@@ -1582,6 +1589,24 @@ |
} |
+Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
+ if (pretenure == NOT_TENURED) { |
+ return AllocateByteArray(length); |
+ } |
+ int size = ByteArray::SizeFor(length); |
+ AllocationSpace space = |
+ size > MaxHeapObjectSize() ? LO_SPACE : OLD_DATA_SPACE; |
+ |
+ Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ |
+ if (result->IsFailure()) return result; |
+ |
+ reinterpret_cast<Array*>(result)->set_map(byte_array_map()); |
+ reinterpret_cast<Array*>(result)->set_length(length); |
+ return result; |
+} |
+ |
+ |
Object* Heap::AllocateByteArray(int length) { |
int size = ByteArray::SizeFor(length); |
AllocationSpace space = |
@@ -1599,7 +1624,8 @@ |
Object* Heap::CreateCode(const CodeDesc& desc, |
ScopeInfo<>* sinfo, |
- Code::Flags flags) { |
+ Code::Flags flags, |
+ Code** self_reference) { |
// Compute size |
int body_size = RoundUp(desc.instr_size + desc.reloc_size, kObjectAlignment); |
int sinfo_size = 0; |
@@ -1622,7 +1648,16 @@ |
code->set_sinfo_size(sinfo_size); |
code->set_flags(flags); |
code->set_ic_flag(Code::IC_TARGET_IS_ADDRESS); |
- code->CopyFrom(desc); // migrate generated code |
+ // Allow self references to created code object. |
+ if (self_reference != NULL) { |
+ *self_reference = code; |
+ } |
+ // Migrate generated code. |
+ // The generated code can contain Object** values (typically from handles) |
+ // that are dereferenced during the copy to point directly to the actual heap |
+ // objects. These pointers can include references to the code object itself, |
+ // through the self_reference parameter. |
+ code->CopyFrom(desc); |
if (sinfo != NULL) sinfo->Serialize(code); // write scope info |
#ifdef DEBUG |