diff options
author | Trevor Norris <trev.norris@gmail.com> | 2013-03-18 13:49:34 -0700 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-03-20 01:11:01 +0100 |
commit | 83261e789eb903da39f279cb5a161611482e7df5 (patch) | |
tree | 4133b5ca9f53bed4365e1a94544a227d68a0cf12 /deps/v8/src/heap-inl.h | |
parent | a05f973f82d2be8527aad4c371d40d3c7e4c564e (diff) | |
download | node-83261e789eb903da39f279cb5a161611482e7df5.tar.gz |
deps: update v8 to 3.17.13
Diffstat (limited to 'deps/v8/src/heap-inl.h')
-rw-r--r-- | deps/v8/src/heap-inl.h | 128 |
1 files changed, 95 insertions, 33 deletions
diff --git a/deps/v8/src/heap-inl.h b/deps/v8/src/heap-inl.h index bace902d4..9ed65d810 100644 --- a/deps/v8/src/heap-inl.h +++ b/deps/v8/src/heap-inl.h @@ -91,30 +91,55 @@ MaybeObject* Heap::AllocateStringFromUtf8(Vector<const char> str, if (non_ascii_start >= length) { // If the string is ASCII, we do not need to convert the characters // since UTF8 is backwards compatible with ASCII. - return AllocateStringFromAscii(str, pretenure); + return AllocateStringFromOneByte(str, pretenure); } // Non-ASCII and we need to decode. return AllocateStringFromUtf8Slow(str, non_ascii_start, pretenure); } -MaybeObject* Heap::AllocateSymbol(Vector<const char> str, - int chars, - uint32_t hash_field) { - unibrow::Utf8InputBuffer<> buffer(str.start(), - static_cast<unsigned>(str.length())); - return AllocateInternalSymbol(&buffer, chars, hash_field); +template<> +bool inline Heap::IsOneByte(Vector<const char> str, int chars) { + // TODO(dcarney): incorporate Latin-1 check when Latin-1 is supported? + // ASCII only check. + return chars == str.length(); } -MaybeObject* Heap::AllocateAsciiSymbol(Vector<const char> str, - uint32_t hash_field) { - if (str.length() > SeqAsciiString::kMaxLength) { - return Failure::OutOfMemoryException(); +template<> +bool inline Heap::IsOneByte(String* str, int chars) { + return str->IsOneByteRepresentation(); +} + + +MaybeObject* Heap::AllocateInternalizedStringFromUtf8( + Vector<const char> str, int chars, uint32_t hash_field) { + if (IsOneByte(str, chars)) { + return AllocateOneByteInternalizedString( + Vector<const uint8_t>::cast(str), hash_field); + } + return AllocateInternalizedStringImpl<false>(str, chars, hash_field); +} + + +template<typename T> +MaybeObject* Heap::AllocateInternalizedStringImpl( + T t, int chars, uint32_t hash_field) { + if (IsOneByte(t, chars)) { + return AllocateInternalizedStringImpl<true>(t, chars, hash_field); + } + return AllocateInternalizedStringImpl<false>(t, chars, hash_field); +} + + +MaybeObject* Heap::AllocateOneByteInternalizedString(Vector<const uint8_t> str, + uint32_t hash_field) { + if (str.length() > SeqOneByteString::kMaxLength) { + return Failure::OutOfMemoryException(0x2); } // Compute map and object size. - Map* map = ascii_symbol_map(); - int size = SeqAsciiString::SizeFor(str.length()); + Map* map = ascii_internalized_string_map(); + int size = SeqOneByteString::SizeFor(str.length()); // Allocate string. Object* result; @@ -134,20 +159,20 @@ MaybeObject* Heap::AllocateAsciiSymbol(Vector<const char> str, ASSERT_EQ(size, answer->Size()); // Fill in the characters. - memcpy(answer->address() + SeqAsciiString::kHeaderSize, + memcpy(answer->address() + SeqOneByteString::kHeaderSize, str.start(), str.length()); return answer; } -MaybeObject* Heap::AllocateTwoByteSymbol(Vector<const uc16> str, - uint32_t hash_field) { +MaybeObject* Heap::AllocateTwoByteInternalizedString(Vector<const uc16> str, + uint32_t hash_field) { if (str.length() > SeqTwoByteString::kMaxLength) { - return Failure::OutOfMemoryException(); + return Failure::OutOfMemoryException(0x3); } // Compute map and object size. - Map* map = symbol_map(); + Map* map = internalized_string_map(); int size = SeqTwoByteString::SizeFor(str.length()); // Allocate string. @@ -239,8 +264,9 @@ MaybeObject* Heap::NumberFromInt32( MaybeObject* Heap::NumberFromUint32( uint32_t value, PretenureFlag pretenure) { - if ((int32_t)value >= 0 && Smi::IsValid((int32_t)value)) { - return Smi::FromInt((int32_t)value); + if (static_cast<int32_t>(value) >= 0 && + Smi::IsValid(static_cast<int32_t>(value))) { + return Smi::FromInt(static_cast<int32_t>(value)); } // Bypass NumberFromDouble to avoid various redundant checks. return AllocateHeapNumber(FastUI2D(value), pretenure); @@ -294,8 +320,8 @@ bool Heap::InNewSpace(Object* object) { } -bool Heap::InNewSpace(Address addr) { - return new_space_.Contains(addr); +bool Heap::InNewSpace(Address address) { + return new_space_.Contains(address); } @@ -309,6 +335,16 @@ bool Heap::InToSpace(Object* object) { } +bool Heap::InOldPointerSpace(Address address) { + return old_pointer_space_->Contains(address); +} + + +bool Heap::InOldPointerSpace(Object* object) { + return InOldPointerSpace(reinterpret_cast<Address>(object)); +} + + bool Heap::OldGenerationAllocationLimitReached() { if (!incremental_marking()->IsStopped()) return false; return OldGenerationSpaceAvailable() < 0; @@ -430,6 +466,15 @@ void Heap::ScavengeObject(HeapObject** p, HeapObject* object) { } +MaybeObject* Heap::AllocateEmptyJSArrayWithAllocationSite( + ElementsKind elements_kind, + Handle<Object> allocation_site_payload) { + return AllocateJSArrayAndStorageWithAllocationSite(elements_kind, 0, 0, + allocation_site_payload, + DONT_INITIALIZE_ARRAY_ELEMENTS); +} + + bool Heap::CollectGarbage(AllocationSpace space, const char* gc_reason) { const char* collector_reason = NULL; GarbageCollector collector = SelectGarbageCollector(space, &collector_reason); @@ -460,7 +505,7 @@ intptr_t Heap::AdjustAmountOfExternalAllocatedMemory( intptr_t change_in_bytes) { ASSERT(HasBeenSetUp()); intptr_t amount = amount_of_external_allocated_memory_ + change_in_bytes; - if (change_in_bytes >= 0) { + if (change_in_bytes > 0) { // Avoid overflow. if (amount > amount_of_external_allocated_memory_) { amount_of_external_allocated_memory_ = amount; @@ -607,21 +652,13 @@ void ExternalStringTable::Verify() { Object* obj = Object::cast(new_space_strings_[i]); // TODO(yangguo): check that the object is indeed an external string. ASSERT(heap_->InNewSpace(obj)); - ASSERT(obj != HEAP->raw_unchecked_the_hole_value()); - if (obj->IsExternalAsciiString()) { - ExternalAsciiString* string = ExternalAsciiString::cast(obj); - ASSERT(String::IsAscii(string->GetChars(), string->length())); - } + ASSERT(obj != HEAP->the_hole_value()); } for (int i = 0; i < old_space_strings_.length(); ++i) { Object* obj = Object::cast(old_space_strings_[i]); // TODO(yangguo): check that the object is indeed an external string. ASSERT(!heap_->InNewSpace(obj)); - ASSERT(obj != HEAP->raw_unchecked_the_hole_value()); - if (obj->IsExternalAsciiString()) { - ExternalAsciiString* string = ExternalAsciiString::cast(obj); - ASSERT(String::IsAscii(string->GetChars(), string->length())); - } + ASSERT(obj != HEAP->the_hole_value()); } #endif } @@ -644,6 +681,19 @@ void ExternalStringTable::ShrinkNewStrings(int position) { } +void ErrorObjectList::Add(JSObject* object) { + list_.Add(object); +} + + +void ErrorObjectList::Iterate(ObjectVisitor* v) { + if (!list_.is_empty()) { + Object** start = &list_[0]; + v->VisitPointers(start, start + list_.length()); + } +} + + void Heap::ClearInstanceofCache() { set_instanceof_cache_function(the_hole_value()); } @@ -739,6 +789,18 @@ AlwaysAllocateScope::~AlwaysAllocateScope() { } +#ifdef VERIFY_HEAP +NoWeakEmbeddedMapsVerificationScope::NoWeakEmbeddedMapsVerificationScope() { + HEAP->no_weak_embedded_maps_verification_scope_depth_++; +} + + +NoWeakEmbeddedMapsVerificationScope::~NoWeakEmbeddedMapsVerificationScope() { + HEAP->no_weak_embedded_maps_verification_scope_depth_--; +} +#endif + + void VerifyPointersVisitor::VisitPointers(Object** start, Object** end) { for (Object** current = start; current < end; current++) { if ((*current)->IsHeapObject()) { |