lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
bool stop_others) override;
- bool IsRuntimeSupportValue(ValueObject &valobj) override;
+ bool IsWhitelistedRuntimeValue(ConstString name) override;
protected:
// Classes that inherit from CPPLanguageRuntime can see and modify these
CPPLanguageRuntime(Process *process);
virtual lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
bool stop_others) = 0;
- /// Identify whether a value is a language implementation detaul
- /// that should be hidden from the user interface by default.
- virtual bool IsRuntimeSupportValue(ValueObject &valobj) { return false; }
+ /// Identify whether a name is a runtime value that should not be hidden by
+ /// from the user interface.
+ virtual bool IsWhitelistedRuntimeValue(ConstString name) { return false; }
virtual void ModulesDidLoad(const ModuleList &module_list) {}
/// Check whether the name is "self" or "_cmd" and should show up in
/// "frame variable".
- static bool IsWhitelistedRuntimeValue(ConstString name);
- bool IsRuntimeSupportValue(ValueObject &valobj) override;
+ bool IsWhitelistedRuntimeValue(ConstString name) override;
protected:
// Classes that inherit from ObjCLanguageRuntime can see and modify these
bool ValueObject::IsRuntimeSupportValue() {
Process *process(GetProcessSP().get());
- if (process) {
- LanguageRuntime *runtime =
- process->GetLanguageRuntime(GetObjectRuntimeLanguage());
- if (!runtime)
- runtime = ObjCLanguageRuntime::Get(*process);
- if (runtime)
- return runtime->IsRuntimeSupportValue(*this);
- // If there is no language runtime, trust the compiler to mark all
- // runtime support variables as artificial.
- return GetVariable() && GetVariable()->IsArtificial();
+ if (!process)
+ return false;
+
+ // We trust the the compiler did the right thing and marked runtime support
+ // values as artificial.
+ if (!GetVariable() || !GetVariable()->IsArtificial())
+ return false;
+
+ LanguageType lang = eLanguageTypeUnknown;
+ if (auto *sym_ctx_scope = GetSymbolContextScope()) {
+ if (auto *func = sym_ctx_scope->CalculateSymbolContextFunction())
+ lang = func->GetLanguage();
+ else if (auto *comp_unit =
+ sym_ctx_scope->CalculateSymbolContextCompileUnit())
+ lang = comp_unit->GetLanguage();
}
- return false;
+
+ if (auto *runtime = process->GetLanguageRuntime(lang))
+ if (runtime->IsWhitelistedRuntimeValue(GetName()))
+ return false;
+
+ return true;
}
bool ValueObject::IsNilReference() {
func_name.SetValue(ConstString(mangled), true);
else if ((die.GetParent().Tag() == DW_TAG_compile_unit ||
die.GetParent().Tag() == DW_TAG_partial_unit) &&
- Language::LanguageIsCPlusPlus(die.GetLanguage()) && name &&
+ Language::LanguageIsCPlusPlus(die.GetLanguage()) &&
+ !Language::LanguageIsObjC(die.GetLanguage()) && name &&
strcmp(name, "main") != 0) {
// If the mangled name is not present in the DWARF, generate the
// demangled name using the decl context. We skip if the function is
}
lldb::LanguageType Function::GetLanguage() const {
+ lldb::LanguageType lang = m_mangled.GuessLanguage();
+ if (lang != lldb::eLanguageTypeUnknown)
+ return lang;
+
if (m_comp_unit)
return m_comp_unit->GetLanguage();
- else
- return lldb::eLanguageTypeUnknown;
+
+ return lldb::eLanguageTypeUnknown;
}
ConstString Function::GetName() const {
CPPLanguageRuntime::CPPLanguageRuntime(Process *process)
: LanguageRuntime(process) {}
-bool CPPLanguageRuntime::IsRuntimeSupportValue(ValueObject &valobj) {
- // All runtime support values have to be marked as artificial by the
- // compiler. But not all artificial variables should be hidden from
- // the user.
- if (!valobj.GetVariable())
- return false;
- if (!valobj.GetVariable()->IsArtificial())
- return false;
-
- // Whitelist "this" and since there is no ObjC++ runtime, any ObjC names.
- ConstString name = valobj.GetName();
- if (name == g_this)
- return false;
- return !ObjCLanguageRuntime::IsWhitelistedRuntimeValue(name);
+bool CPPLanguageRuntime::IsWhitelistedRuntimeValue(ConstString name) {
+ return name == g_this;
}
bool CPPLanguageRuntime::GetObjectDescription(Stream &str,
return name == g_self || name == g_cmd;
}
-bool ObjCLanguageRuntime::IsRuntimeSupportValue(ValueObject &valobj) {
- // All runtime support values have to be marked as artificial by the
- // compiler. But not all artificial variables should be hidden from
- // the user.
- if (!valobj.GetVariable())
- return false;
- if (!valobj.GetVariable()->IsArtificial())
- return false;
-
- // Whitelist "self" and "_cmd".
- return !IsWhitelistedRuntimeValue(valobj.GetName());
-}
-
bool ObjCLanguageRuntime::AddClass(ObjCISA isa,
const ClassDescriptorSP &descriptor_sp,
const char *class_name) {