1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- TypeSummary.cpp ----------------------------------------*- C++ -*-===// 2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// The LLVM Compiler Infrastructure 4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source 6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details. 7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===// 9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h" 11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec 12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes 13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes 15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes 17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes 19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-public.h" 20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-enumerations.h" 21f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 22f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/Debugger.h" 23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/StreamString.h" 24f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/Timer.h" 25f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/TypeSummary.h" 26f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Symbol/ClangASTType.h" 28f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Target/StackFrame.h" 29f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Target/Target.h" 30f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 3124c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata#include "lldb/Host/Host.h" 3224c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata 33f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb; 34f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb_private; 35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 36f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl::TypeSummaryImpl (const TypeSummaryImpl::Flags& flags) : 37f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_flags(flags) 38f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 39f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 40f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 42f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::StringSummaryFormat (const TypeSummaryImpl::Flags& flags, 43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char *format_cstr) : 44f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 45f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_format() 46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 47f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (format_cstr) 48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_format.assign(format_cstr); 49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 51f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 52f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::FormatObject (ValueObject *valobj, 53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& retval) 54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!valobj) 56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("NULL ValueObject"); 58f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString s; 62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); 63f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SymbolContext sc; 64f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StackFrame *frame = exe_ctx.GetFramePtr(); 65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (frame) 66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sc = frame->GetSymbolContext(lldb::eSymbolContextEverything); 67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (IsOneliner()) 69f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 70f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject* object; 71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObjectSP synth_valobj = valobj->GetSyntheticValue(); 73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (synth_valobj) 74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata object = synth_valobj.get(); 75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 76f509c5ec066599a3399fced39ea36996184939e8Enrico Granata object = valobj; 77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const uint32_t num_children = object->GetNumChildren(); 79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (num_children) 80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutChar('('); 82f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 83f509c5ec066599a3399fced39ea36996184939e8Enrico Granata for (uint32_t idx=0; idx<num_children; ++idx) 84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata lldb::ValueObjectSP child_sp(object->GetChildAtIndex(idx, true)); 86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (child_sp.get()) 87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (idx) 89f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(", "); 90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!HideNames()) 91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(child_sp.get()->GetName().AsCString()); 93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(" = "); 94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata child_sp.get()->DumpPrintableRepresentation(s, 96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject::eValueObjectRepresentationStyleSummary, 97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata lldb::eFormatInvalid, 98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject::ePrintableRepresentationSpecialCasesDisable); 99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutChar(')'); 103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign(s.GetString()); 105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 109f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: oneliner for no children"); 110f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 11617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (Debugger::FormatPrompt(m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, valobj)) 117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign(s.GetString()); 119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: summary string parsing error"); 124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 129f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 130f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::GetDescription () 131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("`%s`%s%s%s%s%s%s%s", m_format.c_str(), 135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Cascades() ? "" : " (not cascading)", 136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : ""); 142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 145f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags, 146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Callback impl, 147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char* description) : 148f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 149f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_impl(impl), 150f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_description(description ? description : "") 151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 154f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 155f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::FormatObject (ValueObject *valobj, 156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& dest) 157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata dest.clear(); 159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString stream; 160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!m_impl || m_impl(*valobj,stream) == false) 161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata dest.assign(stream.GetData()); 163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 166f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 167f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::GetDescription () 168f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 169f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s", m_description.c_str(),m_impl, 171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Cascades() ? "" : " (not cascading)", 172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 175f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 176f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : ""); 178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 180f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 181f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON 182f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 183f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 184f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::ScriptSummaryFormat (const TypeSummaryImpl::Flags& flags, 185f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char * function_name, 186f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char * python_script) : 187f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 188f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_function_name(), 189f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_python_script(), 190f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_script_function_sp() 191f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 192f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (function_name) 193f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_function_name.assign(function_name); 194f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (python_script) 195f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_python_script.assign(python_script); 196f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 197f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 198f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 199f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::FormatObject (ValueObject *valobj, 200f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& retval) 201f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 202f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 203f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 20424c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata if (!valobj) 20524c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata return false; 20624c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata 20724c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata Host::SetCrashDescriptionWithFormat("[Python summary] Name: %s - Function: %s", 20824c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata valobj->GetName().AsCString("unknown"), 20924c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata m_function_name.c_str()); 21024c80295d7519754a87f579f9425e4a9fcce6b40Enrico Granata 211f509c5ec066599a3399fced39ea36996184939e8Enrico Granata TargetSP target_sp(valobj->GetTargetSP()); 212f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 213f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!target_sp) 214f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 215f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: no target"); 216f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 217f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 218f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 219f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ScriptInterpreter *script_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 220f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 221f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!script_interpreter) 222f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 223f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: no ScriptInterpreter"); 224f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 225f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 226f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 227f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return script_interpreter->GetScriptedSummary(m_function_name.c_str(), 228f509c5ec066599a3399fced39ea36996184939e8Enrico Granata valobj->GetSP(), 229f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_script_function_sp, 230f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval); 231f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 232f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 233f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 234f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 235f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::GetDescription () 236f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 237f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 238f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("%s%s%s%s%s%s%s\n%s", Cascades() ? "" : " (not cascading)", 239f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 240f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 241f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 242f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 243f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 244f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : "", 245f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_python_script.c_str()); 246f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 247f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 248f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 249f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 250f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON 251