blob: 88ee8997a2f6a83f85175986ac12d151521fef30 [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
10#include "lldb/lldb-python.h"
11
12#include "lldb/DataFormatters/CXXFormatterFunctions.h"
13
14#include "llvm/Support/ConvertUTF.h"
15
16#include "lldb/Core/DataBufferHeap.h"
17#include "lldb/Core/Error.h"
18#include "lldb/Core/Stream.h"
19#include "lldb/Core/ValueObject.h"
20#include "lldb/Core/ValueObjectConstResult.h"
21#include "lldb/Host/Endian.h"
22#include "lldb/Symbol/ClangASTContext.h"
23#include "lldb/Target/ObjCLanguageRuntime.h"
24#include "lldb/Target/Target.h"
25
26using namespace lldb;
27using namespace lldb_private;
28using namespace lldb_private::formatters;
29
30template<bool cf_style>
31bool
32lldb_private::formatters::NSSetSummaryProvider (ValueObject& valobj, Stream& stream)
33{
34 ProcessSP process_sp = valobj.GetProcessSP();
35 if (!process_sp)
36 return false;
37
38 ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
39
40 if (!runtime)
41 return false;
42
43 ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
44
45 if (!descriptor.get() || !descriptor->IsValid())
46 return false;
47
48 uint32_t ptr_size = process_sp->GetAddressByteSize();
49 bool is_64bit = (ptr_size == 8);
50
51 lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
52
53 if (!valobj_addr)
54 return false;
55
56 uint64_t value = 0;
57
58 const char* class_name = descriptor->GetClassName().GetCString();
59
60 if (!class_name || !*class_name)
61 return false;
62
63 if (!strcmp(class_name,"__NSSetI"))
64 {
65 Error error;
66 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
67 if (error.Fail())
68 return false;
69 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
70 }
71 else if (!strcmp(class_name,"__NSSetM"))
72 {
73 Error error;
74 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
75 if (error.Fail())
76 return false;
77 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
78 }
79 else if (!strcmp(class_name,"__NSCFSet"))
80 {
81 Error error;
82 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error);
83 if (error.Fail())
84 return false;
85 if (is_64bit)
86 value &= ~0x1fff000000000000UL;
87 }
88 else if (!strcmp(class_name,"NSCountedSet"))
89 {
90 Error error;
91 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
92 if (error.Fail())
93 return false;
94 value = process_sp->ReadUnsignedIntegerFromMemory(value + (is_64bit ? 20 : 12), ptr_size, 0, error);
95 if (error.Fail())
96 return false;
97 if (is_64bit)
98 value &= ~0x1fff000000000000UL;
99 }
100 else
101 {
102 if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
103 return false;
104 }
105
106 stream.Printf("%s%" PRIu64 " %s%s",
107 (cf_style ? "@\"" : ""),
108 value,
109 (cf_style ? (value == 1 ? "value" : "values") : (value == 1 ? "object" : "objects")),
110 (cf_style ? "\"" : ""));
111 return true;
112}
113
114template bool
115lldb_private::formatters::NSSetSummaryProvider<true> (ValueObject& valobj, Stream& stream);
116
117template bool
118lldb_private::formatters::NSSetSummaryProvider<false> (ValueObject& valobj, Stream& stream);