CXXFormatterFunctions.cpp revision 47beabb1386be44e3f90dbc30a0b22c23b93a4dc
1caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===//
2caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//
3caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//                     The LLVM Compiler Infrastructure
4caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//
5caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// This file is distributed under the University of Illinois Open Source
6caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// License. See LICENSE.TXT for details.
7caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//
8caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===----------------------------------------------------------------------===//
9caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
10caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/CXXFormatterFunctions.h"
11caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
12caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// needed to get ConvertUTF16/32ToUTF8
13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#define CLANG_NEEDS_THESE_ONE_DAY
14caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "clang/Basic/ConvertUTF.h"
15caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
16f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/DataBufferHeap.h"
17f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/Error.h"
18caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/Stream.h"
19caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/ValueObject.h"
20f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/ValueObjectConstResult.h"
21f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Host/Endian.h"
22caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h"
23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h"
24caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
25caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb;
26caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private;
27caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters;
28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
30f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj,
31f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* target_type,
32f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* selector,
33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          uint64_t &value)
34caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
35caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target_type || !*target_type)
36caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!selector || !*selector)
38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StreamString expr_path_stream;
40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
41caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StreamString expr;
42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    expr.Printf("(%s)[%s %s]",target_type,expr_path_stream.GetData(),selector);
43caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::ValueObjectSP result_sp;
45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    Target* target = exe_ctx.GetTargetPtr();
46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target || !stack_frame)
48caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
49d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
5047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
51d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    options.SetCoerceToId(false)
52d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    .SetUnwindOnError(true)
53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    .SetKeepInMemory(true)
54d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
55d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
56caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    target->EvaluateExpression(expr.GetData(),
57caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                               stack_frame,
58d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               result_sp,
59d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               options);
60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!result_sp)
61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    value = result_sp->GetValueAsUnsigned(0);
63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
64caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
65caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
66f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
67f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
68f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
69f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
70f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                uint64_t index)
71f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
72f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
73f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
74f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
75f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
76f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
77f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
78f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
79f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
80f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    expr.Printf("(%s)[%s %s:%lld]",return_type,expr_path_stream.GetData(),selector,index);
81f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
82f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP result_sp;
83f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
84f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
85f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!target || !stack_frame)
86f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
87f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
8847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
89f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    options.SetCoerceToId(false)
90f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUnwindOnError(true)
91f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetKeepInMemory(true)
92f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
93f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
94f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    target->EvaluateExpression(expr.GetData(),
95f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               stack_frame,
96f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               valobj_sp,
97f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               options);
98f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
99f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* key)
106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!key || !*key)
113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key);
118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP result_sp;
120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!target || !stack_frame)
123f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
12547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    options.SetCoerceToId(false)
127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUnwindOnError(true)
128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetKeepInMemory(true)
129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    target->EvaluateExpression(expr.GetData(),
132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               stack_frame,
133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               valobj_sp,
134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               options);
135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
138caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool name_entries>
139caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream)
141caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
142caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
143caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
144caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
145caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
146caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
147caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
148caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
149caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
150caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
151caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
152caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
153caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
154caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
155caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
156caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
157caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_64bit = (ptr_size == 8);
158caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
159caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
160caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
161caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
162caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
163caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
164caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
165caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
166caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
1677685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
1687685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
1697685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
1707685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
171caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"__NSDictionaryI"))
172caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
173caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
174caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
175caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
176caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
177caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
178caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
179caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSDictionaryM"))
180caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
181caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
182caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
183caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
184caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
185caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
186caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
187caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSCFDictionary"))
188caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
189caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
190caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error);
191caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
192caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
193caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (is_64bit)
194caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            value &= ~0x0f1f000000000000UL;
195caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
196caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
197caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
198f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
199caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
200caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
201caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
202caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("%s%llu %s%s",
203caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? "@\"" : ""),
204caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
205caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")),
206caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? "\"" : ""));
207caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
208caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
209caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
210caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
211f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream)
212caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
213caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
214caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
215caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
216caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
217caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
218caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
219caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
220caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
221caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
222caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
223caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
224caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
225caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
226caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
227caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
228caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
229caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
230caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
231caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
232caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
233caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
234caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
235caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
236caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
2377685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
2387685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
2397685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
2407685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
241caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"__NSArrayI"))
242caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
243caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
244caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
245caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
246caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
247caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
248caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSArrayM"))
249caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
250caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
251caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
252caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
253caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
254caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
255caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSCFArray"))
256caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
257caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
258caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error);
259caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
260caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
261caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
262caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
263caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
264f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
265caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
266caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
267caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
268caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("@\"%llu object%s\"",
269caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
270caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value == 1 ? "" : "s");
271caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
272caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
273caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
274caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at>
275caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
276f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream)
277caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
278caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
279caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
280caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
281caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
282caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
283caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
284caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
285caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
286caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
287caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
288caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
289caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
290caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
291caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
292caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_64bit = (process_sp->GetAddressByteSize() == 8);
293caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
294caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
295caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
296caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
297caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
298caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
299caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
300caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
3017685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
3027685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
3037685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
3047685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
305caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"NSConcreteData") ||
306caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"NSConcreteMutableData") ||
307caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"__NSCFData"))
308caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
309caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint32_t offset = (is_64bit ? 16 : 8);
310caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
311caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error);
312caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
313caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
314caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
315caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
316caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
317f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "length", value))
318caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
319caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
320caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
321caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("%s%llu byte%s%s",
322caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "@\"" : ""),
323caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
324caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (value > 1 ? "s" : ""),
325caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "\"" : ""));
326caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
327caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
328caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
329caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
330caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
331f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream)
332caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
333caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
334caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
335caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
336caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
337caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
338caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
339caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
340caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
341caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
342caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
343caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
344caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
345caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
346caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
347caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
348caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
349caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
350caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
351caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
352caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
353caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
354caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
355caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
3567685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
3577685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
3587685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
359caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber"))
360caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
361caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (descriptor->IsTagged())
362caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
363caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them
364caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8;
365caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t i_bits = (valobj_addr & 0xF0) >> 4;
366caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
367caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            switch (i_bits)
368caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
369caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 0:
370caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(char)%hhd",(char)value);
371caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
372caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 4:
373caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(short)%hd",(short)value);
374caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
375caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 8:
376caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(int)%d",(int)value);
377caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
378caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 12:
379caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(long)%lld",value);
380caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
381caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                default:
382caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("absurd value:(info=%llu, value=%llu",i_bits,value);
383caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
384caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
385caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
386caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
387caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
388caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
389caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            Error error;
390caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F);
391caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t data_location = valobj_addr + 2*ptr_size;
392caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t value = 0;
393caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
394caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
395caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            switch (data_type)
396caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
397caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 1: // 0B00001
398caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error);
399caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
400caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
401caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(char)%hhd",(char)value);
402caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
403caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 2: // 0B0010
404caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error);
405caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
406caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
407caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(short)%hd",(short)value);
408caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
409caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 3: // 0B0011
410caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
411caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
412caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
413caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(int)%d",(int)value);
414caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
415caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 17: // 0B10001
416caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    data_location += 8;
417caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 4: // 0B0100
418caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
419caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
420caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
421caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(long)%lld",value);
422caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
423caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 5: // 0B0101
424caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                {
425caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
426caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
427caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
428caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    float flt_value = *((float*)&flt_as_int);
429caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(float)%f",flt_value);
430caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
431caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
432caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 6: // 0B0110
433caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                {
434caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
435caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
436caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
437caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    double dbl_value = *((double*)&dbl_as_lng);
438caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(double)%g",dbl_value);
439caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
440caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
441caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                default:
442caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("absurd: dt=%d",data_type);
443caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
444caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
445caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
446caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
447caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
448caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
449caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
450f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        // similar to ExtractValueFromObjCExpression but uses summary instead of value
451caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StreamString expr_path_stream;
452caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        valobj.GetExpressionPath(expr_path_stream, false);
453caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StreamString expr;
454caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        expr.Printf("(NSString*)[%s stringValue]",expr_path_stream.GetData());
455caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
456caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::ValueObjectSP result_sp;
457caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Target* target = exe_ctx.GetTargetPtr();
458caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StackFrame* stack_frame = exe_ctx.GetFramePtr();
459caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!target || !stack_frame)
460caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
461d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
46247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham        EvaluateExpressionOptions options;
463d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        options.SetCoerceToId(false)
464d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetUnwindOnError(true)
465d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetKeepInMemory(true)
466d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetUseDynamic(lldb::eDynamicCanRunTarget);
467d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
468caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        target->EvaluateExpression(expr.GetData(),
469caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                                   stack_frame,
470d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                   result_sp,
471d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                   options);
472caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!result_sp)
473caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
474caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        stream.Printf("%s",result_sp->GetSummaryAsCString());
475caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return true;
476caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
477caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
478caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
479b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granatastatic bool
480b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico GranataReadUTFBufferAndDumpToStream (uint64_t location,
481b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                              const ProcessSP& process_sp,
482b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                              Stream& stream)
483b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata{
484b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    Error error;
485b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
486b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), 1024, error);
487b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    if (error.Fail())
488b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    {
489b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        stream.Printf("unable to read data");
490b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        return true;
491b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    }
492b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    else
493b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        stream.Printf("@\"");
494b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    if (data_read)
495b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    {
496b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        UTF16 *data_ptr = (UTF16*)buffer_sp->GetBytes();
497b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        UTF16 *data_end_ptr = data_ptr + 256;
498b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata
499b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        while (data_ptr < data_end_ptr)
500b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        {
501b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            if (!*data_ptr)
502b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            {
503b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                data_end_ptr = data_ptr;
504b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                break;
505b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            }
506b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            data_ptr++;
507b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        }
508b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata
509b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        *data_ptr = 0;
510b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        data_ptr = (UTF16*)buffer_sp->GetBytes();
511b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata
512b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        lldb::DataBufferSP utf8_data_buffer_sp(new DataBufferHeap(1024,0));
513b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        UTF8* utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes();
514b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        UTF8* utf8_data_end_ptr = utf8_data_ptr + 1024;
515b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata
516b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        ConvertUTF16toUTF8	(	(const UTF16**)&data_ptr,
517b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                             data_end_ptr,
518b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                             &utf8_data_ptr,
519b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                             utf8_data_end_ptr,
520b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                             lenientConversion);
521b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes();
522b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++)
523b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        {
524b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            if (!*utf8_data_ptr)
525b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata                break;
526b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            stream.Printf("%c",*utf8_data_ptr);
527b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        }
528b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        stream.Printf("\"");
529b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        return true;
530b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    }
531b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    stream.Printf("\"");
532b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata    return true;
533b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata}
534b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata
535caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
536f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream)
537caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
538caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
539caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
540caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
541caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
542caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
543caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
544caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
545caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
546caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
547caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
548caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
549caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
550caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
551caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
552caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
553caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
554caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
555caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
556caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
557caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
558caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
559caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
560caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
56125c9adecf763053ff953b4d437b022075d30dd13Enrico Granata    if (!class_name || !*class_name)
56225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata        return false;
56325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata
564caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t info_bits_location = valobj_addr + ptr_size;
565caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (process_sp->GetByteOrder() != lldb::eByteOrderLittle)
566caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        info_bits_location += 3;
567caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
568caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
569caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
570caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error);
571caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (error.Fail())
572caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
573caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
574caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_mutable = (info_bits & 1) == 1;
575caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_inline = (info_bits & 0x60) == 0;
576caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool has_explicit_length = (info_bits & (1 | 4)) != 4;
577caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_unicode = (info_bits & 0x10) == 0x10;
578caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_special = strcmp(class_name,"NSPathStore2") == 0;
579caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
580caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (strcmp(class_name,"NSString") &&
581caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFStringRef") &&
582caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFMutableStringRef") &&
583caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFConstantString") &&
584caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFString") &&
585caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFConstantString") &&
586caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFString") &&
587caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSPathStore2"))
588caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
589caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        // probably not one of us - bail out
590caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
591caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
592caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
593caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (is_mutable)
594caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
595caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 2 * ptr_size + valobj_addr;
596caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
597caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
598caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
599caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (has_explicit_length and is_unicode)
600b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata            return ReadUTFBufferAndDumpToStream (location, process_sp, stream);
601caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
602caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
603caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location++;
604caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
605caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
606caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
607caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
608caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (data_read)
609caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
610caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return true;
611caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
612caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
613caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable)
614caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
615caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 3 * ptr_size + valobj_addr;
616caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
617caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
618caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
619caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
620caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
621caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
622caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
623caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
624caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_unicode)
625caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
626caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
627caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (is_inline)
628caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
629caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (!has_explicit_length)
630caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
631caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                stream.Printf("found new combo");
632caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return true;
633caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
634caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            else
635caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                location += ptr_size;
636caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
637caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
638caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
639caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location = process_sp->ReadPointerFromMemory(location, error);
640caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
641caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
642caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
643b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        return ReadUTFBufferAndDumpToStream (location, process_sp, stream);
644caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
645caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_special)
646caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
647caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
648b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata        return ReadUTFBufferAndDumpToStream (location, process_sp, stream);
649caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
650caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline)
651caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
652caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
653caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!has_explicit_length)
654caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location++;
655caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
656caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
657caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
658caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
659caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
660caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
661caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
662caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
663caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
664caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
665caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
666caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
667caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
668caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
669caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
670caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
671caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
672caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
673caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
674caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
675caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
676caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
677caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
678caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("class name = %s",class_name);
679caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
680caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
681caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
682caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
6839abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool
6849abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream)
6859abbfba957db139beed19866f61599424ddcd37aEnrico Granata{
6869abbfba957db139beed19866f61599424ddcd37aEnrico Granata    stream.Printf("%s",valobj.GetObjectDescription());
6879abbfba957db139beed19866f61599424ddcd37aEnrico Granata    return true;
6889abbfba957db139beed19866f61599424ddcd37aEnrico Granata}
6899abbfba957db139beed19866f61599424ddcd37aEnrico Granata
690f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
691f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
692f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(),
693f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8),
694f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_32(NULL),
695f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_64(NULL)
696f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
697247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp)
698f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
699247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
700247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        Update();
701f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
702f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
703f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
704f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
705f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren ()
706f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
707f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (m_data_32)
708f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return m_data_32->_used;
709f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (m_data_64)
710f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return m_data_64->_used;
711f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
712f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
713f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
714f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
715f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
716f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
717f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!m_data_32 && !m_data_64)
718f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
719f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx >= CalculateNumChildren())
720f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
721f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data);
722f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx += (idx * m_ptr_size);
723f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
724f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    idx_name.Printf("[%d]",idx);
725f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(),
726f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              object_at_idx,
727f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              m_exe_ctx_ref,
728f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              m_id_type);
729f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.push_back(retval_sp);
730f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return retval_sp;
731f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
732f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
733f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
734f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::Update()
735f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
736f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.clear();
737247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
738247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = 0;
739247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    delete m_data_32;
740247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_32 = NULL;
741247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    delete m_data_64;
742247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_64 = NULL;
743247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsDynamic())
744247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
745247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!valobj_sp)
746247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
747247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
748247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    Error error;
749247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsPointerType())
750247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
751247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
752247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        if (error.Fail() || !valobj_sp)
753247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata            return false;
754247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
755247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    error.Clear();
756247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
757247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!process_sp)
758247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
759247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
760247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
761247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (m_ptr_size == 4)
762247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
763247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_data_32 = new DataDescriptor_32();
764247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
765247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
766247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    else
767247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
768247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_data_64 = new DataDescriptor_64();
769247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
770247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
771247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (error.Fail())
772247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
773f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
774f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
775f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
776f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatastatic uint32_t
777f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataExtractIndexFromString (const char* item_name)
778f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
779f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!item_name || !*item_name)
780f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
781f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (*item_name != '[')
782f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
783f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    item_name++;
784f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = 0;
785f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    while(*item_name)
786f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
787f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        char x = *item_name;
788f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (x == ']')
789f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            break;
790f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (x < '0' || x > '9')
791f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            return UINT32_MAX;
792f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        idx = 10*idx + (x-'0');
793f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        item_name++;
794f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
795f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
796f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
797f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
798f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
799f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
800f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
801f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!m_data_32 && !m_data_64)
802f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
803f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* item_name = name.GetCString();
804f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
805f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
806f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
807f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
808f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
809f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
810f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd ()
811f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
812f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    delete m_data_32;
813f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_data_32 = NULL;
814f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    delete m_data_64;
815f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_data_64 = NULL;
816f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
817f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
818f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
819f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
820f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(),
821f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8),
822f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_items(0),
823f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_ptr(0)
824f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
825247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp)
826f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
827247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
828247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        Update();
829f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
830f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
831f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
832f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd ()
833f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
834f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
835f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
836f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
837f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
838f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
839f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* item_name = name.GetCString();
840f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
841f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
842f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
843f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
844f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
845f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
846f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
847f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren ()
848f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
849f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return m_items;
850f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
851f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
852f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
853f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::Update()
854f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
855247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = 0;
856247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_items = 0;
857247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_ptr = 0;
858f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.clear();
859247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
860247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsDynamic())
861247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
862247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!valobj_sp)
863247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
864247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
865247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    Error error;
866247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsPointerType())
867247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
868247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
869247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        if (error.Fail() || !valobj_sp)
870247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata            return false;
871247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
872247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    error.Clear();
873247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
874247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!process_sp)
875247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
876247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
877247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
878247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_items = process_sp->ReadPointerFromMemory(data_location, error);
879247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (error.Fail())
880247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
881247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_ptr = data_location+m_ptr_size;
882f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
883f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
884f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
885f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
886f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
887f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
888f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx >= CalculateNumChildren())
889f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
890f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::addr_t object_at_idx = m_data_ptr;
891f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx += (idx * m_ptr_size);
892f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
893f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!process_sp)
894f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
895f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Error error;
896f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx = process_sp->ReadPointerFromMemory(object_at_idx, error);
897f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (error.Fail())
898f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
899f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
900f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    expr.Printf("(id)%llu",object_at_idx);
901f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
902f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    idx_name.Printf("[%d]",idx);
903f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
904f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.push_back(retval_sp);
905f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return retval_sp;
906f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
907f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
908f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
909f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
910f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
911f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!process_sp)
912f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
913f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
914f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!runtime)
915f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
916f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
917f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!valobj_sp->IsPointerType())
918f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
919f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        Error error;
920f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        valobj_sp = valobj_sp->AddressOf(error);
921f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (error.Fail() || !valobj_sp)
922f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            return NULL;
923f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
924f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
925f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
926f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
927f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
928f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
929f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
930f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
9317685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
9327685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
9337685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return NULL;
9347685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
935f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!strcmp(class_name,"__NSArrayI"))
936f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
937f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayISyntheticFrontEnd(valobj_sp));
938f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
939f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    else if (!strcmp(class_name,"__NSArrayM"))
940f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
941f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayMSyntheticFrontEnd(valobj_sp));
942f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
943f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    else
944f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
945f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp));
946f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
947f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
948f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
949f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
950f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get())
951f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{}
952f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
953f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
954f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
955f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
956f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint64_t count = 0;
957f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
958f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return count;
959f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
960f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
961f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
962f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
963f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
964f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
965f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
966f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    idx_name.Printf("[%d]",idx);
967f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx);
968f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (valobj_sp)
969f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        valobj_sp->SetName(ConstString(idx_name.GetData()));
970f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
971f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
972f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
973f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
974f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update()
975f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
976f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
977f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
978f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
979f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t
980f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
981f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
982f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
983f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
984f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
985f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd ()
986f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{}
987f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
9883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
9893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
9903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
9913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
9923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!process_sp)
9933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
9943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
9953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!runtime)
9963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
9973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
9983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!valobj_sp->IsPointerType())
9993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
10003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        Error error;
10013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        valobj_sp = valobj_sp->AddressOf(error);
10023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        if (error.Fail() || !valobj_sp)
10033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            return NULL;
10043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
10053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
10073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
10093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
10103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
10127685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
10137685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
10147685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return NULL;
10157685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
10163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!strcmp(class_name,"__NSDictionaryI"))
10173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
10183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryISyntheticFrontEnd(valobj_sp));
10193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
10203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    else if (!strcmp(class_name,"__NSDictionaryM"))
10213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
10223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryMSyntheticFrontEnd(valobj_sp));
10233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
10243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    else
10253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
10263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp));
10273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
10283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
10313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get())
10323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{}
10333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
10353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
10363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
10373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint64_t count = 0;
10383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
10393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return count;
10403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return 0;
10413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
10443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
10453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
10463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString idx_name;
10473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    idx_name.Printf("[%d]",idx);
10483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString valobj_expr_path;
10493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_backend.GetExpressionPath(valobj_expr_path, false);
10503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString key_fetcher_expr;
10513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%d]",valobj_expr_path.GetData(),idx);
10523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString value_fetcher_expr;
10533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData());
10543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString object_fetcher_expr;
1055fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata    object_fetcher_expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = %s; _lldb_valgen_item.value = %s; _lldb_valgen_item;",key_fetcher_expr.GetData(),value_fetcher_expr.GetData());
10563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::ValueObjectSP child_sp;
10573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp,
105847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham                                                EvaluateExpressionOptions().SetKeepInMemory(true));
10593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (child_sp)
10603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        child_sp->SetName(ConstString(idx_name.GetData()));
10613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return child_sp;
10623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
10653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update()
10663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
10673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
10683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
10713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
10723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
10733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return 0;
10743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd ()
10773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{}
10783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
10803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get()),
10813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_exe_ctx_ref(),
10823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_ptr_size(8),
10833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32(NULL),
10843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64(NULL)
10853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
1086a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp)
1087a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        Update();
10883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd ()
10913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
10923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_32;
10933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32 = NULL;
10943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_64;
10953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64 = NULL;
10963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
10973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
10983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
10993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
11003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
11013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* item_name = name.GetCString();
11023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
11033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
11043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return UINT32_MAX;
11053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return idx;
11063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
11073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
11093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren ()
11103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
11113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!m_data_32 && !m_data_64)
11123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return 0;
11133a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
11143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
11153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
11173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update()
11183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
11193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_children.clear();
1120a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_32;
1121a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_32 = NULL;
1122a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_64;
1123a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_64 = NULL;
1124a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = 0;
1125a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1126a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1127a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1128a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsDynamic())
1129a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1130a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1131a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1132a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1133a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    Error error;
1134a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsPointerType())
1135a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1136a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1137a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        if (error.Fail() || !valobj_sp)
1138a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata            return false;
1139a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1140a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    error.Clear();
1141a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1142a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!process_sp)
1143a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1144a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1145a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1146a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (m_ptr_size == 4)
1147a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1148a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_32 = new DataDescriptor_32();
1149a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
1150a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1151a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    else
1152a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1153a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_64 = new DataDescriptor_64();
1154a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
1155a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1156a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (error.Fail())
1157a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1158a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_ptr = data_location + m_ptr_size;
11593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
11603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
11613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
11633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
11643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
11653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t num_children = CalculateNumChildren();
11663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= num_children)
11683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
11693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (m_children.empty())
11713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
11723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // do the scan phase
11733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
11743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t tries = 0;
11763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t test_idx = 0;
11773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        while(tries < num_children)
11793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        {
11803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size);
11813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = key_at_idx + m_ptr_size;
11823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
11833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!process_sp)
11843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
11853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            Error error;
11863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
11873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
11883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
11893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
11903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
11913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
11923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            test_idx++;
11943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!key_at_idx || !val_at_idx)
11963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                continue;
11973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            tries++;
11983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
11993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
12003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            m_children.push_back(descriptor);
12023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        }
12033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
12043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= m_children.size()) // should never happen
12063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
12073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    DictionaryItemDescriptor &dict_item = m_children[idx];
12093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!dict_item.valobj_sp)
12103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
12113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // make the new ValueObject
12123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString expr;
1213fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%llu ; _lldb_valgen_item.value = (id)%llu; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
12143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString idx_name;
12153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        idx_name.Printf("[%d]",idx);
12163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
12173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
12183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return dict_item.valobj_sp;
12193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
12203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
12223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get()),
12233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_exe_ctx_ref(),
12243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_ptr_size(8),
12253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32(NULL),
12263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64(NULL)
12273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
1228a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp)
1229a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        Update ();
12303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
12313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd ()
12333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
12343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_32;
12353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32 = NULL;
12363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_64;
12373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64 = NULL;
12383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
12393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
12413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
12423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
12433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* item_name = name.GetCString();
12443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
12453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
12463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return UINT32_MAX;
12473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return idx;
12483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
12493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t
12513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren ()
12523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
12533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!m_data_32 && !m_data_64)
12543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return 0;
12553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
12563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
12573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
12583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
12593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update()
12603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
12613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_children.clear();
1262a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1263a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = 0;
1264a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_32;
1265a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_32 = NULL;
1266a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_64;
1267a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_64 = NULL;
1268a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1269a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1270a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsDynamic())
1271a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1272a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1273a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1274a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1275a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    Error error;
1276a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsPointerType())
1277a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1278a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1279a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        if (error.Fail() || !valobj_sp)
1280a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata            return false;
1281a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1282a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    error.Clear();
1283a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1284a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!process_sp)
1285a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1286a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1287a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1288a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (m_ptr_size == 4)
1289a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1290a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_32 = new DataDescriptor_32();
1291a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
1292a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1293a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    else
1294a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1295a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_64 = new DataDescriptor_64();
1296a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
1297a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1298a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (error.Fail())
1299a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
13003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
13013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
13023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
13043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
13053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
13063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr);
13073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
13083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t num_children = CalculateNumChildren();
13103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= num_children)
13123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
13133a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (m_children.empty())
13153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
13163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // do the scan phase
13173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
13183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t tries = 0;
13203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t test_idx = 0;
13213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        while(tries < num_children)
13233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        {
13243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = m_keys_ptr + (test_idx * m_ptr_size);
13253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = m_values_ptr + (test_idx * m_ptr_size);;
13263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
13273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!process_sp)
13283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
13293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            Error error;
13303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
13313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
13323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
13333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
13343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
13353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
13363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            test_idx++;
13383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!key_at_idx || !val_at_idx)
13403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                continue;
13413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            tries++;
13423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
13443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            m_children.push_back(descriptor);
13463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        }
13473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
13483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= m_children.size()) // should never happen
13503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
13513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
13523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    DictionaryItemDescriptor &dict_item = m_children[idx];
13533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!dict_item.valobj_sp)
13543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
13553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // make the new ValueObject
13563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString expr;
1357fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%llu ; _lldb_valgen_item.value = (id)%llu; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
13583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString idx_name;
13593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        idx_name.Printf("[%d]",idx);
13603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
13613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
13623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return dict_item.valobj_sp;
13633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
1364f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1365caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1366f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
1367caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1368caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1369f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
1370caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1371caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1372f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
1373caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1374caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1375f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
1376