From: dcarney@chromium.org Date: Wed, 11 Sep 2013 07:14:41 +0000 (+0000) Subject: move HEAP to /test X-Git-Tag: upstream/4.7.83~12579 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cc2257b92ada6b65be25b255d2621dc53d3c3e4c;p=platform%2Fupstream%2Fv8.git move HEAP to /test R=svenpanne@chromium.org BUG= Review URL: https://codereview.chromium.org/23468021 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16631 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/cpu-profiler.cc b/src/cpu-profiler.cc index 74e0d82..e0f7aea 100644 --- a/src/cpu-profiler.cc +++ b/src/cpu-profiler.cc @@ -373,7 +373,7 @@ CpuProfiler::CpuProfiler(Isolate* isolate) : isolate_(isolate), sampling_interval_(TimeDelta::FromMicroseconds( FLAG_cpu_profiler_sampling_interval)), - profiles_(new CpuProfilesCollection()), + profiles_(new CpuProfilesCollection(isolate->heap())), next_profile_uid_(1), generator_(NULL), processor_(NULL), @@ -410,7 +410,7 @@ void CpuProfiler::set_sampling_interval(TimeDelta value) { void CpuProfiler::ResetProfiles() { delete profiles_; - profiles_ = new CpuProfilesCollection(); + profiles_ = new CpuProfilesCollection(isolate()->heap()); } diff --git a/src/disassembler.cc b/src/disassembler.cc index 30df186..dd620fb 100644 --- a/src/disassembler.cc +++ b/src/disassembler.cc @@ -118,7 +118,7 @@ static int DecodeIt(Isolate* isolate, SealHandleScope shs(isolate); DisallowHeapAllocation no_alloc; ExternalReferenceEncoder ref_encoder(isolate); - Heap* heap = HEAP; + Heap* heap = isolate->heap(); v8::internal::EmbeddedVector decode_buffer; v8::internal::EmbeddedVector out_buffer; diff --git a/src/factory.cc b/src/factory.cc index be85a73..acbaf3c 100644 --- a/src/factory.cc +++ b/src/factory.cc @@ -141,7 +141,8 @@ Handle Factory::NewDeoptimizationInputData( PretenureFlag pretenure) { ASSERT(deopt_entry_count > 0); CALL_HEAP_FUNCTION(isolate(), - DeoptimizationInputData::Allocate(deopt_entry_count, + DeoptimizationInputData::Allocate(isolate(), + deopt_entry_count, pretenure), DeoptimizationInputData); } @@ -152,7 +153,8 @@ Handle Factory::NewDeoptimizationOutputData( PretenureFlag pretenure) { ASSERT(deopt_entry_count > 0); CALL_HEAP_FUNCTION(isolate(), - DeoptimizationOutputData::Allocate(deopt_entry_count, + DeoptimizationOutputData::Allocate(isolate(), + deopt_entry_count, pretenure), DeoptimizationOutputData); } diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc index e0b3f7b..bd47eec 100644 --- a/src/heap-snapshot-generator.cc +++ b/src/heap-snapshot-generator.cc @@ -586,6 +586,7 @@ size_t HeapObjectsMap::GetUsedMemorySize() const { HeapSnapshotsCollection::HeapSnapshotsCollection(Heap* heap) : is_tracking_objects_(false), + names_(heap), ids_(heap) { } diff --git a/src/isolate.h b/src/isolate.h index 7b26178..79b00be 100644 --- a/src/isolate.h +++ b/src/isolate.h @@ -1520,7 +1520,6 @@ class PostponeInterruptsScope BASE_EMBEDDED { // Temporary macros for accessing current isolate and its subobjects. // They provide better readability, especially when used a lot in the code. -#define HEAP (v8::internal::Isolate::Current()->heap()) #define ISOLATE (v8::internal::Isolate::Current()) diff --git a/src/mark-compact.cc b/src/mark-compact.cc index b93460d..17ac4a8 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -79,11 +79,13 @@ MarkCompactCollector::MarkCompactCollector() : // NOLINT #ifdef VERIFY_HEAP class VerifyMarkingVisitor: public ObjectVisitor { public: + explicit VerifyMarkingVisitor(Heap* heap) : heap_(heap) {} + void VisitPointers(Object** start, Object** end) { for (Object** current = start; current < end; current++) { if ((*current)->IsHeapObject()) { HeapObject* object = HeapObject::cast(*current); - CHECK(HEAP->mark_compact_collector()->IsMarked(object)); + CHECK(heap_->mark_compact_collector()->IsMarked(object)); } } } @@ -97,11 +99,14 @@ class VerifyMarkingVisitor: public ObjectVisitor { VisitPointer(rinfo->target_object_address()); } } + + private: + Heap* heap_; }; -static void VerifyMarking(Address bottom, Address top) { - VerifyMarkingVisitor visitor; +static void VerifyMarking(Heap* heap, Address bottom, Address top) { + VerifyMarkingVisitor visitor(heap); HeapObject* object; Address next_object_must_be_here_or_later = bottom; @@ -129,7 +134,7 @@ static void VerifyMarking(NewSpace* space) { NewSpacePage* page = it.next(); Address limit = it.has_next() ? page->area_end() : end; CHECK(limit == end || !page->Contains(end)); - VerifyMarking(page->area_start(), limit); + VerifyMarking(space->heap(), page->area_start(), limit); } } @@ -139,7 +144,7 @@ static void VerifyMarking(PagedSpace* space) { while (it.has_next()) { Page* p = it.next(); - VerifyMarking(p->area_start(), p->area_end()); + VerifyMarking(space->heap(), p->area_start(), p->area_end()); } } @@ -153,7 +158,7 @@ static void VerifyMarking(Heap* heap) { VerifyMarking(heap->map_space()); VerifyMarking(heap->new_space()); - VerifyMarkingVisitor visitor; + VerifyMarkingVisitor visitor(heap); LargeObjectIterator it(heap->lo_space()); for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { @@ -1409,7 +1414,7 @@ class MarkCompactMarkingVisitor HeapObject* obj)) { #ifdef DEBUG ASSERT(collector->heap()->Contains(obj)); - ASSERT(!HEAP->mark_compact_collector()->IsMarked(obj)); + ASSERT(!collector->heap()->mark_compact_collector()->IsMarked(obj)); #endif Map* map = obj->map(); Heap* heap = obj->GetHeap(); diff --git a/src/mksnapshot.cc b/src/mksnapshot.cc index 156cd77..efd6e79 100644 --- a/src/mksnapshot.cc +++ b/src/mksnapshot.cc @@ -397,7 +397,8 @@ int main(int argc, char** argv) { } // If we don't do this then we end up with a stray root pointing at the // context even after we have disposed of the context. - HEAP->CollectAllGarbage(i::Heap::kNoGCFlags, "mksnapshot"); + internal_isolate->heap()->CollectAllGarbage( + i::Heap::kNoGCFlags, "mksnapshot"); i::Object* raw_context = *v8::Utils::OpenPersistent(context); context.Dispose(); CppByteSink sink(argv[1]); diff --git a/src/objects-debug.cc b/src/objects-debug.cc index 3eb7817..883afe9 100644 --- a/src/objects-debug.cc +++ b/src/objects-debug.cc @@ -230,7 +230,8 @@ void HeapObject::HeapObjectVerify() { void HeapObject::VerifyHeapPointer(Object* p) { CHECK(p->IsHeapObject()); - CHECK(HEAP->Contains(HeapObject::cast(p))); + HeapObject* ho = HeapObject::cast(p); + CHECK(ho->GetHeap()->Contains(ho)); } @@ -337,11 +338,12 @@ void JSObject::JSObjectVerify() { void Map::MapVerify() { - CHECK(!HEAP->InNewSpace(this)); + Heap* heap = GetHeap(); + CHECK(!heap->InNewSpace(this)); CHECK(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); CHECK(instance_size() == kVariableSizeSentinel || (kPointerSize <= instance_size() && - instance_size() < HEAP->Capacity())); + instance_size() < heap->Capacity())); VerifyHeapPointer(prototype()); VerifyHeapPointer(instance_descriptors()); SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates()); @@ -523,7 +525,7 @@ void String::StringVerify() { CHECK(IsString()); CHECK(length() >= 0 && length() <= Smi::kMaxValue); if (IsInternalizedString()) { - CHECK(!HEAP->InNewSpace(this)); + CHECK(!GetHeap()->InNewSpace(this)); } if (IsConsString()) { ConsString::cast(this)->ConsStringVerify(); @@ -615,7 +617,7 @@ void Oddball::OddballVerify() { VerifyHeapPointer(to_string()); Object* number = to_number(); if (number->IsHeapObject()) { - CHECK(number == HEAP->nan_value()); + CHECK(number == HeapObject::cast(number)->GetHeap()->nan_value()); } else { CHECK(number->IsSmi()); int value = Smi::cast(number)->value(); @@ -1043,7 +1045,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { int holes = 0; FixedArray* e = FixedArray::cast(elements()); int len = e->length(); - Heap* heap = HEAP; + Heap* heap = GetHeap(); for (int i = 0; i < len; i++) { if (e->get(i) == heap->the_hole_value()) holes++; } diff --git a/src/objects-inl.h b/src/objects-inl.h index 9f68c4f..c2dc750 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1963,7 +1963,7 @@ bool FixedArray::is_the_hole(int index) { void FixedArray::set(int index, Smi* value) { - ASSERT(map() != HEAP->fixed_cow_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < this->length()); ASSERT(reinterpret_cast(value)->IsSmi()); int offset = kHeaderSize + index * kPointerSize; @@ -1972,7 +1972,7 @@ void FixedArray::set(int index, Smi* value) { void FixedArray::set(int index, Object* value) { - ASSERT(map() != HEAP->fixed_cow_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < this->length()); int offset = kHeaderSize + index * kPointerSize; WRITE_FIELD(this, offset, value); @@ -1998,8 +1998,8 @@ inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { double FixedDoubleArray::get_scalar(int index) { - ASSERT(map() != HEAP->fixed_cow_array_map() && - map() != HEAP->fixed_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map() && + map() != GetHeap()->fixed_array_map()); ASSERT(index >= 0 && index < this->length()); double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); ASSERT(!is_the_hole_nan(result)); @@ -2007,8 +2007,8 @@ double FixedDoubleArray::get_scalar(int index) { } int64_t FixedDoubleArray::get_representation(int index) { - ASSERT(map() != HEAP->fixed_cow_array_map() && - map() != HEAP->fixed_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map() && + map() != GetHeap()->fixed_array_map()); ASSERT(index >= 0 && index < this->length()); return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize); } @@ -2023,8 +2023,8 @@ MaybeObject* FixedDoubleArray::get(int index) { void FixedDoubleArray::set(int index, double value) { - ASSERT(map() != HEAP->fixed_cow_array_map() && - map() != HEAP->fixed_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map() && + map() != GetHeap()->fixed_array_map()); int offset = kHeaderSize + index * kDoubleSize; if (std::isnan(value)) value = canonical_not_the_hole_nan_as_double(); WRITE_DOUBLE_FIELD(this, offset, value); @@ -2032,8 +2032,8 @@ void FixedDoubleArray::set(int index, double value) { void FixedDoubleArray::set_the_hole(int index) { - ASSERT(map() != HEAP->fixed_cow_array_map() && - map() != HEAP->fixed_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map() && + map() != GetHeap()->fixed_array_map()); int offset = kHeaderSize + index * kDoubleSize; WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); } @@ -2057,7 +2057,7 @@ WriteBarrierMode HeapObject::GetWriteBarrierMode( void FixedArray::set(int index, Object* value, WriteBarrierMode mode) { - ASSERT(map() != HEAP->fixed_cow_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < this->length()); int offset = kHeaderSize + index * kPointerSize; WRITE_FIELD(this, offset, value); @@ -2068,7 +2068,7 @@ void FixedArray::set(int index, void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array, int index, Object* value) { - ASSERT(array->map() != HEAP->fixed_cow_array_map()); + ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < array->length()); int offset = kHeaderSize + index * kPointerSize; WRITE_FIELD(array, offset, value); @@ -2082,9 +2082,9 @@ void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array, void FixedArray::NoWriteBarrierSet(FixedArray* array, int index, Object* value) { - ASSERT(array->map() != HEAP->fixed_cow_array_map()); + ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < array->length()); - ASSERT(!HEAP->InNewSpace(value)); + ASSERT(!array->GetHeap()->InNewSpace(value)); WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); } @@ -2109,9 +2109,9 @@ void FixedArray::set_null(int index) { void FixedArray::set_the_hole(int index) { - ASSERT(map() != HEAP->fixed_cow_array_map()); + ASSERT(map() != GetHeap()->fixed_cow_array_map()); ASSERT(index >= 0 && index < this->length()); - ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value())); + ASSERT(!GetHeap()->InNewSpace(GetHeap()->the_hole_value())); WRITE_FIELD(this, kHeaderSize + index * kPointerSize, GetHeap()->the_hole_value()); @@ -2130,7 +2130,7 @@ Object** FixedArray::data_start() { bool DescriptorArray::IsEmpty() { ASSERT(length() >= kFirstIndex || - this == HEAP->empty_descriptor_array()); + this == GetHeap()->empty_descriptor_array()); return length() < kFirstIndex; } @@ -4995,7 +4995,7 @@ Code* JSFunction::code() { void JSFunction::set_code(Code* value) { - ASSERT(!HEAP->InNewSpace(value)); + ASSERT(!GetHeap()->InNewSpace(value)); Address entry = value->entry(); WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast(entry)); GetHeap()->incremental_marking()->RecordWriteOfCodeEntry( @@ -5006,7 +5006,7 @@ void JSFunction::set_code(Code* value) { void JSFunction::set_code_no_write_barrier(Code* value) { - ASSERT(!HEAP->InNewSpace(value)); + ASSERT(!GetHeap()->InNewSpace(value)); Address entry = value->entry(); WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast(entry)); } @@ -5156,7 +5156,7 @@ void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, Code* value) { ASSERT(id < kJSBuiltinsCount); // id is unsigned. WRITE_FIELD(this, OffsetOfCodeWithId(id), value); - ASSERT(!HEAP->InNewSpace(value)); + ASSERT(!GetHeap()->InNewSpace(value)); } diff --git a/src/objects.cc b/src/objects.cc index dca4af4..027506f 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -2188,9 +2188,9 @@ static void ZapEndOfFixedArray(Address new_end, int to_trim) { template static void RightTrimFixedArray(Heap* heap, FixedArray* elms, int to_trim) { - ASSERT(elms->map() != HEAP->fixed_cow_array_map()); + ASSERT(elms->map() != heap->fixed_cow_array_map()); // For now this trick is only applied to fixed arrays in new and paged space. - ASSERT(!HEAP->lo_space()->Contains(elms)); + ASSERT(!heap->lo_space()->Contains(elms)); const int len = elms->length(); @@ -7980,19 +7980,21 @@ Object* AccessorPair::GetComponent(AccessorComponent component) { } -MaybeObject* DeoptimizationInputData::Allocate(int deopt_entry_count, +MaybeObject* DeoptimizationInputData::Allocate(Isolate* isolate, + int deopt_entry_count, PretenureFlag pretenure) { ASSERT(deopt_entry_count > 0); - return HEAP->AllocateFixedArray(LengthFor(deopt_entry_count), - pretenure); + return isolate->heap()->AllocateFixedArray(LengthFor(deopt_entry_count), + pretenure); } -MaybeObject* DeoptimizationOutputData::Allocate(int number_of_deopt_points, +MaybeObject* DeoptimizationOutputData::Allocate(Isolate* isolate, + int number_of_deopt_points, PretenureFlag pretenure) { - if (number_of_deopt_points == 0) return HEAP->empty_fixed_array(); - return HEAP->AllocateFixedArray(LengthOfFixedArray(number_of_deopt_points), - pretenure); + if (number_of_deopt_points == 0) return isolate->heap()->empty_fixed_array(); + return isolate->heap()->AllocateFixedArray( + LengthOfFixedArray(number_of_deopt_points), pretenure); } diff --git a/src/objects.h b/src/objects.h index 56ce497..af0a891 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4635,7 +4635,8 @@ class DeoptimizationInputData: public FixedArray { } // Allocates a DeoptimizationInputData. - MUST_USE_RESULT static MaybeObject* Allocate(int deopt_entry_count, + MUST_USE_RESULT static MaybeObject* Allocate(Isolate* isolate, + int deopt_entry_count, PretenureFlag pretenure); // Casting. @@ -4681,7 +4682,8 @@ class DeoptimizationOutputData: public FixedArray { } // Allocates a DeoptimizationOutputData. - MUST_USE_RESULT static MaybeObject* Allocate(int number_of_deopt_points, + MUST_USE_RESULT static MaybeObject* Allocate(Isolate* isolate, + int number_of_deopt_points, PretenureFlag pretenure); // Casting. diff --git a/src/profile-generator.cc b/src/profile-generator.cc index 3c11521..38c1f78 100644 --- a/src/profile-generator.cc +++ b/src/profile-generator.cc @@ -41,8 +41,8 @@ namespace v8 { namespace internal { -StringsStorage::StringsStorage() - : names_(StringsMatch) { +StringsStorage::StringsStorage(Heap* heap) + : hash_seed_(heap->HashSeed()), names_(StringsMatch) { } @@ -61,7 +61,7 @@ const char* StringsStorage::GetCopy(const char* src) { OS::StrNCpy(dst, src, len); dst[len] = '\0'; uint32_t hash = - StringHasher::HashSequentialString(dst.start(), len, HEAP->HashSeed()); + StringHasher::HashSequentialString(dst.start(), len, hash_seed_); return AddOrDisposeString(dst.start(), hash); } @@ -95,7 +95,7 @@ const char* StringsStorage::GetVFormatted(const char* format, va_list args) { return format; } uint32_t hash = StringHasher::HashSequentialString( - str.start(), len, HEAP->HashSeed()); + str.start(), len, hash_seed_); return AddOrDisposeString(str.start(), hash); } @@ -443,8 +443,9 @@ void CodeMap::Print() { } -CpuProfilesCollection::CpuProfilesCollection() - : current_profiles_semaphore_(1) { +CpuProfilesCollection::CpuProfilesCollection(Heap* heap) + : function_and_resource_names_(heap), + current_profiles_semaphore_(1) { } diff --git a/src/profile-generator.h b/src/profile-generator.h index 9ce5f23..0a4502c 100644 --- a/src/profile-generator.h +++ b/src/profile-generator.h @@ -41,7 +41,7 @@ struct OffsetRange; // forever, even if they disappear from JS heap or external storage. class StringsStorage { public: - StringsStorage(); + explicit StringsStorage(Heap* heap); ~StringsStorage(); const char* GetCopy(const char* src); @@ -63,6 +63,7 @@ class StringsStorage { const char* AddOrDisposeString(char* str, uint32_t hash); // Mapping of strings by String::Hash to const char* strings. + uint32_t hash_seed_; HashMap names_; DISALLOW_COPY_AND_ASSIGN(StringsStorage); @@ -277,7 +278,7 @@ class CodeMap { class CpuProfilesCollection { public: - CpuProfilesCollection(); + explicit CpuProfilesCollection(Heap* heap); ~CpuProfilesCollection(); bool StartProfiling(const char* title, unsigned uid, bool record_samples); diff --git a/src/property.h b/src/property.h index 094590e..0f78ba4 100644 --- a/src/property.h +++ b/src/property.h @@ -46,7 +46,8 @@ class Descriptor BASE_EMBEDDED { public: MUST_USE_RESULT MaybeObject* KeyToUniqueName() { if (!key_->IsUniqueName()) { - MaybeObject* maybe_result = HEAP->InternalizeString(String::cast(key_)); + MaybeObject* maybe_result = + key_->GetIsolate()->heap()->InternalizeString(String::cast(key_)); if (!maybe_result->To(&key_)) return maybe_result; } return key_; diff --git a/src/runtime.cc b/src/runtime.cc index 2c0cab0..9f37411 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -12950,7 +12950,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) { } FixedArray* instances = FixedArray::cast(object); - ASSERT(HEAP->IsHeapIterable()); + ASSERT(isolate->heap()->IsHeapIterable()); // Fill the referencing objects. HeapIterator heap_iterator2(heap); count = DebugConstructedBy(&heap_iterator2, diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc index 3d09d3a..ba138f2 100644 --- a/src/scopeinfo.cc +++ b/src/scopeinfo.cc @@ -445,7 +445,8 @@ void ContextSlotCache::Update(Object* data, int slot_index) { String* internalized_name; ASSERT(slot_index > kNotFound); - if (HEAP->InternalizeStringIfExists(name, &internalized_name)) { + if (name->GetIsolate()->heap()->InternalizeStringIfExists( + name, &internalized_name)) { int index = Hash(data, internalized_name); Key& key = keys_[index]; key.data = data; @@ -472,7 +473,8 @@ void ContextSlotCache::ValidateEntry(Object* data, InitializationFlag init_flag, int slot_index) { String* internalized_name; - if (HEAP->InternalizeStringIfExists(name, &internalized_name)) { + if (name->GetIsolate()->heap()->InternalizeStringIfExists( + name, &internalized_name)) { int index = Hash(data, name); Key& key = keys_[index]; ASSERT(key.data == data); diff --git a/src/serialize.cc b/src/serialize.cc index 6f84aed..d05dd26 100644 --- a/src/serialize.cc +++ b/src/serialize.cc @@ -1307,7 +1307,7 @@ void StartupSerializer::SerializeStrongReferences() { // We don't support serializing installed extensions. CHECK(!isolate->has_installed_extensions()); - HEAP->IterateStrongRoots(this, VISIT_ONLY_STRONG); + isolate->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG); } @@ -1485,7 +1485,7 @@ void StartupSerializer::SerializeWeakReferences() { // uses to know it is done deserializing the array. Object* undefined = isolate()->heap()->undefined_value(); VisitPointer(&undefined); - HEAP->IterateWeakRoots(this, VISIT_ALL); + isolate()->heap()->IterateWeakRoots(this, VISIT_ALL); Pad(); } @@ -1498,7 +1498,7 @@ void Serializer::PutRoot(int root_index, if (how_to_code == kPlain && where_to_point == kStartOfObject && root_index < kRootArrayNumberOfConstantEncodings && - !HEAP->InNewSpace(object)) { + !isolate()->heap()->InNewSpace(object)) { if (skip == 0) { sink_->Put(kRootArrayConstants + kNoSkipDistance + root_index, "RootConstant"); @@ -1631,7 +1631,7 @@ void Serializer::ObjectSerializer::VisitPointers(Object** start, root_index != kInvalidRootIndex && root_index < kRootArrayNumberOfConstantEncodings && current_contents == current[-1]) { - ASSERT(!HEAP->InNewSpace(current_contents)); + ASSERT(!serializer_->isolate()->heap()->InNewSpace(current_contents)); int repeat_count = 1; while (current < end - 1 && current[repeat_count] == current_contents) { repeat_count++; @@ -1748,7 +1748,8 @@ void Serializer::ObjectSerializer::VisitExternalAsciiString( Address references_start = reinterpret_cast
(resource_pointer); OutputRawData(references_start); for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { - Object* source = HEAP->natives_source_cache()->get(i); + Object* source = + serializer_->isolate()->heap()->natives_source_cache()->get(i); if (!source->IsUndefined()) { ExternalAsciiString* string = ExternalAsciiString::cast(source); typedef v8::String::ExternalAsciiStringResource Resource; @@ -1817,7 +1818,7 @@ int Serializer::ObjectSerializer::OutputRawData( int Serializer::SpaceOfObject(HeapObject* object) { for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) { AllocationSpace s = static_cast(i); - if (HEAP->InSpace(object, s)) { + if (object->GetHeap()->InSpace(object, s)) { ASSERT(i < kNumberOfSpaces); return i; } diff --git a/src/serialize.h b/src/serialize.h index 0b07e1f..020a744 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -620,7 +620,8 @@ class PartialSerializer : public Serializer { return o->IsName() || o->IsSharedFunctionInfo() || o->IsHeapNumber() || o->IsCode() || o->IsScopeInfo() || - o->map() == HEAP->fixed_cow_array_map(); + o->map() == + startup_serializer_->isolate()->heap()->fixed_cow_array_map(); } private: diff --git a/src/spaces-inl.h b/src/spaces-inl.h index 77117b8..be2ae2a 100644 --- a/src/spaces-inl.h +++ b/src/spaces-inl.h @@ -194,11 +194,11 @@ void MemoryChunk::set_scan_on_scavenge(bool scan) { } -MemoryChunk* MemoryChunk::FromAnyPointerAddress(Address addr) { +MemoryChunk* MemoryChunk::FromAnyPointerAddress(Heap* heap, Address addr) { MemoryChunk* maybe = reinterpret_cast( OffsetFrom(addr) & ~Page::kPageAlignmentMask); if (maybe->owner() != NULL) return maybe; - LargeObjectIterator iterator(HEAP->lo_space()); + LargeObjectIterator iterator(heap->lo_space()); for (HeapObject* o = iterator.Next(); o != NULL; o = iterator.Next()) { // Fixed arrays are the only pointer-containing objects in large object // space. @@ -315,12 +315,12 @@ MaybeObject* NewSpace::AllocateRaw(int size_in_bytes) { #ifdef DEBUG // If we are stressing compaction we waste some memory in new space // in order to get more frequent GCs. - if (FLAG_stress_compaction && !HEAP->linear_allocation()) { + if (FLAG_stress_compaction && !heap()->linear_allocation()) { if (allocation_info_.limit - old_top >= size_in_bytes * 4) { int filler_size = size_in_bytes * 4; for (int i = 0; i < filler_size; i += kPointerSize) { *(reinterpret_cast(old_top + i)) = - HEAP->one_pointer_filler_map(); + heap()->one_pointer_filler_map(); } old_top += filler_size; allocation_info_.top += filler_size; diff --git a/src/spaces.h b/src/spaces.h index 5b9a4e4..1ccdacb 100644 --- a/src/spaces.h +++ b/src/spaces.h @@ -307,7 +307,7 @@ class MemoryChunk { } // Only works for addresses in pointer spaces, not data or code spaces. - static inline MemoryChunk* FromAnyPointerAddress(Address addr); + static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr); Address address() { return reinterpret_cast
(this); } diff --git a/src/store-buffer-inl.h b/src/store-buffer-inl.h index bb386db..e1fcdee 100644 --- a/src/store-buffer-inl.h +++ b/src/store-buffer-inl.h @@ -67,7 +67,7 @@ void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { if (top >= old_limit_) { ASSERT(callback_ != NULL); (*callback_)(heap_, - MemoryChunk::FromAnyPointerAddress(addr), + MemoryChunk::FromAnyPointerAddress(heap_, addr), kStoreBufferFullEvent); } } diff --git a/src/store-buffer.cc b/src/store-buffer.cc index 30b7f25..22a5467 100644 --- a/src/store-buffer.cc +++ b/src/store-buffer.cc @@ -221,7 +221,7 @@ void StoreBuffer::ExemptPopularPages(int prime_sample_step, int threshold) { if (previous_chunk != NULL && previous_chunk->Contains(addr)) { containing_chunk = previous_chunk; } else { - containing_chunk = MemoryChunk::FromAnyPointerAddress(addr); + containing_chunk = MemoryChunk::FromAnyPointerAddress(heap_, addr); } int old_counter = containing_chunk->store_buffer_counter(); if (old_counter == threshold) { @@ -247,7 +247,7 @@ void StoreBuffer::Filter(int flag) { if (previous_chunk != NULL && previous_chunk->Contains(addr)) { containing_chunk = previous_chunk; } else { - containing_chunk = MemoryChunk::FromAnyPointerAddress(addr); + containing_chunk = MemoryChunk::FromAnyPointerAddress(heap_, addr); previous_chunk = containing_chunk; } if (!containing_chunk->IsFlagSet(flag)) { diff --git a/src/string-stream.cc b/src/string-stream.cc index f34f53d..2afbae2 100644 --- a/src/string-stream.cc +++ b/src/string-stream.cc @@ -350,7 +350,7 @@ void StringStream::PrintName(Object* name) { void StringStream::PrintUsingMap(JSObject* js_object) { Map* map = js_object->map(); - if (!HEAP->Contains(map) || + if (!js_object->GetHeap()->Contains(map) || !map->IsHeapObject() || !map->IsMap()) { Add("\n"); @@ -384,7 +384,7 @@ void StringStream::PrintUsingMap(JSObject* js_object) { void StringStream::PrintFixedArray(FixedArray* array, unsigned int limit) { - Heap* heap = HEAP; + Heap* heap = array->GetHeap(); for (unsigned int i = 0; i < 10 && i < limit; i++) { Object* element = array->get(i); if (element != heap->the_hole_value()) { @@ -491,48 +491,39 @@ void StringStream::PrintSecurityTokenIfChanged(Object* f) { void StringStream::PrintFunction(Object* f, Object* receiver, Code** code) { - if (f->IsHeapObject() && - HEAP->Contains(HeapObject::cast(f)) && - HEAP->Contains(HeapObject::cast(f)->map()) && - HeapObject::cast(f)->map()->IsMap()) { - if (f->IsJSFunction()) { - JSFunction* fun = JSFunction::cast(f); - // Common case: on-stack function present and resolved. - PrintPrototype(fun, receiver); - *code = fun->code(); - } else if (f->IsInternalizedString()) { - // Unresolved and megamorphic calls: Instead of the function - // we have the function name on the stack. - PrintName(f); - Add("/* unresolved */ "); - } else { - // Unless this is the frame of a built-in function, we should always have - // the callee function or name on the stack. If we don't, we have a - // problem or a change of the stack frame layout. - Add("%o", f); - Add("/* warning: no JSFunction object or function name found */ "); - } - /* } else if (is_trampoline()) { - Print("trampoline "); - */ + if (!f->IsHeapObject()) { + Add("/* warning: 'function' was not a heap object */ "); + return; + } + Heap* heap = HeapObject::cast(f)->GetHeap(); + if (!heap->Contains(HeapObject::cast(f))) { + Add("/* warning: 'function' was not on the heap */ "); + return; + } + if (!heap->Contains(HeapObject::cast(f)->map())) { + Add("/* warning: function's map was not on the heap */ "); + return; + } + if (!HeapObject::cast(f)->map()->IsMap()) { + Add("/* warning: function's map was not a valid map */ "); + return; + } + if (f->IsJSFunction()) { + JSFunction* fun = JSFunction::cast(f); + // Common case: on-stack function present and resolved. + PrintPrototype(fun, receiver); + *code = fun->code(); + } else if (f->IsInternalizedString()) { + // Unresolved and megamorphic calls: Instead of the function + // we have the function name on the stack. + PrintName(f); + Add("/* unresolved */ "); } else { - if (!f->IsHeapObject()) { - Add("/* warning: 'function' was not a heap object */ "); - return; - } - if (!HEAP->Contains(HeapObject::cast(f))) { - Add("/* warning: 'function' was not on the heap */ "); - return; - } - if (!HEAP->Contains(HeapObject::cast(f)->map())) { - Add("/* warning: function's map was not on the heap */ "); - return; - } - if (!HeapObject::cast(f)->map()->IsMap()) { - Add("/* warning: function's map was not a valid map */ "); - return; - } - Add("/* warning: Invalid JSFunction object found */ "); + // Unless this is the frame of a built-in function, we should always have + // the callee function or name on the stack. If we don't, we have a + // problem or a change of the stack frame layout. + Add("%o", f); + Add("/* warning: no JSFunction object or function name found */ "); } } diff --git a/src/stub-cache.cc b/src/stub-cache.cc index f83a7d2..bdfb32f 100644 --- a/src/stub-cache.cc +++ b/src/stub-cache.cc @@ -1309,7 +1309,7 @@ static MaybeObject* ThrowReferenceError(Isolate* isolate, Name* name) { // can't use either LoadIC or KeyedLoadIC constructors. IC ic(IC::NO_EXTRA_FRAME, isolate); ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); - if (!ic.SlowIsUndeclaredGlobal()) return HEAP->undefined_value(); + if (!ic.SlowIsUndeclaredGlobal()) return isolate->heap()->undefined_value(); // Throw a reference error. HandleScope scope(isolate); diff --git a/test/cctest/cctest.h b/test/cctest/cctest.h index 3365493..ceb9774 100644 --- a/test/cctest/cctest.h +++ b/test/cctest/cctest.h @@ -71,6 +71,10 @@ typedef v8::internal::EnumSet CcTestExtensionFlags; EXTENSION_LIST(DEFINE_EXTENSION_FLAG) #undef DEFINE_EXTENSION_FLAG +// Temporary macros for accessing current isolate and its subobjects. +// They provide better readability, especially when used a lot in the code. +#define HEAP (v8::internal::Isolate::Current()->heap()) + class CcTest { public: typedef void (TestFunction)(); diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc index 6d66c5e..4708f50 100644 --- a/test/cctest/test-cpu-profiler.cc +++ b/test/cctest/test-cpu-profiler.cc @@ -49,7 +49,8 @@ using i::Vector; TEST(StartStop) { - CpuProfilesCollection profiles; + i::Isolate* isolate = CcTest::i_isolate(); + CpuProfilesCollection profiles(isolate->heap()); ProfileGenerator generator(&profiles); SmartPointer processor(new ProfilerEventsProcessor( &generator, NULL, TimeDelta::FromMicroseconds(100))); @@ -140,7 +141,7 @@ TEST(CodeEvents) { i::Code* args3_code = CreateCode(&env); i::Code* args4_code = CreateCode(&env); - CpuProfilesCollection* profiles = new CpuProfilesCollection; + CpuProfilesCollection* profiles = new CpuProfilesCollection(isolate->heap()); profiles->StartProfiling("", 1, false); ProfileGenerator generator(profiles); SmartPointer processor(new ProfilerEventsProcessor( @@ -202,7 +203,7 @@ TEST(TickEvents) { i::Code* frame2_code = CreateCode(&env); i::Code* frame3_code = CreateCode(&env); - CpuProfilesCollection* profiles = new CpuProfilesCollection; + CpuProfilesCollection* profiles = new CpuProfilesCollection(isolate->heap()); profiles->StartProfiling("", 1, false); ProfileGenerator generator(profiles); SmartPointer processor(new ProfilerEventsProcessor( @@ -271,7 +272,7 @@ TEST(Issue1398) { i::Code* code = CreateCode(&env); - CpuProfilesCollection* profiles = new CpuProfilesCollection; + CpuProfilesCollection* profiles = new CpuProfilesCollection(isolate->heap()); profiles->StartProfiling("", 1, false); ProfileGenerator generator(profiles); SmartPointer processor(new ProfilerEventsProcessor( diff --git a/test/cctest/test-profile-generator.cc b/test/cctest/test-profile-generator.cc index c84003f..7504b17 100644 --- a/test/cctest/test-profile-generator.cc +++ b/test/cctest/test-profile-generator.cc @@ -399,7 +399,7 @@ class TestSetup { TEST(RecordTickSample) { TestSetup test_setup; - CpuProfilesCollection profiles; + CpuProfilesCollection profiles(CcTest::i_isolate()->heap()); profiles.StartProfiling("", 1, false); ProfileGenerator generator(&profiles); CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); @@ -465,7 +465,7 @@ static void CheckNodeIds(ProfileNode* node, int* expectedId) { TEST(SampleIds) { TestSetup test_setup; - CpuProfilesCollection profiles; + CpuProfilesCollection profiles(CcTest::i_isolate()->heap()); profiles.StartProfiling("", 1, true); ProfileGenerator generator(&profiles); CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); @@ -513,7 +513,7 @@ TEST(SampleIds) { TEST(NoSamples) { TestSetup test_setup; - CpuProfilesCollection profiles; + CpuProfilesCollection profiles(CcTest::i_isolate()->heap()); profiles.StartProfiling("", 1, false); ProfileGenerator generator(&profiles); CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); @@ -652,7 +652,7 @@ TEST(RecordStackTraceAtStartProfiling) { TEST(Issue51919) { - CpuProfilesCollection collection; + CpuProfilesCollection collection(CcTest::i_isolate()->heap()); i::EmbeddedVector titles; for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) {