blob: b2909328d4ba5a0cb28db3458fbe4a94a9360cd0 [file] [log] [blame]
Greg Clayton5c28dd12011-06-23 17:59:56 +00001//===-- CommandObjectType.cpp ----------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "CommandObjectType.h"
11
12// C Includes
Enrico Granata9ae7cef2011-07-24 00:14:56 +000013
14#include <ctype.h>
15
Greg Clayton5c28dd12011-06-23 17:59:56 +000016// C++ Includes
17
Enrico Granata0be2e9b2011-08-22 22:03:47 +000018#include "lldb/Core/DataVisualization.h"
Greg Clayton5c28dd12011-06-23 17:59:56 +000019#include "lldb/Core/ConstString.h"
20#include "lldb/Core/Debugger.h"
Enrico Granataf7a9b142011-07-15 02:26:42 +000021#include "lldb/Core/InputReaderEZ.h"
Enrico Granata886bc3e2011-07-02 00:25:22 +000022#include "lldb/Core/RegularExpression.h"
Greg Clayton3182eff2011-06-23 21:22:24 +000023#include "lldb/Core/State.h"
Enrico Granataf7a9b142011-07-15 02:26:42 +000024#include "lldb/Core/StringList.h"
Greg Clayton5c28dd12011-06-23 17:59:56 +000025#include "lldb/Interpreter/CommandInterpreter.h"
26#include "lldb/Interpreter/CommandObject.h"
27#include "lldb/Interpreter/CommandReturnObject.h"
28#include "lldb/Interpreter/Options.h"
Greg Claytona42880a2011-10-25 06:44:01 +000029#include "lldb/Interpreter/OptionGroupFormat.h"
Greg Clayton5c28dd12011-06-23 17:59:56 +000030
31using namespace lldb;
32using namespace lldb_private;
33
Greg Clayton5c28dd12011-06-23 17:59:56 +000034
Greg Claytona42880a2011-10-25 06:44:01 +000035class ScriptAddOptions
36{
37
38public:
39
Enrico Granata16376ed2012-02-15 02:34:21 +000040 TypeSummaryImpl::Flags m_flags;
Enrico Granata2f2c2772012-02-02 23:34:52 +000041
Greg Claytona42880a2011-10-25 06:44:01 +000042 StringList m_target_types;
43 StringList m_user_source;
44
Greg Claytona42880a2011-10-25 06:44:01 +000045 bool m_regex;
Enrico Granata2f2c2772012-02-02 23:34:52 +000046
Greg Clayton3e4238d2011-11-04 03:34:56 +000047 ConstString m_name;
Greg Claytona42880a2011-10-25 06:44:01 +000048
49 std::string m_category;
50
Enrico Granata16376ed2012-02-15 02:34:21 +000051 ScriptAddOptions(const TypeSummaryImpl::Flags& flags,
Greg Claytona42880a2011-10-25 06:44:01 +000052 bool regx,
Greg Clayton3e4238d2011-11-04 03:34:56 +000053 const ConstString& name,
Greg Claytona42880a2011-10-25 06:44:01 +000054 std::string catg) :
Enrico Granata2f2c2772012-02-02 23:34:52 +000055 m_flags(flags),
Greg Clayton3e4238d2011-11-04 03:34:56 +000056 m_regex(regx),
57 m_name(name),
58 m_category(catg)
Greg Claytona42880a2011-10-25 06:44:01 +000059 {
60 }
61
Greg Clayton598df882012-03-14 03:07:05 +000062 typedef STD_SHARED_PTR(ScriptAddOptions) SharedPointer;
Greg Claytona42880a2011-10-25 06:44:01 +000063
64};
65
66class SynthAddOptions
67{
68
69public:
70
71 bool m_skip_pointers;
72 bool m_skip_references;
73 bool m_cascade;
74 bool m_regex;
75 StringList m_user_source;
76 StringList m_target_types;
77
78 std::string m_category;
79
80 SynthAddOptions(bool sptr,
81 bool sref,
82 bool casc,
83 bool regx,
84 std::string catg) :
85 m_skip_pointers(sptr),
86 m_skip_references(sref),
87 m_cascade(casc),
88 m_regex(regx),
89 m_user_source(),
90 m_target_types(),
91 m_category(catg)
92 {
93 }
94
Greg Clayton598df882012-03-14 03:07:05 +000095 typedef STD_SHARED_PTR(SynthAddOptions) SharedPointer;
Greg Claytona42880a2011-10-25 06:44:01 +000096
97};
98
99
100
Jim Inghamda26bd22012-06-08 21:56:10 +0000101class CommandObjectTypeSummaryAdd : public CommandObjectParsed
Greg Claytona42880a2011-10-25 06:44:01 +0000102{
103
104private:
105
106 class CommandOptions : public Options
107 {
108 public:
109
110 CommandOptions (CommandInterpreter &interpreter) :
111 Options (interpreter)
112 {
113 }
114
115 virtual
116 ~CommandOptions (){}
117
118 virtual Error
119 SetOptionValue (uint32_t option_idx, const char *option_arg);
120
121 void
122 OptionParsingStarting ();
123
124 const OptionDefinition*
125 GetDefinitions ()
126 {
127 return g_option_table;
128 }
129
130 // Options table: Required for subclasses of Options.
131
132 static OptionDefinition g_option_table[];
133
134 // Instance variables to hold the values for command options.
135
Enrico Granata16376ed2012-02-15 02:34:21 +0000136 TypeSummaryImpl::Flags m_flags;
Greg Claytona42880a2011-10-25 06:44:01 +0000137 bool m_regex;
138 std::string m_format_string;
Greg Clayton3e4238d2011-11-04 03:34:56 +0000139 ConstString m_name;
Greg Claytona42880a2011-10-25 06:44:01 +0000140 std::string m_python_script;
141 std::string m_python_function;
142 bool m_is_add_script;
143 std::string m_category;
144 };
145
146 CommandOptions m_options;
147
148 virtual Options *
149 GetOptions ()
150 {
151 return &m_options;
152 }
153
154 void
155 CollectPythonScript(ScriptAddOptions *options,
156 CommandReturnObject &result);
157
158 bool
159 Execute_ScriptSummary (Args& command, CommandReturnObject &result);
160
161 bool
162 Execute_StringSummary (Args& command, CommandReturnObject &result);
163
164public:
165
166 enum SummaryFormatType
167 {
168 eRegularSummary,
169 eRegexSummary,
170 eNamedSummary
171 };
172
173 CommandObjectTypeSummaryAdd (CommandInterpreter &interpreter);
174
175 ~CommandObjectTypeSummaryAdd ()
176 {
177 }
178
Greg Claytona42880a2011-10-25 06:44:01 +0000179 static bool
180 AddSummary(const ConstString& type_name,
Enrico Granata16376ed2012-02-15 02:34:21 +0000181 lldb::TypeSummaryImplSP entry,
Greg Claytona42880a2011-10-25 06:44:01 +0000182 SummaryFormatType type,
183 std::string category,
184 Error* error = NULL);
Jim Inghamda26bd22012-06-08 21:56:10 +0000185protected:
186 bool
187 DoExecute (Args& command, CommandReturnObject &result);
188
Greg Claytona42880a2011-10-25 06:44:01 +0000189};
190
Jim Inghamda26bd22012-06-08 21:56:10 +0000191class CommandObjectTypeSynthAdd : public CommandObjectParsed
Greg Clayton5c28dd12011-06-23 17:59:56 +0000192{
193
194private:
195
196 class CommandOptions : public Options
197 {
198 public:
199
200 CommandOptions (CommandInterpreter &interpreter) :
201 Options (interpreter)
202 {
203 }
204
205 virtual
206 ~CommandOptions (){}
207
208 virtual Error
209 SetOptionValue (uint32_t option_idx, const char *option_arg)
210 {
211 Error error;
212 char short_option = (char) m_getopt_table[option_idx].val;
213 bool success;
214
215 switch (short_option)
216 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000217 case 'C':
Greg Clayton5c28dd12011-06-23 17:59:56 +0000218 m_cascade = Args::StringToBoolean(option_arg, true, &success);
219 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +0000220 error.SetErrorStringWithFormat("invalid value for cascade: %s", option_arg);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000221 break;
Greg Claytona42880a2011-10-25 06:44:01 +0000222 case 'P':
223 handwrite_python = true;
224 break;
225 case 'l':
226 m_class_name = std::string(option_arg);
227 is_class_based = true;
Enrico Granata886bc3e2011-07-02 00:25:22 +0000228 break;
Enrico Granata1bba6e52011-07-07 00:38:40 +0000229 case 'p':
230 m_skip_pointers = true;
231 break;
232 case 'r':
233 m_skip_references = true;
234 break;
Greg Claytona42880a2011-10-25 06:44:01 +0000235 case 'w':
236 m_category = std::string(option_arg);
237 break;
238 case 'x':
239 m_regex = true;
240 break;
Greg Clayton5c28dd12011-06-23 17:59:56 +0000241 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000242 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000243 break;
244 }
245
246 return error;
247 }
248
249 void
250 OptionParsingStarting ()
251 {
252 m_cascade = true;
Greg Claytona42880a2011-10-25 06:44:01 +0000253 m_class_name = "";
Enrico Granata1bba6e52011-07-07 00:38:40 +0000254 m_skip_pointers = false;
255 m_skip_references = false;
Greg Claytona42880a2011-10-25 06:44:01 +0000256 m_category = "default";
257 is_class_based = false;
258 handwrite_python = false;
259 m_regex = false;
Greg Clayton5c28dd12011-06-23 17:59:56 +0000260 }
261
262 const OptionDefinition*
263 GetDefinitions ()
264 {
265 return g_option_table;
266 }
267
268 // Options table: Required for subclasses of Options.
269
270 static OptionDefinition g_option_table[];
271
272 // Instance variables to hold the values for command options.
273
274 bool m_cascade;
Enrico Granata1bba6e52011-07-07 00:38:40 +0000275 bool m_skip_references;
276 bool m_skip_pointers;
Greg Claytona42880a2011-10-25 06:44:01 +0000277 std::string m_class_name;
278 bool m_input_python;
279 std::string m_category;
280
281 bool is_class_based;
282
283 bool handwrite_python;
284
285 bool m_regex;
286
Greg Clayton5c28dd12011-06-23 17:59:56 +0000287 };
288
289 CommandOptions m_options;
290
291 virtual Options *
292 GetOptions ()
293 {
294 return &m_options;
295 }
296
Greg Claytona42880a2011-10-25 06:44:01 +0000297 void
298 CollectPythonScript (SynthAddOptions *options,
299 CommandReturnObject &result);
300 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000301 Execute_HandwritePython (Args& command, CommandReturnObject &result);
Greg Claytona42880a2011-10-25 06:44:01 +0000302
303 bool
304 Execute_PythonClass (Args& command, CommandReturnObject &result);
305
Jim Inghamda26bd22012-06-08 21:56:10 +0000306protected:
Greg Claytona42880a2011-10-25 06:44:01 +0000307 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000308 DoExecute (Args& command, CommandReturnObject &result);
Greg Claytona42880a2011-10-25 06:44:01 +0000309
310public:
311
312 enum SynthFormatType
313 {
314 eRegularSynth,
315 eRegexSynth
316 };
317
318 CommandObjectTypeSynthAdd (CommandInterpreter &interpreter);
319
320 ~CommandObjectTypeSynthAdd ()
321 {
322 }
323
324 static bool
325 AddSynth(const ConstString& type_name,
326 lldb::SyntheticChildrenSP entry,
327 SynthFormatType type,
328 std::string category_name,
329 Error* error);
330};
331
332//-------------------------------------------------------------------------
333// CommandObjectTypeFormatAdd
334//-------------------------------------------------------------------------
335
Jim Inghamda26bd22012-06-08 21:56:10 +0000336class CommandObjectTypeFormatAdd : public CommandObjectParsed
Greg Claytona42880a2011-10-25 06:44:01 +0000337{
338
339private:
340
341 class CommandOptions : public OptionGroup
342 {
343 public:
344
345 CommandOptions () :
346 OptionGroup()
347 {
348 }
349
350 virtual
351 ~CommandOptions ()
352 {
353 }
354
355 virtual uint32_t
356 GetNumDefinitions ();
357
358 virtual const OptionDefinition*
359 GetDefinitions ()
360 {
361 return g_option_table;
362 }
363
364 virtual void
365 OptionParsingStarting (CommandInterpreter &interpreter)
366 {
367 m_cascade = true;
368 m_skip_pointers = false;
369 m_skip_references = false;
370 }
371 virtual Error
372 SetOptionValue (CommandInterpreter &interpreter,
373 uint32_t option_idx,
374 const char *option_value)
375 {
376 Error error;
377 const char short_option = (char) g_option_table[option_idx].short_option;
378 bool success;
379
380 switch (short_option)
381 {
382 case 'C':
383 m_cascade = Args::StringToBoolean(option_value, true, &success);
384 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +0000385 error.SetErrorStringWithFormat("invalid value for cascade: %s", option_value);
Greg Claytona42880a2011-10-25 06:44:01 +0000386 break;
387 case 'p':
388 m_skip_pointers = true;
389 break;
390 case 'r':
391 m_skip_references = true;
392 break;
393 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000394 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Greg Claytona42880a2011-10-25 06:44:01 +0000395 break;
396 }
397
398 return error;
399 }
400
401 // Options table: Required for subclasses of Options.
402
403 static OptionDefinition g_option_table[];
404
405 // Instance variables to hold the values for command options.
406
407 bool m_cascade;
408 bool m_skip_references;
409 bool m_skip_pointers;
410 };
411
412 OptionGroupOptions m_option_group;
413 OptionGroupFormat m_format_options;
414 CommandOptions m_command_options;
415
416 virtual Options *
417 GetOptions ()
418 {
419 return &m_option_group;
420 }
421
Greg Clayton5c28dd12011-06-23 17:59:56 +0000422public:
Enrico Granata1391a392011-06-29 22:27:15 +0000423 CommandObjectTypeFormatAdd (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000424 CommandObjectParsed (interpreter,
425 "type format add",
426 "Add a new formatting style for a type.",
427 NULL),
Greg Claytona42880a2011-10-25 06:44:01 +0000428 m_option_group (interpreter),
429 m_format_options (eFormatInvalid),
430 m_command_options ()
Greg Clayton5c28dd12011-06-23 17:59:56 +0000431 {
Greg Clayton5c28dd12011-06-23 17:59:56 +0000432 CommandArgumentEntry type_arg;
433 CommandArgumentData type_style_arg;
434
Greg Clayton5c28dd12011-06-23 17:59:56 +0000435 type_style_arg.arg_type = eArgTypeName;
436 type_style_arg.arg_repetition = eArgRepeatPlus;
437
Greg Clayton5c28dd12011-06-23 17:59:56 +0000438 type_arg.push_back (type_style_arg);
Enrico Granata886bc3e2011-07-02 00:25:22 +0000439
Greg Clayton5c28dd12011-06-23 17:59:56 +0000440 m_arguments.push_back (type_arg);
Enrico Granata1bba6e52011-07-07 00:38:40 +0000441
442 SetHelpLong(
443 "Some examples of using this command.\n"
444 "We use as reference the following snippet of code:\n"
445 "\n"
446 "typedef int Aint;\n"
447 "typedef float Afloat;\n"
448 "typedef Aint Bint;\n"
449 "typedef Afloat Bfloat;\n"
450 "\n"
451 "Aint ix = 5;\n"
452 "Bint iy = 5;\n"
453 "\n"
454 "Afloat fx = 3.14;\n"
455 "BFloat fy = 3.14;\n"
456 "\n"
457 "Typing:\n"
458 "type format add -f hex AInt\n"
459 "frame variable iy\n"
460 "will produce an hex display of iy, because no formatter is available for Bint and the one for Aint is used instead\n"
461 "To prevent this type\n"
462 "type format add -f hex -C no AInt\n"
463 "\n"
464 "A similar reasoning applies to\n"
465 "type format add -f hex -C no float -p\n"
466 "which now prints all floats and float&s as hexadecimal, but does not format float*s\n"
467 "and does not change the default display for Afloat and Bfloat objects.\n"
468 );
Greg Claytona42880a2011-10-25 06:44:01 +0000469
470 // Add the "--format" to all options groups
471 m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT, LLDB_OPT_SET_ALL);
472 m_option_group.Append (&m_command_options);
473 m_option_group.Finalize();
474
Greg Clayton5c28dd12011-06-23 17:59:56 +0000475 }
476
Enrico Granata1391a392011-06-29 22:27:15 +0000477 ~CommandObjectTypeFormatAdd ()
Greg Clayton5c28dd12011-06-23 17:59:56 +0000478 {
479 }
480
Jim Inghamda26bd22012-06-08 21:56:10 +0000481protected:
Greg Clayton5c28dd12011-06-23 17:59:56 +0000482 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000483 DoExecute (Args& command, CommandReturnObject &result)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000484 {
485 const size_t argc = command.GetArgumentCount();
486
Enrico Granata886bc3e2011-07-02 00:25:22 +0000487 if (argc < 1)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000488 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000489 result.AppendErrorWithFormat ("%s takes one or more args.\n", m_cmd_name.c_str());
Greg Clayton5c28dd12011-06-23 17:59:56 +0000490 result.SetStatus(eReturnStatusFailed);
491 return false;
492 }
493
Greg Claytona42880a2011-10-25 06:44:01 +0000494 const Format format = m_format_options.GetFormat();
495 if (format == eFormatInvalid)
Enrico Granata1391a392011-06-29 22:27:15 +0000496 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000497 result.AppendErrorWithFormat ("%s needs a valid format.\n", m_cmd_name.c_str());
Enrico Granata1391a392011-06-29 22:27:15 +0000498 result.SetStatus(eReturnStatusFailed);
499 return false;
500 }
501
Enrico Granata16376ed2012-02-15 02:34:21 +0000502 TypeFormatImplSP entry;
Enrico Granata1391a392011-06-29 22:27:15 +0000503
Enrico Granata16376ed2012-02-15 02:34:21 +0000504 entry.reset(new TypeFormatImpl(format,
505 TypeFormatImpl::Flags().SetCascades(m_command_options.m_cascade).
506 SetSkipPointers(m_command_options.m_skip_pointers).
507 SetSkipReferences(m_command_options.m_skip_references)));
Enrico Granata1391a392011-06-29 22:27:15 +0000508
Greg Clayton5c28dd12011-06-23 17:59:56 +0000509 // now I have a valid format, let's add it to every type
510
Enrico Granata1c617432011-08-18 16:38:26 +0000511 for (size_t i = 0; i < argc; i++)
512 {
Greg Clayton5c28dd12011-06-23 17:59:56 +0000513 const char* typeA = command.GetArgumentAtIndex(i);
514 ConstString typeCS(typeA);
Enrico Granata1391a392011-06-29 22:27:15 +0000515 if (typeCS)
Enrico Granataf501c592011-08-17 22:13:59 +0000516 DataVisualization::ValueFormats::Add(typeCS, entry);
Enrico Granata1391a392011-06-29 22:27:15 +0000517 else
518 {
519 result.AppendError("empty typenames not allowed");
520 result.SetStatus(eReturnStatusFailed);
521 return false;
522 }
Greg Clayton5c28dd12011-06-23 17:59:56 +0000523 }
524
Johnny Chenfcfc1182011-06-23 23:14:10 +0000525 result.SetStatus(eReturnStatusSuccessFinishNoResult);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000526 return result.Succeeded();
527 }
Greg Clayton5c28dd12011-06-23 17:59:56 +0000528};
529
530OptionDefinition
Enrico Granata1391a392011-06-29 22:27:15 +0000531CommandObjectTypeFormatAdd::CommandOptions::g_option_table[] =
Greg Clayton5c28dd12011-06-23 17:59:56 +0000532{
Enrico Granataf2cb7f22012-03-22 19:55:55 +0000533 { LLDB_OPT_SET_ALL, false, "cascade", 'C', required_argument, NULL, 0, eArgTypeBoolean, "If true, cascade through typedef chains."},
Enrico Granata979e20d2011-07-29 19:53:35 +0000534 { LLDB_OPT_SET_ALL, false, "skip-pointers", 'p', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for pointers-to-type objects."},
535 { LLDB_OPT_SET_ALL, false, "skip-references", 'r', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for references-to-type objects."},
Greg Clayton5c28dd12011-06-23 17:59:56 +0000536};
537
538
Greg Claytona42880a2011-10-25 06:44:01 +0000539uint32_t
540CommandObjectTypeFormatAdd::CommandOptions::GetNumDefinitions ()
541{
542 return sizeof(g_option_table) / sizeof (OptionDefinition);
543}
544
545
Greg Clayton5c28dd12011-06-23 17:59:56 +0000546//-------------------------------------------------------------------------
Enrico Granata1391a392011-06-29 22:27:15 +0000547// CommandObjectTypeFormatDelete
Greg Clayton5c28dd12011-06-23 17:59:56 +0000548//-------------------------------------------------------------------------
549
Jim Inghamda26bd22012-06-08 21:56:10 +0000550class CommandObjectTypeFormatDelete : public CommandObjectParsed
Greg Clayton5c28dd12011-06-23 17:59:56 +0000551{
552public:
Enrico Granata1391a392011-06-29 22:27:15 +0000553 CommandObjectTypeFormatDelete (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000554 CommandObjectParsed (interpreter,
555 "type format delete",
556 "Delete an existing formatting style for a type.",
557 NULL)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000558 {
559 CommandArgumentEntry type_arg;
560 CommandArgumentData type_style_arg;
Enrico Granata1391a392011-06-29 22:27:15 +0000561
Greg Clayton5c28dd12011-06-23 17:59:56 +0000562 type_style_arg.arg_type = eArgTypeName;
563 type_style_arg.arg_repetition = eArgRepeatPlain;
564
565 type_arg.push_back (type_style_arg);
566
567 m_arguments.push_back (type_arg);
Enrico Granata1391a392011-06-29 22:27:15 +0000568
Greg Clayton5c28dd12011-06-23 17:59:56 +0000569 }
570
Enrico Granata1391a392011-06-29 22:27:15 +0000571 ~CommandObjectTypeFormatDelete ()
Greg Clayton5c28dd12011-06-23 17:59:56 +0000572 {
573 }
574
Jim Inghamda26bd22012-06-08 21:56:10 +0000575protected:
Greg Clayton5c28dd12011-06-23 17:59:56 +0000576 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000577 DoExecute (Args& command, CommandReturnObject &result)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000578 {
579 const size_t argc = command.GetArgumentCount();
580
581 if (argc != 1)
582 {
583 result.AppendErrorWithFormat ("%s takes 1 arg.\n", m_cmd_name.c_str());
584 result.SetStatus(eReturnStatusFailed);
585 return false;
586 }
587
588 const char* typeA = command.GetArgumentAtIndex(0);
589 ConstString typeCS(typeA);
590
Enrico Granata90d207e2011-07-15 23:30:15 +0000591 if (!typeCS)
Enrico Granata1391a392011-06-29 22:27:15 +0000592 {
593 result.AppendError("empty typenames not allowed");
594 result.SetStatus(eReturnStatusFailed);
595 return false;
596 }
597
598
Enrico Granataf501c592011-08-17 22:13:59 +0000599 if (DataVisualization::ValueFormats::Delete(typeCS))
Johnny Chenfcfc1182011-06-23 23:14:10 +0000600 {
601 result.SetStatus(eReturnStatusSuccessFinishNoResult);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000602 return result.Succeeded();
Johnny Chenfcfc1182011-06-23 23:14:10 +0000603 }
Greg Clayton5c28dd12011-06-23 17:59:56 +0000604 else
605 {
606 result.AppendErrorWithFormat ("no custom format for %s.\n", typeA);
607 result.SetStatus(eReturnStatusFailed);
608 return false;
609 }
Enrico Granata1391a392011-06-29 22:27:15 +0000610
Greg Clayton5c28dd12011-06-23 17:59:56 +0000611 }
612
613};
614
615//-------------------------------------------------------------------------
Enrico Granata1391a392011-06-29 22:27:15 +0000616// CommandObjectTypeFormatClear
Greg Clayton5c28dd12011-06-23 17:59:56 +0000617//-------------------------------------------------------------------------
618
Jim Inghamda26bd22012-06-08 21:56:10 +0000619class CommandObjectTypeFormatClear : public CommandObjectParsed
Enrico Granata1391a392011-06-29 22:27:15 +0000620{
621public:
622 CommandObjectTypeFormatClear (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000623 CommandObjectParsed (interpreter,
624 "type format clear",
625 "Delete all existing format styles.",
626 NULL)
Enrico Granata1391a392011-06-29 22:27:15 +0000627 {
628 }
629
630 ~CommandObjectTypeFormatClear ()
631 {
632 }
633
Jim Inghamda26bd22012-06-08 21:56:10 +0000634protected:
Enrico Granata1391a392011-06-29 22:27:15 +0000635 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000636 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata1391a392011-06-29 22:27:15 +0000637 {
Enrico Granataf501c592011-08-17 22:13:59 +0000638 DataVisualization::ValueFormats::Clear();
Enrico Granata1391a392011-06-29 22:27:15 +0000639 result.SetStatus(eReturnStatusSuccessFinishResult);
640 return result.Succeeded();
641 }
642
643};
Greg Clayton5c28dd12011-06-23 17:59:56 +0000644
Enrico Granata1391a392011-06-29 22:27:15 +0000645//-------------------------------------------------------------------------
646// CommandObjectTypeFormatList
647//-------------------------------------------------------------------------
Greg Clayton5c28dd12011-06-23 17:59:56 +0000648
Enrico Granata16376ed2012-02-15 02:34:21 +0000649bool CommandObjectTypeFormatList_LoopCallback(void* pt2self, ConstString type, const lldb::TypeFormatImplSP& entry);
Enrico Granata1391a392011-06-29 22:27:15 +0000650
651class CommandObjectTypeFormatList;
652
653struct CommandObjectTypeFormatList_LoopCallbackParam {
654 CommandObjectTypeFormatList* self;
Greg Clayton5c28dd12011-06-23 17:59:56 +0000655 CommandReturnObject* result;
656 RegularExpression* regex;
Enrico Granata1391a392011-06-29 22:27:15 +0000657 CommandObjectTypeFormatList_LoopCallbackParam(CommandObjectTypeFormatList* S, CommandReturnObject* R,
Greg Clayton5c28dd12011-06-23 17:59:56 +0000658 RegularExpression* X = NULL) : self(S), result(R), regex(X) {}
659};
660
Jim Inghamda26bd22012-06-08 21:56:10 +0000661class CommandObjectTypeFormatList : public CommandObjectParsed
Greg Clayton5c28dd12011-06-23 17:59:56 +0000662{
663public:
Enrico Granata1391a392011-06-29 22:27:15 +0000664 CommandObjectTypeFormatList (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000665 CommandObjectParsed (interpreter,
666 "type format list",
667 "Show a list of current formatting styles.",
668 NULL)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000669 {
670 CommandArgumentEntry type_arg;
671 CommandArgumentData type_style_arg;
672
673 type_style_arg.arg_type = eArgTypeName;
674 type_style_arg.arg_repetition = eArgRepeatOptional;
675
676 type_arg.push_back (type_style_arg);
677
678 m_arguments.push_back (type_arg);
679 }
680
Enrico Granata1391a392011-06-29 22:27:15 +0000681 ~CommandObjectTypeFormatList ()
Greg Clayton5c28dd12011-06-23 17:59:56 +0000682 {
683 }
684
Jim Inghamda26bd22012-06-08 21:56:10 +0000685protected:
Greg Clayton5c28dd12011-06-23 17:59:56 +0000686 bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000687 DoExecute (Args& command, CommandReturnObject &result)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000688 {
689 const size_t argc = command.GetArgumentCount();
690
Enrico Granata1391a392011-06-29 22:27:15 +0000691 CommandObjectTypeFormatList_LoopCallbackParam *param;
Greg Clayton5c28dd12011-06-23 17:59:56 +0000692
Enrico Granata1c617432011-08-18 16:38:26 +0000693 if (argc == 1)
694 {
Greg Clayton5c28dd12011-06-23 17:59:56 +0000695 RegularExpression* regex = new RegularExpression(command.GetArgumentAtIndex(0));
696 regex->Compile(command.GetArgumentAtIndex(0));
Enrico Granata1391a392011-06-29 22:27:15 +0000697 param = new CommandObjectTypeFormatList_LoopCallbackParam(this,&result,regex);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000698 }
699 else
Enrico Granata1391a392011-06-29 22:27:15 +0000700 param = new CommandObjectTypeFormatList_LoopCallbackParam(this,&result);
Enrico Granataf501c592011-08-17 22:13:59 +0000701 DataVisualization::ValueFormats::LoopThrough(CommandObjectTypeFormatList_LoopCallback, param);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000702 delete param;
Johnny Chenfcfc1182011-06-23 23:14:10 +0000703 result.SetStatus(eReturnStatusSuccessFinishResult);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000704 return result.Succeeded();
705 }
706
707private:
708
709 bool
Enrico Granataf501c592011-08-17 22:13:59 +0000710 LoopCallback (ConstString type,
Enrico Granata16376ed2012-02-15 02:34:21 +0000711 const lldb::TypeFormatImplSP& entry,
Greg Clayton5c28dd12011-06-23 17:59:56 +0000712 RegularExpression* regex,
Greg Clayton3182eff2011-06-23 21:22:24 +0000713 CommandReturnObject *result)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000714 {
Enrico Granataf501c592011-08-17 22:13:59 +0000715 if (regex == NULL || regex->Execute(type.AsCString()))
Greg Clayton3182eff2011-06-23 21:22:24 +0000716 {
Enrico Granata16376ed2012-02-15 02:34:21 +0000717 result->GetOutputStream().Printf ("%s: %s\n", type.AsCString(),
718 entry->GetDescription().c_str());
Greg Clayton5c28dd12011-06-23 17:59:56 +0000719 }
720 return true;
721 }
722
Enrico Granata16376ed2012-02-15 02:34:21 +0000723 friend bool CommandObjectTypeFormatList_LoopCallback(void* pt2self, ConstString type, const lldb::TypeFormatImplSP& entry);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000724
725};
726
727bool
Enrico Granata1391a392011-06-29 22:27:15 +0000728CommandObjectTypeFormatList_LoopCallback (
Greg Clayton5c28dd12011-06-23 17:59:56 +0000729 void* pt2self,
Enrico Granataf501c592011-08-17 22:13:59 +0000730 ConstString type,
Enrico Granata16376ed2012-02-15 02:34:21 +0000731 const lldb::TypeFormatImplSP& entry)
Greg Clayton5c28dd12011-06-23 17:59:56 +0000732{
Enrico Granata1391a392011-06-29 22:27:15 +0000733 CommandObjectTypeFormatList_LoopCallbackParam* param = (CommandObjectTypeFormatList_LoopCallbackParam*)pt2self;
734 return param->self->LoopCallback(type, entry, param->regex, param->result);
Greg Clayton5c28dd12011-06-23 17:59:56 +0000735}
736
Enrico Granata1391a392011-06-29 22:27:15 +0000737
Greg Clayton3e4238d2011-11-04 03:34:56 +0000738#ifndef LLDB_DISABLE_PYTHON
Enrico Granata1391a392011-06-29 22:27:15 +0000739
740//-------------------------------------------------------------------------
741// CommandObjectTypeSummaryAdd
742//-------------------------------------------------------------------------
743
Enrico Granata9ae7cef2011-07-24 00:14:56 +0000744static const char *g_summary_addreader_instructions = "Enter your Python command(s). Type 'DONE' to end.\n"
Enrico Granatac1ca9dc2012-08-08 02:06:30 +0000745 "def function (valobj,internal_dict):";
Enrico Granataf7a9b142011-07-15 02:26:42 +0000746
747class TypeScriptAddInputReader : public InputReaderEZ
748{
749private:
750 DISALLOW_COPY_AND_ASSIGN (TypeScriptAddInputReader);
751public:
752 TypeScriptAddInputReader(Debugger& debugger) :
753 InputReaderEZ(debugger)
754 {}
755
756 virtual
757 ~TypeScriptAddInputReader()
758 {
759 }
760
761 virtual void ActivateHandler(HandlerData& data)
762 {
763 StreamSP out_stream = data.reader.GetDebugger().GetAsyncOutputStream();
764 bool batch_mode = data.reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
765 if (!batch_mode)
766 {
Enrico Granata9ae7cef2011-07-24 00:14:56 +0000767 out_stream->Printf ("%s\n", g_summary_addreader_instructions);
Enrico Granataf7a9b142011-07-15 02:26:42 +0000768 if (data.reader.GetPrompt())
769 out_stream->Printf ("%s", data.reader.GetPrompt());
770 out_stream->Flush();
771 }
772 }
773
774 virtual void ReactivateHandler(HandlerData& data)
775 {
776 StreamSP out_stream = data.reader.GetDebugger().GetAsyncOutputStream();
777 bool batch_mode = data.reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
778 if (data.reader.GetPrompt() && !batch_mode)
779 {
780 out_stream->Printf ("%s", data.reader.GetPrompt());
781 out_stream->Flush();
782 }
783 }
784 virtual void GotTokenHandler(HandlerData& data)
785 {
786 StreamSP out_stream = data.reader.GetDebugger().GetAsyncOutputStream();
787 bool batch_mode = data.reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
788 if (data.bytes && data.bytes_len && data.baton)
789 {
790 ((ScriptAddOptions*)data.baton)->m_user_source.AppendString(data.bytes, data.bytes_len);
791 }
792 if (!data.reader.IsDone() && data.reader.GetPrompt() && !batch_mode)
793 {
794 out_stream->Printf ("%s", data.reader.GetPrompt());
795 out_stream->Flush();
796 }
797 }
798 virtual void InterruptHandler(HandlerData& data)
799 {
800 StreamSP out_stream = data.reader.GetDebugger().GetAsyncOutputStream();
801 bool batch_mode = data.reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
802 data.reader.SetIsDone (true);
803 if (!batch_mode)
804 {
805 out_stream->Printf ("Warning: No command attached to breakpoint.\n");
806 out_stream->Flush();
807 }
808 }
809 virtual void EOFHandler(HandlerData& data)
810 {
811 data.reader.SetIsDone (true);
812 }
813 virtual void DoneHandler(HandlerData& data)
814 {
815 StreamSP out_stream = data.reader.GetDebugger().GetAsyncOutputStream();
816 ScriptAddOptions *options_ptr = ((ScriptAddOptions*)data.baton);
817 if (!options_ptr)
818 {
819 out_stream->Printf ("Internal error #1: no script attached.\n");
820 out_stream->Flush();
821 return;
822 }
823
824 ScriptAddOptions::SharedPointer options(options_ptr); // this will ensure that we get rid of the pointer when going out of scope
825
826 ScriptInterpreter *interpreter = data.reader.GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
827 if (!interpreter)
828 {
829 out_stream->Printf ("Internal error #2: no script attached.\n");
830 out_stream->Flush();
831 return;
832 }
Enrico Granata400105d2012-03-06 23:42:15 +0000833 std::string funct_name_str;
Enrico Granataf7a9b142011-07-15 02:26:42 +0000834 if (!interpreter->GenerateTypeScriptFunction (options->m_user_source,
Enrico Granata400105d2012-03-06 23:42:15 +0000835 funct_name_str))
Enrico Granataf7a9b142011-07-15 02:26:42 +0000836 {
837 out_stream->Printf ("Internal error #3: no script attached.\n");
838 out_stream->Flush();
839 return;
840 }
Enrico Granata400105d2012-03-06 23:42:15 +0000841 if (funct_name_str.empty())
Enrico Granataf7a9b142011-07-15 02:26:42 +0000842 {
843 out_stream->Printf ("Internal error #4: no script attached.\n");
844 out_stream->Flush();
845 return;
846 }
Enrico Granataf7a9b142011-07-15 02:26:42 +0000847 // now I have a valid function name, let's add this as script for every type in the list
848
Enrico Granata16376ed2012-02-15 02:34:21 +0000849 TypeSummaryImplSP script_format;
Enrico Granata2f2c2772012-02-02 23:34:52 +0000850 script_format.reset(new ScriptSummaryFormat(options->m_flags,
Enrico Granata400105d2012-03-06 23:42:15 +0000851 funct_name_str.c_str(),
Enrico Granata16376ed2012-02-15 02:34:21 +0000852 options->m_user_source.CopyList(" ").c_str()));
Enrico Granataf7a9b142011-07-15 02:26:42 +0000853
Enrico Granata90d207e2011-07-15 23:30:15 +0000854 Error error;
855
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000856 for (size_t i = 0; i < options->m_target_types.GetSize(); i++)
Enrico Granataf7a9b142011-07-15 02:26:42 +0000857 {
858 const char *type_name = options->m_target_types.GetStringAtIndex(i);
Enrico Granata90d207e2011-07-15 23:30:15 +0000859 CommandObjectTypeSummaryAdd::AddSummary(ConstString(type_name),
860 script_format,
861 (options->m_regex ? CommandObjectTypeSummaryAdd::eRegexSummary : CommandObjectTypeSummaryAdd::eRegularSummary),
Enrico Granata8a717e52011-07-19 02:34:21 +0000862 options->m_category,
Enrico Granata90d207e2011-07-15 23:30:15 +0000863 &error);
864 if (error.Fail())
865 {
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000866 out_stream->Printf ("%s", error.AsCString());
Enrico Granata90d207e2011-07-15 23:30:15 +0000867 out_stream->Flush();
868 return;
869 }
870 }
871
872 if (options->m_name)
873 {
Greg Clayton3e4238d2011-11-04 03:34:56 +0000874 CommandObjectTypeSummaryAdd::AddSummary (options->m_name,
875 script_format,
876 CommandObjectTypeSummaryAdd::eNamedSummary,
877 options->m_category,
878 &error);
879 if (error.Fail())
Enrico Granata90d207e2011-07-15 23:30:15 +0000880 {
Greg Clayton3e4238d2011-11-04 03:34:56 +0000881 CommandObjectTypeSummaryAdd::AddSummary (options->m_name,
882 script_format,
883 CommandObjectTypeSummaryAdd::eNamedSummary,
884 options->m_category,
885 &error);
Enrico Granata90d207e2011-07-15 23:30:15 +0000886 if (error.Fail())
887 {
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000888 out_stream->Printf ("%s", error.AsCString());
Enrico Granata90d207e2011-07-15 23:30:15 +0000889 out_stream->Flush();
890 return;
891 }
892 }
893 else
894 {
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000895 out_stream->Printf ("%s", error.AsCString());
Enrico Granata90d207e2011-07-15 23:30:15 +0000896 out_stream->Flush();
897 return;
898 }
Enrico Granataf7a9b142011-07-15 02:26:42 +0000899 }
Greg Clayton3e4238d2011-11-04 03:34:56 +0000900 else
901 {
Enrico Granata448b6d62012-01-31 02:21:45 +0000902 if (error.AsCString())
903 {
904 out_stream->PutCString (error.AsCString());
905 out_stream->Flush();
906 }
Greg Clayton3e4238d2011-11-04 03:34:56 +0000907 return;
908 }
Enrico Granataf7a9b142011-07-15 02:26:42 +0000909 }
910};
911
Greg Clayton3e4238d2011-11-04 03:34:56 +0000912#endif // #ifndef LLDB_DISABLE_PYTHON
913
Enrico Granata90d207e2011-07-15 23:30:15 +0000914Error
915CommandObjectTypeSummaryAdd::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
Enrico Granata1391a392011-06-29 22:27:15 +0000916{
Enrico Granata90d207e2011-07-15 23:30:15 +0000917 Error error;
918 char short_option = (char) m_getopt_table[option_idx].val;
919 bool success;
Enrico Granata1391a392011-06-29 22:27:15 +0000920
Enrico Granata90d207e2011-07-15 23:30:15 +0000921 switch (short_option)
922 {
923 case 'C':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000924 m_flags.SetCascades(Args::StringToBoolean(option_arg, true, &success));
Enrico Granata90d207e2011-07-15 23:30:15 +0000925 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +0000926 error.SetErrorStringWithFormat("invalid value for cascade: %s", option_arg);
Enrico Granata90d207e2011-07-15 23:30:15 +0000927 break;
928 case 'e':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000929 m_flags.SetDontShowChildren(false);
Enrico Granata90d207e2011-07-15 23:30:15 +0000930 break;
931 case 'v':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000932 m_flags.SetDontShowValue(true);
Enrico Granata90d207e2011-07-15 23:30:15 +0000933 break;
934 case 'c':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000935 m_flags.SetShowMembersOneLiner(true);
Enrico Granata90d207e2011-07-15 23:30:15 +0000936 break;
Enrico Granata242ffb82011-08-23 16:13:35 +0000937 case 's':
Enrico Granata90d207e2011-07-15 23:30:15 +0000938 m_format_string = std::string(option_arg);
939 break;
940 case 'p':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000941 m_flags.SetSkipPointers(true);
Enrico Granata90d207e2011-07-15 23:30:15 +0000942 break;
943 case 'r':
Enrico Granata2f2c2772012-02-02 23:34:52 +0000944 m_flags.SetSkipReferences(true);
Enrico Granata90d207e2011-07-15 23:30:15 +0000945 break;
946 case 'x':
947 m_regex = true;
948 break;
949 case 'n':
Greg Clayton3e4238d2011-11-04 03:34:56 +0000950 m_name.SetCString(option_arg);
Enrico Granata90d207e2011-07-15 23:30:15 +0000951 break;
Enrico Granata2c6a3d82011-08-23 00:32:52 +0000952 case 'o':
Enrico Granata90d207e2011-07-15 23:30:15 +0000953 m_python_script = std::string(option_arg);
954 m_is_add_script = true;
955 break;
956 case 'F':
957 m_python_function = std::string(option_arg);
958 m_is_add_script = true;
959 break;
960 case 'P':
961 m_is_add_script = true;
962 break;
963 case 'w':
Enrico Granata71148312011-08-11 21:37:21 +0000964 m_category = std::string(option_arg);
Enrico Granata90d207e2011-07-15 23:30:15 +0000965 break;
Enrico Granata2f2c2772012-02-02 23:34:52 +0000966 case 'O':
967 m_flags.SetHideItemNames(true);
968 break;
Enrico Granata90d207e2011-07-15 23:30:15 +0000969 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000970 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata90d207e2011-07-15 23:30:15 +0000971 break;
972 }
973
974 return error;
975}
976
977void
978CommandObjectTypeSummaryAdd::CommandOptions::OptionParsingStarting ()
979{
Enrico Granata2f2c2772012-02-02 23:34:52 +0000980 m_flags.Clear().SetCascades().SetDontShowChildren().SetDontShowValue(false);
981 m_flags.SetShowMembersOneLiner(false).SetSkipPointers(false).SetSkipReferences(false).SetHideItemNames(false);
982
Enrico Granata90d207e2011-07-15 23:30:15 +0000983 m_regex = false;
Greg Clayton3e4238d2011-11-04 03:34:56 +0000984 m_name.Clear();
Enrico Granata90d207e2011-07-15 23:30:15 +0000985 m_python_script = "";
986 m_python_function = "";
Enrico Granata840eb262011-08-09 23:50:01 +0000987 m_format_string = "";
Enrico Granata90d207e2011-07-15 23:30:15 +0000988 m_is_add_script = false;
Enrico Granata71148312011-08-11 21:37:21 +0000989 m_category = "default";
Enrico Granata90d207e2011-07-15 23:30:15 +0000990}
991
Greg Clayton3e4238d2011-11-04 03:34:56 +0000992#ifndef LLDB_DISABLE_PYTHON
Enrico Granata90d207e2011-07-15 23:30:15 +0000993void
994CommandObjectTypeSummaryAdd::CollectPythonScript (ScriptAddOptions *options,
995 CommandReturnObject &result)
996{
997 InputReaderSP reader_sp (new TypeScriptAddInputReader(m_interpreter.GetDebugger()));
998 if (reader_sp && options)
999 {
1000
1001 InputReaderEZ::InitializationParameters ipr;
1002
1003 Error err (reader_sp->Initialize (ipr.SetBaton(options).SetPrompt(" ")));
1004 if (err.Success())
1005 {
1006 m_interpreter.GetDebugger().PushInputReader (reader_sp);
1007 result.SetStatus (eReturnStatusSuccessFinishNoResult);
1008 }
1009 else
1010 {
1011 result.AppendError (err.AsCString());
1012 result.SetStatus (eReturnStatusFailed);
1013 }
1014 }
1015 else
1016 {
1017 result.AppendError("out of memory");
1018 result.SetStatus (eReturnStatusFailed);
1019 }
Enrico Granata90d207e2011-07-15 23:30:15 +00001020}
1021
1022bool
1023CommandObjectTypeSummaryAdd::Execute_ScriptSummary (Args& command, CommandReturnObject &result)
1024{
1025 const size_t argc = command.GetArgumentCount();
1026
1027 if (argc < 1 && !m_options.m_name)
1028 {
1029 result.AppendErrorWithFormat ("%s takes one or more args.\n", m_cmd_name.c_str());
1030 result.SetStatus(eReturnStatusFailed);
1031 return false;
1032 }
1033
Enrico Granata16376ed2012-02-15 02:34:21 +00001034 TypeSummaryImplSP script_format;
Enrico Granata90d207e2011-07-15 23:30:15 +00001035
1036 if (!m_options.m_python_function.empty()) // we have a Python function ready to use
1037 {
1038 ScriptInterpreter *interpreter = m_interpreter.GetScriptInterpreter();
1039 if (!interpreter)
1040 {
1041 result.AppendError ("Internal error #1N: no script attached.\n");
1042 result.SetStatus (eReturnStatusFailed);
1043 return false;
1044 }
1045 const char *funct_name = m_options.m_python_function.c_str();
1046 if (!funct_name || !funct_name[0])
1047 {
1048 result.AppendError ("Internal error #2N: no script attached.\n");
1049 result.SetStatus (eReturnStatusFailed);
1050 return false;
1051 }
1052
Enrico Granatac1ca9dc2012-08-08 02:06:30 +00001053 std::string code = (" " + m_options.m_python_function + "(valobj,internal_dict)");
Enrico Granata16376ed2012-02-15 02:34:21 +00001054
Enrico Granata2f2c2772012-02-02 23:34:52 +00001055 script_format.reset(new ScriptSummaryFormat(m_options.m_flags,
Enrico Granata16376ed2012-02-15 02:34:21 +00001056 funct_name,
1057 code.c_str()));
Enrico Granata90d207e2011-07-15 23:30:15 +00001058 }
1059 else if (!m_options.m_python_script.empty()) // we have a quick 1-line script, just use it
1060 {
1061 ScriptInterpreter *interpreter = m_interpreter.GetScriptInterpreter();
1062 if (!interpreter)
1063 {
1064 result.AppendError ("Internal error #1Q: no script attached.\n");
1065 result.SetStatus (eReturnStatusFailed);
1066 return false;
1067 }
1068 StringList funct_sl;
1069 funct_sl << m_options.m_python_script.c_str();
Enrico Granata400105d2012-03-06 23:42:15 +00001070 std::string funct_name_str;
Enrico Granata90d207e2011-07-15 23:30:15 +00001071 if (!interpreter->GenerateTypeScriptFunction (funct_sl,
Enrico Granata400105d2012-03-06 23:42:15 +00001072 funct_name_str))
Enrico Granata90d207e2011-07-15 23:30:15 +00001073 {
1074 result.AppendError ("Internal error #2Q: no script attached.\n");
1075 result.SetStatus (eReturnStatusFailed);
1076 return false;
1077 }
Enrico Granata400105d2012-03-06 23:42:15 +00001078 if (funct_name_str.empty())
Enrico Granata90d207e2011-07-15 23:30:15 +00001079 {
1080 result.AppendError ("Internal error #3Q: no script attached.\n");
1081 result.SetStatus (eReturnStatusFailed);
1082 return false;
1083 }
Enrico Granata90d207e2011-07-15 23:30:15 +00001084
Enrico Granata16376ed2012-02-15 02:34:21 +00001085 std::string code = " " + m_options.m_python_script;
1086
Enrico Granata2f2c2772012-02-02 23:34:52 +00001087 script_format.reset(new ScriptSummaryFormat(m_options.m_flags,
Enrico Granata400105d2012-03-06 23:42:15 +00001088 funct_name_str.c_str(),
Enrico Granata16376ed2012-02-15 02:34:21 +00001089 code.c_str()));
Enrico Granata90d207e2011-07-15 23:30:15 +00001090 }
1091 else // use an InputReader to grab Python code from the user
1092 {
Enrico Granata2f2c2772012-02-02 23:34:52 +00001093 ScriptAddOptions *options = new ScriptAddOptions(m_options.m_flags,
Enrico Granata90d207e2011-07-15 23:30:15 +00001094 m_options.m_regex,
Enrico Granata8a717e52011-07-19 02:34:21 +00001095 m_options.m_name,
1096 m_options.m_category);
Enrico Granata90d207e2011-07-15 23:30:15 +00001097
Enrico Granata1c617432011-08-18 16:38:26 +00001098 for (size_t i = 0; i < argc; i++)
1099 {
Enrico Granata90d207e2011-07-15 23:30:15 +00001100 const char* typeA = command.GetArgumentAtIndex(i);
1101 if (typeA && *typeA)
1102 options->m_target_types << typeA;
1103 else
1104 {
1105 result.AppendError("empty typenames not allowed");
1106 result.SetStatus(eReturnStatusFailed);
1107 return false;
1108 }
1109 }
1110
1111 CollectPythonScript(options,result);
1112 return result.Succeeded();
1113 }
1114
1115 // if I am here, script_format must point to something good, so I can add that
1116 // as a script summary to all interested parties
1117
1118 Error error;
1119
Johnny Chen2bc9eb32011-07-19 19:48:13 +00001120 for (size_t i = 0; i < command.GetArgumentCount(); i++)
Enrico Granata90d207e2011-07-15 23:30:15 +00001121 {
1122 const char *type_name = command.GetArgumentAtIndex(i);
1123 CommandObjectTypeSummaryAdd::AddSummary(ConstString(type_name),
1124 script_format,
1125 (m_options.m_regex ? eRegexSummary : eRegularSummary),
Enrico Granata8a717e52011-07-19 02:34:21 +00001126 m_options.m_category,
Enrico Granata90d207e2011-07-15 23:30:15 +00001127 &error);
1128 if (error.Fail())
1129 {
1130 result.AppendError(error.AsCString());
1131 result.SetStatus(eReturnStatusFailed);
1132 return false;
1133 }
1134 }
1135
1136 if (m_options.m_name)
1137 {
Greg Clayton3e4238d2011-11-04 03:34:56 +00001138 AddSummary(m_options.m_name, script_format, eNamedSummary, m_options.m_category, &error);
1139 if (error.Fail())
Enrico Granata90d207e2011-07-15 23:30:15 +00001140 {
Greg Clayton3e4238d2011-11-04 03:34:56 +00001141 result.AppendError(error.AsCString());
Enrico Granata90d207e2011-07-15 23:30:15 +00001142 result.AppendError("added to types, but not given a name");
1143 result.SetStatus(eReturnStatusFailed);
1144 return false;
1145 }
1146 }
1147
1148 return result.Succeeded();
1149}
1150
Greg Clayton3e4238d2011-11-04 03:34:56 +00001151#endif
1152
1153
Enrico Granata90d207e2011-07-15 23:30:15 +00001154bool
1155CommandObjectTypeSummaryAdd::Execute_StringSummary (Args& command, CommandReturnObject &result)
1156{
1157 const size_t argc = command.GetArgumentCount();
1158
1159 if (argc < 1 && !m_options.m_name)
1160 {
1161 result.AppendErrorWithFormat ("%s takes one or more args.\n", m_cmd_name.c_str());
1162 result.SetStatus(eReturnStatusFailed);
1163 return false;
1164 }
1165
Enrico Granata2f2c2772012-02-02 23:34:52 +00001166 if (!m_options.m_flags.GetShowMembersOneLiner() && m_options.m_format_string.empty())
Enrico Granata90d207e2011-07-15 23:30:15 +00001167 {
1168 result.AppendError("empty summary strings not allowed");
1169 result.SetStatus(eReturnStatusFailed);
1170 return false;
1171 }
1172
Enrico Granata2f2c2772012-02-02 23:34:52 +00001173 const char* format_cstr = (m_options.m_flags.GetShowMembersOneLiner() ? "" : m_options.m_format_string.c_str());
Enrico Granata90d207e2011-07-15 23:30:15 +00001174
Enrico Granata716a6282011-09-06 22:59:55 +00001175 // ${var%S} is an endless recursion, prevent it
1176 if (strcmp(format_cstr, "${var%S}") == 0)
1177 {
1178 result.AppendError("recursive summary not allowed");
1179 result.SetStatus(eReturnStatusFailed);
1180 return false;
1181 }
1182
Enrico Granata90d207e2011-07-15 23:30:15 +00001183 Error error;
1184
Enrico Granata16376ed2012-02-15 02:34:21 +00001185 lldb::TypeSummaryImplSP entry(new StringSummaryFormat(m_options.m_flags,
Enrico Granata2f2c2772012-02-02 23:34:52 +00001186 format_cstr));
Enrico Granata90d207e2011-07-15 23:30:15 +00001187
Enrico Granata2f2c2772012-02-02 23:34:52 +00001188 if (error.Fail())
Enrico Granata90d207e2011-07-15 23:30:15 +00001189 {
1190 result.AppendError(error.AsCString());
1191 result.SetStatus(eReturnStatusFailed);
1192 return false;
1193 }
1194
1195 // now I have a valid format, let's add it to every type
1196
Enrico Granata1c617432011-08-18 16:38:26 +00001197 for (size_t i = 0; i < argc; i++)
1198 {
Enrico Granata90d207e2011-07-15 23:30:15 +00001199 const char* typeA = command.GetArgumentAtIndex(i);
1200 if (!typeA || typeA[0] == '\0')
1201 {
1202 result.AppendError("empty typenames not allowed");
1203 result.SetStatus(eReturnStatusFailed);
1204 return false;
1205 }
1206 ConstString typeCS(typeA);
1207
1208 AddSummary(typeCS,
1209 entry,
1210 (m_options.m_regex ? eRegexSummary : eRegularSummary),
Enrico Granata8a717e52011-07-19 02:34:21 +00001211 m_options.m_category,
Enrico Granata90d207e2011-07-15 23:30:15 +00001212 &error);
1213
1214 if (error.Fail())
1215 {
1216 result.AppendError(error.AsCString());
1217 result.SetStatus(eReturnStatusFailed);
1218 return false;
1219 }
1220 }
1221
1222 if (m_options.m_name)
1223 {
Greg Clayton3e4238d2011-11-04 03:34:56 +00001224 AddSummary(m_options.m_name, entry, eNamedSummary, m_options.m_category, &error);
1225 if (error.Fail())
Enrico Granata90d207e2011-07-15 23:30:15 +00001226 {
Greg Clayton3e4238d2011-11-04 03:34:56 +00001227 result.AppendError(error.AsCString());
Enrico Granata90d207e2011-07-15 23:30:15 +00001228 result.AppendError("added to types, but not given a name");
1229 result.SetStatus(eReturnStatusFailed);
1230 return false;
1231 }
1232 }
1233
1234 result.SetStatus(eReturnStatusSuccessFinishNoResult);
1235 return result.Succeeded();
1236}
1237
1238CommandObjectTypeSummaryAdd::CommandObjectTypeSummaryAdd (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001239 CommandObjectParsed (interpreter,
1240 "type summary add",
1241 "Add a new summary style for a type.",
1242 NULL),
1243 m_options (interpreter)
Enrico Granata90d207e2011-07-15 23:30:15 +00001244{
1245 CommandArgumentEntry type_arg;
1246 CommandArgumentData type_style_arg;
1247
1248 type_style_arg.arg_type = eArgTypeName;
1249 type_style_arg.arg_repetition = eArgRepeatPlus;
1250
1251 type_arg.push_back (type_style_arg);
1252
1253 m_arguments.push_back (type_arg);
1254
1255 SetHelpLong(
1256 "Some examples of using this command.\n"
1257 "We use as reference the following snippet of code:\n"
1258 "struct JustADemo\n"
1259 "{\n"
1260 "int* ptr;\n"
1261 "float value;\n"
1262 "JustADemo(int p = 1, float v = 0.1) : ptr(new int(p)), value(v) {}\n"
1263 "};\n"
1264 "JustADemo object(42,3.14);\n"
1265 "struct AnotherDemo : public JustADemo\n"
1266 "{\n"
1267 "uint8_t byte;\n"
1268 "AnotherDemo(uint8_t b = 'E', int p = 1, float v = 0.1) : JustADemo(p,v), byte(b) {}\n"
1269 "};\n"
1270 "AnotherDemo *another_object = new AnotherDemo('E',42,3.14);\n"
1271 "\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001272 "type summary add --summary-string \"the answer is ${*var.ptr}\" JustADemo\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001273 "when typing frame variable object you will get \"the answer is 42\"\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001274 "type summary add --summary-string \"the answer is ${*var.ptr}, and the question is ${var.value}\" JustADemo\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001275 "when typing frame variable object you will get \"the answer is 42 and the question is 3.14\"\n"
1276 "\n"
1277 "Alternatively, you could also say\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001278 "type summary add --summary-string \"${var%V} -> ${*var}\" \"int *\"\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001279 "and replace the above summary string with\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001280 "type summary add --summary-string \"the answer is ${var.ptr}, and the question is ${var.value}\" JustADemo\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001281 "to obtain a similar result\n"
1282 "\n"
1283 "To add a summary valid for both JustADemo and AnotherDemo you can use the scoping operator, as in:\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001284 "type summary add --summary-string \"${var.ptr}, ${var.value},{${var.byte}}\" JustADemo -C yes\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001285 "\n"
1286 "This will be used for both variables of type JustADemo and AnotherDemo. To prevent this, change the -C to read -C no\n"
1287 "If you do not want pointers to be shown using that summary, you can use the -p option, as in:\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001288 "type summary add --summary-string \"${var.ptr}, ${var.value},{${var.byte}}\" JustADemo -C yes -p\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001289 "A similar option -r exists for references.\n"
1290 "\n"
1291 "If you simply want a one-line summary of the content of your variable, without typing an explicit string to that effect\n"
1292 "you can use the -c option, without giving any summary string:\n"
1293 "type summary add -c JustADemo\n"
1294 "frame variable object\n"
1295 "the output being similar to (ptr=0xsomeaddress, value=3.14)\n"
1296 "\n"
1297 "If you want to display some summary text, but also expand the structure of your object, you can add the -e option, as in:\n"
Enrico Granataf501c592011-08-17 22:13:59 +00001298 "type summary add -e --summary-string \"*ptr = ${*var.ptr}\" JustADemo\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001299 "Here the value of the int* is displayed, followed by the standard LLDB sequence of children objects, one per line.\n"
1300 "to get an output like:\n"
1301 "\n"
1302 "*ptr = 42 {\n"
1303 " ptr = 0xsomeaddress\n"
1304 " value = 3.14\n"
1305 "}\n"
1306 "\n"
Enrico Granata7f163b32011-07-16 01:22:04 +00001307 "You can also add Python summaries, in which case you will use lldb public API to gather information from your variables"
1308 "and elaborate them to a meaningful summary inside a script written in Python. The variable object will be passed to your"
1309 "script as an SBValue object. The following example might help you when starting to use the Python summaries feature:\n"
Enrico Granata242ffb82011-08-23 16:13:35 +00001310 "type summary add JustADemo -o \"value = valobj.GetChildMemberWithName('value'); return 'My value is ' + value.GetValue();\"\n"
Enrico Granata7f163b32011-07-16 01:22:04 +00001311 "If you prefer to type your scripts on multiple lines, you will use the -P option and then type your script, ending it with "
1312 "the word DONE on a line by itself to mark you're finished editing your code:\n"
1313 "(lldb)type summary add JustADemo -P\n"
1314 " value = valobj.GetChildMemberWithName('value');\n"
1315 " return 'My value is ' + value.GetValue();\n"
1316 "DONE\n"
Enrico Granata9ae7cef2011-07-24 00:14:56 +00001317 "(lldb) <-- type further LLDB commands here\n"
Enrico Granata90d207e2011-07-15 23:30:15 +00001318 );
1319}
1320
1321bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001322CommandObjectTypeSummaryAdd::DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata90d207e2011-07-15 23:30:15 +00001323{
1324 if (m_options.m_is_add_script)
Greg Clayton3e4238d2011-11-04 03:34:56 +00001325 {
1326#ifndef LLDB_DISABLE_PYTHON
Enrico Granata90d207e2011-07-15 23:30:15 +00001327 return Execute_ScriptSummary(command, result);
Greg Clayton3e4238d2011-11-04 03:34:56 +00001328#else
1329 result.AppendError ("python is disabled");
1330 result.SetStatus(eReturnStatusFailed);
1331 return false;
1332#endif
1333 }
1334
1335 return Execute_StringSummary(command, result);
Enrico Granata90d207e2011-07-15 23:30:15 +00001336}
1337
1338bool
1339CommandObjectTypeSummaryAdd::AddSummary(const ConstString& type_name,
Enrico Granata16376ed2012-02-15 02:34:21 +00001340 TypeSummaryImplSP entry,
Enrico Granata90d207e2011-07-15 23:30:15 +00001341 SummaryFormatType type,
Enrico Granata71148312011-08-11 21:37:21 +00001342 std::string category_name,
Enrico Granata90d207e2011-07-15 23:30:15 +00001343 Error* error)
1344{
Enrico Granata16376ed2012-02-15 02:34:21 +00001345 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00001346 DataVisualization::Categories::GetCategory(ConstString(category_name.c_str()), category);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001347
Enrico Granata90d207e2011-07-15 23:30:15 +00001348 if (type == eRegexSummary)
1349 {
1350 RegularExpressionSP typeRX(new RegularExpression());
1351 if (!typeRX->Compile(type_name.GetCString()))
1352 {
1353 if (error)
1354 error->SetErrorString("regex format error (maybe this is not really a regex?)");
1355 return false;
1356 }
1357
Enrico Granata1c617432011-08-18 16:38:26 +00001358 category->GetRegexSummaryNavigator()->Delete(type_name);
1359 category->GetRegexSummaryNavigator()->Add(typeRX, entry);
Enrico Granata8a717e52011-07-19 02:34:21 +00001360
Enrico Granata90d207e2011-07-15 23:30:15 +00001361 return true;
1362 }
1363 else if (type == eNamedSummary)
1364 {
1365 // system named summaries do not exist (yet?)
Enrico Granataf501c592011-08-17 22:13:59 +00001366 DataVisualization::NamedSummaryFormats::Add(type_name,entry);
Enrico Granata90d207e2011-07-15 23:30:15 +00001367 return true;
1368 }
1369 else
1370 {
Enrico Granata1c617432011-08-18 16:38:26 +00001371 category->GetSummaryNavigator()->Add(type_name, entry);
Enrico Granata90d207e2011-07-15 23:30:15 +00001372 return true;
1373 }
1374}
1375
1376OptionDefinition
1377CommandObjectTypeSummaryAdd::CommandOptions::g_option_table[] =
1378{
Enrico Granata8a717e52011-07-19 02:34:21 +00001379 { LLDB_OPT_SET_ALL, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Add this to the given category instead of the default one."},
Enrico Granataf2cb7f22012-03-22 19:55:55 +00001380 { LLDB_OPT_SET_ALL, false, "cascade", 'C', required_argument, NULL, 0, eArgTypeBoolean, "If true, cascade through typedef chains."},
Enrico Granata979e20d2011-07-29 19:53:35 +00001381 { LLDB_OPT_SET_ALL, false, "no-value", 'v', no_argument, NULL, 0, eArgTypeNone, "Don't show the value, just show the summary, for this type."},
1382 { LLDB_OPT_SET_ALL, false, "skip-pointers", 'p', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for pointers-to-type objects."},
1383 { LLDB_OPT_SET_ALL, false, "skip-references", 'r', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for references-to-type objects."},
1384 { LLDB_OPT_SET_ALL, false, "regex", 'x', no_argument, NULL, 0, eArgTypeNone, "Type names are actually regular expressions."},
1385 { LLDB_OPT_SET_1 , true, "inline-children", 'c', no_argument, NULL, 0, eArgTypeNone, "If true, inline all child values into summary string."},
Enrico Granata2f2c2772012-02-02 23:34:52 +00001386 { LLDB_OPT_SET_1 , false, "omit-names", 'O', no_argument, NULL, 0, eArgTypeNone, "If true, omit value names in the summary display."},
Enrico Granata242ffb82011-08-23 16:13:35 +00001387 { LLDB_OPT_SET_2 , true, "summary-string", 's', required_argument, NULL, 0, eArgTypeSummaryString, "Summary string used to display text and object contents."},
Enrico Granata91544802011-09-06 19:20:51 +00001388 { LLDB_OPT_SET_3, false, "python-script", 'o', required_argument, NULL, 0, eArgTypePythonScript, "Give a one-liner Python script as part of the command."},
1389 { LLDB_OPT_SET_3, false, "python-function", 'F', required_argument, NULL, 0, eArgTypePythonFunction, "Give the name of a Python function to use for this type."},
Enrico Granata979e20d2011-07-29 19:53:35 +00001390 { LLDB_OPT_SET_3, false, "input-python", 'P', no_argument, NULL, 0, eArgTypeNone, "Input Python code to use for this type manually."},
1391 { LLDB_OPT_SET_2 | LLDB_OPT_SET_3, false, "expand", 'e', no_argument, NULL, 0, eArgTypeNone, "Expand aggregate data types to show children on separate lines."},
Enrico Granata90d207e2011-07-15 23:30:15 +00001392 { LLDB_OPT_SET_2 | LLDB_OPT_SET_3, false, "name", 'n', required_argument, NULL, 0, eArgTypeName, "A name for this summary string."},
1393 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
1394};
1395
1396
1397//-------------------------------------------------------------------------
1398// CommandObjectTypeSummaryDelete
1399//-------------------------------------------------------------------------
1400
Jim Inghamda26bd22012-06-08 21:56:10 +00001401class CommandObjectTypeSummaryDelete : public CommandObjectParsed
Enrico Granata90d207e2011-07-15 23:30:15 +00001402{
Enrico Granata1391a392011-06-29 22:27:15 +00001403private:
Enrico Granata1391a392011-06-29 22:27:15 +00001404 class CommandOptions : public Options
1405 {
1406 public:
1407
1408 CommandOptions (CommandInterpreter &interpreter) :
1409 Options (interpreter)
1410 {
1411 }
1412
1413 virtual
1414 ~CommandOptions (){}
1415
1416 virtual Error
1417 SetOptionValue (uint32_t option_idx, const char *option_arg)
1418 {
1419 Error error;
1420 char short_option = (char) m_getopt_table[option_idx].val;
Enrico Granata1391a392011-06-29 22:27:15 +00001421
1422 switch (short_option)
1423 {
Enrico Granata90d207e2011-07-15 23:30:15 +00001424 case 'a':
Enrico Granata8a717e52011-07-19 02:34:21 +00001425 m_delete_all = true;
1426 break;
1427 case 'w':
Enrico Granata018921d2011-08-12 02:00:06 +00001428 m_category = std::string(option_arg);
Enrico Granataf7a9b142011-07-15 02:26:42 +00001429 break;
Enrico Granata1391a392011-06-29 22:27:15 +00001430 default:
Greg Clayton9c236732011-10-26 00:56:27 +00001431 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata1391a392011-06-29 22:27:15 +00001432 break;
1433 }
1434
1435 return error;
1436 }
1437
1438 void
1439 OptionParsingStarting ()
1440 {
Enrico Granata8a717e52011-07-19 02:34:21 +00001441 m_delete_all = false;
Enrico Granata018921d2011-08-12 02:00:06 +00001442 m_category = "default";
Enrico Granata1391a392011-06-29 22:27:15 +00001443 }
1444
1445 const OptionDefinition*
1446 GetDefinitions ()
1447 {
1448 return g_option_table;
1449 }
1450
1451 // Options table: Required for subclasses of Options.
1452
1453 static OptionDefinition g_option_table[];
1454
1455 // Instance variables to hold the values for command options.
1456
Enrico Granata8a717e52011-07-19 02:34:21 +00001457 bool m_delete_all;
Enrico Granata018921d2011-08-12 02:00:06 +00001458 std::string m_category;
Enrico Granata8a717e52011-07-19 02:34:21 +00001459
Enrico Granata1391a392011-06-29 22:27:15 +00001460 };
1461
1462 CommandOptions m_options;
1463
1464 virtual Options *
1465 GetOptions ()
1466 {
1467 return &m_options;
1468 }
Enrico Granata8a717e52011-07-19 02:34:21 +00001469
1470 static bool
1471 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00001472 const lldb::TypeCategoryImplSP& category_sp)
Enrico Granata8a717e52011-07-19 02:34:21 +00001473 {
Enrico Granata16376ed2012-02-15 02:34:21 +00001474 ConstString *name = (ConstString*)param;
1475 category_sp->Delete(*name, eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary);
1476 return true;
Enrico Granata8a717e52011-07-19 02:34:21 +00001477 }
Enrico Granataf7a9b142011-07-15 02:26:42 +00001478
Enrico Granata1391a392011-06-29 22:27:15 +00001479public:
1480 CommandObjectTypeSummaryDelete (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001481 CommandObjectParsed (interpreter,
1482 "type summary delete",
1483 "Delete an existing summary style for a type.",
1484 NULL),
1485 m_options(interpreter)
Enrico Granata1391a392011-06-29 22:27:15 +00001486 {
1487 CommandArgumentEntry type_arg;
1488 CommandArgumentData type_style_arg;
1489
1490 type_style_arg.arg_type = eArgTypeName;
1491 type_style_arg.arg_repetition = eArgRepeatPlain;
1492
1493 type_arg.push_back (type_style_arg);
1494
1495 m_arguments.push_back (type_arg);
1496
1497 }
1498
1499 ~CommandObjectTypeSummaryDelete ()
1500 {
1501 }
1502
Jim Inghamda26bd22012-06-08 21:56:10 +00001503protected:
Enrico Granata1391a392011-06-29 22:27:15 +00001504 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001505 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata1391a392011-06-29 22:27:15 +00001506 {
1507 const size_t argc = command.GetArgumentCount();
1508
1509 if (argc != 1)
1510 {
1511 result.AppendErrorWithFormat ("%s takes 1 arg.\n", m_cmd_name.c_str());
1512 result.SetStatus(eReturnStatusFailed);
1513 return false;
1514 }
1515
1516 const char* typeA = command.GetArgumentAtIndex(0);
1517 ConstString typeCS(typeA);
1518
Enrico Granata90d207e2011-07-15 23:30:15 +00001519 if (!typeCS)
Enrico Granata1391a392011-06-29 22:27:15 +00001520 {
1521 result.AppendError("empty typenames not allowed");
1522 result.SetStatus(eReturnStatusFailed);
1523 return false;
1524 }
1525
Enrico Granata8a717e52011-07-19 02:34:21 +00001526 if (m_options.m_delete_all)
1527 {
Enrico Granata448b6d62012-01-31 02:21:45 +00001528 DataVisualization::Categories::LoopThrough(PerCategoryCallback, &typeCS);
Enrico Granata8a717e52011-07-19 02:34:21 +00001529 result.SetStatus(eReturnStatusSuccessFinishNoResult);
1530 return result.Succeeded();
1531 }
Enrico Granata1a102082011-07-12 00:18:11 +00001532
Enrico Granata16376ed2012-02-15 02:34:21 +00001533 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00001534 DataVisualization::Categories::GetCategory(ConstString(m_options.m_category.c_str()), category);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001535
Enrico Granata2c6a3d82011-08-23 00:32:52 +00001536 bool delete_category = category->Delete(typeCS,
1537 eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary);
Enrico Granataf501c592011-08-17 22:13:59 +00001538 bool delete_named = DataVisualization::NamedSummaryFormats::Delete(typeCS);
Enrico Granata8a717e52011-07-19 02:34:21 +00001539
1540 if (delete_category || delete_named)
Enrico Granata1391a392011-06-29 22:27:15 +00001541 {
1542 result.SetStatus(eReturnStatusSuccessFinishNoResult);
1543 return result.Succeeded();
1544 }
1545 else
1546 {
1547 result.AppendErrorWithFormat ("no custom summary for %s.\n", typeA);
1548 result.SetStatus(eReturnStatusFailed);
1549 return false;
1550 }
1551
1552 }
Enrico Granata90d207e2011-07-15 23:30:15 +00001553};
1554
1555OptionDefinition
1556CommandObjectTypeSummaryDelete::CommandOptions::g_option_table[] =
1557{
Enrico Granata979e20d2011-07-29 19:53:35 +00001558 { LLDB_OPT_SET_1, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Delete from every category."},
Enrico Granata8a717e52011-07-19 02:34:21 +00001559 { LLDB_OPT_SET_2, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Delete from given category."},
Enrico Granata90d207e2011-07-15 23:30:15 +00001560 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
Enrico Granata1391a392011-06-29 22:27:15 +00001561};
1562
Jim Inghamda26bd22012-06-08 21:56:10 +00001563class CommandObjectTypeSummaryClear : public CommandObjectParsed
Enrico Granata1391a392011-06-29 22:27:15 +00001564{
Enrico Granata90d207e2011-07-15 23:30:15 +00001565private:
1566
1567 class CommandOptions : public Options
1568 {
1569 public:
1570
1571 CommandOptions (CommandInterpreter &interpreter) :
1572 Options (interpreter)
1573 {
1574 }
1575
1576 virtual
1577 ~CommandOptions (){}
1578
1579 virtual Error
1580 SetOptionValue (uint32_t option_idx, const char *option_arg)
1581 {
1582 Error error;
1583 char short_option = (char) m_getopt_table[option_idx].val;
1584
1585 switch (short_option)
1586 {
1587 case 'a':
Enrico Granata8a717e52011-07-19 02:34:21 +00001588 m_delete_all = true;
Enrico Granata90d207e2011-07-15 23:30:15 +00001589 break;
1590 default:
Greg Clayton9c236732011-10-26 00:56:27 +00001591 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata90d207e2011-07-15 23:30:15 +00001592 break;
1593 }
1594
1595 return error;
1596 }
1597
1598 void
1599 OptionParsingStarting ()
1600 {
Enrico Granata8a717e52011-07-19 02:34:21 +00001601 m_delete_all = false;
Enrico Granata90d207e2011-07-15 23:30:15 +00001602 }
1603
1604 const OptionDefinition*
1605 GetDefinitions ()
1606 {
1607 return g_option_table;
1608 }
1609
1610 // Options table: Required for subclasses of Options.
1611
1612 static OptionDefinition g_option_table[];
1613
1614 // Instance variables to hold the values for command options.
1615
Enrico Granata8a717e52011-07-19 02:34:21 +00001616 bool m_delete_all;
1617 bool m_delete_named;
Enrico Granata90d207e2011-07-15 23:30:15 +00001618 };
1619
1620 CommandOptions m_options;
1621
1622 virtual Options *
1623 GetOptions ()
1624 {
1625 return &m_options;
1626 }
Enrico Granata8a717e52011-07-19 02:34:21 +00001627
1628 static bool
1629 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00001630 const lldb::TypeCategoryImplSP& cate)
Enrico Granata8a717e52011-07-19 02:34:21 +00001631 {
Enrico Granata1c617432011-08-18 16:38:26 +00001632 cate->GetSummaryNavigator()->Clear();
1633 cate->GetRegexSummaryNavigator()->Clear();
Enrico Granata8a717e52011-07-19 02:34:21 +00001634 return true;
1635
1636 }
1637
Enrico Granata1391a392011-06-29 22:27:15 +00001638public:
1639 CommandObjectTypeSummaryClear (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001640 CommandObjectParsed (interpreter,
1641 "type summary clear",
1642 "Delete all existing summary styles.",
1643 NULL),
1644 m_options(interpreter)
Enrico Granata1391a392011-06-29 22:27:15 +00001645 {
1646 }
1647
1648 ~CommandObjectTypeSummaryClear ()
1649 {
1650 }
1651
Jim Inghamda26bd22012-06-08 21:56:10 +00001652protected:
Enrico Granata1391a392011-06-29 22:27:15 +00001653 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001654 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata1391a392011-06-29 22:27:15 +00001655 {
Enrico Granata90d207e2011-07-15 23:30:15 +00001656
Enrico Granata8a717e52011-07-19 02:34:21 +00001657 if (m_options.m_delete_all)
Enrico Granataf501c592011-08-17 22:13:59 +00001658 DataVisualization::Categories::LoopThrough(PerCategoryCallback, NULL);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001659
Enrico Granata8a717e52011-07-19 02:34:21 +00001660 else
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001661 {
Enrico Granata16376ed2012-02-15 02:34:21 +00001662 lldb::TypeCategoryImplSP category;
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001663 if (command.GetArgumentCount() > 0)
1664 {
1665 const char* cat_name = command.GetArgumentAtIndex(0);
1666 ConstString cat_nameCS(cat_name);
Enrico Granata3b23d202011-09-09 23:33:14 +00001667 DataVisualization::Categories::GetCategory(cat_nameCS, category);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001668 }
1669 else
Enrico Granata3b23d202011-09-09 23:33:14 +00001670 DataVisualization::Categories::GetCategory(ConstString(NULL), category);
Enrico Granata2c6a3d82011-08-23 00:32:52 +00001671 category->Clear(eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001672 }
Enrico Granata8a717e52011-07-19 02:34:21 +00001673
Enrico Granataf501c592011-08-17 22:13:59 +00001674 DataVisualization::NamedSummaryFormats::Clear();
Enrico Granata90d207e2011-07-15 23:30:15 +00001675
Enrico Granata1391a392011-06-29 22:27:15 +00001676 result.SetStatus(eReturnStatusSuccessFinishResult);
1677 return result.Succeeded();
1678 }
1679
1680};
1681
Enrico Granata90d207e2011-07-15 23:30:15 +00001682OptionDefinition
1683CommandObjectTypeSummaryClear::CommandOptions::g_option_table[] =
1684{
Enrico Granata979e20d2011-07-29 19:53:35 +00001685 { LLDB_OPT_SET_ALL, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Clear every category."},
Enrico Granata90d207e2011-07-15 23:30:15 +00001686 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
1687};
1688
Enrico Granata1391a392011-06-29 22:27:15 +00001689//-------------------------------------------------------------------------
1690// CommandObjectTypeSummaryList
1691//-------------------------------------------------------------------------
1692
Enrico Granataf501c592011-08-17 22:13:59 +00001693bool CommandObjectTypeSummaryList_LoopCallback(void* pt2self, ConstString type, const StringSummaryFormat::SharedPointer& entry);
Enrico Granataf7a9b142011-07-15 02:26:42 +00001694bool CommandObjectTypeRXSummaryList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const StringSummaryFormat::SharedPointer& entry);
Enrico Granata1391a392011-06-29 22:27:15 +00001695
1696class CommandObjectTypeSummaryList;
1697
1698struct CommandObjectTypeSummaryList_LoopCallbackParam {
1699 CommandObjectTypeSummaryList* self;
1700 CommandReturnObject* result;
1701 RegularExpression* regex;
Enrico Granata1e620f02011-07-19 22:35:10 +00001702 RegularExpression* cate_regex;
Enrico Granata1391a392011-06-29 22:27:15 +00001703 CommandObjectTypeSummaryList_LoopCallbackParam(CommandObjectTypeSummaryList* S, CommandReturnObject* R,
Enrico Granata1e620f02011-07-19 22:35:10 +00001704 RegularExpression* X = NULL,
1705 RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
Enrico Granata1391a392011-06-29 22:27:15 +00001706};
1707
Jim Inghamda26bd22012-06-08 21:56:10 +00001708class CommandObjectTypeSummaryList : public CommandObjectParsed
Enrico Granata1391a392011-06-29 22:27:15 +00001709{
Enrico Granata1e620f02011-07-19 22:35:10 +00001710
1711 class CommandOptions : public Options
1712 {
1713 public:
1714
1715 CommandOptions (CommandInterpreter &interpreter) :
1716 Options (interpreter)
1717 {
1718 }
1719
1720 virtual
1721 ~CommandOptions (){}
1722
1723 virtual Error
1724 SetOptionValue (uint32_t option_idx, const char *option_arg)
1725 {
1726 Error error;
1727 char short_option = (char) m_getopt_table[option_idx].val;
1728
1729 switch (short_option)
1730 {
1731 case 'w':
1732 m_category_regex = std::string(option_arg);
1733 break;
1734 default:
Greg Clayton9c236732011-10-26 00:56:27 +00001735 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata1e620f02011-07-19 22:35:10 +00001736 break;
1737 }
1738
1739 return error;
1740 }
1741
1742 void
1743 OptionParsingStarting ()
1744 {
1745 m_category_regex = "";
1746 }
1747
1748 const OptionDefinition*
1749 GetDefinitions ()
1750 {
1751 return g_option_table;
1752 }
1753
1754 // Options table: Required for subclasses of Options.
1755
1756 static OptionDefinition g_option_table[];
1757
1758 // Instance variables to hold the values for command options.
1759
1760 std::string m_category_regex;
1761
1762 };
1763
1764 CommandOptions m_options;
1765
1766 virtual Options *
1767 GetOptions ()
1768 {
1769 return &m_options;
1770 }
1771
Enrico Granata1391a392011-06-29 22:27:15 +00001772public:
1773 CommandObjectTypeSummaryList (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001774 CommandObjectParsed (interpreter,
1775 "type summary list",
1776 "Show a list of current summary styles.",
1777 NULL),
1778 m_options(interpreter)
Enrico Granata1391a392011-06-29 22:27:15 +00001779 {
1780 CommandArgumentEntry type_arg;
1781 CommandArgumentData type_style_arg;
1782
1783 type_style_arg.arg_type = eArgTypeName;
1784 type_style_arg.arg_repetition = eArgRepeatOptional;
1785
1786 type_arg.push_back (type_style_arg);
1787
1788 m_arguments.push_back (type_arg);
1789 }
1790
1791 ~CommandObjectTypeSummaryList ()
1792 {
1793 }
1794
Jim Inghamda26bd22012-06-08 21:56:10 +00001795protected:
Enrico Granata1391a392011-06-29 22:27:15 +00001796 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001797 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata1391a392011-06-29 22:27:15 +00001798 {
1799 const size_t argc = command.GetArgumentCount();
1800
1801 CommandObjectTypeSummaryList_LoopCallbackParam *param;
Enrico Granata1e620f02011-07-19 22:35:10 +00001802 RegularExpression* cate_regex =
1803 m_options.m_category_regex.empty() ? NULL :
1804 new RegularExpression(m_options.m_category_regex.c_str());
Enrico Granata1391a392011-06-29 22:27:15 +00001805
Enrico Granata1c617432011-08-18 16:38:26 +00001806 if (argc == 1)
1807 {
Enrico Granata1391a392011-06-29 22:27:15 +00001808 RegularExpression* regex = new RegularExpression(command.GetArgumentAtIndex(0));
1809 regex->Compile(command.GetArgumentAtIndex(0));
Enrico Granata1e620f02011-07-19 22:35:10 +00001810 param = new CommandObjectTypeSummaryList_LoopCallbackParam(this,&result,regex,cate_regex);
Enrico Granata1391a392011-06-29 22:27:15 +00001811 }
1812 else
Enrico Granata1e620f02011-07-19 22:35:10 +00001813 param = new CommandObjectTypeSummaryList_LoopCallbackParam(this,&result,NULL,cate_regex);
Enrico Granata886bc3e2011-07-02 00:25:22 +00001814
Enrico Granataf501c592011-08-17 22:13:59 +00001815 DataVisualization::Categories::LoopThrough(PerCategoryCallback,param);
Enrico Granata8a717e52011-07-19 02:34:21 +00001816
Enrico Granataf501c592011-08-17 22:13:59 +00001817 if (DataVisualization::NamedSummaryFormats::GetCount() > 0)
Enrico Granata1a102082011-07-12 00:18:11 +00001818 {
1819 result.GetOutputStream().Printf("Named summaries:\n");
Enrico Granata1c617432011-08-18 16:38:26 +00001820 if (argc == 1)
1821 {
Enrico Granata1a102082011-07-12 00:18:11 +00001822 RegularExpression* regex = new RegularExpression(command.GetArgumentAtIndex(0));
1823 regex->Compile(command.GetArgumentAtIndex(0));
1824 param = new CommandObjectTypeSummaryList_LoopCallbackParam(this,&result,regex);
1825 }
1826 else
1827 param = new CommandObjectTypeSummaryList_LoopCallbackParam(this,&result);
Enrico Granataf501c592011-08-17 22:13:59 +00001828 DataVisualization::NamedSummaryFormats::LoopThrough(CommandObjectTypeSummaryList_LoopCallback, param);
Enrico Granata1a102082011-07-12 00:18:11 +00001829 delete param;
Enrico Granata886bc3e2011-07-02 00:25:22 +00001830 }
Enrico Granata886bc3e2011-07-02 00:25:22 +00001831
Enrico Granata1e620f02011-07-19 22:35:10 +00001832 if (cate_regex)
1833 delete cate_regex;
1834
Enrico Granata1391a392011-06-29 22:27:15 +00001835 result.SetStatus(eReturnStatusSuccessFinishResult);
1836 return result.Succeeded();
1837 }
1838
1839private:
1840
Enrico Granata8a717e52011-07-19 02:34:21 +00001841 static bool
Enrico Granata1e620f02011-07-19 22:35:10 +00001842 PerCategoryCallback(void* param_vp,
Enrico Granata16376ed2012-02-15 02:34:21 +00001843 const lldb::TypeCategoryImplSP& cate)
Enrico Granata8a717e52011-07-19 02:34:21 +00001844 {
1845
Enrico Granata1e620f02011-07-19 22:35:10 +00001846 CommandObjectTypeSummaryList_LoopCallbackParam* param =
1847 (CommandObjectTypeSummaryList_LoopCallbackParam*)param_vp;
1848 CommandReturnObject* result = param->result;
1849
Enrico Granata16376ed2012-02-15 02:34:21 +00001850 const char* cate_name = cate->GetName();
Enrico Granatab0968f52011-08-22 18:36:52 +00001851
Enrico Granata1e620f02011-07-19 22:35:10 +00001852 // if the category is disabled or empty and there is no regex, just skip it
Enrico Granatad587a582011-08-22 23:45:15 +00001853 if ((cate->IsEnabled() == false || cate->GetCount(eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary) == 0) && param->cate_regex == NULL)
Enrico Granata1e620f02011-07-19 22:35:10 +00001854 return true;
1855
1856 // if we have a regex and this category does not match it, just skip it
1857 if(param->cate_regex != NULL && param->cate_regex->Execute(cate_name) == false)
1858 return true;
1859
Enrico Granata8a717e52011-07-19 02:34:21 +00001860 result->GetOutputStream().Printf("-----------------------\nCategory: %s (%s)\n-----------------------\n",
1861 cate_name,
1862 (cate->IsEnabled() ? "enabled" : "disabled"));
Enrico Granata1e620f02011-07-19 22:35:10 +00001863
Enrico Granata1c617432011-08-18 16:38:26 +00001864 cate->GetSummaryNavigator()->LoopThrough(CommandObjectTypeSummaryList_LoopCallback, param_vp);
Enrico Granata8a717e52011-07-19 02:34:21 +00001865
Enrico Granata1c617432011-08-18 16:38:26 +00001866 if (cate->GetRegexSummaryNavigator()->GetCount() > 0)
Enrico Granata8a717e52011-07-19 02:34:21 +00001867 {
1868 result->GetOutputStream().Printf("Regex-based summaries (slower):\n");
Enrico Granata1c617432011-08-18 16:38:26 +00001869 cate->GetRegexSummaryNavigator()->LoopThrough(CommandObjectTypeRXSummaryList_LoopCallback, param_vp);
Enrico Granata8a717e52011-07-19 02:34:21 +00001870 }
1871 return true;
1872 }
Enrico Granataf501c592011-08-17 22:13:59 +00001873
Enrico Granata8a717e52011-07-19 02:34:21 +00001874
Enrico Granata1391a392011-06-29 22:27:15 +00001875 bool
1876 LoopCallback (const char* type,
Enrico Granata16376ed2012-02-15 02:34:21 +00001877 const lldb::TypeSummaryImplSP& entry,
Enrico Granata1391a392011-06-29 22:27:15 +00001878 RegularExpression* regex,
1879 CommandReturnObject *result)
1880 {
1881 if (regex == NULL || regex->Execute(type))
Enrico Granataf7a9b142011-07-15 02:26:42 +00001882 result->GetOutputStream().Printf ("%s: %s\n", type, entry->GetDescription().c_str());
Enrico Granata1391a392011-06-29 22:27:15 +00001883 return true;
1884 }
1885
Enrico Granata16376ed2012-02-15 02:34:21 +00001886 friend bool CommandObjectTypeSummaryList_LoopCallback(void* pt2self, ConstString type, const lldb::TypeSummaryImplSP& entry);
1887 friend bool CommandObjectTypeRXSummaryList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const lldb::TypeSummaryImplSP& entry);
Enrico Granata1391a392011-06-29 22:27:15 +00001888};
1889
1890bool
1891CommandObjectTypeSummaryList_LoopCallback (
1892 void* pt2self,
Enrico Granataf501c592011-08-17 22:13:59 +00001893 ConstString type,
Enrico Granata16376ed2012-02-15 02:34:21 +00001894 const lldb::TypeSummaryImplSP& entry)
Enrico Granata1391a392011-06-29 22:27:15 +00001895{
1896 CommandObjectTypeSummaryList_LoopCallbackParam* param = (CommandObjectTypeSummaryList_LoopCallbackParam*)pt2self;
Enrico Granataf501c592011-08-17 22:13:59 +00001897 return param->self->LoopCallback(type.AsCString(), entry, param->regex, param->result);
Enrico Granata1391a392011-06-29 22:27:15 +00001898}
1899
Enrico Granata886bc3e2011-07-02 00:25:22 +00001900bool
1901CommandObjectTypeRXSummaryList_LoopCallback (
1902 void* pt2self,
1903 lldb::RegularExpressionSP regex,
Enrico Granata16376ed2012-02-15 02:34:21 +00001904 const lldb::TypeSummaryImplSP& entry)
Enrico Granata886bc3e2011-07-02 00:25:22 +00001905{
Enrico Granata8a717e52011-07-19 02:34:21 +00001906 CommandObjectTypeSummaryList_LoopCallbackParam* param = (CommandObjectTypeSummaryList_LoopCallbackParam*)pt2self;
Enrico Granata886bc3e2011-07-02 00:25:22 +00001907 return param->self->LoopCallback(regex->GetText(), entry, param->regex, param->result);
1908}
Enrico Granata1391a392011-06-29 22:27:15 +00001909
Enrico Granata1e620f02011-07-19 22:35:10 +00001910OptionDefinition
1911CommandObjectTypeSummaryList::CommandOptions::g_option_table[] =
1912{
1913 { LLDB_OPT_SET_ALL, false, "category-regex", 'w', required_argument, NULL, 0, eArgTypeName, "Only show categories matching this filter."},
1914 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
1915};
1916
Enrico Granata8a717e52011-07-19 02:34:21 +00001917//-------------------------------------------------------------------------
1918// CommandObjectTypeCategoryEnable
1919//-------------------------------------------------------------------------
1920
Jim Inghamda26bd22012-06-08 21:56:10 +00001921class CommandObjectTypeCategoryEnable : public CommandObjectParsed
Enrico Granata8a717e52011-07-19 02:34:21 +00001922{
1923public:
1924 CommandObjectTypeCategoryEnable (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001925 CommandObjectParsed (interpreter,
1926 "type category enable",
1927 "Enable a category as a source of formatters.",
1928 NULL)
Enrico Granata8a717e52011-07-19 02:34:21 +00001929 {
1930 CommandArgumentEntry type_arg;
1931 CommandArgumentData type_style_arg;
1932
1933 type_style_arg.arg_type = eArgTypeName;
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001934 type_style_arg.arg_repetition = eArgRepeatPlus;
Enrico Granata8a717e52011-07-19 02:34:21 +00001935
1936 type_arg.push_back (type_style_arg);
1937
1938 m_arguments.push_back (type_arg);
1939
1940 }
1941
1942 ~CommandObjectTypeCategoryEnable ()
1943 {
1944 }
1945
Jim Inghamda26bd22012-06-08 21:56:10 +00001946protected:
Enrico Granata8a717e52011-07-19 02:34:21 +00001947 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001948 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata8a717e52011-07-19 02:34:21 +00001949 {
1950 const size_t argc = command.GetArgumentCount();
1951
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001952 if (argc < 1)
Enrico Granata8a717e52011-07-19 02:34:21 +00001953 {
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001954 result.AppendErrorWithFormat ("%s takes 1 or more args.\n", m_cmd_name.c_str());
Enrico Granata8a717e52011-07-19 02:34:21 +00001955 result.SetStatus(eReturnStatusFailed);
1956 return false;
1957 }
1958
Enrico Granata2f7fd492012-08-14 18:18:07 +00001959 if (argc == 1 && strcmp(command.GetArgumentAtIndex(0),"*") == 0)
Enrico Granata8a717e52011-07-19 02:34:21 +00001960 {
Enrico Granata2f7fd492012-08-14 18:18:07 +00001961 // we want to make sure to enable "system" last and "default" first
1962 DataVisualization::Categories::Enable(ConstString("default"), CategoryMap::First);
1963 uint32_t num_categories = DataVisualization::Categories::GetCount();
1964 for (uint32_t i = 0; i < num_categories; i++)
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00001965 {
Enrico Granata2f7fd492012-08-14 18:18:07 +00001966 lldb::TypeCategoryImplSP category_sp = DataVisualization::Categories::GetCategoryAtIndex(i);
1967 if (category_sp)
Enrico Granatab0968f52011-08-22 18:36:52 +00001968 {
Enrico Granata2f7fd492012-08-14 18:18:07 +00001969 if ( ::strcmp(category_sp->GetName(), "system") == 0 ||
1970 ::strcmp(category_sp->GetName(), "default") == 0 )
1971 continue;
1972 else
1973 DataVisualization::Categories::Enable(category_sp, CategoryMap::Default);
1974 }
1975 }
1976 DataVisualization::Categories::Enable(ConstString("system"), CategoryMap::Last);
1977 }
1978 else
1979 {
1980 for (int i = argc - 1; i >= 0; i--)
1981 {
1982 const char* typeA = command.GetArgumentAtIndex(i);
1983 ConstString typeCS(typeA);
1984
1985 if (!typeCS)
1986 {
1987 result.AppendError("empty category name not allowed");
1988 result.SetStatus(eReturnStatusFailed);
1989 return false;
1990 }
1991 DataVisualization::Categories::Enable(typeCS);
1992 lldb::TypeCategoryImplSP cate;
1993 if (DataVisualization::Categories::GetCategory(typeCS, cate) && cate.get())
1994 {
1995 if (cate->GetCount() == 0)
1996 {
1997 result.AppendWarning("empty category enabled (typo?)");
1998 }
Enrico Granatab0968f52011-08-22 18:36:52 +00001999 }
2000 }
Enrico Granata8a717e52011-07-19 02:34:21 +00002001 }
2002
Enrico Granata8a717e52011-07-19 02:34:21 +00002003 result.SetStatus(eReturnStatusSuccessFinishResult);
2004 return result.Succeeded();
2005 }
2006
2007};
2008
2009//-------------------------------------------------------------------------
2010// CommandObjectTypeCategoryDelete
2011//-------------------------------------------------------------------------
2012
Jim Inghamda26bd22012-06-08 21:56:10 +00002013class CommandObjectTypeCategoryDelete : public CommandObjectParsed
Enrico Granata8a717e52011-07-19 02:34:21 +00002014{
2015public:
2016 CommandObjectTypeCategoryDelete (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002017 CommandObjectParsed (interpreter,
2018 "type category delete",
2019 "Delete a category and all associated formatters.",
2020 NULL)
Enrico Granata8a717e52011-07-19 02:34:21 +00002021 {
2022 CommandArgumentEntry type_arg;
2023 CommandArgumentData type_style_arg;
Enrico Granata6a043532012-05-03 01:08:44 +00002024
Enrico Granata8a717e52011-07-19 02:34:21 +00002025 type_style_arg.arg_type = eArgTypeName;
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002026 type_style_arg.arg_repetition = eArgRepeatPlus;
Enrico Granata6a043532012-05-03 01:08:44 +00002027
Enrico Granata8a717e52011-07-19 02:34:21 +00002028 type_arg.push_back (type_style_arg);
2029
2030 m_arguments.push_back (type_arg);
2031
2032 }
2033
2034 ~CommandObjectTypeCategoryDelete ()
2035 {
2036 }
2037
Jim Inghamda26bd22012-06-08 21:56:10 +00002038protected:
Enrico Granata8a717e52011-07-19 02:34:21 +00002039 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002040 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata8a717e52011-07-19 02:34:21 +00002041 {
2042 const size_t argc = command.GetArgumentCount();
2043
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002044 if (argc < 1)
Enrico Granata8a717e52011-07-19 02:34:21 +00002045 {
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002046 result.AppendErrorWithFormat ("%s takes 1 or more arg.\n", m_cmd_name.c_str());
Enrico Granata8a717e52011-07-19 02:34:21 +00002047 result.SetStatus(eReturnStatusFailed);
2048 return false;
2049 }
2050
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002051 bool success = true;
Enrico Granata8a717e52011-07-19 02:34:21 +00002052
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002053 // the order is not relevant here
2054 for (int i = argc - 1; i >= 0; i--)
Enrico Granata8a717e52011-07-19 02:34:21 +00002055 {
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002056 const char* typeA = command.GetArgumentAtIndex(i);
2057 ConstString typeCS(typeA);
2058
2059 if (!typeCS)
2060 {
2061 result.AppendError("empty category name not allowed");
2062 result.SetStatus(eReturnStatusFailed);
2063 return false;
2064 }
Enrico Granataf501c592011-08-17 22:13:59 +00002065 if (!DataVisualization::Categories::Delete(typeCS))
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002066 success = false; // keep deleting even if we hit an error
Enrico Granata8a717e52011-07-19 02:34:21 +00002067 }
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002068 if (success)
Enrico Granata8a717e52011-07-19 02:34:21 +00002069 {
2070 result.SetStatus(eReturnStatusSuccessFinishResult);
2071 return result.Succeeded();
2072 }
2073 else
2074 {
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002075 result.AppendError("cannot delete one or more categories\n");
Enrico Granata8a717e52011-07-19 02:34:21 +00002076 result.SetStatus(eReturnStatusFailed);
2077 return false;
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002078 }
Enrico Granata8a717e52011-07-19 02:34:21 +00002079 }
Enrico Granata8a717e52011-07-19 02:34:21 +00002080};
2081
2082//-------------------------------------------------------------------------
2083// CommandObjectTypeCategoryDisable
2084//-------------------------------------------------------------------------
2085
Jim Inghamda26bd22012-06-08 21:56:10 +00002086class CommandObjectTypeCategoryDisable : public CommandObjectParsed
Enrico Granata8a717e52011-07-19 02:34:21 +00002087{
2088public:
2089 CommandObjectTypeCategoryDisable (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002090 CommandObjectParsed (interpreter,
2091 "type category disable",
2092 "Disable a category as a source of formatters.",
2093 NULL)
Enrico Granata8a717e52011-07-19 02:34:21 +00002094 {
2095 CommandArgumentEntry type_arg;
2096 CommandArgumentData type_style_arg;
2097
2098 type_style_arg.arg_type = eArgTypeName;
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002099 type_style_arg.arg_repetition = eArgRepeatPlus;
Enrico Granata8a717e52011-07-19 02:34:21 +00002100
2101 type_arg.push_back (type_style_arg);
2102
2103 m_arguments.push_back (type_arg);
2104
2105 }
2106
2107 ~CommandObjectTypeCategoryDisable ()
2108 {
2109 }
2110
Jim Inghamda26bd22012-06-08 21:56:10 +00002111protected:
Enrico Granata8a717e52011-07-19 02:34:21 +00002112 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002113 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata8a717e52011-07-19 02:34:21 +00002114 {
2115 const size_t argc = command.GetArgumentCount();
2116
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002117 if (argc < 1)
Enrico Granata8a717e52011-07-19 02:34:21 +00002118 {
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002119 result.AppendErrorWithFormat ("%s takes 1 or more args.\n", m_cmd_name.c_str());
Enrico Granata8a717e52011-07-19 02:34:21 +00002120 result.SetStatus(eReturnStatusFailed);
2121 return false;
2122 }
2123
Enrico Granata6a043532012-05-03 01:08:44 +00002124 if (argc == 1 && strcmp(command.GetArgumentAtIndex(0),"*") == 0)
Enrico Granata8a717e52011-07-19 02:34:21 +00002125 {
Enrico Granata6a043532012-05-03 01:08:44 +00002126 uint32_t num_categories = DataVisualization::Categories::GetCount();
2127 for (uint32_t i = 0; i < num_categories; i++)
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002128 {
Enrico Granata6a043532012-05-03 01:08:44 +00002129 lldb::TypeCategoryImplSP category_sp = DataVisualization::Categories::GetCategoryAtIndex(i);
2130 // no need to check if the category is enabled - disabling a disabled category has no effect
2131 if (category_sp)
2132 DataVisualization::Categories::Disable(category_sp);
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002133 }
Enrico Granata6a043532012-05-03 01:08:44 +00002134 }
2135 else
2136 {
2137 // the order is not relevant here
2138 for (int i = argc - 1; i >= 0; i--)
2139 {
2140 const char* typeA = command.GetArgumentAtIndex(i);
2141 ConstString typeCS(typeA);
2142
2143 if (!typeCS)
2144 {
2145 result.AppendError("empty category name not allowed");
2146 result.SetStatus(eReturnStatusFailed);
2147 return false;
2148 }
2149 DataVisualization::Categories::Disable(typeCS);
2150 }
Enrico Granata8a717e52011-07-19 02:34:21 +00002151 }
Enrico Granata4c3fb4b2011-07-19 18:03:25 +00002152
Enrico Granata8a717e52011-07-19 02:34:21 +00002153 result.SetStatus(eReturnStatusSuccessFinishResult);
2154 return result.Succeeded();
2155 }
2156
2157};
2158
2159//-------------------------------------------------------------------------
2160// CommandObjectTypeCategoryList
2161//-------------------------------------------------------------------------
2162
Jim Inghamda26bd22012-06-08 21:56:10 +00002163class CommandObjectTypeCategoryList : public CommandObjectParsed
Enrico Granata8a717e52011-07-19 02:34:21 +00002164{
2165private:
Enrico Granata1e620f02011-07-19 22:35:10 +00002166
2167 struct CommandObjectTypeCategoryList_CallbackParam
2168 {
2169 CommandReturnObject* result;
2170 RegularExpression* regex;
2171
2172 CommandObjectTypeCategoryList_CallbackParam(CommandReturnObject* res,
2173 RegularExpression* rex = NULL) :
2174 result(res),
2175 regex(rex)
2176 {
2177 }
2178
2179 };
2180
Enrico Granata8a717e52011-07-19 02:34:21 +00002181 static bool
Enrico Granata1e620f02011-07-19 22:35:10 +00002182 PerCategoryCallback(void* param_vp,
Enrico Granata16376ed2012-02-15 02:34:21 +00002183 const lldb::TypeCategoryImplSP& cate)
Enrico Granata8a717e52011-07-19 02:34:21 +00002184 {
Enrico Granata1e620f02011-07-19 22:35:10 +00002185 CommandObjectTypeCategoryList_CallbackParam* param =
2186 (CommandObjectTypeCategoryList_CallbackParam*)param_vp;
2187 CommandReturnObject* result = param->result;
2188 RegularExpression* regex = param->regex;
2189
Enrico Granata16376ed2012-02-15 02:34:21 +00002190 const char* cate_name = cate->GetName();
Enrico Granatab0968f52011-08-22 18:36:52 +00002191
Enrico Granata1e620f02011-07-19 22:35:10 +00002192 if (regex == NULL || regex->Execute(cate_name))
2193 result->GetOutputStream().Printf("Category %s is%s enabled\n",
Enrico Granata8a717e52011-07-19 02:34:21 +00002194 cate_name,
2195 (cate->IsEnabled() ? "" : " not"));
2196 return true;
2197 }
2198public:
2199 CommandObjectTypeCategoryList (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002200 CommandObjectParsed (interpreter,
2201 "type category list",
2202 "Provide a list of all existing categories.",
2203 NULL)
Enrico Granata8a717e52011-07-19 02:34:21 +00002204 {
Enrico Granata1e620f02011-07-19 22:35:10 +00002205 CommandArgumentEntry type_arg;
2206 CommandArgumentData type_style_arg;
2207
2208 type_style_arg.arg_type = eArgTypeName;
2209 type_style_arg.arg_repetition = eArgRepeatOptional;
2210
2211 type_arg.push_back (type_style_arg);
2212
2213 m_arguments.push_back (type_arg);
Enrico Granata8a717e52011-07-19 02:34:21 +00002214 }
2215
2216 ~CommandObjectTypeCategoryList ()
2217 {
2218 }
2219
Jim Inghamda26bd22012-06-08 21:56:10 +00002220protected:
Enrico Granata8a717e52011-07-19 02:34:21 +00002221 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002222 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata8a717e52011-07-19 02:34:21 +00002223 {
Enrico Granata1e620f02011-07-19 22:35:10 +00002224 const size_t argc = command.GetArgumentCount();
2225 RegularExpression* regex = NULL;
2226
2227 if (argc == 0)
2228 ;
2229 else if (argc == 1)
2230 regex = new RegularExpression(command.GetArgumentAtIndex(0));
2231 else
2232 {
2233 result.AppendErrorWithFormat ("%s takes 0 or one arg.\n", m_cmd_name.c_str());
2234 result.SetStatus(eReturnStatusFailed);
2235 return false;
2236 }
2237
2238 CommandObjectTypeCategoryList_CallbackParam param(&result,
2239 regex);
2240
Enrico Granataf501c592011-08-17 22:13:59 +00002241 DataVisualization::Categories::LoopThrough(PerCategoryCallback, &param);
Enrico Granata1e620f02011-07-19 22:35:10 +00002242
2243 if (regex)
2244 delete regex;
2245
Enrico Granata8a717e52011-07-19 02:34:21 +00002246 result.SetStatus(eReturnStatusSuccessFinishResult);
2247 return result.Succeeded();
2248 }
2249
2250};
2251
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002252//-------------------------------------------------------------------------
Enrico Granata018921d2011-08-12 02:00:06 +00002253// CommandObjectTypeFilterList
2254//-------------------------------------------------------------------------
2255
Enrico Granataf501c592011-08-17 22:13:59 +00002256bool CommandObjectTypeFilterList_LoopCallback(void* pt2self, ConstString type, const SyntheticChildren::SharedPointer& entry);
Enrico Granata018921d2011-08-12 02:00:06 +00002257bool CommandObjectTypeFilterRXList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const SyntheticChildren::SharedPointer& entry);
2258
2259class CommandObjectTypeFilterList;
2260
2261struct CommandObjectTypeFilterList_LoopCallbackParam {
2262 CommandObjectTypeFilterList* self;
2263 CommandReturnObject* result;
2264 RegularExpression* regex;
2265 RegularExpression* cate_regex;
2266 CommandObjectTypeFilterList_LoopCallbackParam(CommandObjectTypeFilterList* S, CommandReturnObject* R,
2267 RegularExpression* X = NULL,
2268 RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
2269};
2270
Jim Inghamda26bd22012-06-08 21:56:10 +00002271class CommandObjectTypeFilterList : public CommandObjectParsed
Enrico Granata018921d2011-08-12 02:00:06 +00002272{
2273
2274 class CommandOptions : public Options
2275 {
2276 public:
2277
2278 CommandOptions (CommandInterpreter &interpreter) :
2279 Options (interpreter)
2280 {
2281 }
2282
2283 virtual
2284 ~CommandOptions (){}
2285
2286 virtual Error
2287 SetOptionValue (uint32_t option_idx, const char *option_arg)
2288 {
2289 Error error;
2290 char short_option = (char) m_getopt_table[option_idx].val;
2291
2292 switch (short_option)
2293 {
2294 case 'w':
2295 m_category_regex = std::string(option_arg);
2296 break;
2297 default:
Greg Clayton9c236732011-10-26 00:56:27 +00002298 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata018921d2011-08-12 02:00:06 +00002299 break;
2300 }
2301
2302 return error;
2303 }
2304
2305 void
2306 OptionParsingStarting ()
2307 {
2308 m_category_regex = "";
2309 }
2310
2311 const OptionDefinition*
2312 GetDefinitions ()
2313 {
2314 return g_option_table;
2315 }
2316
2317 // Options table: Required for subclasses of Options.
2318
2319 static OptionDefinition g_option_table[];
2320
2321 // Instance variables to hold the values for command options.
2322
2323 std::string m_category_regex;
2324
2325 };
2326
2327 CommandOptions m_options;
2328
2329 virtual Options *
2330 GetOptions ()
2331 {
2332 return &m_options;
2333 }
2334
2335public:
2336 CommandObjectTypeFilterList (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002337 CommandObjectParsed (interpreter,
2338 "type filter list",
2339 "Show a list of current filters.",
2340 NULL),
2341 m_options(interpreter)
Enrico Granata018921d2011-08-12 02:00:06 +00002342 {
2343 CommandArgumentEntry type_arg;
2344 CommandArgumentData type_style_arg;
2345
2346 type_style_arg.arg_type = eArgTypeName;
2347 type_style_arg.arg_repetition = eArgRepeatOptional;
2348
2349 type_arg.push_back (type_style_arg);
2350
2351 m_arguments.push_back (type_arg);
2352 }
2353
2354 ~CommandObjectTypeFilterList ()
2355 {
2356 }
2357
Jim Inghamda26bd22012-06-08 21:56:10 +00002358protected:
Enrico Granata018921d2011-08-12 02:00:06 +00002359 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002360 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata018921d2011-08-12 02:00:06 +00002361 {
2362 const size_t argc = command.GetArgumentCount();
2363
2364 CommandObjectTypeFilterList_LoopCallbackParam *param;
2365 RegularExpression* cate_regex =
2366 m_options.m_category_regex.empty() ? NULL :
2367 new RegularExpression(m_options.m_category_regex.c_str());
2368
Enrico Granata1c617432011-08-18 16:38:26 +00002369 if (argc == 1)
2370 {
Enrico Granata018921d2011-08-12 02:00:06 +00002371 RegularExpression* regex = new RegularExpression(command.GetArgumentAtIndex(0));
2372 regex->Compile(command.GetArgumentAtIndex(0));
2373 param = new CommandObjectTypeFilterList_LoopCallbackParam(this,&result,regex,cate_regex);
2374 }
2375 else
2376 param = new CommandObjectTypeFilterList_LoopCallbackParam(this,&result,NULL,cate_regex);
2377
Enrico Granataf501c592011-08-17 22:13:59 +00002378 DataVisualization::Categories::LoopThrough(PerCategoryCallback,param);
Enrico Granata018921d2011-08-12 02:00:06 +00002379
2380 if (cate_regex)
2381 delete cate_regex;
2382
2383 result.SetStatus(eReturnStatusSuccessFinishResult);
2384 return result.Succeeded();
2385 }
2386
2387private:
2388
2389 static bool
2390 PerCategoryCallback(void* param_vp,
Enrico Granata16376ed2012-02-15 02:34:21 +00002391 const lldb::TypeCategoryImplSP& cate)
Enrico Granata018921d2011-08-12 02:00:06 +00002392 {
2393
Enrico Granata16376ed2012-02-15 02:34:21 +00002394 const char* cate_name = cate->GetName();
Enrico Granatab0968f52011-08-22 18:36:52 +00002395
Enrico Granata018921d2011-08-12 02:00:06 +00002396 CommandObjectTypeFilterList_LoopCallbackParam* param =
2397 (CommandObjectTypeFilterList_LoopCallbackParam*)param_vp;
2398 CommandReturnObject* result = param->result;
2399
2400 // if the category is disabled or empty and there is no regex, just skip it
Enrico Granatad587a582011-08-22 23:45:15 +00002401 if ((cate->IsEnabled() == false || cate->GetCount(eFormatCategoryItemFilter | eFormatCategoryItemRegexFilter) == 0) && param->cate_regex == NULL)
Enrico Granata018921d2011-08-12 02:00:06 +00002402 return true;
2403
2404 // if we have a regex and this category does not match it, just skip it
2405 if(param->cate_regex != NULL && param->cate_regex->Execute(cate_name) == false)
2406 return true;
2407
2408 result->GetOutputStream().Printf("-----------------------\nCategory: %s (%s)\n-----------------------\n",
2409 cate_name,
2410 (cate->IsEnabled() ? "enabled" : "disabled"));
2411
Enrico Granata1c617432011-08-18 16:38:26 +00002412 cate->GetFilterNavigator()->LoopThrough(CommandObjectTypeFilterList_LoopCallback, param_vp);
Enrico Granata018921d2011-08-12 02:00:06 +00002413
Enrico Granata1c617432011-08-18 16:38:26 +00002414 if (cate->GetRegexFilterNavigator()->GetCount() > 0)
Enrico Granata018921d2011-08-12 02:00:06 +00002415 {
2416 result->GetOutputStream().Printf("Regex-based filters (slower):\n");
Enrico Granata1c617432011-08-18 16:38:26 +00002417 cate->GetRegexFilterNavigator()->LoopThrough(CommandObjectTypeFilterRXList_LoopCallback, param_vp);
Enrico Granata018921d2011-08-12 02:00:06 +00002418 }
2419
2420 return true;
2421 }
2422
2423 bool
2424 LoopCallback (const char* type,
2425 const SyntheticChildren::SharedPointer& entry,
2426 RegularExpression* regex,
2427 CommandReturnObject *result)
2428 {
2429 if (regex == NULL || regex->Execute(type))
2430 result->GetOutputStream().Printf ("%s: %s\n", type, entry->GetDescription().c_str());
2431 return true;
2432 }
2433
Enrico Granataf501c592011-08-17 22:13:59 +00002434 friend bool CommandObjectTypeFilterList_LoopCallback(void* pt2self, ConstString type, const SyntheticChildren::SharedPointer& entry);
Enrico Granata018921d2011-08-12 02:00:06 +00002435 friend bool CommandObjectTypeFilterRXList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const SyntheticChildren::SharedPointer& entry);
2436};
2437
2438bool
2439CommandObjectTypeFilterList_LoopCallback (void* pt2self,
Enrico Granataf501c592011-08-17 22:13:59 +00002440 ConstString type,
Enrico Granata018921d2011-08-12 02:00:06 +00002441 const SyntheticChildren::SharedPointer& entry)
2442{
2443 CommandObjectTypeFilterList_LoopCallbackParam* param = (CommandObjectTypeFilterList_LoopCallbackParam*)pt2self;
Enrico Granataf501c592011-08-17 22:13:59 +00002444 return param->self->LoopCallback(type.AsCString(), entry, param->regex, param->result);
Enrico Granata018921d2011-08-12 02:00:06 +00002445}
2446
2447bool
2448CommandObjectTypeFilterRXList_LoopCallback (void* pt2self,
2449 lldb::RegularExpressionSP regex,
2450 const SyntheticChildren::SharedPointer& entry)
2451{
2452 CommandObjectTypeFilterList_LoopCallbackParam* param = (CommandObjectTypeFilterList_LoopCallbackParam*)pt2self;
2453 return param->self->LoopCallback(regex->GetText(), entry, param->regex, param->result);
2454}
2455
2456
2457OptionDefinition
2458CommandObjectTypeFilterList::CommandOptions::g_option_table[] =
2459{
2460 { LLDB_OPT_SET_ALL, false, "category-regex", 'w', required_argument, NULL, 0, eArgTypeName, "Only show categories matching this filter."},
2461 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
2462};
2463
Greg Clayton3e4238d2011-11-04 03:34:56 +00002464#ifndef LLDB_DISABLE_PYTHON
2465
Enrico Granata018921d2011-08-12 02:00:06 +00002466//-------------------------------------------------------------------------
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002467// CommandObjectTypeSynthList
2468//-------------------------------------------------------------------------
2469
Enrico Granataf501c592011-08-17 22:13:59 +00002470bool CommandObjectTypeSynthList_LoopCallback(void* pt2self, ConstString type, const SyntheticChildren::SharedPointer& entry);
Enrico Granata018921d2011-08-12 02:00:06 +00002471bool CommandObjectTypeSynthRXList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const SyntheticChildren::SharedPointer& entry);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002472
2473class CommandObjectTypeSynthList;
2474
2475struct CommandObjectTypeSynthList_LoopCallbackParam {
2476 CommandObjectTypeSynthList* self;
2477 CommandReturnObject* result;
2478 RegularExpression* regex;
2479 RegularExpression* cate_regex;
2480 CommandObjectTypeSynthList_LoopCallbackParam(CommandObjectTypeSynthList* S, CommandReturnObject* R,
2481 RegularExpression* X = NULL,
2482 RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
2483};
2484
Jim Inghamda26bd22012-06-08 21:56:10 +00002485class CommandObjectTypeSynthList : public CommandObjectParsed
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002486{
2487
2488 class CommandOptions : public Options
2489 {
2490 public:
2491
2492 CommandOptions (CommandInterpreter &interpreter) :
2493 Options (interpreter)
2494 {
2495 }
2496
2497 virtual
2498 ~CommandOptions (){}
2499
2500 virtual Error
2501 SetOptionValue (uint32_t option_idx, const char *option_arg)
2502 {
2503 Error error;
2504 char short_option = (char) m_getopt_table[option_idx].val;
2505
2506 switch (short_option)
2507 {
2508 case 'w':
2509 m_category_regex = std::string(option_arg);
2510 break;
2511 default:
Greg Clayton9c236732011-10-26 00:56:27 +00002512 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002513 break;
2514 }
2515
2516 return error;
2517 }
2518
2519 void
2520 OptionParsingStarting ()
2521 {
2522 m_category_regex = "";
2523 }
2524
2525 const OptionDefinition*
2526 GetDefinitions ()
2527 {
2528 return g_option_table;
2529 }
2530
2531 // Options table: Required for subclasses of Options.
2532
2533 static OptionDefinition g_option_table[];
2534
2535 // Instance variables to hold the values for command options.
2536
2537 std::string m_category_regex;
2538
2539 };
2540
2541 CommandOptions m_options;
2542
2543 virtual Options *
2544 GetOptions ()
2545 {
2546 return &m_options;
2547 }
2548
2549public:
2550 CommandObjectTypeSynthList (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002551 CommandObjectParsed (interpreter,
2552 "type synthetic list",
2553 "Show a list of current synthetic providers.",
2554 NULL),
2555 m_options(interpreter)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002556 {
2557 CommandArgumentEntry type_arg;
2558 CommandArgumentData type_style_arg;
2559
2560 type_style_arg.arg_type = eArgTypeName;
2561 type_style_arg.arg_repetition = eArgRepeatOptional;
2562
2563 type_arg.push_back (type_style_arg);
2564
2565 m_arguments.push_back (type_arg);
2566 }
2567
2568 ~CommandObjectTypeSynthList ()
2569 {
2570 }
2571
Jim Inghamda26bd22012-06-08 21:56:10 +00002572protected:
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002573 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002574 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002575 {
2576 const size_t argc = command.GetArgumentCount();
2577
2578 CommandObjectTypeSynthList_LoopCallbackParam *param;
2579 RegularExpression* cate_regex =
2580 m_options.m_category_regex.empty() ? NULL :
2581 new RegularExpression(m_options.m_category_regex.c_str());
2582
Enrico Granata1c617432011-08-18 16:38:26 +00002583 if (argc == 1)
2584 {
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002585 RegularExpression* regex = new RegularExpression(command.GetArgumentAtIndex(0));
2586 regex->Compile(command.GetArgumentAtIndex(0));
2587 param = new CommandObjectTypeSynthList_LoopCallbackParam(this,&result,regex,cate_regex);
2588 }
2589 else
2590 param = new CommandObjectTypeSynthList_LoopCallbackParam(this,&result,NULL,cate_regex);
2591
Enrico Granataf501c592011-08-17 22:13:59 +00002592 DataVisualization::Categories::LoopThrough(PerCategoryCallback,param);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002593
2594 if (cate_regex)
2595 delete cate_regex;
2596
2597 result.SetStatus(eReturnStatusSuccessFinishResult);
2598 return result.Succeeded();
2599 }
2600
2601private:
2602
2603 static bool
2604 PerCategoryCallback(void* param_vp,
Enrico Granata16376ed2012-02-15 02:34:21 +00002605 const lldb::TypeCategoryImplSP& cate)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002606 {
2607
2608 CommandObjectTypeSynthList_LoopCallbackParam* param =
2609 (CommandObjectTypeSynthList_LoopCallbackParam*)param_vp;
2610 CommandReturnObject* result = param->result;
2611
Enrico Granata16376ed2012-02-15 02:34:21 +00002612 const char* cate_name = cate->GetName();
Enrico Granatab0968f52011-08-22 18:36:52 +00002613
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002614 // if the category is disabled or empty and there is no regex, just skip it
Enrico Granatad587a582011-08-22 23:45:15 +00002615 if ((cate->IsEnabled() == false || cate->GetCount(eFormatCategoryItemSynth | eFormatCategoryItemRegexSynth) == 0) && param->cate_regex == NULL)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002616 return true;
2617
2618 // if we have a regex and this category does not match it, just skip it
2619 if(param->cate_regex != NULL && param->cate_regex->Execute(cate_name) == false)
2620 return true;
2621
2622 result->GetOutputStream().Printf("-----------------------\nCategory: %s (%s)\n-----------------------\n",
2623 cate_name,
2624 (cate->IsEnabled() ? "enabled" : "disabled"));
2625
Enrico Granata1c617432011-08-18 16:38:26 +00002626 cate->GetSyntheticNavigator()->LoopThrough(CommandObjectTypeSynthList_LoopCallback, param_vp);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002627
Enrico Granata1c617432011-08-18 16:38:26 +00002628 if (cate->GetRegexSyntheticNavigator()->GetCount() > 0)
Enrico Granataa54ad992011-08-05 01:32:50 +00002629 {
Enrico Granata018921d2011-08-12 02:00:06 +00002630 result->GetOutputStream().Printf("Regex-based synthetic providers (slower):\n");
Enrico Granata1c617432011-08-18 16:38:26 +00002631 cate->GetRegexSyntheticNavigator()->LoopThrough(CommandObjectTypeSynthRXList_LoopCallback, param_vp);
Enrico Granataa54ad992011-08-05 01:32:50 +00002632 }
2633
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002634 return true;
2635 }
2636
2637 bool
2638 LoopCallback (const char* type,
Enrico Granata018921d2011-08-12 02:00:06 +00002639 const SyntheticChildren::SharedPointer& entry,
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002640 RegularExpression* regex,
2641 CommandReturnObject *result)
2642 {
Enrico Granata018921d2011-08-12 02:00:06 +00002643 if (regex == NULL || regex->Execute(type))
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002644 result->GetOutputStream().Printf ("%s: %s\n", type, entry->GetDescription().c_str());
2645 return true;
2646 }
2647
Enrico Granataf501c592011-08-17 22:13:59 +00002648 friend bool CommandObjectTypeSynthList_LoopCallback(void* pt2self, ConstString type, const SyntheticChildren::SharedPointer& entry);
Enrico Granata018921d2011-08-12 02:00:06 +00002649 friend bool CommandObjectTypeSynthRXList_LoopCallback(void* pt2self, lldb::RegularExpressionSP regex, const SyntheticChildren::SharedPointer& entry);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002650};
2651
2652bool
2653CommandObjectTypeSynthList_LoopCallback (void* pt2self,
Enrico Granataf501c592011-08-17 22:13:59 +00002654 ConstString type,
Enrico Granata018921d2011-08-12 02:00:06 +00002655 const SyntheticChildren::SharedPointer& entry)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002656{
2657 CommandObjectTypeSynthList_LoopCallbackParam* param = (CommandObjectTypeSynthList_LoopCallbackParam*)pt2self;
Enrico Granataf501c592011-08-17 22:13:59 +00002658 return param->self->LoopCallback(type.AsCString(), entry, param->regex, param->result);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002659}
2660
Enrico Granataa54ad992011-08-05 01:32:50 +00002661bool
2662CommandObjectTypeSynthRXList_LoopCallback (void* pt2self,
2663 lldb::RegularExpressionSP regex,
Enrico Granata018921d2011-08-12 02:00:06 +00002664 const SyntheticChildren::SharedPointer& entry)
Enrico Granataa54ad992011-08-05 01:32:50 +00002665{
2666 CommandObjectTypeSynthList_LoopCallbackParam* param = (CommandObjectTypeSynthList_LoopCallbackParam*)pt2self;
2667 return param->self->LoopCallback(regex->GetText(), entry, param->regex, param->result);
2668}
2669
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002670
2671OptionDefinition
2672CommandObjectTypeSynthList::CommandOptions::g_option_table[] =
2673{
2674 { LLDB_OPT_SET_ALL, false, "category-regex", 'w', required_argument, NULL, 0, eArgTypeName, "Only show categories matching this filter."},
2675 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
2676};
2677
Greg Clayton3e4238d2011-11-04 03:34:56 +00002678#endif // #ifndef LLDB_DISABLE_PYTHON
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002679//-------------------------------------------------------------------------
Enrico Granata018921d2011-08-12 02:00:06 +00002680// CommandObjectTypeFilterDelete
2681//-------------------------------------------------------------------------
2682
Jim Inghamda26bd22012-06-08 21:56:10 +00002683class CommandObjectTypeFilterDelete : public CommandObjectParsed
Enrico Granata018921d2011-08-12 02:00:06 +00002684{
2685private:
2686 class CommandOptions : public Options
2687 {
2688 public:
2689
2690 CommandOptions (CommandInterpreter &interpreter) :
2691 Options (interpreter)
2692 {
2693 }
2694
2695 virtual
2696 ~CommandOptions (){}
2697
2698 virtual Error
2699 SetOptionValue (uint32_t option_idx, const char *option_arg)
2700 {
2701 Error error;
2702 char short_option = (char) m_getopt_table[option_idx].val;
2703
2704 switch (short_option)
2705 {
2706 case 'a':
2707 m_delete_all = true;
2708 break;
2709 case 'w':
2710 m_category = std::string(option_arg);
2711 break;
2712 default:
Greg Clayton9c236732011-10-26 00:56:27 +00002713 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata018921d2011-08-12 02:00:06 +00002714 break;
2715 }
2716
2717 return error;
2718 }
2719
2720 void
2721 OptionParsingStarting ()
2722 {
2723 m_delete_all = false;
2724 m_category = "default";
2725 }
2726
2727 const OptionDefinition*
2728 GetDefinitions ()
2729 {
2730 return g_option_table;
2731 }
2732
2733 // Options table: Required for subclasses of Options.
2734
2735 static OptionDefinition g_option_table[];
2736
2737 // Instance variables to hold the values for command options.
2738
2739 bool m_delete_all;
2740 std::string m_category;
2741
2742 };
2743
2744 CommandOptions m_options;
2745
2746 virtual Options *
2747 GetOptions ()
2748 {
2749 return &m_options;
2750 }
2751
2752 static bool
2753 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00002754 const lldb::TypeCategoryImplSP& cate)
Enrico Granata018921d2011-08-12 02:00:06 +00002755 {
Enrico Granataf501c592011-08-17 22:13:59 +00002756 ConstString *name = (ConstString*)param;
Enrico Granatad587a582011-08-22 23:45:15 +00002757 return cate->Delete(*name, eFormatCategoryItemFilter | eFormatCategoryItemRegexFilter);
Enrico Granata018921d2011-08-12 02:00:06 +00002758 }
2759
2760public:
2761 CommandObjectTypeFilterDelete (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002762 CommandObjectParsed (interpreter,
2763 "type filter delete",
2764 "Delete an existing filter for a type.",
2765 NULL),
2766 m_options(interpreter)
Enrico Granata018921d2011-08-12 02:00:06 +00002767 {
2768 CommandArgumentEntry type_arg;
2769 CommandArgumentData type_style_arg;
2770
2771 type_style_arg.arg_type = eArgTypeName;
2772 type_style_arg.arg_repetition = eArgRepeatPlain;
2773
2774 type_arg.push_back (type_style_arg);
2775
2776 m_arguments.push_back (type_arg);
2777
2778 }
2779
2780 ~CommandObjectTypeFilterDelete ()
2781 {
2782 }
2783
Jim Inghamda26bd22012-06-08 21:56:10 +00002784protected:
Enrico Granata018921d2011-08-12 02:00:06 +00002785 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002786 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata018921d2011-08-12 02:00:06 +00002787 {
2788 const size_t argc = command.GetArgumentCount();
2789
2790 if (argc != 1)
2791 {
2792 result.AppendErrorWithFormat ("%s takes 1 arg.\n", m_cmd_name.c_str());
2793 result.SetStatus(eReturnStatusFailed);
2794 return false;
2795 }
2796
2797 const char* typeA = command.GetArgumentAtIndex(0);
2798 ConstString typeCS(typeA);
2799
2800 if (!typeCS)
2801 {
2802 result.AppendError("empty typenames not allowed");
2803 result.SetStatus(eReturnStatusFailed);
2804 return false;
2805 }
2806
2807 if (m_options.m_delete_all)
2808 {
Enrico Granataf501c592011-08-17 22:13:59 +00002809 DataVisualization::Categories::LoopThrough(PerCategoryCallback, (void*)&typeCS);
Enrico Granata018921d2011-08-12 02:00:06 +00002810 result.SetStatus(eReturnStatusSuccessFinishNoResult);
2811 return result.Succeeded();
2812 }
2813
Enrico Granata16376ed2012-02-15 02:34:21 +00002814 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00002815 DataVisualization::Categories::GetCategory(ConstString(m_options.m_category.c_str()), category);
Enrico Granata018921d2011-08-12 02:00:06 +00002816
Enrico Granata1c617432011-08-18 16:38:26 +00002817 bool delete_category = category->GetFilterNavigator()->Delete(typeCS);
2818 delete_category = category->GetRegexFilterNavigator()->Delete(typeCS) || delete_category;
Enrico Granata018921d2011-08-12 02:00:06 +00002819
2820 if (delete_category)
2821 {
2822 result.SetStatus(eReturnStatusSuccessFinishNoResult);
2823 return result.Succeeded();
2824 }
2825 else
2826 {
2827 result.AppendErrorWithFormat ("no custom synthetic provider for %s.\n", typeA);
2828 result.SetStatus(eReturnStatusFailed);
2829 return false;
2830 }
2831
2832 }
2833};
2834
2835OptionDefinition
2836CommandObjectTypeFilterDelete::CommandOptions::g_option_table[] =
2837{
2838 { LLDB_OPT_SET_1, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Delete from every category."},
2839 { LLDB_OPT_SET_2, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Delete from given category."},
2840 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
2841};
2842
Greg Clayton3e4238d2011-11-04 03:34:56 +00002843#ifndef LLDB_DISABLE_PYTHON
2844
Enrico Granata018921d2011-08-12 02:00:06 +00002845//-------------------------------------------------------------------------
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002846// CommandObjectTypeSynthDelete
2847//-------------------------------------------------------------------------
2848
Jim Inghamda26bd22012-06-08 21:56:10 +00002849class CommandObjectTypeSynthDelete : public CommandObjectParsed
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002850{
2851private:
2852 class CommandOptions : public Options
2853 {
2854 public:
2855
2856 CommandOptions (CommandInterpreter &interpreter) :
2857 Options (interpreter)
2858 {
2859 }
2860
2861 virtual
2862 ~CommandOptions (){}
2863
2864 virtual Error
2865 SetOptionValue (uint32_t option_idx, const char *option_arg)
2866 {
2867 Error error;
2868 char short_option = (char) m_getopt_table[option_idx].val;
2869
2870 switch (short_option)
2871 {
2872 case 'a':
2873 m_delete_all = true;
2874 break;
2875 case 'w':
Enrico Granata018921d2011-08-12 02:00:06 +00002876 m_category = std::string(option_arg);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002877 break;
2878 default:
Greg Clayton9c236732011-10-26 00:56:27 +00002879 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002880 break;
2881 }
2882
2883 return error;
2884 }
2885
2886 void
2887 OptionParsingStarting ()
2888 {
2889 m_delete_all = false;
Enrico Granata018921d2011-08-12 02:00:06 +00002890 m_category = "default";
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002891 }
2892
2893 const OptionDefinition*
2894 GetDefinitions ()
2895 {
2896 return g_option_table;
2897 }
2898
2899 // Options table: Required for subclasses of Options.
2900
2901 static OptionDefinition g_option_table[];
2902
2903 // Instance variables to hold the values for command options.
2904
2905 bool m_delete_all;
Enrico Granata018921d2011-08-12 02:00:06 +00002906 std::string m_category;
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002907
2908 };
2909
2910 CommandOptions m_options;
2911
2912 virtual Options *
2913 GetOptions ()
2914 {
2915 return &m_options;
2916 }
2917
2918 static bool
2919 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00002920 const lldb::TypeCategoryImplSP& cate)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002921 {
Enrico Granataf501c592011-08-17 22:13:59 +00002922 ConstString* name = (ConstString*)param;
Enrico Granatad587a582011-08-22 23:45:15 +00002923 return cate->Delete(*name, eFormatCategoryItemSynth | eFormatCategoryItemRegexSynth);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002924 }
2925
2926public:
2927 CommandObjectTypeSynthDelete (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00002928 CommandObjectParsed (interpreter,
2929 "type synthetic delete",
2930 "Delete an existing synthetic provider for a type.",
2931 NULL),
2932 m_options(interpreter)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002933 {
2934 CommandArgumentEntry type_arg;
2935 CommandArgumentData type_style_arg;
2936
2937 type_style_arg.arg_type = eArgTypeName;
2938 type_style_arg.arg_repetition = eArgRepeatPlain;
2939
2940 type_arg.push_back (type_style_arg);
2941
2942 m_arguments.push_back (type_arg);
2943
2944 }
2945
2946 ~CommandObjectTypeSynthDelete ()
2947 {
2948 }
2949
Jim Inghamda26bd22012-06-08 21:56:10 +00002950protected:
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002951 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00002952 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002953 {
2954 const size_t argc = command.GetArgumentCount();
2955
2956 if (argc != 1)
2957 {
2958 result.AppendErrorWithFormat ("%s takes 1 arg.\n", m_cmd_name.c_str());
2959 result.SetStatus(eReturnStatusFailed);
2960 return false;
2961 }
2962
2963 const char* typeA = command.GetArgumentAtIndex(0);
2964 ConstString typeCS(typeA);
2965
2966 if (!typeCS)
2967 {
2968 result.AppendError("empty typenames not allowed");
2969 result.SetStatus(eReturnStatusFailed);
2970 return false;
2971 }
2972
2973 if (m_options.m_delete_all)
2974 {
Enrico Granataf501c592011-08-17 22:13:59 +00002975 DataVisualization::Categories::LoopThrough(PerCategoryCallback, (void*)&typeCS);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002976 result.SetStatus(eReturnStatusSuccessFinishNoResult);
2977 return result.Succeeded();
2978 }
2979
Enrico Granata16376ed2012-02-15 02:34:21 +00002980 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00002981 DataVisualization::Categories::GetCategory(ConstString(m_options.m_category.c_str()), category);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002982
Enrico Granata1c617432011-08-18 16:38:26 +00002983 bool delete_category = category->GetSyntheticNavigator()->Delete(typeCS);
2984 delete_category = category->GetRegexSyntheticNavigator()->Delete(typeCS) || delete_category;
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00002985
2986 if (delete_category)
2987 {
2988 result.SetStatus(eReturnStatusSuccessFinishNoResult);
2989 return result.Succeeded();
2990 }
2991 else
2992 {
2993 result.AppendErrorWithFormat ("no custom synthetic provider for %s.\n", typeA);
2994 result.SetStatus(eReturnStatusFailed);
2995 return false;
2996 }
2997
2998 }
2999};
3000
3001OptionDefinition
3002CommandObjectTypeSynthDelete::CommandOptions::g_option_table[] =
3003{
Enrico Granata979e20d2011-07-29 19:53:35 +00003004 { LLDB_OPT_SET_1, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Delete from every category."},
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003005 { LLDB_OPT_SET_2, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Delete from given category."},
3006 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
3007};
3008
Greg Clayton3e4238d2011-11-04 03:34:56 +00003009#endif // #ifndef LLDB_DISABLE_PYTHON
3010
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003011//-------------------------------------------------------------------------
Enrico Granata018921d2011-08-12 02:00:06 +00003012// CommandObjectTypeFilterClear
3013//-------------------------------------------------------------------------
3014
Jim Inghamda26bd22012-06-08 21:56:10 +00003015class CommandObjectTypeFilterClear : public CommandObjectParsed
Enrico Granata018921d2011-08-12 02:00:06 +00003016{
3017private:
3018
3019 class CommandOptions : public Options
3020 {
3021 public:
3022
3023 CommandOptions (CommandInterpreter &interpreter) :
3024 Options (interpreter)
3025 {
3026 }
3027
3028 virtual
3029 ~CommandOptions (){}
3030
3031 virtual Error
3032 SetOptionValue (uint32_t option_idx, const char *option_arg)
3033 {
3034 Error error;
3035 char short_option = (char) m_getopt_table[option_idx].val;
3036
3037 switch (short_option)
3038 {
3039 case 'a':
3040 m_delete_all = true;
3041 break;
3042 default:
Greg Clayton9c236732011-10-26 00:56:27 +00003043 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata018921d2011-08-12 02:00:06 +00003044 break;
3045 }
3046
3047 return error;
3048 }
3049
3050 void
3051 OptionParsingStarting ()
3052 {
3053 m_delete_all = false;
3054 }
3055
3056 const OptionDefinition*
3057 GetDefinitions ()
3058 {
3059 return g_option_table;
3060 }
3061
3062 // Options table: Required for subclasses of Options.
3063
3064 static OptionDefinition g_option_table[];
3065
3066 // Instance variables to hold the values for command options.
3067
3068 bool m_delete_all;
3069 bool m_delete_named;
3070 };
3071
3072 CommandOptions m_options;
3073
3074 virtual Options *
3075 GetOptions ()
3076 {
3077 return &m_options;
3078 }
3079
3080 static bool
3081 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00003082 const lldb::TypeCategoryImplSP& cate)
Enrico Granata018921d2011-08-12 02:00:06 +00003083 {
Enrico Granatad587a582011-08-22 23:45:15 +00003084 cate->Clear(eFormatCategoryItemFilter | eFormatCategoryItemRegexFilter);
Enrico Granata018921d2011-08-12 02:00:06 +00003085 return true;
3086
3087 }
3088
3089public:
3090 CommandObjectTypeFilterClear (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00003091 CommandObjectParsed (interpreter,
3092 "type filter clear",
3093 "Delete all existing filters.",
3094 NULL),
3095 m_options(interpreter)
Enrico Granata018921d2011-08-12 02:00:06 +00003096 {
3097 }
3098
3099 ~CommandObjectTypeFilterClear ()
3100 {
3101 }
3102
Jim Inghamda26bd22012-06-08 21:56:10 +00003103protected:
Enrico Granata018921d2011-08-12 02:00:06 +00003104 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00003105 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata018921d2011-08-12 02:00:06 +00003106 {
3107
3108 if (m_options.m_delete_all)
Enrico Granataf501c592011-08-17 22:13:59 +00003109 DataVisualization::Categories::LoopThrough(PerCategoryCallback, NULL);
Enrico Granata018921d2011-08-12 02:00:06 +00003110
3111 else
3112 {
Enrico Granata16376ed2012-02-15 02:34:21 +00003113 lldb::TypeCategoryImplSP category;
Enrico Granata018921d2011-08-12 02:00:06 +00003114 if (command.GetArgumentCount() > 0)
3115 {
3116 const char* cat_name = command.GetArgumentAtIndex(0);
3117 ConstString cat_nameCS(cat_name);
Enrico Granata3b23d202011-09-09 23:33:14 +00003118 DataVisualization::Categories::GetCategory(cat_nameCS, category);
Enrico Granata018921d2011-08-12 02:00:06 +00003119 }
3120 else
Enrico Granata3b23d202011-09-09 23:33:14 +00003121 DataVisualization::Categories::GetCategory(ConstString(NULL), category);
Enrico Granata1c617432011-08-18 16:38:26 +00003122 category->GetFilterNavigator()->Clear();
3123 category->GetRegexFilterNavigator()->Clear();
Enrico Granata018921d2011-08-12 02:00:06 +00003124 }
3125
3126 result.SetStatus(eReturnStatusSuccessFinishResult);
3127 return result.Succeeded();
3128 }
3129
3130};
3131
3132OptionDefinition
3133CommandObjectTypeFilterClear::CommandOptions::g_option_table[] =
3134{
3135 { LLDB_OPT_SET_ALL, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Clear every category."},
3136 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
3137};
3138
Greg Clayton3e4238d2011-11-04 03:34:56 +00003139#ifndef LLDB_DISABLE_PYTHON
Enrico Granata018921d2011-08-12 02:00:06 +00003140//-------------------------------------------------------------------------
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003141// CommandObjectTypeSynthClear
3142//-------------------------------------------------------------------------
3143
Jim Inghamda26bd22012-06-08 21:56:10 +00003144class CommandObjectTypeSynthClear : public CommandObjectParsed
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003145{
3146private:
3147
3148 class CommandOptions : public Options
3149 {
3150 public:
3151
3152 CommandOptions (CommandInterpreter &interpreter) :
3153 Options (interpreter)
3154 {
3155 }
3156
3157 virtual
3158 ~CommandOptions (){}
3159
3160 virtual Error
3161 SetOptionValue (uint32_t option_idx, const char *option_arg)
3162 {
3163 Error error;
3164 char short_option = (char) m_getopt_table[option_idx].val;
3165
3166 switch (short_option)
3167 {
3168 case 'a':
3169 m_delete_all = true;
3170 break;
3171 default:
Greg Clayton9c236732011-10-26 00:56:27 +00003172 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003173 break;
3174 }
3175
3176 return error;
3177 }
3178
3179 void
3180 OptionParsingStarting ()
3181 {
3182 m_delete_all = false;
3183 }
3184
3185 const OptionDefinition*
3186 GetDefinitions ()
3187 {
3188 return g_option_table;
3189 }
3190
3191 // Options table: Required for subclasses of Options.
3192
3193 static OptionDefinition g_option_table[];
3194
3195 // Instance variables to hold the values for command options.
3196
3197 bool m_delete_all;
3198 bool m_delete_named;
3199 };
3200
3201 CommandOptions m_options;
3202
3203 virtual Options *
3204 GetOptions ()
3205 {
3206 return &m_options;
3207 }
3208
3209 static bool
3210 PerCategoryCallback(void* param,
Enrico Granata16376ed2012-02-15 02:34:21 +00003211 const lldb::TypeCategoryImplSP& cate)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003212 {
Enrico Granatad587a582011-08-22 23:45:15 +00003213 cate->Clear(eFormatCategoryItemSynth | eFormatCategoryItemRegexSynth);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003214 return true;
3215
3216 }
3217
3218public:
3219 CommandObjectTypeSynthClear (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00003220 CommandObjectParsed (interpreter,
3221 "type synthetic clear",
3222 "Delete all existing synthetic providers.",
3223 NULL),
3224 m_options(interpreter)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003225 {
3226 }
3227
3228 ~CommandObjectTypeSynthClear ()
3229 {
3230 }
3231
Jim Inghamda26bd22012-06-08 21:56:10 +00003232protected:
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003233 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00003234 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003235 {
3236
3237 if (m_options.m_delete_all)
Enrico Granataf501c592011-08-17 22:13:59 +00003238 DataVisualization::Categories::LoopThrough(PerCategoryCallback, NULL);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003239
3240 else
3241 {
Enrico Granata16376ed2012-02-15 02:34:21 +00003242 lldb::TypeCategoryImplSP category;
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003243 if (command.GetArgumentCount() > 0)
3244 {
3245 const char* cat_name = command.GetArgumentAtIndex(0);
3246 ConstString cat_nameCS(cat_name);
Enrico Granata3b23d202011-09-09 23:33:14 +00003247 DataVisualization::Categories::GetCategory(cat_nameCS, category);
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003248 }
3249 else
Enrico Granata3b23d202011-09-09 23:33:14 +00003250 DataVisualization::Categories::GetCategory(ConstString(NULL), category);
Enrico Granata1c617432011-08-18 16:38:26 +00003251 category->GetSyntheticNavigator()->Clear();
3252 category->GetRegexSyntheticNavigator()->Clear();
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003253 }
3254
3255 result.SetStatus(eReturnStatusSuccessFinishResult);
3256 return result.Succeeded();
3257 }
3258
3259};
3260
3261OptionDefinition
3262CommandObjectTypeSynthClear::CommandOptions::g_option_table[] =
3263{
Enrico Granata979e20d2011-07-29 19:53:35 +00003264 { LLDB_OPT_SET_ALL, false, "all", 'a', no_argument, NULL, 0, eArgTypeNone, "Clear every category."},
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003265 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
3266};
3267
Greg Clayton3e4238d2011-11-04 03:34:56 +00003268
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003269//-------------------------------------------------------------------------
Greg Clayton3e4238d2011-11-04 03:34:56 +00003270// TypeSynthAddInputReader
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003271//-------------------------------------------------------------------------
3272
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003273static const char *g_synth_addreader_instructions = "Enter your Python command(s). Type 'DONE' to end.\n"
Enrico Granataca67cc12011-07-25 18:59:15 +00003274 "You must define a Python class with these methods:\n"
3275 " def __init__(self, valobj, dict):\n"
3276 " def num_children(self):\n"
3277 " def get_child_at_index(self, index):\n"
3278 " def get_child_index(self, name):\n"
Enrico Granata979e20d2011-07-29 19:53:35 +00003279 "Optionally, you can also define a method:\n"
3280 " def update(self):\n"
3281 "if your synthetic provider is holding on to any per-object state variables (currently, this is not implemented because of the way LLDB handles instances of SBValue and you should not rely on object persistence and per-object state)\n"
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003282 "class synthProvider:";
3283
3284class TypeSynthAddInputReader : public InputReaderEZ
3285{
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003286public:
3287 TypeSynthAddInputReader(Debugger& debugger) :
Greg Clayton3e4238d2011-11-04 03:34:56 +00003288 InputReaderEZ(debugger)
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003289 {}
3290
3291 virtual
3292 ~TypeSynthAddInputReader()
3293 {
3294 }
3295
3296 virtual void ActivateHandler(HandlerData& data)
3297 {
3298 StreamSP out_stream = data.GetOutStream();
3299 bool batch_mode = data.GetBatchMode();
3300 if (!batch_mode)
3301 {
3302 out_stream->Printf ("%s\n", g_synth_addreader_instructions);
3303 if (data.reader.GetPrompt())
3304 out_stream->Printf ("%s", data.reader.GetPrompt());
3305 out_stream->Flush();
3306 }
3307 }
3308
3309 virtual void ReactivateHandler(HandlerData& data)
3310 {
3311 StreamSP out_stream = data.GetOutStream();
3312 bool batch_mode = data.GetBatchMode();
3313 if (data.reader.GetPrompt() && !batch_mode)
3314 {
3315 out_stream->Printf ("%s", data.reader.GetPrompt());
3316 out_stream->Flush();
3317 }
3318 }
3319 virtual void GotTokenHandler(HandlerData& data)
3320 {
3321 StreamSP out_stream = data.GetOutStream();
3322 bool batch_mode = data.GetBatchMode();
3323 if (data.bytes && data.bytes_len && data.baton)
3324 {
3325 ((SynthAddOptions*)data.baton)->m_user_source.AppendString(data.bytes, data.bytes_len);
3326 }
3327 if (!data.reader.IsDone() && data.reader.GetPrompt() && !batch_mode)
3328 {
3329 out_stream->Printf ("%s", data.reader.GetPrompt());
3330 out_stream->Flush();
3331 }
3332 }
3333 virtual void InterruptHandler(HandlerData& data)
3334 {
3335 StreamSP out_stream = data.GetOutStream();
3336 bool batch_mode = data.GetBatchMode();
3337 data.reader.SetIsDone (true);
3338 if (!batch_mode)
3339 {
3340 out_stream->Printf ("Warning: No command attached to breakpoint.\n");
3341 out_stream->Flush();
3342 }
3343 }
3344 virtual void EOFHandler(HandlerData& data)
3345 {
3346 data.reader.SetIsDone (true);
3347 }
3348 virtual void DoneHandler(HandlerData& data)
3349 {
3350 StreamSP out_stream = data.GetOutStream();
3351 SynthAddOptions *options_ptr = ((SynthAddOptions*)data.baton);
3352 if (!options_ptr)
3353 {
3354 out_stream->Printf ("Internal error #1: no script attached.\n");
3355 out_stream->Flush();
3356 return;
3357 }
3358
3359 SynthAddOptions::SharedPointer options(options_ptr); // this will ensure that we get rid of the pointer when going out of scope
3360
3361 ScriptInterpreter *interpreter = data.reader.GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
3362 if (!interpreter)
3363 {
3364 out_stream->Printf ("Internal error #2: no script attached.\n");
3365 out_stream->Flush();
3366 return;
3367 }
Enrico Granata400105d2012-03-06 23:42:15 +00003368 std::string class_name_str;
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003369 if (!interpreter->GenerateTypeSynthClass (options->m_user_source,
Enrico Granata400105d2012-03-06 23:42:15 +00003370 class_name_str))
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003371 {
3372 out_stream->Printf ("Internal error #3: no script attached.\n");
3373 out_stream->Flush();
3374 return;
3375 }
Enrico Granata400105d2012-03-06 23:42:15 +00003376 if (class_name_str.empty())
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003377 {
3378 out_stream->Printf ("Internal error #4: no script attached.\n");
3379 out_stream->Flush();
3380 return;
3381 }
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003382
3383 // everything should be fine now, let's add the synth provider class
3384
3385 SyntheticChildrenSP synth_provider;
Enrico Granata16376ed2012-02-15 02:34:21 +00003386 synth_provider.reset(new TypeSyntheticImpl(SyntheticChildren::Flags().SetCascades(options->m_cascade).
3387 SetSkipPointers(options->m_skip_pointers).
3388 SetSkipReferences(options->m_skip_references),
Enrico Granata400105d2012-03-06 23:42:15 +00003389 class_name_str.c_str()));
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003390
3391
Enrico Granata16376ed2012-02-15 02:34:21 +00003392 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00003393 DataVisualization::Categories::GetCategory(ConstString(options->m_category.c_str()), category);
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003394
Enrico Granata06f0db62011-08-12 19:14:27 +00003395 Error error;
3396
Enrico Granata1c617432011-08-18 16:38:26 +00003397 for (size_t i = 0; i < options->m_target_types.GetSize(); i++)
3398 {
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003399 const char *type_name = options->m_target_types.GetStringAtIndex(i);
3400 ConstString typeCS(type_name);
3401 if (typeCS)
Enrico Granata06f0db62011-08-12 19:14:27 +00003402 {
3403 if (!CommandObjectTypeSynthAdd::AddSynth(typeCS,
3404 synth_provider,
3405 options->m_regex ? CommandObjectTypeSynthAdd::eRegexSynth : CommandObjectTypeSynthAdd::eRegularSynth,
3406 options->m_category,
3407 &error))
3408 {
3409 out_stream->Printf("%s\n", error.AsCString());
3410 out_stream->Flush();
3411 return;
3412 }
3413 }
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003414 else
3415 {
3416 out_stream->Printf ("Internal error #6: no script attached.\n");
3417 out_stream->Flush();
3418 return;
3419 }
3420 }
3421 }
Greg Clayton3e4238d2011-11-04 03:34:56 +00003422
3423private:
3424 DISALLOW_COPY_AND_ASSIGN (TypeSynthAddInputReader);
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003425};
3426
Enrico Granataa54ad992011-08-05 01:32:50 +00003427void
3428CommandObjectTypeSynthAdd::CollectPythonScript (SynthAddOptions *options,
3429 CommandReturnObject &result)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003430{
Enrico Granataa54ad992011-08-05 01:32:50 +00003431 InputReaderSP reader_sp (new TypeSynthAddInputReader(m_interpreter.GetDebugger()));
3432 if (reader_sp && options)
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003433 {
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003434
Enrico Granataa54ad992011-08-05 01:32:50 +00003435 InputReaderEZ::InitializationParameters ipr;
3436
3437 Error err (reader_sp->Initialize (ipr.SetBaton(options).SetPrompt(" ")));
3438 if (err.Success())
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003439 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003440 m_interpreter.GetDebugger().PushInputReader (reader_sp);
3441 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003442 }
3443 else
3444 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003445 result.AppendError (err.AsCString());
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003446 result.SetStatus (eReturnStatusFailed);
3447 }
3448 }
Enrico Granataa54ad992011-08-05 01:32:50 +00003449 else
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003450 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003451 result.AppendError("out of memory");
3452 result.SetStatus (eReturnStatusFailed);
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003453 }
Enrico Granataa54ad992011-08-05 01:32:50 +00003454}
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003455
Enrico Granataa54ad992011-08-05 01:32:50 +00003456bool
3457CommandObjectTypeSynthAdd::Execute_HandwritePython (Args& command, CommandReturnObject &result)
3458{
3459 SynthAddOptions *options = new SynthAddOptions ( m_options.m_skip_pointers,
3460 m_options.m_skip_references,
3461 m_options.m_cascade,
3462 m_options.m_regex,
3463 m_options.m_category);
Enrico Granata9ae7cef2011-07-24 00:14:56 +00003464
Enrico Granataa54ad992011-08-05 01:32:50 +00003465 const size_t argc = command.GetArgumentCount();
Enrico Granata9ae7cef2011-07-24 00:14:56 +00003466
Enrico Granata1c617432011-08-18 16:38:26 +00003467 for (size_t i = 0; i < argc; i++)
3468 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003469 const char* typeA = command.GetArgumentAtIndex(i);
3470 if (typeA && *typeA)
3471 options->m_target_types << typeA;
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003472 else
3473 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003474 result.AppendError("empty typenames not allowed");
Enrico Granatae89ab7b2011-07-25 16:59:05 +00003475 result.SetStatus(eReturnStatusFailed);
3476 return false;
3477 }
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003478 }
Enrico Granataa54ad992011-08-05 01:32:50 +00003479
3480 CollectPythonScript(options,result);
3481 return result.Succeeded();
3482}
Enrico Granata018921d2011-08-12 02:00:06 +00003483
Enrico Granataa54ad992011-08-05 01:32:50 +00003484bool
3485CommandObjectTypeSynthAdd::Execute_PythonClass (Args& command, CommandReturnObject &result)
3486{
3487 const size_t argc = command.GetArgumentCount();
3488
3489 if (argc < 1)
3490 {
3491 result.AppendErrorWithFormat ("%s takes one or more args.\n", m_cmd_name.c_str());
3492 result.SetStatus(eReturnStatusFailed);
3493 return false;
3494 }
3495
3496 if (m_options.m_class_name.empty() && !m_options.m_input_python)
3497 {
3498 result.AppendErrorWithFormat ("%s needs either a Python class name or -P to directly input Python code.\n", m_cmd_name.c_str());
3499 result.SetStatus(eReturnStatusFailed);
3500 return false;
3501 }
3502
3503 SyntheticChildrenSP entry;
3504
Enrico Granata16376ed2012-02-15 02:34:21 +00003505 TypeSyntheticImpl* impl = new TypeSyntheticImpl(SyntheticChildren::Flags().
3506 SetCascades(m_options.m_cascade).
3507 SetSkipPointers(m_options.m_skip_pointers).
3508 SetSkipReferences(m_options.m_skip_references),
3509 m_options.m_class_name.c_str());
Enrico Granataa54ad992011-08-05 01:32:50 +00003510
3511 entry.reset(impl);
3512
3513 // now I have a valid provider, let's add it to every type
3514
Enrico Granata16376ed2012-02-15 02:34:21 +00003515 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00003516 DataVisualization::Categories::GetCategory(ConstString(m_options.m_category.c_str()), category);
Enrico Granataa54ad992011-08-05 01:32:50 +00003517
Enrico Granata06f0db62011-08-12 19:14:27 +00003518 Error error;
3519
Enrico Granata1c617432011-08-18 16:38:26 +00003520 for (size_t i = 0; i < argc; i++)
3521 {
Enrico Granataa54ad992011-08-05 01:32:50 +00003522 const char* typeA = command.GetArgumentAtIndex(i);
3523 ConstString typeCS(typeA);
3524 if (typeCS)
Enrico Granata06f0db62011-08-12 19:14:27 +00003525 {
3526 if (!AddSynth(typeCS,
3527 entry,
3528 m_options.m_regex ? eRegexSynth : eRegularSynth,
3529 m_options.m_category,
3530 &error))
3531 {
3532 result.AppendError(error.AsCString());
3533 result.SetStatus(eReturnStatusFailed);
3534 return false;
3535 }
3536 }
Enrico Granataa54ad992011-08-05 01:32:50 +00003537 else
3538 {
3539 result.AppendError("empty typenames not allowed");
3540 result.SetStatus(eReturnStatusFailed);
3541 return false;
3542 }
3543 }
3544
3545 result.SetStatus(eReturnStatusSuccessFinishNoResult);
3546 return result.Succeeded();
3547}
3548
3549CommandObjectTypeSynthAdd::CommandObjectTypeSynthAdd (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00003550 CommandObjectParsed (interpreter,
3551 "type synthetic add",
3552 "Add a new synthetic provider for a type.",
3553 NULL),
3554 m_options (interpreter)
Enrico Granataa54ad992011-08-05 01:32:50 +00003555{
3556 CommandArgumentEntry type_arg;
3557 CommandArgumentData type_style_arg;
3558
3559 type_style_arg.arg_type = eArgTypeName;
3560 type_style_arg.arg_repetition = eArgRepeatPlus;
3561
3562 type_arg.push_back (type_style_arg);
3563
3564 m_arguments.push_back (type_arg);
3565
3566}
3567
3568bool
3569CommandObjectTypeSynthAdd::AddSynth(const ConstString& type_name,
3570 SyntheticChildrenSP entry,
3571 SynthFormatType type,
Enrico Granata71148312011-08-11 21:37:21 +00003572 std::string category_name,
Enrico Granataa54ad992011-08-05 01:32:50 +00003573 Error* error)
3574{
Enrico Granata16376ed2012-02-15 02:34:21 +00003575 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00003576 DataVisualization::Categories::GetCategory(ConstString(category_name.c_str()), category);
Enrico Granataa54ad992011-08-05 01:32:50 +00003577
Enrico Granata06f0db62011-08-12 19:14:27 +00003578 if (category->AnyMatches(type_name,
Enrico Granatad587a582011-08-22 23:45:15 +00003579 eFormatCategoryItemFilter | eFormatCategoryItemRegexFilter,
Enrico Granata06f0db62011-08-12 19:14:27 +00003580 false))
3581 {
3582 if (error)
3583 error->SetErrorStringWithFormat("cannot add synthetic for type %s when filter is defined in same category!", type_name.AsCString());
3584 return false;
3585 }
3586
Enrico Granataa54ad992011-08-05 01:32:50 +00003587 if (type == eRegexSynth)
3588 {
3589 RegularExpressionSP typeRX(new RegularExpression());
3590 if (!typeRX->Compile(type_name.GetCString()))
3591 {
3592 if (error)
3593 error->SetErrorString("regex format error (maybe this is not really a regex?)");
3594 return false;
3595 }
3596
Enrico Granata1c617432011-08-18 16:38:26 +00003597 category->GetRegexSyntheticNavigator()->Delete(type_name);
3598 category->GetRegexSyntheticNavigator()->Add(typeRX, entry);
Enrico Granataa54ad992011-08-05 01:32:50 +00003599
3600 return true;
3601 }
3602 else
3603 {
Enrico Granata1c617432011-08-18 16:38:26 +00003604 category->GetSyntheticNavigator()->Add(type_name, entry);
Enrico Granataa54ad992011-08-05 01:32:50 +00003605 return true;
3606 }
3607}
3608
3609bool
Jim Inghamda26bd22012-06-08 21:56:10 +00003610CommandObjectTypeSynthAdd::DoExecute (Args& command, CommandReturnObject &result)
Enrico Granataa54ad992011-08-05 01:32:50 +00003611{
3612 if (m_options.handwrite_python)
3613 return Execute_HandwritePython(command, result);
3614 else if (m_options.is_class_based)
3615 return Execute_PythonClass(command, result);
Enrico Granataa54ad992011-08-05 01:32:50 +00003616 else
3617 {
3618 result.AppendError("must either provide a children list, a Python class name, or use -P and type a Python class line-by-line");
3619 result.SetStatus(eReturnStatusFailed);
3620 return false;
3621 }
3622}
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003623
3624OptionDefinition
3625CommandObjectTypeSynthAdd::CommandOptions::g_option_table[] =
3626{
Enrico Granataf2cb7f22012-03-22 19:55:55 +00003627 { LLDB_OPT_SET_ALL, false, "cascade", 'C', required_argument, NULL, 0, eArgTypeBoolean, "If true, cascade through typedef chains."},
Enrico Granata979e20d2011-07-29 19:53:35 +00003628 { LLDB_OPT_SET_ALL, false, "skip-pointers", 'p', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for pointers-to-type objects."},
3629 { LLDB_OPT_SET_ALL, false, "skip-references", 'r', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for references-to-type objects."},
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003630 { LLDB_OPT_SET_ALL, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Add this to the given category instead of the default one."},
Enrico Granata91544802011-09-06 19:20:51 +00003631 { LLDB_OPT_SET_2, false, "python-class", 'l', required_argument, NULL, 0, eArgTypePythonClass, "Use this Python class to produce synthetic children."},
Enrico Granata979e20d2011-07-29 19:53:35 +00003632 { LLDB_OPT_SET_3, false, "input-python", 'P', no_argument, NULL, 0, eArgTypeNone, "Type Python code to generate a class that provides synthetic children."},
Enrico Granataa54ad992011-08-05 01:32:50 +00003633 { LLDB_OPT_SET_ALL, false, "regex", 'x', no_argument, NULL, 0, eArgTypeNone, "Type names are actually regular expressions."},
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003634 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
3635};
3636
Greg Clayton3e4238d2011-11-04 03:34:56 +00003637#endif // #ifndef LLDB_DISABLE_PYTHON
3638
Jim Inghamda26bd22012-06-08 21:56:10 +00003639class CommandObjectTypeFilterAdd : public CommandObjectParsed
Enrico Granata018921d2011-08-12 02:00:06 +00003640{
3641
3642private:
3643
3644 class CommandOptions : public Options
3645 {
3646 typedef std::vector<std::string> option_vector;
3647 public:
3648
3649 CommandOptions (CommandInterpreter &interpreter) :
3650 Options (interpreter)
3651 {
3652 }
3653
3654 virtual
3655 ~CommandOptions (){}
3656
3657 virtual Error
3658 SetOptionValue (uint32_t option_idx, const char *option_arg)
3659 {
3660 Error error;
3661 char short_option = (char) m_getopt_table[option_idx].val;
3662 bool success;
3663
3664 switch (short_option)
3665 {
3666 case 'C':
3667 m_cascade = Args::StringToBoolean(option_arg, true, &success);
3668 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +00003669 error.SetErrorStringWithFormat("invalid value for cascade: %s", option_arg);
Enrico Granata018921d2011-08-12 02:00:06 +00003670 break;
3671 case 'c':
3672 m_expr_paths.push_back(option_arg);
3673 has_child_list = true;
3674 break;
3675 case 'p':
3676 m_skip_pointers = true;
3677 break;
3678 case 'r':
3679 m_skip_references = true;
3680 break;
3681 case 'w':
3682 m_category = std::string(option_arg);
3683 break;
3684 case 'x':
3685 m_regex = true;
3686 break;
3687 default:
Greg Clayton9c236732011-10-26 00:56:27 +00003688 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Enrico Granata018921d2011-08-12 02:00:06 +00003689 break;
3690 }
3691
3692 return error;
3693 }
3694
3695 void
3696 OptionParsingStarting ()
3697 {
3698 m_cascade = true;
3699 m_skip_pointers = false;
3700 m_skip_references = false;
3701 m_category = "default";
3702 m_expr_paths.clear();
3703 has_child_list = false;
3704 m_regex = false;
3705 }
3706
3707 const OptionDefinition*
3708 GetDefinitions ()
3709 {
3710 return g_option_table;
3711 }
3712
3713 // Options table: Required for subclasses of Options.
3714
3715 static OptionDefinition g_option_table[];
3716
3717 // Instance variables to hold the values for command options.
3718
3719 bool m_cascade;
3720 bool m_skip_references;
3721 bool m_skip_pointers;
3722 bool m_input_python;
3723 option_vector m_expr_paths;
3724 std::string m_category;
3725
3726 bool has_child_list;
3727
3728 bool m_regex;
3729
3730 typedef option_vector::iterator ExpressionPathsIterator;
3731 };
3732
3733 CommandOptions m_options;
3734
3735 virtual Options *
3736 GetOptions ()
3737 {
3738 return &m_options;
3739 }
3740
Enrico Granata06f0db62011-08-12 19:14:27 +00003741 enum FilterFormatType
Enrico Granata018921d2011-08-12 02:00:06 +00003742 {
Enrico Granata06f0db62011-08-12 19:14:27 +00003743 eRegularFilter,
Enrico Granatad3a86a22011-08-19 01:14:49 +00003744 eRegexFilter
Enrico Granata018921d2011-08-12 02:00:06 +00003745 };
3746
3747 bool
Enrico Granata06f0db62011-08-12 19:14:27 +00003748 AddFilter(const ConstString& type_name,
3749 SyntheticChildrenSP entry,
3750 FilterFormatType type,
3751 std::string category_name,
3752 Error* error)
Enrico Granata018921d2011-08-12 02:00:06 +00003753 {
Enrico Granata16376ed2012-02-15 02:34:21 +00003754 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00003755 DataVisualization::Categories::GetCategory(ConstString(category_name.c_str()), category);
Enrico Granata018921d2011-08-12 02:00:06 +00003756
Enrico Granata06f0db62011-08-12 19:14:27 +00003757 if (category->AnyMatches(type_name,
Enrico Granatad587a582011-08-22 23:45:15 +00003758 eFormatCategoryItemSynth | eFormatCategoryItemRegexSynth,
Enrico Granata06f0db62011-08-12 19:14:27 +00003759 false))
3760 {
3761 if (error)
3762 error->SetErrorStringWithFormat("cannot add filter for type %s when synthetic is defined in same category!", type_name.AsCString());
3763 return false;
3764 }
3765
3766 if (type == eRegexFilter)
Enrico Granata018921d2011-08-12 02:00:06 +00003767 {
3768 RegularExpressionSP typeRX(new RegularExpression());
3769 if (!typeRX->Compile(type_name.GetCString()))
3770 {
3771 if (error)
3772 error->SetErrorString("regex format error (maybe this is not really a regex?)");
3773 return false;
3774 }
3775
Enrico Granata1c617432011-08-18 16:38:26 +00003776 category->GetRegexFilterNavigator()->Delete(type_name);
3777 category->GetRegexFilterNavigator()->Add(typeRX, entry);
Enrico Granata018921d2011-08-12 02:00:06 +00003778
3779 return true;
3780 }
3781 else
3782 {
Enrico Granata1c617432011-08-18 16:38:26 +00003783 category->GetFilterNavigator()->Add(type_name, entry);
Enrico Granata018921d2011-08-12 02:00:06 +00003784 return true;
3785 }
3786 }
3787
3788
3789public:
3790
3791 CommandObjectTypeFilterAdd (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00003792 CommandObjectParsed (interpreter,
3793 "type filter add",
3794 "Add a new filter for a type.",
3795 NULL),
3796 m_options (interpreter)
Enrico Granata018921d2011-08-12 02:00:06 +00003797 {
3798 CommandArgumentEntry type_arg;
3799 CommandArgumentData type_style_arg;
3800
3801 type_style_arg.arg_type = eArgTypeName;
3802 type_style_arg.arg_repetition = eArgRepeatPlus;
3803
3804 type_arg.push_back (type_style_arg);
3805
3806 m_arguments.push_back (type_arg);
3807
Enrico Granata2c6a3d82011-08-23 00:32:52 +00003808 SetHelpLong(
3809 "Some examples of using this command.\n"
3810 "We use as reference the following snippet of code:\n"
3811 "\n"
3812 "class Foo {;\n"
3813 " int a;\n"
3814 " int b;\n"
3815 " int c;\n"
3816 " int d;\n"
3817 " int e;\n"
3818 " int f;\n"
3819 " int g;\n"
3820 " int h;\n"
3821 " int i;\n"
3822 "} \n"
3823 "Typing:\n"
3824 "type filter add --child a -- child g Foo\n"
3825 "frame variable a_foo\n"
Sean Callananad014962012-08-15 00:26:32 +00003826 "will produce an output where only a and g are displayed\n"
Enrico Granata2c6a3d82011-08-23 00:32:52 +00003827 "Other children of a_foo (b,c,d,e,f,h and i) are available by asking for them, as in:\n"
3828 "frame variable a_foo.b a_foo.c ... a_foo.i\n"
3829 "\n"
3830 "Use option --raw to frame variable prevails on the filter\n"
3831 "frame variable a_foo --raw\n"
3832 "shows all the children of a_foo (a thru i) as if no filter was defined\n"
3833 );
Enrico Granata018921d2011-08-12 02:00:06 +00003834 }
3835
3836 ~CommandObjectTypeFilterAdd ()
3837 {
3838 }
3839
Jim Inghamda26bd22012-06-08 21:56:10 +00003840protected:
Enrico Granata018921d2011-08-12 02:00:06 +00003841 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00003842 DoExecute (Args& command, CommandReturnObject &result)
Enrico Granata018921d2011-08-12 02:00:06 +00003843 {
3844 const size_t argc = command.GetArgumentCount();
3845
3846 if (argc < 1)
3847 {
3848 result.AppendErrorWithFormat ("%s takes one or more args.\n", m_cmd_name.c_str());
3849 result.SetStatus(eReturnStatusFailed);
3850 return false;
3851 }
3852
3853 if (m_options.m_expr_paths.size() == 0)
3854 {
3855 result.AppendErrorWithFormat ("%s needs one or more children.\n", m_cmd_name.c_str());
3856 result.SetStatus(eReturnStatusFailed);
3857 return false;
3858 }
3859
3860 SyntheticChildrenSP entry;
3861
Enrico Granata16376ed2012-02-15 02:34:21 +00003862 TypeFilterImpl* impl = new TypeFilterImpl(SyntheticChildren::Flags().SetCascades(m_options.m_cascade).
3863 SetSkipPointers(m_options.m_skip_pointers).
3864 SetSkipReferences(m_options.m_skip_references));
Enrico Granata018921d2011-08-12 02:00:06 +00003865
3866 entry.reset(impl);
3867
3868 // go through the expression paths
3869 CommandOptions::ExpressionPathsIterator begin, end = m_options.m_expr_paths.end();
3870
3871 for (begin = m_options.m_expr_paths.begin(); begin != end; begin++)
3872 impl->AddExpressionPath(*begin);
3873
3874
3875 // now I have a valid provider, let's add it to every type
3876
Enrico Granata16376ed2012-02-15 02:34:21 +00003877 lldb::TypeCategoryImplSP category;
Enrico Granata3b23d202011-09-09 23:33:14 +00003878 DataVisualization::Categories::GetCategory(ConstString(m_options.m_category.c_str()), category);
Enrico Granata018921d2011-08-12 02:00:06 +00003879
Enrico Granata06f0db62011-08-12 19:14:27 +00003880 Error error;
3881
Enrico Granata1c617432011-08-18 16:38:26 +00003882 for (size_t i = 0; i < argc; i++)
3883 {
Enrico Granata018921d2011-08-12 02:00:06 +00003884 const char* typeA = command.GetArgumentAtIndex(i);
3885 ConstString typeCS(typeA);
3886 if (typeCS)
Enrico Granata06f0db62011-08-12 19:14:27 +00003887 {
3888 if (!AddFilter(typeCS,
3889 entry,
3890 m_options.m_regex ? eRegexFilter : eRegularFilter,
3891 m_options.m_category,
3892 &error))
3893 {
3894 result.AppendError(error.AsCString());
3895 result.SetStatus(eReturnStatusFailed);
3896 return false;
3897 }
3898 }
Enrico Granata018921d2011-08-12 02:00:06 +00003899 else
3900 {
3901 result.AppendError("empty typenames not allowed");
3902 result.SetStatus(eReturnStatusFailed);
3903 return false;
3904 }
3905 }
3906
3907 result.SetStatus(eReturnStatusSuccessFinishNoResult);
3908 return result.Succeeded();
3909 }
3910
3911};
3912
3913OptionDefinition
3914CommandObjectTypeFilterAdd::CommandOptions::g_option_table[] =
3915{
Enrico Granataf2cb7f22012-03-22 19:55:55 +00003916 { LLDB_OPT_SET_ALL, false, "cascade", 'C', required_argument, NULL, 0, eArgTypeBoolean, "If true, cascade through typedef chains."},
Enrico Granata018921d2011-08-12 02:00:06 +00003917 { LLDB_OPT_SET_ALL, false, "skip-pointers", 'p', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for pointers-to-type objects."},
3918 { LLDB_OPT_SET_ALL, false, "skip-references", 'r', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for references-to-type objects."},
3919 { LLDB_OPT_SET_ALL, false, "category", 'w', required_argument, NULL, 0, eArgTypeName, "Add this to the given category instead of the default one."},
Enrico Granata91544802011-09-06 19:20:51 +00003920 { LLDB_OPT_SET_ALL, false, "child", 'c', required_argument, NULL, 0, eArgTypeExpressionPath, "Include this expression path in the synthetic view."},
Enrico Granata018921d2011-08-12 02:00:06 +00003921 { LLDB_OPT_SET_ALL, false, "regex", 'x', no_argument, NULL, 0, eArgTypeNone, "Type names are actually regular expressions."},
3922 { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
3923};
3924
Greg Clayton5c28dd12011-06-23 17:59:56 +00003925class CommandObjectTypeFormat : public CommandObjectMultiword
3926{
3927public:
3928 CommandObjectTypeFormat (CommandInterpreter &interpreter) :
3929 CommandObjectMultiword (interpreter,
3930 "type format",
Enrico Granata1391a392011-06-29 22:27:15 +00003931 "A set of commands for editing variable value display options",
Greg Clayton5c28dd12011-06-23 17:59:56 +00003932 "type format [<sub-command-options>] ")
3933 {
Enrico Granata1391a392011-06-29 22:27:15 +00003934 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTypeFormatAdd (interpreter)));
3935 LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTypeFormatClear (interpreter)));
3936 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTypeFormatDelete (interpreter)));
3937 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTypeFormatList (interpreter)));
Greg Clayton5c28dd12011-06-23 17:59:56 +00003938 }
3939
3940
3941 ~CommandObjectTypeFormat ()
3942 {
3943 }
3944};
3945
Greg Clayton3e4238d2011-11-04 03:34:56 +00003946#ifndef LLDB_DISABLE_PYTHON
3947
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003948class CommandObjectTypeSynth : public CommandObjectMultiword
3949{
3950public:
3951 CommandObjectTypeSynth (CommandInterpreter &interpreter) :
3952 CommandObjectMultiword (interpreter,
Enrico Granataa7e1b6d2011-08-10 15:29:15 +00003953 "type synthetic",
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003954 "A set of commands for operating on synthetic type representations",
Enrico Granataa7e1b6d2011-08-10 15:29:15 +00003955 "type synthetic [<sub-command-options>] ")
Enrico Granatae4e3e2c2011-07-22 00:16:08 +00003956 {
3957 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTypeSynthAdd (interpreter)));
3958 LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTypeSynthClear (interpreter)));
3959 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTypeSynthDelete (interpreter)));
3960 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTypeSynthList (interpreter)));
3961 }
3962
3963
3964 ~CommandObjectTypeSynth ()
3965 {
3966 }
3967};
3968
Greg Clayton3e4238d2011-11-04 03:34:56 +00003969#endif // #ifndef LLDB_DISABLE_PYTHON
3970
Enrico Granata018921d2011-08-12 02:00:06 +00003971class CommandObjectTypeFilter : public CommandObjectMultiword
3972{
3973public:
3974 CommandObjectTypeFilter (CommandInterpreter &interpreter) :
3975 CommandObjectMultiword (interpreter,
3976 "type filter",
3977 "A set of commands for operating on type filters",
3978 "type synthetic [<sub-command-options>] ")
3979 {
3980 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTypeFilterAdd (interpreter)));
3981 LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTypeFilterClear (interpreter)));
3982 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTypeFilterDelete (interpreter)));
3983 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTypeFilterList (interpreter)));
3984 }
3985
3986
3987 ~CommandObjectTypeFilter ()
3988 {
3989 }
3990};
3991
Enrico Granata8a717e52011-07-19 02:34:21 +00003992class CommandObjectTypeCategory : public CommandObjectMultiword
3993{
3994public:
3995 CommandObjectTypeCategory (CommandInterpreter &interpreter) :
3996 CommandObjectMultiword (interpreter,
3997 "type category",
3998 "A set of commands for operating on categories",
3999 "type category [<sub-command-options>] ")
4000 {
4001 LoadSubCommand ("enable", CommandObjectSP (new CommandObjectTypeCategoryEnable (interpreter)));
4002 LoadSubCommand ("disable", CommandObjectSP (new CommandObjectTypeCategoryDisable (interpreter)));
4003 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTypeCategoryDelete (interpreter)));
4004 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTypeCategoryList (interpreter)));
4005 }
4006
4007
4008 ~CommandObjectTypeCategory ()
4009 {
4010 }
4011};
4012
Enrico Granata1391a392011-06-29 22:27:15 +00004013class CommandObjectTypeSummary : public CommandObjectMultiword
4014{
4015public:
4016 CommandObjectTypeSummary (CommandInterpreter &interpreter) :
4017 CommandObjectMultiword (interpreter,
Enrico Granata886bc3e2011-07-02 00:25:22 +00004018 "type summary",
Enrico Granata1391a392011-06-29 22:27:15 +00004019 "A set of commands for editing variable summary display options",
4020 "type summary [<sub-command-options>] ")
4021 {
Enrico Granataf7a9b142011-07-15 02:26:42 +00004022 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTypeSummaryAdd (interpreter)));
4023 LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTypeSummaryClear (interpreter)));
4024 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTypeSummaryDelete (interpreter)));
4025 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTypeSummaryList (interpreter)));
Enrico Granata1391a392011-06-29 22:27:15 +00004026 }
4027
4028
4029 ~CommandObjectTypeSummary ()
4030 {
4031 }
4032};
4033
Greg Clayton5c28dd12011-06-23 17:59:56 +00004034//-------------------------------------------------------------------------
4035// CommandObjectType
4036//-------------------------------------------------------------------------
4037
4038CommandObjectType::CommandObjectType (CommandInterpreter &interpreter) :
4039 CommandObjectMultiword (interpreter,
4040 "type",
4041 "A set of commands for operating on the type system",
4042 "type [<sub-command-options>]")
4043{
Enrico Granata8a717e52011-07-19 02:34:21 +00004044 LoadSubCommand ("category", CommandObjectSP (new CommandObjectTypeCategory (interpreter)));
Enrico Granata018921d2011-08-12 02:00:06 +00004045 LoadSubCommand ("filter", CommandObjectSP (new CommandObjectTypeFilter (interpreter)));
Greg Clayton5c28dd12011-06-23 17:59:56 +00004046 LoadSubCommand ("format", CommandObjectSP (new CommandObjectTypeFormat (interpreter)));
Enrico Granata1391a392011-06-29 22:27:15 +00004047 LoadSubCommand ("summary", CommandObjectSP (new CommandObjectTypeSummary (interpreter)));
Greg Clayton3e4238d2011-11-04 03:34:56 +00004048#ifndef LLDB_DISABLE_PYTHON
Enrico Granata018921d2011-08-12 02:00:06 +00004049 LoadSubCommand ("synthetic", CommandObjectSP (new CommandObjectTypeSynth (interpreter)));
Greg Clayton3e4238d2011-11-04 03:34:56 +00004050#endif
Greg Clayton5c28dd12011-06-23 17:59:56 +00004051}
4052
4053
4054CommandObjectType::~CommandObjectType ()
4055{
4056}
4057
4058