blob: 696f6fa371d3bbb7cbc5aa91180e45b31b92b3d6 [file] [log] [blame]
Enrico Granataf615b802013-02-15 23:38:37 +00001//===-- NSSet.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
Matt Kopec676a4872013-02-21 23:55:31 +000010#include "lldb/lldb-python.h"
11
Enrico Granataf615b802013-02-15 23:38:37 +000012#include "lldb/DataFormatters/CXXFormatterFunctions.h"
13
Enrico Granataf615b802013-02-15 23:38:37 +000014#include "lldb/Core/DataBufferHeap.h"
15#include "lldb/Core/Error.h"
16#include "lldb/Core/Stream.h"
17#include "lldb/Core/ValueObject.h"
18#include "lldb/Core/ValueObjectConstResult.h"
19#include "lldb/Host/Endian.h"
20#include "lldb/Symbol/ClangASTContext.h"
21#include "lldb/Target/ObjCLanguageRuntime.h"
22#include "lldb/Target/Target.h"
23
24using namespace lldb;
25using namespace lldb_private;
26using namespace lldb_private::formatters;
27
Enrico Granata6714a0f2014-10-22 21:47:27 +000028namespace lldb_private {
29 namespace formatters {
30 class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
31 {
32 private:
33 struct DataDescriptor_32
34 {
35 uint32_t _used : 26;
36 uint32_t _szidx : 6;
37 };
38 struct DataDescriptor_64
39 {
40 uint64_t _used : 58;
41 uint32_t _szidx : 6;
42 };
43
44 struct SetItemDescriptor
45 {
46 lldb::addr_t item_ptr;
47 lldb::ValueObjectSP valobj_sp;
48 };
49
50 public:
51 NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
52
53 virtual size_t
54 CalculateNumChildren ();
55
56 virtual lldb::ValueObjectSP
57 GetChildAtIndex (size_t idx);
58
59 virtual bool
60 Update();
61
62 virtual bool
63 MightHaveChildren ();
64
65 virtual size_t
66 GetIndexOfChildWithName (const ConstString &name);
67
68 virtual
69 ~NSSetISyntheticFrontEnd ();
70 private:
71 ExecutionContextRef m_exe_ctx_ref;
72 uint8_t m_ptr_size;
73 DataDescriptor_32 *m_data_32;
74 DataDescriptor_64 *m_data_64;
75 lldb::addr_t m_data_ptr;
76 std::vector<SetItemDescriptor> m_children;
77 };
78
79 class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd
80 {
81 private:
82
83 public:
84 NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
85
86 virtual size_t
87 CalculateNumChildren ();
88
89 virtual lldb::ValueObjectSP
90 GetChildAtIndex (size_t idx);
91
92 virtual bool
93 Update();
94
95 virtual bool
96 MightHaveChildren ();
97
98 virtual size_t
99 GetIndexOfChildWithName (const ConstString &name);
100
101 virtual
102 ~NSOrderedSetSyntheticFrontEnd ();
103 private:
104 uint32_t m_count;
105 std::map<uint32_t,lldb::ValueObjectSP> m_children;
106 };
107
108 class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
109 {
110 private:
111 struct DataDescriptor_32
112 {
113 uint32_t _used : 26;
114 uint32_t _size;
115 uint32_t _mutations;
116 uint32_t _objs_addr;
117 };
118 struct DataDescriptor_64
119 {
120 uint64_t _used : 58;
121 uint64_t _size;
122 uint64_t _mutations;
123 uint64_t _objs_addr;
124 };
125 struct SetItemDescriptor
126 {
127 lldb::addr_t item_ptr;
128 lldb::ValueObjectSP valobj_sp;
129 };
130 public:
131 NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
132
133 virtual size_t
134 CalculateNumChildren ();
135
136 virtual lldb::ValueObjectSP
137 GetChildAtIndex (size_t idx);
138
139 virtual bool
140 Update();
141
142 virtual bool
143 MightHaveChildren ();
144
145 virtual size_t
146 GetIndexOfChildWithName (const ConstString &name);
147
148 virtual
149 ~NSSetMSyntheticFrontEnd ();
150 private:
151 ExecutionContextRef m_exe_ctx_ref;
152 uint8_t m_ptr_size;
153 DataDescriptor_32 *m_data_32;
154 DataDescriptor_64 *m_data_64;
155 std::vector<SetItemDescriptor> m_children;
156 };
157
158 class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
159 {
160 public:
161 NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
162
163 virtual size_t
164 CalculateNumChildren ();
165
166 virtual lldb::ValueObjectSP
167 GetChildAtIndex (size_t idx);
168
169 virtual bool
170 Update();
171
172 virtual bool
173 MightHaveChildren ();
174
175 virtual size_t
176 GetIndexOfChildWithName (const ConstString &name);
177
178 virtual
179 ~NSSetCodeRunningSyntheticFrontEnd ();
180 };
181 }
182}
183
Enrico Granataf615b802013-02-15 23:38:37 +0000184template<bool cf_style>
185bool
186lldb_private::formatters::NSSetSummaryProvider (ValueObject& valobj, Stream& stream)
187{
188 ProcessSP process_sp = valobj.GetProcessSP();
189 if (!process_sp)
190 return false;
191
192 ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
193
194 if (!runtime)
195 return false;
196
197 ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
198
199 if (!descriptor.get() || !descriptor->IsValid())
200 return false;
201
202 uint32_t ptr_size = process_sp->GetAddressByteSize();
203 bool is_64bit = (ptr_size == 8);
204
205 lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
206
207 if (!valobj_addr)
208 return false;
209
210 uint64_t value = 0;
211
212 const char* class_name = descriptor->GetClassName().GetCString();
213
214 if (!class_name || !*class_name)
215 return false;
216
217 if (!strcmp(class_name,"__NSSetI"))
218 {
219 Error error;
220 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
221 if (error.Fail())
222 return false;
223 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
224 }
225 else if (!strcmp(class_name,"__NSSetM"))
226 {
227 Error error;
228 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
229 if (error.Fail())
230 return false;
231 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
232 }
Enrico Granataea9f9e82013-07-15 23:17:32 +0000233 /*else if (!strcmp(class_name,"__NSCFSet"))
Enrico Granataf615b802013-02-15 23:38:37 +0000234 {
235 Error error;
Enrico Granataf68f7322013-03-15 18:44:08 +0000236 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), 4, 0, error);
Enrico Granataf615b802013-02-15 23:38:37 +0000237 if (error.Fail())
238 return false;
239 if (is_64bit)
240 value &= ~0x1fff000000000000UL;
241 }
Enrico Granataea9f9e82013-07-15 23:17:32 +0000242 else if (!strcmp(class_name,"NSCountedSet"))
Enrico Granataf615b802013-02-15 23:38:37 +0000243 {
244 Error error;
245 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
246 if (error.Fail())
247 return false;
Enrico Granataf68f7322013-03-15 18:44:08 +0000248 value = process_sp->ReadUnsignedIntegerFromMemory(value + (is_64bit ? 20 : 12), 4, 0, error);
Enrico Granataf615b802013-02-15 23:38:37 +0000249 if (error.Fail())
250 return false;
251 if (is_64bit)
252 value &= ~0x1fff000000000000UL;
Enrico Granataf68f7322013-03-15 18:44:08 +0000253 }*/
Enrico Granataf615b802013-02-15 23:38:37 +0000254 else
255 {
256 if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
257 return false;
258 }
259
260 stream.Printf("%s%" PRIu64 " %s%s",
261 (cf_style ? "@\"" : ""),
262 value,
263 (cf_style ? (value == 1 ? "value" : "values") : (value == 1 ? "object" : "objects")),
264 (cf_style ? "\"" : ""));
265 return true;
266}
267
Enrico Granata9f02e092013-02-18 23:16:23 +0000268SyntheticChildrenFrontEnd* lldb_private::formatters::NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
269{
270 lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
271 if (!process_sp)
272 return NULL;
273 ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
274 if (!runtime)
275 return NULL;
276
277 if (!valobj_sp->IsPointerType())
278 {
279 Error error;
280 valobj_sp = valobj_sp->AddressOf(error);
281 if (error.Fail() || !valobj_sp)
282 return NULL;
283 }
284
285 ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
286
287 if (!descriptor.get() || !descriptor->IsValid())
288 return NULL;
289
290 const char* class_name = descriptor->GetClassName().GetCString();
291
292 if (!class_name || !*class_name)
293 return NULL;
294
295 if (!strcmp(class_name,"__NSSetI"))
296 {
297 return (new NSSetISyntheticFrontEnd(valobj_sp));
298 }
299 else if (!strcmp(class_name,"__NSSetM"))
300 {
301 return (new NSSetMSyntheticFrontEnd(valobj_sp));
302 }
Enrico Granatacd67f972013-04-27 00:27:20 +0000303 else if ((!strcmp(class_name,"__NSOrderedSetI")) || (!strcmp(class_name,"__NSOrderedSetM")))
304 {
305 return new NSOrderedSetSyntheticFrontEnd(valobj_sp); // this runs code
306 }
Enrico Granata9f02e092013-02-18 23:16:23 +0000307 else
308 {
309 return /*(new NSSetCodeRunningSyntheticFrontEnd(valobj_sp))*/ NULL;
310 }
311}
312
313lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
314SyntheticChildrenFrontEnd(*valobj_sp.get()),
315m_exe_ctx_ref(),
316m_ptr_size(8),
317m_data_32(NULL),
318m_data_64(NULL)
319{
320 if (valobj_sp)
321 Update();
322}
323
324lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd ()
325{
326 delete m_data_32;
327 m_data_32 = NULL;
328 delete m_data_64;
329 m_data_64 = NULL;
330}
331
332size_t
333lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
334{
335 const char* item_name = name.GetCString();
336 uint32_t idx = ExtractIndexFromString(item_name);
337 if (idx < UINT32_MAX && idx >= CalculateNumChildren())
338 return UINT32_MAX;
339 return idx;
340}
341
342size_t
343lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren ()
344{
345 if (!m_data_32 && !m_data_64)
346 return 0;
347 return (m_data_32 ? m_data_32->_used : m_data_64->_used);
348}
349
350bool
351lldb_private::formatters::NSSetISyntheticFrontEnd::Update()
352{
353 m_children.clear();
354 delete m_data_32;
355 m_data_32 = NULL;
356 delete m_data_64;
357 m_data_64 = NULL;
358 m_ptr_size = 0;
359 ValueObjectSP valobj_sp = m_backend.GetSP();
360 if (!valobj_sp)
361 return false;
Enrico Granata9f02e092013-02-18 23:16:23 +0000362 if (!valobj_sp)
363 return false;
364 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
365 Error error;
366 if (valobj_sp->IsPointerType())
367 {
368 valobj_sp = valobj_sp->Dereference(error);
369 if (error.Fail() || !valobj_sp)
370 return false;
371 }
372 error.Clear();
373 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
374 if (!process_sp)
375 return false;
376 m_ptr_size = process_sp->GetAddressByteSize();
377 uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
378 if (m_ptr_size == 4)
379 {
380 m_data_32 = new DataDescriptor_32();
381 process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
382 }
383 else
384 {
385 m_data_64 = new DataDescriptor_64();
386 process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
387 }
388 if (error.Fail())
389 return false;
390 m_data_ptr = data_location + m_ptr_size;
391 return false;
392}
393
394bool
395lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren ()
396{
397 return true;
398}
399
400lldb::ValueObjectSP
401lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx)
402{
403 uint32_t num_children = CalculateNumChildren();
404
405 if (idx >= num_children)
406 return lldb::ValueObjectSP();
407
Enrico Granata5383e812013-11-21 01:08:05 +0000408 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
409 if (!process_sp)
410 return lldb::ValueObjectSP();
411
Enrico Granata9f02e092013-02-18 23:16:23 +0000412 if (m_children.empty())
413 {
414 // do the scan phase
415 lldb::addr_t obj_at_idx = 0;
416
417 uint32_t tries = 0;
418 uint32_t test_idx = 0;
419
420 while(tries < num_children)
421 {
422 obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
Enrico Granata9f02e092013-02-18 23:16:23 +0000423 if (!process_sp)
424 return lldb::ValueObjectSP();
425 Error error;
426 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
427 if (error.Fail())
428 return lldb::ValueObjectSP();
429
430 test_idx++;
431
432 if (!obj_at_idx)
433 continue;
434 tries++;
435
436 SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()};
437
438 m_children.push_back(descriptor);
439 }
440 }
441
442 if (idx >= m_children.size()) // should never happen
443 return lldb::ValueObjectSP();
444
445 SetItemDescriptor &set_item = m_children[idx];
446 if (!set_item.valobj_sp)
447 {
Enrico Granata5383e812013-11-21 01:08:05 +0000448 auto ptr_size = process_sp->GetAddressByteSize();
449 DataBufferHeap buffer(ptr_size,0);
450 switch (ptr_size)
451 {
452 case 0: // architecture has no clue?? - fail
453 return lldb::ValueObjectSP();
454 case 4:
455 *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
456 break;
457 case 8:
458 *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
459 break;
460 default:
461 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
462 }
Enrico Granata9f02e092013-02-18 23:16:23 +0000463 StreamString idx_name;
Deepak Panickal99fbc072014-03-03 15:39:47 +0000464 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
Enrico Granata5383e812013-11-21 01:08:05 +0000465
466 DataExtractor data(buffer.GetBytes(),
467 buffer.GetByteSize(),
468 process_sp->GetByteOrder(),
469 process_sp->GetAddressByteSize());
470
471 set_item.valobj_sp =
472 ValueObject::CreateValueObjectFromData(idx_name.GetData(),
473 data,
474 m_exe_ctx_ref,
475 m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID));
Enrico Granata9f02e092013-02-18 23:16:23 +0000476 }
477 return set_item.valobj_sp;
478}
479
480lldb_private::formatters::NSSetMSyntheticFrontEnd::NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
481SyntheticChildrenFrontEnd(*valobj_sp.get()),
482m_exe_ctx_ref(),
483m_ptr_size(8),
484m_data_32(NULL),
485m_data_64(NULL)
486{
487 if (valobj_sp)
488 Update ();
489}
490
491lldb_private::formatters::NSSetMSyntheticFrontEnd::~NSSetMSyntheticFrontEnd ()
492{
493 delete m_data_32;
494 m_data_32 = NULL;
495 delete m_data_64;
496 m_data_64 = NULL;
497}
498
499size_t
500lldb_private::formatters::NSSetMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
501{
502 const char* item_name = name.GetCString();
503 uint32_t idx = ExtractIndexFromString(item_name);
504 if (idx < UINT32_MAX && idx >= CalculateNumChildren())
505 return UINT32_MAX;
506 return idx;
507}
508
509size_t
510lldb_private::formatters::NSSetMSyntheticFrontEnd::CalculateNumChildren ()
511{
512 if (!m_data_32 && !m_data_64)
513 return 0;
514 return (m_data_32 ? m_data_32->_used : m_data_64->_used);
515}
516
517bool
518lldb_private::formatters::NSSetMSyntheticFrontEnd::Update()
519{
520 m_children.clear();
521 ValueObjectSP valobj_sp = m_backend.GetSP();
522 m_ptr_size = 0;
523 delete m_data_32;
524 m_data_32 = NULL;
525 delete m_data_64;
526 m_data_64 = NULL;
527 if (!valobj_sp)
528 return false;
Enrico Granata9f02e092013-02-18 23:16:23 +0000529 if (!valobj_sp)
530 return false;
531 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
532 Error error;
533 if (valobj_sp->IsPointerType())
534 {
535 valobj_sp = valobj_sp->Dereference(error);
536 if (error.Fail() || !valobj_sp)
537 return false;
538 }
539 error.Clear();
540 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
541 if (!process_sp)
542 return false;
543 m_ptr_size = process_sp->GetAddressByteSize();
544 uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
545 if (m_ptr_size == 4)
546 {
547 m_data_32 = new DataDescriptor_32();
548 process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
549 }
550 else
551 {
552 m_data_64 = new DataDescriptor_64();
553 process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
554 }
555 if (error.Fail())
556 return false;
557 return false;
558}
559
560bool
561lldb_private::formatters::NSSetMSyntheticFrontEnd::MightHaveChildren ()
562{
563 return true;
564}
565
566lldb::ValueObjectSP
567lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
568{
569 lldb::addr_t m_objs_addr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
570
571 uint32_t num_children = CalculateNumChildren();
572
573 if (idx >= num_children)
574 return lldb::ValueObjectSP();
575
Enrico Granata5383e812013-11-21 01:08:05 +0000576 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
577 if (!process_sp)
578 return lldb::ValueObjectSP();
579
Enrico Granata9f02e092013-02-18 23:16:23 +0000580 if (m_children.empty())
581 {
582 // do the scan phase
583 lldb::addr_t obj_at_idx = 0;
584
585 uint32_t tries = 0;
586 uint32_t test_idx = 0;
587
588 while(tries < num_children)
589 {
590 obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
Enrico Granata9f02e092013-02-18 23:16:23 +0000591 if (!process_sp)
592 return lldb::ValueObjectSP();
593 Error error;
594 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
595 if (error.Fail())
596 return lldb::ValueObjectSP();
597
598 test_idx++;
599
600 if (!obj_at_idx)
601 continue;
602 tries++;
603
604 SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()};
605
606 m_children.push_back(descriptor);
607 }
608 }
609
610 if (idx >= m_children.size()) // should never happen
611 return lldb::ValueObjectSP();
612
613 SetItemDescriptor &set_item = m_children[idx];
614 if (!set_item.valobj_sp)
615 {
Enrico Granata5383e812013-11-21 01:08:05 +0000616 auto ptr_size = process_sp->GetAddressByteSize();
617 DataBufferHeap buffer(ptr_size,0);
618 switch (ptr_size)
619 {
620 case 0: // architecture has no clue?? - fail
621 return lldb::ValueObjectSP();
622 case 4:
623 *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
624 break;
625 case 8:
626 *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
627 break;
628 default:
629 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
630 }
Enrico Granata9f02e092013-02-18 23:16:23 +0000631 StreamString idx_name;
Deepak Panickal99fbc072014-03-03 15:39:47 +0000632 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
Enrico Granata5383e812013-11-21 01:08:05 +0000633
634 DataExtractor data(buffer.GetBytes(),
635 buffer.GetByteSize(),
636 process_sp->GetByteOrder(),
637 process_sp->GetAddressByteSize());
638
639 set_item.valobj_sp =
640 ValueObject::CreateValueObjectFromData(idx_name.GetData(),
641 data,
642 m_exe_ctx_ref,
643 m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID));
Enrico Granata9f02e092013-02-18 23:16:23 +0000644 }
645 return set_item.valobj_sp;
646}
647
Enrico Granatacd67f972013-04-27 00:27:20 +0000648lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
649SyntheticChildrenFrontEnd(*valobj_sp.get()),
650m_count(UINT32_MAX),
651m_children()
652{}
653
654size_t
655lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::CalculateNumChildren ()
656{
657 if (m_count != UINT32_MAX)
658 return m_count;
659 uint64_t count_temp;
660 if (ExtractValueFromObjCExpression(m_backend,"unsigned int","count",count_temp))
661 return (m_count = count_temp);
662 return (m_count = 0);
663}
664
665lldb::ValueObjectSP
666lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::GetChildAtIndex (size_t idx)
667{
668 auto iter = m_children.find(idx);
669 if (iter == m_children.end())
670 {
671 lldb::ValueObjectSP retval_sp;
672 if (idx <= m_count)
673 {
674 retval_sp = CallSelectorOnObject(m_backend, "id", "objectAtIndex", idx);
675 if (retval_sp)
676 {
677 StreamString idx_name;
Deepak Panickal99fbc072014-03-03 15:39:47 +0000678 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
Enrico Granatacd67f972013-04-27 00:27:20 +0000679 retval_sp->SetName(ConstString(idx_name.GetData()));
680 }
681 m_children[idx] = retval_sp;
682 }
683 return retval_sp;
684 }
685 else
686 return iter->second;
687}
688
689bool
690lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::Update()
691{
692 return false;
693}
694
695bool
696lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::MightHaveChildren ()
697{
698 return true;
699}
700
701size_t
702lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
703{
704 const char* item_name = name.GetCString();
705 uint32_t idx = ExtractIndexFromString(item_name);
706 if (idx < UINT32_MAX && idx >= CalculateNumChildren())
707 return UINT32_MAX;
708 return idx;
709}
710
711lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::~NSOrderedSetSyntheticFrontEnd ()
712{
713}
714
Enrico Granataf615b802013-02-15 23:38:37 +0000715template bool
716lldb_private::formatters::NSSetSummaryProvider<true> (ValueObject& valobj, Stream& stream);
717
718template bool
719lldb_private::formatters::NSSetSummaryProvider<false> (ValueObject& valobj, Stream& stream);