1 //===-- SBTypeCategory.cpp ----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/lldb-python.h"
12 #include "lldb/API/SBTypeCategory.h"
14 #include "lldb/API/SBTypeFilter.h"
15 #include "lldb/API/SBTypeFormat.h"
16 #include "lldb/API/SBTypeSummary.h"
17 #include "lldb/API/SBTypeSynthetic.h"
18 #include "lldb/API/SBTypeNameSpecifier.h"
19 #include "lldb/API/SBStream.h"
21 #include "lldb/Core/Debugger.h"
22 #include "lldb/DataFormatters/DataVisualization.h"
23 #include "lldb/Interpreter/CommandInterpreter.h"
24 #include "lldb/Interpreter/ScriptInterpreter.h"
27 using namespace lldb_private;
29 typedef std::pair<lldb::TypeCategoryImplSP,user_id_t> ImplType;
31 SBTypeCategory::SBTypeCategory() :
36 SBTypeCategory::SBTypeCategory (const char* name) :
39 DataVisualization::Categories::GetCategory(ConstString(name), m_opaque_sp);
42 SBTypeCategory::SBTypeCategory (const lldb::SBTypeCategory &rhs) :
43 m_opaque_sp(rhs.m_opaque_sp)
47 SBTypeCategory::~SBTypeCategory ()
52 SBTypeCategory::IsValid() const
54 return (m_opaque_sp.get() != NULL);
58 SBTypeCategory::GetEnabled ()
62 return m_opaque_sp->IsEnabled();
66 SBTypeCategory::SetEnabled (bool enabled)
71 DataVisualization::Categories::Enable(m_opaque_sp);
73 DataVisualization::Categories::Disable(m_opaque_sp);
77 SBTypeCategory::GetName()
81 return m_opaque_sp->GetName();
85 SBTypeCategory::GetNumFormats ()
90 return m_opaque_sp->GetTypeFormatsContainer()->GetCount() + m_opaque_sp->GetRegexTypeFormatsContainer()->GetCount();
94 SBTypeCategory::GetNumSummaries ()
98 return m_opaque_sp->GetTypeSummariesContainer()->GetCount() + m_opaque_sp->GetRegexTypeSummariesContainer()->GetCount();
102 SBTypeCategory::GetNumFilters ()
106 return m_opaque_sp->GetTypeFiltersContainer()->GetCount() + m_opaque_sp->GetRegexTypeFiltersContainer()->GetCount();
109 #ifndef LLDB_DISABLE_PYTHON
111 SBTypeCategory::GetNumSynthetics ()
115 return m_opaque_sp->GetTypeSyntheticsContainer()->GetCount() + m_opaque_sp->GetRegexTypeSyntheticsContainer()->GetCount();
119 lldb::SBTypeNameSpecifier
120 SBTypeCategory::GetTypeNameSpecifierForFilterAtIndex (uint32_t index)
123 return SBTypeNameSpecifier();
124 return SBTypeNameSpecifier(m_opaque_sp->GetTypeNameSpecifierForFilterAtIndex(index));
127 lldb::SBTypeNameSpecifier
128 SBTypeCategory::GetTypeNameSpecifierForFormatAtIndex (uint32_t index)
131 return SBTypeNameSpecifier();
132 return SBTypeNameSpecifier(m_opaque_sp->GetTypeNameSpecifierForFormatAtIndex(index));
135 lldb::SBTypeNameSpecifier
136 SBTypeCategory::GetTypeNameSpecifierForSummaryAtIndex (uint32_t index)
139 return SBTypeNameSpecifier();
140 return SBTypeNameSpecifier(m_opaque_sp->GetTypeNameSpecifierForSummaryAtIndex(index));
143 #ifndef LLDB_DISABLE_PYTHON
144 lldb::SBTypeNameSpecifier
145 SBTypeCategory::GetTypeNameSpecifierForSyntheticAtIndex (uint32_t index)
148 return SBTypeNameSpecifier();
149 return SBTypeNameSpecifier(m_opaque_sp->GetTypeNameSpecifierForSyntheticAtIndex(index));
154 SBTypeCategory::GetFilterForType (SBTypeNameSpecifier spec)
157 return SBTypeFilter();
160 return SBTypeFilter();
162 lldb::SyntheticChildrenSP children_sp;
165 m_opaque_sp->GetRegexTypeFiltersContainer()->GetExact(ConstString(spec.GetName()), children_sp);
167 m_opaque_sp->GetTypeFiltersContainer()->GetExact(ConstString(spec.GetName()), children_sp);
170 return lldb::SBTypeFilter();
172 TypeFilterImplSP filter_sp = std::static_pointer_cast<TypeFilterImpl>(children_sp);
174 return lldb::SBTypeFilter(filter_sp);
178 SBTypeCategory::GetFormatForType (SBTypeNameSpecifier spec)
181 return SBTypeFormat();
184 return SBTypeFormat();
186 lldb::TypeFormatImplSP format_sp;
189 m_opaque_sp->GetRegexTypeFormatsContainer()->GetExact(ConstString(spec.GetName()), format_sp);
191 m_opaque_sp->GetTypeFormatsContainer()->GetExact(ConstString(spec.GetName()), format_sp);
194 return lldb::SBTypeFormat();
196 return lldb::SBTypeFormat(format_sp);
199 #ifndef LLDB_DISABLE_PYTHON
201 SBTypeCategory::GetSummaryForType (SBTypeNameSpecifier spec)
204 return SBTypeSummary();
207 return SBTypeSummary();
209 lldb::TypeSummaryImplSP summary_sp;
212 m_opaque_sp->GetRegexTypeSummariesContainer()->GetExact(ConstString(spec.GetName()), summary_sp);
214 m_opaque_sp->GetTypeSummariesContainer()->GetExact(ConstString(spec.GetName()), summary_sp);
217 return lldb::SBTypeSummary();
219 return lldb::SBTypeSummary(summary_sp);
221 #endif // LLDB_DISABLE_PYTHON
223 #ifndef LLDB_DISABLE_PYTHON
225 SBTypeCategory::GetSyntheticForType (SBTypeNameSpecifier spec)
228 return SBTypeSynthetic();
231 return SBTypeSynthetic();
233 lldb::SyntheticChildrenSP children_sp;
236 m_opaque_sp->GetRegexTypeSyntheticsContainer()->GetExact(ConstString(spec.GetName()), children_sp);
238 m_opaque_sp->GetTypeSyntheticsContainer()->GetExact(ConstString(spec.GetName()), children_sp);
241 return lldb::SBTypeSynthetic();
243 ScriptedSyntheticChildrenSP synth_sp = std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
245 return lldb::SBTypeSynthetic(synth_sp);
249 #ifndef LLDB_DISABLE_PYTHON
251 SBTypeCategory::GetFilterAtIndex (uint32_t index)
254 return SBTypeFilter();
255 lldb::SyntheticChildrenSP children_sp = m_opaque_sp->GetSyntheticAtIndex((index));
257 if (!children_sp.get())
258 return lldb::SBTypeFilter();
260 TypeFilterImplSP filter_sp = std::static_pointer_cast<TypeFilterImpl>(children_sp);
262 return lldb::SBTypeFilter(filter_sp);
267 SBTypeCategory::GetFormatAtIndex (uint32_t index)
270 return SBTypeFormat();
271 return SBTypeFormat(m_opaque_sp->GetFormatAtIndex((index)));
274 #ifndef LLDB_DISABLE_PYTHON
276 SBTypeCategory::GetSummaryAtIndex (uint32_t index)
279 return SBTypeSummary();
280 return SBTypeSummary(m_opaque_sp->GetSummaryAtIndex((index)));
284 #ifndef LLDB_DISABLE_PYTHON
286 SBTypeCategory::GetSyntheticAtIndex (uint32_t index)
289 return SBTypeSynthetic();
290 lldb::SyntheticChildrenSP children_sp = m_opaque_sp->GetSyntheticAtIndex((index));
292 if (!children_sp.get())
293 return lldb::SBTypeSynthetic();
295 ScriptedSyntheticChildrenSP synth_sp = std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
297 return lldb::SBTypeSynthetic(synth_sp);
302 SBTypeCategory::AddTypeFormat (SBTypeNameSpecifier type_name,
308 if (!type_name.IsValid())
311 if (!format.IsValid())
314 if (type_name.IsRegex())
315 m_opaque_sp->GetRegexTypeFormatsContainer()->Add(lldb::RegularExpressionSP(new RegularExpression(type_name.GetName())), format.GetSP());
317 m_opaque_sp->GetTypeFormatsContainer()->Add(ConstString(type_name.GetName()), format.GetSP());
323 SBTypeCategory::DeleteTypeFormat (SBTypeNameSpecifier type_name)
328 if (!type_name.IsValid())
331 if (type_name.IsRegex())
332 return m_opaque_sp->GetRegexTypeFormatsContainer()->Delete(ConstString(type_name.GetName()));
334 return m_opaque_sp->GetTypeFormatsContainer()->Delete(ConstString(type_name.GetName()));
337 #ifndef LLDB_DISABLE_PYTHON
339 SBTypeCategory::AddTypeSummary (SBTypeNameSpecifier type_name,
340 SBTypeSummary summary)
345 if (!type_name.IsValid())
348 if (!summary.IsValid())
351 // FIXME: we need to iterate over all the Debugger objects and have each of them contain a copy of the function
352 // since we currently have formatters live in a global space, while Python code lives in a specific Debugger-related environment
353 // this should eventually be fixed by deciding a final location in the LLDB object space for formatters
354 if (summary.IsFunctionCode())
356 void *name_token = (void*)ConstString(type_name.GetName()).GetCString();
357 const char* script = summary.GetData();
358 StringList input; input.SplitIntoLines(script, strlen(script));
359 uint32_t num_debuggers = lldb_private::Debugger::GetNumDebuggers();
360 bool need_set = true;
365 DebuggerSP debugger_sp = lldb_private::Debugger::GetDebuggerAtIndex(j);
368 ScriptInterpreter* interpreter_ptr = debugger_sp->GetCommandInterpreter().GetScriptInterpreter();
372 if (interpreter_ptr->GenerateTypeScriptFunction(input, output, name_token) && !output.empty())
377 summary.SetFunctionName(output.c_str());
385 if (type_name.IsRegex())
386 m_opaque_sp->GetRegexTypeSummariesContainer()->Add(lldb::RegularExpressionSP(new RegularExpression(type_name.GetName())), summary.GetSP());
388 m_opaque_sp->GetTypeSummariesContainer()->Add(ConstString(type_name.GetName()), summary.GetSP());
395 SBTypeCategory::DeleteTypeSummary (SBTypeNameSpecifier type_name)
400 if (!type_name.IsValid())
403 if (type_name.IsRegex())
404 return m_opaque_sp->GetRegexTypeSummariesContainer()->Delete(ConstString(type_name.GetName()));
406 return m_opaque_sp->GetTypeSummariesContainer()->Delete(ConstString(type_name.GetName()));
410 SBTypeCategory::AddTypeFilter (SBTypeNameSpecifier type_name,
416 if (!type_name.IsValid())
419 if (!filter.IsValid())
422 if (type_name.IsRegex())
423 m_opaque_sp->GetRegexTypeFiltersContainer()->Add(lldb::RegularExpressionSP(new RegularExpression(type_name.GetName())), filter.GetSP());
425 m_opaque_sp->GetTypeFiltersContainer()->Add(ConstString(type_name.GetName()), filter.GetSP());
431 SBTypeCategory::DeleteTypeFilter (SBTypeNameSpecifier type_name)
436 if (!type_name.IsValid())
439 if (type_name.IsRegex())
440 return m_opaque_sp->GetRegexTypeFiltersContainer()->Delete(ConstString(type_name.GetName()));
442 return m_opaque_sp->GetTypeFiltersContainer()->Delete(ConstString(type_name.GetName()));
445 #ifndef LLDB_DISABLE_PYTHON
447 SBTypeCategory::AddTypeSynthetic (SBTypeNameSpecifier type_name,
448 SBTypeSynthetic synth)
453 if (!type_name.IsValid())
456 if (!synth.IsValid())
459 // FIXME: we need to iterate over all the Debugger objects and have each of them contain a copy of the function
460 // since we currently have formatters live in a global space, while Python code lives in a specific Debugger-related environment
461 // this should eventually be fixed by deciding a final location in the LLDB object space for formatters
462 if (synth.IsClassCode())
464 void *name_token = (void*)ConstString(type_name.GetName()).GetCString();
465 const char* script = synth.GetData();
466 StringList input; input.SplitIntoLines(script, strlen(script));
467 uint32_t num_debuggers = lldb_private::Debugger::GetNumDebuggers();
468 bool need_set = true;
473 DebuggerSP debugger_sp = lldb_private::Debugger::GetDebuggerAtIndex(j);
476 ScriptInterpreter* interpreter_ptr = debugger_sp->GetCommandInterpreter().GetScriptInterpreter();
480 if (interpreter_ptr->GenerateTypeSynthClass(input, output, name_token) && !output.empty())
485 synth.SetClassName(output.c_str());
493 if (type_name.IsRegex())
494 m_opaque_sp->GetRegexTypeSyntheticsContainer()->Add(lldb::RegularExpressionSP(new RegularExpression(type_name.GetName())), synth.GetSP());
496 m_opaque_sp->GetTypeSyntheticsContainer()->Add(ConstString(type_name.GetName()), synth.GetSP());
502 SBTypeCategory::DeleteTypeSynthetic (SBTypeNameSpecifier type_name)
507 if (!type_name.IsValid())
510 if (type_name.IsRegex())
511 return m_opaque_sp->GetRegexTypeSyntheticsContainer()->Delete(ConstString(type_name.GetName()));
513 return m_opaque_sp->GetTypeSyntheticsContainer()->Delete(ConstString(type_name.GetName()));
515 #endif // LLDB_DISABLE_PYTHON
518 SBTypeCategory::GetDescription (lldb::SBStream &description,
519 lldb::DescriptionLevel description_level)
523 description.Printf("Category name: %s\n",GetName());
527 lldb::SBTypeCategory &
528 SBTypeCategory::operator = (const lldb::SBTypeCategory &rhs)
532 m_opaque_sp = rhs.m_opaque_sp;
538 SBTypeCategory::operator == (lldb::SBTypeCategory &rhs)
540 if (IsValid() == false)
541 return !rhs.IsValid();
543 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
548 SBTypeCategory::operator != (lldb::SBTypeCategory &rhs)
550 if (IsValid() == false)
551 return rhs.IsValid();
553 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
556 lldb::TypeCategoryImplSP
557 SBTypeCategory::GetSP ()
560 return lldb::TypeCategoryImplSP();
565 SBTypeCategory::SetSP (const lldb::TypeCategoryImplSP &typecategory_impl_sp)
567 m_opaque_sp = typecategory_impl_sp;
570 SBTypeCategory::SBTypeCategory (const lldb::TypeCategoryImplSP &typecategory_impl_sp) :
571 m_opaque_sp(typecategory_impl_sp)
576 SBTypeCategory::IsDefaultCategory()
581 return (strcmp(m_opaque_sp->GetName(),"default") == 0);