2019-09-24 11:56:38 -04:00
|
|
|
// Copyright 2019 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
#include "debug-helper-internal.h"
|
|
|
|
#include "src/common/ptr-compr-inl.h"
|
2020-11-13 12:51:53 +01:00
|
|
|
#include "torque-generated/class-debug-readers.h"
|
2019-09-24 11:56:38 -04:00
|
|
|
|
|
|
|
namespace i = v8::internal;
|
|
|
|
|
2020-05-05 09:19:02 +02:00
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
|
|
|
namespace debug_helper_internal {
|
2019-09-24 11:56:38 -04:00
|
|
|
|
|
|
|
bool IsPointerCompressed(uintptr_t address) {
|
|
|
|
#if COMPRESS_POINTERS_BOOL
|
2021-06-08 14:04:59 +02:00
|
|
|
return address < i::kPtrComprCageReservationSize;
|
2019-09-24 11:56:38 -04:00
|
|
|
#else
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-11-08 15:39:11 +01:00
|
|
|
uintptr_t EnsureDecompressed(uintptr_t address,
|
|
|
|
uintptr_t any_uncompressed_ptr) {
|
2019-09-24 11:56:38 -04:00
|
|
|
if (!COMPRESS_POINTERS_BOOL || !IsPointerCompressed(address)) return address;
|
2023-11-12 00:14:48 +00:00
|
|
|
#ifdef V8_COMPRESS_POINTERS
|
2023-03-30 12:11:08 +02:00
|
|
|
Address base =
|
|
|
|
V8HeapCompressionScheme::GetPtrComprCageBaseAddress(any_uncompressed_ptr);
|
|
|
|
if (base != V8HeapCompressionScheme::base()) {
|
|
|
|
V8HeapCompressionScheme::InitBase(base);
|
|
|
|
}
|
2023-11-12 00:14:48 +00:00
|
|
|
#endif // V8_COMPRESS_POINTERS
|
2022-11-18 09:50:46 +00:00
|
|
|
// TODO(v8:11880): ExternalCodeCompressionScheme might be needed here for
|
|
|
|
// decompressing Code pointers from external code space.
|
2023-03-30 12:11:08 +02:00
|
|
|
return i::V8HeapCompressionScheme::DecompressTagged(
|
2022-11-18 09:50:46 +00:00
|
|
|
any_uncompressed_ptr, static_cast<i::Tagged_t>(address));
|
2019-09-24 11:56:38 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
d::PropertyKind GetArrayKind(d::MemoryAccessResult mem_result) {
|
|
|
|
d::PropertyKind indexed_field_kind{};
|
|
|
|
switch (mem_result) {
|
|
|
|
case d::MemoryAccessResult::kOk:
|
|
|
|
indexed_field_kind = d::PropertyKind::kArrayOfKnownSize;
|
|
|
|
break;
|
|
|
|
case d::MemoryAccessResult::kAddressNotValid:
|
|
|
|
indexed_field_kind =
|
|
|
|
d::PropertyKind::kArrayOfUnknownSizeDueToInvalidMemory;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
indexed_field_kind =
|
|
|
|
d::PropertyKind::kArrayOfUnknownSizeDueToValidButInaccessibleMemory;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return indexed_field_kind;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<std::unique_ptr<ObjectProperty>> TqObject::GetProperties(
|
|
|
|
d::MemoryAccessor accessor) const {
|
|
|
|
return std::vector<std::unique_ptr<ObjectProperty>>();
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* TqObject::GetName() const { return "v8::internal::Object"; }
|
|
|
|
|
|
|
|
void TqObject::Visit(TqObjectVisitor* visitor) const {
|
|
|
|
visitor->VisitObject(this);
|
|
|
|
}
|
|
|
|
|
2019-11-08 15:39:11 +01:00
|
|
|
bool TqObject::IsSuperclassOf(const TqObject* other) const {
|
|
|
|
return GetName() != other->GetName();
|
|
|
|
}
|
|
|
|
|
2020-05-05 09:19:02 +02:00
|
|
|
} // namespace debug_helper_internal
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace v8
|