blob: f66533b448d2f4fae557dc584bf272f67e4827e6 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/developer/debug/zxdb/symbols/member_ptr.h"
#include "src/developer/debug/zxdb/symbols/arch.h"
#include "src/developer/debug/zxdb/symbols/function_type.h"
namespace zxdb {
MemberPtr::MemberPtr(LazySymbol container_type, LazySymbol member_type)
: Type(DwarfTag::kPtrToMemberType),
container_type_(std::move(container_type)),
member_type_(std::move(member_type)) {
set_byte_size(kTargetPointerSize);
}
MemberPtr::~MemberPtr() = default;
const MemberPtr* MemberPtr::AsMemberPtr() const { return this; }
std::string MemberPtr::ComputeFullName() const {
const Type* member = member_type_.Get()->As<Type>();
if (!member)
return "<invalid>";
std::string container_name;
if (const Type* container = container_type_.Get()->As<Type>()) {
container_name = container->GetFullName();
} else {
// Can still compute function description from the type when the container is bad.
container_name = "<invalid>";
}
// Special-case pointer-to-member-functions.
if (const FunctionType* func = member->As<FunctionType>())
return func->ComputeFullNameForFunctionPtr(container_name);
// Everything else is a pointer to member data.
return member->GetFullName() + " " + container_name + "::*";
}
} // namespace zxdb