diff options
Diffstat (limited to 'deps/v8/tools/debug_helper/get-object-properties.cc')
-rw-r--r-- | deps/v8/tools/debug_helper/get-object-properties.cc | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/deps/v8/tools/debug_helper/get-object-properties.cc b/deps/v8/tools/debug_helper/get-object-properties.cc index 659a138462..186438d7ac 100644 --- a/deps/v8/tools/debug_helper/get-object-properties.cc +++ b/deps/v8/tools/debug_helper/get-object-properties.cc @@ -244,11 +244,11 @@ class ReadStringVisitor : public TqObjectVisitor { return std::string(result.data(), write_index); } - template <typename TChar> - Value<TChar> ReadCharacter(uintptr_t data_address, int32_t index) { - TChar value{}; + template <typename T> + Value<T> ReadValue(uintptr_t data_address, int32_t index = 0) { + T value{}; d::MemoryAccessResult validity = - accessor_(data_address + index * sizeof(TChar), + accessor_(data_address + index * sizeof(T), reinterpret_cast<uint8_t*>(&value), sizeof(value)); return {validity, value}; } @@ -259,7 +259,7 @@ class ReadStringVisitor : public TqObjectVisitor { for (; index_ < length && index_ < limit_ && !done_; ++index_) { static_assert(sizeof(TChar) <= sizeof(char16_t)); char16_t c = static_cast<char16_t>( - GetOrFinish(ReadCharacter<TChar>(data_address, index_))); + GetOrFinish(ReadValue<TChar>(data_address, index_))); if (!done_) AddCharacter(c); } } @@ -350,13 +350,22 @@ class ReadStringVisitor : public TqObjectVisitor { ExternalPointer_t resource_data = GetOrFinish(object->GetResourceDataValue(accessor_)); #ifdef V8_ENABLE_SANDBOX - Isolate* isolate = GetIsolateForSandbox( - HeapObject::unchecked_cast(Object(heap_addresses_.any_heap_pointer))); - ExternalPointerHandle handle = - static_cast<ExternalPointerHandle>(resource_data); - uintptr_t data_address = - static_cast<uintptr_t>(isolate->shared_external_pointer_table().Get( - handle, kExternalStringResourceDataTag)); + Address memory_chunk = + BasicMemoryChunk::BaseAddress(object->GetMapAddress()); + Address heap = GetOrFinish( + ReadValue<Address>(memory_chunk + BasicMemoryChunk::kHeapOffset)); + Isolate* isolate = Isolate::FromHeap(reinterpret_cast<Heap*>(heap)); + Address external_pointer_table_address_address = + isolate->shared_external_pointer_table_address_address(); + Address external_pointer_table_address = GetOrFinish( + ReadValue<Address>(external_pointer_table_address_address)); + Address external_pointer_table = + GetOrFinish(ReadValue<Address>(external_pointer_table_address)); + int32_t index = + static_cast<int32_t>(resource_data >> kExternalPointerIndexShift); + Address tagged_data = + GetOrFinish(ReadValue<Address>(external_pointer_table, index)); + Address data_address = tagged_data & ~kExternalStringResourceDataTag; #else uintptr_t data_address = static_cast<uintptr_t>(resource_data); #endif // V8_ENABLE_SANDBOX @@ -614,6 +623,13 @@ std::unique_ptr<ObjectPropertiesResult> GetHeapObjectPropertiesMaybeCompressed( any_uncompressed_ptr = heap_addresses.old_space_first_page; if (any_uncompressed_ptr == 0) any_uncompressed_ptr = heap_addresses.read_only_space_first_page; +#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE + Address base = + V8HeapCompressionScheme::GetPtrComprCageBaseAddress(any_uncompressed_ptr); + if (base != V8HeapCompressionScheme::base()) { + V8HeapCompressionScheme::InitBase(base); + } +#endif FillInUnknownHeapAddresses(&heap_addresses, any_uncompressed_ptr); if (any_uncompressed_ptr == 0) { // We can't figure out the heap range. Just check for known objects. |