static bool SwiftOptional_SummaryProvider_Impl (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) { static ConstString g_Some("Some"); static ConstString g_None("None"); ValueObjectSP non_synth_valobj = valobj.GetNonSyntheticValue(); if (!non_synth_valobj) return false; ConstString value(non_synth_valobj->GetValueAsCString()); if (!value) return false; if (value == g_None) { stream.Printf("nil"); return true; } ValueObjectSP value_sp(non_synth_valobj->GetChildMemberWithName(g_Some, true)); if (!value_sp) return false; value_sp = value_sp->GetQualifiedRepresentationIfAvailable(lldb::eDynamicDontRunTarget, true); if (!value_sp) return false; const char* value_summary = value_sp->GetSummaryAsCString(); if (value_summary) stream.Printf("%s",value_summary); else if (lldb_private::DataVisualization::ShouldPrintAsOneLiner(*value_sp.get())) { TypeSummaryImpl::Flags oneliner_flags; oneliner_flags.SetHideItemNames(false).SetCascades(true).SetDontShowChildren(false).SetDontShowValue(false).SetShowMembersOneLiner(true).SetSkipPointers(false).SetSkipReferences(false); StringSummaryFormat oneliner(oneliner_flags, ""); std::string buffer; oneliner.FormatObject(value_sp.get(), buffer, options); stream.Printf("%s",buffer.c_str()); } return true; }
bool lldb_private::formatters::LibcxxFunctionSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); if (!valobj_sp) return false; ExecutionContext exe_ctx(valobj_sp->GetExecutionContextRef()); Process *process = exe_ctx.GetProcessPtr(); if (process == nullptr) return false; CPPLanguageRuntime *cpp_runtime = process->GetCPPLanguageRuntime(); if (!cpp_runtime) return false; CPPLanguageRuntime::LibCppStdFunctionCallableInfo callable_info = cpp_runtime->FindLibCppStdFunctionCallableInfo(valobj_sp); switch (callable_info.callable_case) { case CPPLanguageRuntime::LibCppStdFunctionCallableCase::Invalid: stream.Printf(" __f_ = %" PRIu64, callable_info.member__f_pointer_value); return false; break; case CPPLanguageRuntime::LibCppStdFunctionCallableCase::Lambda: stream.Printf( " Lambda in File %s at Line %u", callable_info.callable_line_entry.file.GetFilename().GetCString(), callable_info.callable_line_entry.line); break; case CPPLanguageRuntime::LibCppStdFunctionCallableCase::CallableObject: stream.Printf( " Function in File %s at Line %u", callable_info.callable_line_entry.file.GetFilename().GetCString(), callable_info.callable_line_entry.line); break; case CPPLanguageRuntime::LibCppStdFunctionCallableCase::FreeOrMemberFunction: stream.Printf(" Function = %s ", callable_info.callable_symbol.GetName().GetCString()); break; } return true; }
bool lldb_private::formatters::LibcxxSmartPointerSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); if (!valobj_sp) return false; ValueObjectSP ptr_sp( valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true)); ValueObjectSP count_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"), ConstString("__shared_owners_")})); ValueObjectSP weakcount_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"), ConstString("__shared_weak_owners_")})); if (!ptr_sp) return false; if (ptr_sp->GetValueAsUnsigned(0) == 0) { stream.Printf("nullptr"); return true; } else { bool print_pointee = false; Status error; ValueObjectSP pointee_sp = ptr_sp->Dereference(error); if (pointee_sp && error.Success()) { if (pointee_sp->DumpPrintableRepresentation( stream, ValueObject::eValueObjectRepresentationStyleSummary, lldb::eFormatInvalid, ValueObject::PrintableRepresentationSpecialCases::eDisable, false)) print_pointee = true; } if (!print_pointee) stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); } if (count_sp) stream.Printf(" strong=%" PRIu64, 1 + count_sp->GetValueAsUnsigned(0)); if (weakcount_sp) stream.Printf(" weak=%" PRIu64, 1 + weakcount_sp->GetValueAsUnsigned(0)); return true; }
bool lldb_private::formatters::LibcxxOptionalSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); if (!valobj_sp) return false; // An optional either contains a value or not, the member __engaged_ is // a bool flag, it is true if the optional has a value and false otherwise. ValueObjectSP engaged_sp( valobj_sp->GetChildMemberWithName(ConstString("__engaged_"), true)); if (!engaged_sp) return false; llvm::StringRef engaged_as_cstring( engaged_sp->GetValueAsUnsigned(0) == 1 ? "true" : "false"); stream.Printf(" Has Value=%s ", engaged_as_cstring.data()); return true; }
bool lldb_private::formatters::LibStdcppSmartPointerSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); if (!valobj_sp) return false; ValueObjectSP ptr_sp( valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true)); if (!ptr_sp) return false; ValueObjectSP usecount_sp(valobj_sp->GetChildAtNamePath( {ConstString("_M_refcount"), ConstString("_M_pi"), ConstString("_M_use_count")})); if (!usecount_sp) return false; if (ptr_sp->GetValueAsUnsigned(0) == 0 || usecount_sp->GetValueAsUnsigned(0) == 0) { stream.Printf("nullptr"); return true; } Error error; ValueObjectSP pointee_sp = ptr_sp->Dereference(error); if (pointee_sp && error.Success()) { if (pointee_sp->DumpPrintableRepresentation( stream, ValueObject::eValueObjectRepresentationStyleSummary, lldb::eFormatInvalid, ValueObject::PrintableRepresentationSpecialCases::eDisable, false)) { return true; } } stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); return true; }