CXXFormatterFunctions.cpp revision 1f9df7804f59193fdfbba3d73bb81f99c689f486
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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h"
13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
142a64f9ad2f6abf7a43bb03346a5af50f9df204f7Dmitri Gribenko#include "llvm/Support/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"
22db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Symbol/ClangASTContext.h"
23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h"
24caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h"
25caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
26caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb;
27caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private;
28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters;
29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
30caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
31f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj,
32f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* target_type,
33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* selector,
34f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          uint64_t &value)
35caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
36caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target_type || !*target_type)
37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!selector || !*selector)
39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StreamString expr;
41b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea    expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector);
42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
43caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::ValueObjectSP result_sp;
44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    Target* target = exe_ctx.GetTargetPtr();
45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target || !stack_frame)
47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
48d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
4947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
50d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    options.SetCoerceToId(false)
51d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    .SetUnwindOnError(true)
5299611fe5a2a450087e7d9cbdb91c7d3fdcb5a5c2Sean Callanan    .SetKeepInMemory(true);
53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
54caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    target->EvaluateExpression(expr.GetData(),
55caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                               stack_frame,
56d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               result_sp,
57d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               options);
58caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!result_sp)
59caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    value = result_sp->GetValueAsUnsigned(0);
61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
64f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
65f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
66f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
67f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
68f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                uint64_t index)
69f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
70f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
71f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
72f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
73f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
74f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
75f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
76f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
77f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index);
79f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
80f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP result_sp;
81f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
82f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
83f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!target || !stack_frame)
84f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
85f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
8647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
87f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    options.SetCoerceToId(false)
88f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUnwindOnError(true)
89f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetKeepInMemory(true)
90f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
91f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
92f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    target->EvaluateExpression(expr.GetData(),
93f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               stack_frame,
94f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               valobj_sp,
95f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               options);
96f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
97f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
98f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
99f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* key)
104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!key || !*key)
111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key);
116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP result_sp;
118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!target || !stack_frame)
121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
12347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    options.SetCoerceToId(false)
125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUnwindOnError(true)
126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetKeepInMemory(true)
127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    target->EvaluateExpression(expr.GetData(),
130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               stack_frame,
131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               valobj_sp,
132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               options);
133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
136cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata// use this call if you already have an LLDB-side buffer for the data
137cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType>
138f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatastatic bool
139cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataDumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
140cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            const SourceDataType*,
141cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            UTF8**,
142cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            UTF8*,
143cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            ConversionFlags),
144cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       DataExtractor& data,
145cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       Stream& stream,
146cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       char prefix_token = '@',
147cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       char quote = '"',
148cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       int sourceSize = 0)
149f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
150cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (prefix_token != 0)
151cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",prefix_token);
152cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (quote != 0)
153cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",quote);
154cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd())
155f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
156cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        const int bufferSPSize = data.GetByteSize();
157cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        if (sourceSize == 0)
158cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        {
159cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            const int origin_encoding = 8*sizeof(SourceDataType);
1600cd33406723ceed5c08d41ff6946006298f3f133Greg Clayton            sourceSize = bufferSPSize/(origin_encoding / 4);
161cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        }
162cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
163cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart();
164f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        SourceDataType *data_end_ptr = data_ptr + sourceSize;
165f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
166f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        while (data_ptr < data_end_ptr)
167f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
168f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            if (!*data_ptr)
169f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            {
170f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                data_end_ptr = data_ptr;
171f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                break;
172f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            }
173f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            data_ptr++;
174f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
175f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
176cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        data_ptr = (SourceDataType*)data.GetDataStart();
177f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
17806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        lldb::DataBufferSP utf8_data_buffer_sp;
17906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        UTF8* utf8_data_ptr = nullptr;
18006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        UTF8* utf8_data_end_ptr = nullptr;
181cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
182f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        if (ConvertFunction)
18306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        {
18406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_buffer_sp.reset(new DataBufferHeap(bufferSPSize,0));
18506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes();
18606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_end_ptr = utf8_data_ptr + bufferSPSize;
187f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion );
18806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr
18906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        }
190f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        else
191f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
192f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            // just copy the pointers - the cast is necessary to make the compiler happy
193f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            // but this should only happen if we are reading UTF8 data
194f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            utf8_data_ptr = (UTF8*)data_ptr;
195f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            utf8_data_end_ptr = (UTF8*)data_end_ptr;
196f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
197f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
198b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // since we tend to accept partial data (and even partially malformed data)
199b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // we might end up with no NULL terminator before the end_ptr
200b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // hence we need to take a slower route and ensure we stay within boundaries
201f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++)
202f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
203f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            if (!*utf8_data_ptr)
204f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                break;
205f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            stream.Printf("%c",*utf8_data_ptr);
206f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
207f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
208cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (quote != 0)
209cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",quote);
210f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
211f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
212f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
213cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType>
214cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatastatic bool
215cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
216cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                   const SourceDataType*,
217cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                   UTF8**,
218cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                   UTF8*,
219cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                   ConversionFlags),
220cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              uint64_t location,
221cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              const ProcessSP& process_sp,
222cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              Stream& stream,
223cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              char prefix_token = '@',
224cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              char quote = '"',
225cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                              int sourceSize = 0)
226cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
227cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (location == 0 || location == LLDB_INVALID_ADDRESS)
228cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
229cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!process_sp)
230cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
231cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
232cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    const int origin_encoding = 8*sizeof(SourceDataType);
233cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
234cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
235cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    // if not UTF8, I need a conversion function to return proper UTF8
236cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (origin_encoding != 8 && !ConvertFunction)
237cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
238cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
239cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (sourceSize == 0)
240cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
241cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    const int bufferSPSize = sourceSize * (origin_encoding >> 2);
242cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
243cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    Error error;
244cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
245cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
246cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!buffer_sp->GetBytes())
247cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
248cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
249cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error);
250cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (error.Fail() || data_read == 0)
251cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    {
252cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("unable to read data");
253cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return true;
254cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    }
255cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
256cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());
257cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
258cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return DumpUTFBufferToStream(ConvertFunction, data, stream, prefix_token, quote, sourceSize);
259cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
260cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
261f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
262f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream)
263f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
264f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
265f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!process_sp)
266f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
267f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
268f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
269f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
270f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!valobj_addr)
271f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
272f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
273cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8,valobj_addr,
274f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                                                                 process_sp,
275f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                                                                 stream,
276cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                 'u'))
277f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
278f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        stream.Printf("Summary Unavailable");
279f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return true;
280f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
281f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
282f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
283f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
284f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
285f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
286f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream)
287f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
288f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
289f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!process_sp)
290f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
291f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
292f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
293f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
294f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!valobj_addr)
295f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
296f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
297cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8,valobj_addr,
298f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                                                                 process_sp,
299f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                                                                 stream,
300cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                 'U'))
301f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
302f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        stream.Printf("Summary Unavailable");
303f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return true;
304f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
305f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
306f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
307f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
308f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
309f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
310f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream)
311f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
31206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
31306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    if (!process_sp)
31406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
31506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
316b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    lldb::addr_t data_addr = 0;
317b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
318b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (valobj.IsPointerType())
319b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        data_addr = valobj.GetValueAsUnsigned(0);
320b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    else if (valobj.IsArrayType())
321b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        data_addr = valobj.GetAddressOf();
32206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
323b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS)
32406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
32506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
32606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    clang::ASTContext* ast = valobj.GetClangAST();
32706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
32806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    if (!ast)
32906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
33006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
33106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType());
33206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
33306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    switch (wchar_size)
33406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    {
33506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 8:
33606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 8
337cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return ReadUTFBufferAndDumpToStream<UTF8>(nullptr, data_addr,
33806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                               process_sp,
33906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                               stream,
340cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                               'L');
34106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 16:
34206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 16
343cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8, data_addr,
34406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                                           process_sp,
34506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                                           stream,
346cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                           'L');
34706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 32:
34806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 32
349cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8, data_addr,
35006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                                           process_sp,
35106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata                                                                           stream,
352cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                                           'L');
353cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        default:
354cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            stream.Printf("size for wchar_t is not valid");
355cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return true;
356cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    }
357cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return true;
358cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
359cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
360cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
361cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream)
362cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
363cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
364cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
365cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
366cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
367cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
368cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!value.empty())
369cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%s ", value.c_str());
370cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
371cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1);
372cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
373cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
374cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
375cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream)
376cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
377cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
378cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
379cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
380cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
381cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
382cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!value.empty())
383cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%s ", value.c_str());
384cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
385cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1);
386cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
387cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
388cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
389cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream)
390cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
391cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
392cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
393cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
394cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    clang::ASTContext* ast = valobj.GetClangAST();
395cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
396cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!ast)
397cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
398cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
399cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
400cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
401cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType());
402cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
403cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    switch (wchar_size)
404cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    {
405cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 8:
406cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 8
407cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatChar, value);
408cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
409cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
410cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF8>(nullptr,
411cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               data,
412cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               stream,
413cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               'L',
414cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               '\'',
415cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               1);
416cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 16:
417cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 16
418cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
419cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
420cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
421cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,
422cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                data,
423cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                stream,
424cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                'L',
425cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                '\'',
426cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                1);
427cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 32:
428cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 32
429cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
430cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
431cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
432cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,
433cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                data,
434cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                stream,
435cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                'L',
436cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                '\'',
437cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                1);
43806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        default:
43906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            stream.Printf("size for wchar_t is not valid");
44006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            return true;
44106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    }
44206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    return true;
443f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
444f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
445b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// this function extracts information from a libcxx std::basic_string<>
446b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// irregardless of template arguments. it reports the size (in item count not bytes)
447b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// and the location in memory where the string data can be found
448b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatastatic bool
449b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataExtractLibcxxStringInfo (ValueObject& valobj,
450b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                         ValueObjectSP &location_sp,
451b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                         uint64_t& size)
452b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
453b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0}));
454b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!D)
455b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
456b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
457b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0}));
458b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!size_mode)
459b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
460b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
461b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    uint64_t size_mode_value(size_mode->GetValueAsUnsigned(0));
462b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
463b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if ((size_mode_value & 1) == 0) // this means the string is in short-mode and the data is stored inline
464b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
465b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP s(D->GetChildAtIndex(1, true));
466b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!s)
467b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
468b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        size = ((size_mode_value >> 1) % 256);
469b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        location_sp = s->GetChildAtIndex(1, true);
470b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return (location_sp.get() != nullptr);
471b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
472b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    else
473b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
474b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP l(D->GetChildAtIndex(0, true));
475b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!l)
476b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
477b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        location_sp = l->GetChildAtIndex(2, true);
478b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP size_vo(l->GetChildAtIndex(1, true));
479b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!size_vo || !location_sp)
480b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
481b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        size = size_vo->GetValueAsUnsigned(0);
482b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
483b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
484b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
485b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
486b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool
487b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream)
488b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
489b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    uint64_t size = 0;
490b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP location_sp((ValueObject*)nullptr);
491b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
492b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
493b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (size == 0)
494b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
495b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        stream.Printf("L\"\"");
496b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
497b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
498b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!location_sp)
499b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
500b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    return WCharStringSummaryProvider(*location_sp.get(), stream);
501b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
502b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
503b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool
504b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream)
505b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
506b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    uint64_t size = 0;
507b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP location_sp((ValueObject*)nullptr);
508b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
509b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
510b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (size == 0)
511b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
512b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        stream.Printf("\"\"");
513b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
514b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
515b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!location_sp)
516b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
517b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    Error error;
518b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    location_sp->ReadPointedString(stream,
519b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                                   error,
520b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                                   0, // max length is decided by the settings
521b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                                   false); // do not honor array (terminates on first 0 byte even for a char[])
522b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    return error.Success();
523b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
524b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
525caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool name_entries>
526caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
527f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream)
528caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
529caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
530caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
531caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
532caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
533caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
534caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
535caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
536caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
537caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
538caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
539caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
540caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
541caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
542caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
543caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
544caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_64bit = (ptr_size == 8);
545caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
546caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
547caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
548caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
549caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
550caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
551caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
552caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
553caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
5547685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
5557685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
5567685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
5577685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
558caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"__NSDictionaryI"))
559caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
560caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
561caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
562caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
563caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
564caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
565caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
566caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSDictionaryM"))
567caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
568caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
569caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
570caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
571caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
572caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
573caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
574caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSCFDictionary"))
575caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
576caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
577caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error);
578caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
579caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
580caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (is_64bit)
581caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            value &= ~0x0f1f000000000000UL;
58206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    }
583caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
584caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
585f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
586caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
587caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
588caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
5895f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    stream.Printf("%s%" PRIu64 " %s%s",
590caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? "@\"" : ""),
591caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
592caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")),
593caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (name_entries ? "\"" : ""));
594caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
595caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
596caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
597caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
598f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream)
599caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
600caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
601caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
602caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
603caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
604caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
605caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
606caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
607caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
608caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
609caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
610caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
611caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
612caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
613caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
614caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
615caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
616caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
617caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
618caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
619caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
620caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
621caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
622caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
623caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
6247685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
6257685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
6267685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
6277685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
628caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"__NSArrayI"))
629caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
630caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
631caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
632caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
633caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
634caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
635caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSArrayM"))
636caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
637caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
638caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
639caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
640caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
641caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
642caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (!strcmp(class_name,"__NSCFArray"))
643caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
644caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
645caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error);
646caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
647caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
648caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
649caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
650caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
651f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
652caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
653caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
654caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
6555f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    stream.Printf("@\"%" PRIu64 " object%s\"",
656caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
657caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value == 1 ? "" : "s");
658caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
659caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
660caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
661caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at>
662caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
663f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream)
664caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
665caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
666caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
667caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
668caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
669caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
670caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
671caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
672caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
673caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
674caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
675caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
676caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
677caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
678caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
679caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_64bit = (process_sp->GetAddressByteSize() == 8);
680caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
681caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
682caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
683caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
684caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
685caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
686caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
687caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
6887685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
6897685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
6907685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
6917685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
692caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"NSConcreteData") ||
693caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"NSConcreteMutableData") ||
694caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"__NSCFData"))
695caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
696caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint32_t offset = (is_64bit ? 16 : 8);
697caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
698caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error);
699caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
700caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
701caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
702caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
703caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
704f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "length", value))
705caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
706caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
707caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
7085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    stream.Printf("%s%" PRIu64 " byte%s%s",
709caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "@\"" : ""),
710caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
711caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (value > 1 ? "s" : ""),
712caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "\"" : ""));
713caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
714caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
715caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
716caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
717caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
718f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream)
719caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
720caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
721caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
722caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
723caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
724caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
725caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
726caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
727caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
728caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
729caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
730caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
731caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
732caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
733caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
734caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
735caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
736caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
737caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
738caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
739caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
740caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
741caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
742caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
7437685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
7447685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
7457685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
746caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber"))
747caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
748caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (descriptor->IsTagged())
749caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
750caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them
751caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8;
752caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t i_bits = (valobj_addr & 0xF0) >> 4;
753caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
754caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            switch (i_bits)
755caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
756caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 0:
757caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(char)%hhd",(char)value);
758caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
759caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 4:
760caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(short)%hd",(short)value);
761caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
762caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 8:
763caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(int)%d",(int)value);
764caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
765caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 12:
7665f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    stream.Printf("(long)%" PRId64,value);
767caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
768caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                default:
7693ca24b48096ca34bdcfed26e85bb0d6be6169153Enrico Granata                    stream.Printf("unexpected value:(info=%" PRIu64 ", value=%" PRIu64,i_bits,value);
770caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
771caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
772caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
773caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
774caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
775caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
776caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            Error error;
777caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F);
778caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t data_location = valobj_addr + 2*ptr_size;
779caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            uint64_t value = 0;
780caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
781caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
782caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            switch (data_type)
783caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
784caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 1: // 0B00001
785caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error);
786caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
787caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
788caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(char)%hhd",(char)value);
789caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
790caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 2: // 0B0010
791caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error);
792caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
793caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
794caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(short)%hd",(short)value);
795caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
796caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 3: // 0B0011
797caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
798caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
799caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
800caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(int)%d",(int)value);
801caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
802caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 17: // 0B10001
803caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    data_location += 8;
804caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 4: // 0B0100
805caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
806caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
807caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
8085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    stream.Printf("(long)%" PRId64,value);
809caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
810caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 5: // 0B0101
811caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                {
812caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
813caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
814caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
815caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    float flt_value = *((float*)&flt_as_int);
816caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(float)%f",flt_value);
817caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
818caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
819caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                case 6: // 0B0110
820caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                {
821caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
822caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    if (error.Fail())
823caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                        return false;
824caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    double dbl_value = *((double*)&dbl_as_lng);
825caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("(double)%g",dbl_value);
826caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
827caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
828caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                default:
829caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    stream.Printf("absurd: dt=%d",data_type);
830caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                    break;
831caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
832caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
833caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
834caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
835caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
836caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
837f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        // similar to ExtractValueFromObjCExpression but uses summary instead of value
838caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StreamString expr_path_stream;
839caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        valobj.GetExpressionPath(expr_path_stream, false);
840caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StreamString expr;
841caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        expr.Printf("(NSString*)[%s stringValue]",expr_path_stream.GetData());
842caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
843caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::ValueObjectSP result_sp;
844caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Target* target = exe_ctx.GetTargetPtr();
845caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        StackFrame* stack_frame = exe_ctx.GetFramePtr();
846caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!target || !stack_frame)
847caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
848d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
84947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham        EvaluateExpressionOptions options;
850d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        options.SetCoerceToId(false)
851d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetUnwindOnError(true)
852d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetKeepInMemory(true)
853d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata        .SetUseDynamic(lldb::eDynamicCanRunTarget);
854d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
855caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        target->EvaluateExpression(expr.GetData(),
856caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                                   stack_frame,
857d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                   result_sp,
858d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                   options);
859caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!result_sp)
860caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
861caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        stream.Printf("%s",result_sp->GetSummaryAsCString());
862caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return true;
863caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
864caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
865caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
866caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
867f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream)
868caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
869caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
870caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
871caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
872caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
873caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
874caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
875caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
876caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
877caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
878caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
879caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
880caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
881caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
882caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
883caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
884caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
885caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
886caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
887caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
888caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
889caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
890caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
891caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
89225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata    if (!class_name || !*class_name)
89325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata        return false;
89425c9adecf763053ff953b4d437b022075d30dd13Enrico Granata
895caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t info_bits_location = valobj_addr + ptr_size;
896caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (process_sp->GetByteOrder() != lldb::eByteOrderLittle)
897caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        info_bits_location += 3;
898caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
899caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
900caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
901caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error);
902caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (error.Fail())
903caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
904caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
905caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_mutable = (info_bits & 1) == 1;
906caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_inline = (info_bits & 0x60) == 0;
907caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool has_explicit_length = (info_bits & (1 | 4)) != 4;
908caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_unicode = (info_bits & 0x10) == 0x10;
909caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_special = strcmp(class_name,"NSPathStore2") == 0;
910caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
911caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (strcmp(class_name,"NSString") &&
912caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFStringRef") &&
913caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFMutableStringRef") &&
914caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFConstantString") &&
915caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFString") &&
916caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFConstantString") &&
917caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFString") &&
918caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSPathStore2"))
919caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
920caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        // probably not one of us - bail out
921caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
922caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
923caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
924caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (is_mutable)
925caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
926caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 2 * ptr_size + valobj_addr;
927caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
928caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
929caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
930caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (has_explicit_length and is_unicode)
931cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@');
932caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
933caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
934caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location++;
935caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
936caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
937caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
938caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
939caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (data_read)
940caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
941caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return true;
942caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
943caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
944caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable)
945caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
946caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 3 * ptr_size + valobj_addr;
947caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
948caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
949caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
950caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
951caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
952caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
953caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
954caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
955caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_unicode)
956caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
957caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
958caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (is_inline)
959caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
960caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (!has_explicit_length)
961caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
962caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                stream.Printf("found new combo");
963caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return true;
964caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
965caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            else
966caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                location += ptr_size;
967caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                }
968caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
969caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
970caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location = process_sp->ReadPointerFromMemory(location, error);
971caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
972caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
973caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
974cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
975caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
976caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_special)
977caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
978caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
979cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
980caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
981caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline)
982caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
983caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
984caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!has_explicit_length)
985caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location++;
986caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
987caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
988caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
989caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
990caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
991caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
992caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
993caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
994caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
995caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
996caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
997caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
998caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
999caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
1000caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
1001caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
1002caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
1003caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
1004caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (data_read)
1005caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
1006caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return true;
1007caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1008caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1009caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("class name = %s",class_name);
1010caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
1011caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1012caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
1013caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
10149abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool
1015dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream)
1016dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{
1017dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    TargetSP target_sp(valobj.GetTargetSP());
1018dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (!target_sp)
1019dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
1020dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize();
1021dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    uint64_t pointee = valobj.GetValueAsUnsigned(0);
1022dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (!pointee)
1023dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
1024dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    pointee += addr_size;
1025dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ClangASTType type(valobj.GetClangAST(),valobj.GetClangType());
1026dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ExecutionContext exe_ctx(target_sp,false);
1027dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointee, exe_ctx, type));
1028dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (!child_ptr_sp)
1029dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
1030dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    DataExtractor data;
1031dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    child_ptr_sp->GetData(data);
1032dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type));
1033dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    child_sp->GetValueAsUnsigned(0);
1034dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (child_sp)
1035dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return NSStringSummaryProvider(*child_sp, stream);
1036dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    return false;
1037dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata}
1038dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata
1039dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool
1040dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream)
1041dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{
1042dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    return NSAttributedStringSummaryProvider(valobj, stream);
1043dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata}
1044dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata
1045dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool
10469abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream)
10479abbfba957db139beed19866f61599424ddcd37aEnrico Granata{
10489abbfba957db139beed19866f61599424ddcd37aEnrico Granata    stream.Printf("%s",valobj.GetObjectDescription());
10499abbfba957db139beed19866f61599424ddcd37aEnrico Granata    return true;
10509abbfba957db139beed19866f61599424ddcd37aEnrico Granata}
10519abbfba957db139beed19866f61599424ddcd37aEnrico Granata
1052db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool
1053979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granatalldb_private::formatters::NSURLSummaryProvider (ValueObject& valobj, Stream& stream)
1054979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata{
1055979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
1056979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (!process_sp)
1057979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return false;
1058979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1059979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1060979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1061979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (!runtime)
1062979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return false;
1063979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1064979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
1065979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1066979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
1067979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return false;
1068979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1069979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
1070979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1071979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
1072979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1073979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (!valobj_addr)
1074979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return false;
1075979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1076979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
1077979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1078979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (!class_name || !*class_name)
1079979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return false;
1080979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1081979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    if (strcmp(class_name, "NSURL") == 0)
1082979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    {
1083979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        uint64_t offset_text = ptr_size + ptr_size + 8; // ISA + pointer + 8 bytes of data (even on 32bit)
1084979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        uint64_t offset_base = offset_text + ptr_size;
1085979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        ClangASTType type(valobj.GetClangAST(),valobj.GetClangType());
1086979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset_text, type, true));
1087979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        ValueObjectSP base(valobj.GetSyntheticChildAtOffset(offset_base, type, true));
10882fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata        if (!text)
1089979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return false;
1090979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        if (text->GetValueAsUnsigned(0) == 0)
1091979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return false;
1092979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        StreamString summary;
1093979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        if (!NSStringSummaryProvider(*text, summary))
1094979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return false;
10952fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata        if (base && base->GetValueAsUnsigned(0))
1096979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        {
1097979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            if (summary.GetSize() > 0)
1098979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata                summary.GetString().resize(summary.GetSize()-1);
1099979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            summary.Printf(" -- ");
1100979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            StreamString base_summary;
11012fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata            if (NSURLSummaryProvider(*base, base_summary) && base_summary.GetSize() > 0)
1102979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata                summary.Printf("%s",base_summary.GetSize() > 2 ? base_summary.GetData() + 2 : base_summary.GetData());
1103979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        }
1104979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        if (summary.GetSize())
1105979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        {
1106979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            stream.Printf("%s",summary.GetData());
1107979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return true;
1108979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        }
1109979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    }
1110979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    else
1111979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    {
1112979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        // similar to ExtractValueFromObjCExpression but uses summary instead of value
1113979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        StreamString expr_path_stream;
1114979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        valobj.GetExpressionPath(expr_path_stream, false);
1115979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        StreamString expr;
1116979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        expr.Printf("(NSString*)[%s description]",expr_path_stream.GetData());
1117979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
1118979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        lldb::ValueObjectSP result_sp;
1119979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        Target* target = exe_ctx.GetTargetPtr();
1120979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        StackFrame* stack_frame = exe_ctx.GetFramePtr();
1121979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        if (!target || !stack_frame)
1122979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return false;
1123979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1124979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        EvaluateExpressionOptions options;
1125979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        options.SetCoerceToId(false)
1126979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        .SetUnwindOnError(true)
1127979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        .SetKeepInMemory(true)
1128979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        .SetUseDynamic(lldb::eDynamicCanRunTarget);
1129979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1130979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        target->EvaluateExpression(expr.GetData(),
1131979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata                                   stack_frame,
1132979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata                                   result_sp,
1133979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata                                   options);
1134979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        if (!result_sp)
1135979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata            return false;
1136979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        stream.Printf("%s",result_sp->GetSummaryAsCString());
1137979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata        return true;
1138979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    }
1139979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata    return false;
1140979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata}
1141979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata
1142979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granatabool
1143db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream)
1144db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{
1145db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    const uint32_t type_info = ClangASTContext::GetTypeInfo(valobj.GetClangType(),
1146db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata                                                            valobj.GetClangAST(),
1147db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata                                                            NULL);
1148db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1149db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    ValueObjectSP real_guy_sp = valobj.GetSP();
1150db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1151db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (type_info & ClangASTContext::eTypeIsPointer)
1152db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1153db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        Error err;
1154db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        real_guy_sp = valobj.Dereference(err);
1155db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        if (err.Fail() || !real_guy_sp)
1156db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata            return false;
1157db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
1158db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    else if (type_info & ClangASTContext::eTypeIsReference)
1159db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1160db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        real_guy_sp =  valobj.GetChildAtIndex(0, true);
1161db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        if (!real_guy_sp)
1162db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata            return false;
1163db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
1164db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    uint64_t value = real_guy_sp->GetValueAsUnsigned(0);
1165db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (value == 0)
1166db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1167db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        stream.Printf("NO");
1168db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        return true;
1169db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
1170db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    stream.Printf("YES");
1171db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    return true;
1172db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata}
1173db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1174db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate <bool is_sel_ptr>
1175db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool
1176db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream)
1177db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{
11781f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    lldb::ValueObjectSP valobj_sp;
1179db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
11801f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (!valobj.GetClangAST())
1181db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        return false;
1182db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    void* char_opaque_type = valobj.GetClangAST()->CharTy.getAsOpaquePtr();
11831f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (!char_opaque_type)
11841f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        return false;
1185db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    ClangASTType charstar(valobj.GetClangAST(),ClangASTType::GetPointerType(valobj.GetClangAST(), char_opaque_type));
11861f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata
11871f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
1188db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
11891f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (is_sel_ptr)
11901f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    {
11911f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
11921f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        if (data_address == LLDB_INVALID_ADDRESS)
11931f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata            return false;
11941f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar);
11951f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    }
11961f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    else
11971f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    {
11981f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        DataExtractor data;
11991f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj.GetData(data);
12001f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar);
12011f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    }
12021f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata
12031f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (!valobj_sp)
12041f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        return false;
1205db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1206db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    stream.Printf("%s",valobj_sp->GetSummaryAsCString());
1207db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    return true;
1208db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata}
1209db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1210f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
1211f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
1212f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(),
1213f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8),
1214f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_32(NULL),
1215f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_64(NULL)
1216f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1217247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp)
1218f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1219247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
1220247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        Update();
1221f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1222f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1223f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
122436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
1225f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren ()
1226f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1227f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (m_data_32)
1228f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return m_data_32->_used;
1229f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (m_data_64)
1230f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return m_data_64->_used;
1231f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
1232f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1233f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1234f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
123536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
1236f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1237f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!m_data_32 && !m_data_64)
1238f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
1239f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx >= CalculateNumChildren())
1240f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
1241f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data);
1242f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx += (idx * m_ptr_size);
1243f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
124436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    idx_name.Printf("[%zu]",idx);
1245f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(),
1246f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              object_at_idx,
1247f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              m_exe_ctx_ref,
1248f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                                              m_id_type);
1249f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.push_back(retval_sp);
1250f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return retval_sp;
1251f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1252f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1253f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
1254f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::Update()
1255f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1256f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.clear();
1257247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1258247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = 0;
1259247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    delete m_data_32;
1260247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_32 = NULL;
1261247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    delete m_data_64;
1262247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_64 = NULL;
1263247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsDynamic())
1264247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1265247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!valobj_sp)
1266247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1267247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1268247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    Error error;
1269247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsPointerType())
1270247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
1271247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1272247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        if (error.Fail() || !valobj_sp)
1273247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata            return false;
1274247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
1275247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    error.Clear();
1276247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1277247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!process_sp)
1278247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1279247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1280247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1281247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (m_ptr_size == 4)
1282247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
1283247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_data_32 = new DataDescriptor_32();
1284247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
1285247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
1286247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    else
1287247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
1288247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_data_64 = new DataDescriptor_64();
1289247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
1290247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
1291247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (error.Fail())
1292247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1293f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
1294f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1295f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1296800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1297800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren ()
1298800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1299f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1300800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1301800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
1302f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatastatic uint32_t
1303f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataExtractIndexFromString (const char* item_name)
1304f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1305f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!item_name || !*item_name)
1306f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
1307f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (*item_name != '[')
1308f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
1309f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    item_name++;
1310f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = 0;
1311f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    while(*item_name)
1312f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1313f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        char x = *item_name;
1314f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (x == ']')
1315f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            break;
1316f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (x < '0' || x > '9')
1317f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            return UINT32_MAX;
1318f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        idx = 10*idx + (x-'0');
1319f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        item_name++;
1320f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1321f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
1322f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1323f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1324f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
1325f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
1326f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1327f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!m_data_32 && !m_data_64)
1328f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
1329f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* item_name = name.GetCString();
1330f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
1331f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
1332f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
1333f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
1334f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1335f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1336f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd ()
1337f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1338f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    delete m_data_32;
1339f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_data_32 = NULL;
1340f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    delete m_data_64;
1341f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_data_64 = NULL;
1342f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1343f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1344f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
1345f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
1346f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(),
1347f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8),
1348f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_items(0),
1349f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_ptr(0)
1350f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1351247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp)
1352f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1353247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
1354247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        Update();
1355f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1356f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1357f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1358f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd ()
1359f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1360f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1361f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1362f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
1363f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
1364f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1365f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* item_name = name.GetCString();
1366f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
1367f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
1368f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return UINT32_MAX;
1369f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return idx;
1370f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1371f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
137236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
1373f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren ()
1374f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1375f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return m_items;
1376f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1377f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1378f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
1379f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::Update()
1380f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1381247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = 0;
1382247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_items = 0;
1383247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_ptr = 0;
1384f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.clear();
1385247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1386247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsDynamic())
1387247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1388247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!valobj_sp)
1389247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1390247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1391247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    Error error;
1392247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (valobj_sp->IsPointerType())
1393247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    {
1394247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1395247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        if (error.Fail() || !valobj_sp)
1396247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata            return false;
1397247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    }
1398247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    error.Clear();
1399247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1400247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!process_sp)
1401247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1402247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1403247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1404247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_items = process_sp->ReadPointerFromMemory(data_location, error);
1405247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (error.Fail())
1406247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
1407247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    m_data_ptr = data_location+m_ptr_size;
1408f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
1409f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1410f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1411800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1412800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren ()
1413800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1414f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1415800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1416800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
1417f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
141836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx)
1419f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1420f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (idx >= CalculateNumChildren())
1421f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
1422f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::addr_t object_at_idx = m_data_ptr;
1423f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx += (idx * m_ptr_size);
1424f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
1425f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!process_sp)
1426f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
1427f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Error error;
1428f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    object_at_idx = process_sp->ReadPointerFromMemory(object_at_idx, error);
1429f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (error.Fail())
1430f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return lldb::ValueObjectSP();
1431f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
14325f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    expr.Printf("(id)%" PRIu64,object_at_idx);
1433f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
143436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    idx_name.Printf("[%zu]",idx);
1435f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
1436f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    m_children.push_back(retval_sp);
1437f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return retval_sp;
1438f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1439f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1440f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
1441f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1442f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
1443f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!process_sp)
1444f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
1445f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1446f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!runtime)
1447f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
1448f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1449f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!valobj_sp->IsPointerType())
1450f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1451f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        Error error;
1452f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        valobj_sp = valobj_sp->AddressOf(error);
1453f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (error.Fail() || !valobj_sp)
1454f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata            return NULL;
1455f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1456f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1457f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
1458f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1459f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
1460f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return NULL;
1461f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1462f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
14637685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
14647685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
14657685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return NULL;
14667685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
1467f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!strcmp(class_name,"__NSArrayI"))
1468f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1469f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayISyntheticFrontEnd(valobj_sp));
1470f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1471f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    else if (!strcmp(class_name,"__NSArrayM"))
1472f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1473f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayMSyntheticFrontEnd(valobj_sp));
1474f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1475f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    else
1476f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    {
1477f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp));
1478f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    }
1479f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1480f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1481f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
1482f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get())
1483f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{}
1484f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
148536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
1486f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
1487f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1488f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    uint64_t count = 0;
1489f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
1490f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return count;
1491f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
1492f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1493f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1494f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
149536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
1496f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1497f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString idx_name;
149836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    idx_name.Printf("[%zu]",idx);
1499f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx);
1500f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (valobj_sp)
1501f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        valobj_sp->SetName(ConstString(idx_name.GetData()));
1502f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
1503f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1504f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1505f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
1506f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update()
1507f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1508f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return false;
1509f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1510f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1511800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1512800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::MightHaveChildren ()
1513800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1514f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1515800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1516800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
1517f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
1518f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
1519f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1520f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return 0;
1521f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1522f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1523f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd ()
1524f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{}
1525f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
15263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
15273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
15283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
15303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!process_sp)
15313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
15323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
15333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!runtime)
15343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
15353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!valobj_sp->IsPointerType())
15373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
15383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        Error error;
15393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        valobj_sp = valobj_sp->AddressOf(error);
15403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        if (error.Fail() || !valobj_sp)
15413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            return NULL;
15423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
15433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
15453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
15473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return NULL;
15483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
15507685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
15517685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
15527685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return NULL;
15537685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
15543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!strcmp(class_name,"__NSDictionaryI"))
15553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
15563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryISyntheticFrontEnd(valobj_sp));
15573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
15583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    else if (!strcmp(class_name,"__NSDictionaryM"))
15593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
15603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryMSyntheticFrontEnd(valobj_sp));
15613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
15623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    else
15633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
15643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp));
15653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
15663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
15673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
15693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get())
15703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{}
15713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
157236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
15733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
15743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
15753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint64_t count = 0;
15763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
15773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return count;
15783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return 0;
15793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
15803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
15813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
158236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
15833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
15843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString idx_name;
158536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    idx_name.Printf("[%zu]",idx);
15863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString valobj_expr_path;
15873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_backend.GetExpressionPath(valobj_expr_path, false);
15883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString key_fetcher_expr;
158936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%zu]",valobj_expr_path.GetData(),idx);
15903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString value_fetcher_expr;
15913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData());
15923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    StreamString object_fetcher_expr;
1593fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico 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());
15943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::ValueObjectSP child_sp;
15953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp,
159647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham                                                EvaluateExpressionOptions().SetKeepInMemory(true));
15973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (child_sp)
15983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        child_sp->SetName(ConstString(idx_name.GetData()));
15993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return child_sp;
16003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
16023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
16033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update()
16043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
16063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
1608800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1609800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::MightHaveChildren ()
1610800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1611f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1612800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1613800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
1614f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
16153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
16163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return 0;
16183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
16203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd ()
16213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{}
16223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
16233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
16243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get()),
16253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_exe_ctx_ref(),
16263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_ptr_size(8),
16273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32(NULL),
16283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64(NULL)
16293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
1630a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp)
1631a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        Update();
16323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
16343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd ()
16353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_32;
16373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32 = NULL;
16383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_64;
16393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64 = NULL;
16403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
1642f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
16433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
16443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* item_name = name.GetCString();
16463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
16473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
16483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return UINT32_MAX;
16493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return idx;
16503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
165236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
16533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren ()
16543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!m_data_32 && !m_data_64)
16563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return 0;
16573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
16583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
16593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
16603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
16613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update()
16623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
16633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_children.clear();
1664a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_32;
1665a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_32 = NULL;
1666a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_64;
1667a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_64 = NULL;
1668a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = 0;
1669a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1670a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1671a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1672a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsDynamic())
1673a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1674a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1675a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1676a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1677a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    Error error;
1678a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsPointerType())
1679a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1680a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1681a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        if (error.Fail() || !valobj_sp)
1682a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata            return false;
1683a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1684a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    error.Clear();
1685a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1686a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!process_sp)
1687a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1688a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1689a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1690a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (m_ptr_size == 4)
1691a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1692a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_32 = new DataDescriptor_32();
1693a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
1694a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1695a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    else
1696a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1697a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_64 = new DataDescriptor_64();
1698a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
1699a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1700a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (error.Fail())
1701a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1702a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_ptr = data_location + m_ptr_size;
17033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
17043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
17053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
1706800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1707800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren ()
1708800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1709f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1710800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1711800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
17123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
171336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx)
17143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
17153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t num_children = CalculateNumChildren();
17163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= num_children)
17183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
17193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (m_children.empty())
17213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
17223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // do the scan phase
17233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
17243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t tries = 0;
17263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t test_idx = 0;
17273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        while(tries < num_children)
17293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        {
17303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size);
17313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = key_at_idx + m_ptr_size;
17323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
17333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!process_sp)
17343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
17353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            Error error;
17363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
17373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
17383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
17393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
17403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
17413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
17423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            test_idx++;
17443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!key_at_idx || !val_at_idx)
17463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                continue;
17473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            tries++;
17483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
17503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            m_children.push_back(descriptor);
17523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        }
17533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
17543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= m_children.size()) // should never happen
17563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
17573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    DictionaryItemDescriptor &dict_item = m_children[idx];
17593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!dict_item.valobj_sp)
17603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
17613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // make the new ValueObject
17623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString expr;
17635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
17643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString idx_name;
176536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        idx_name.Printf("[%zu]",idx);
17663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
17673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
17683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return dict_item.valobj_sp;
17693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
17703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
17723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get()),
17733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_exe_ctx_ref(),
17743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_ptr_size(8),
17753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32(NULL),
17763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64(NULL)
17773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
1778a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp)
1779a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        Update ();
17803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
17813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
17823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd ()
17833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
17843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_32;
17853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_32 = NULL;
17863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    delete m_data_64;
17873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_data_64 = NULL;
17883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
17893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
1790f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t
17913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
17923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
17933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    const char* item_name = name.GetCString();
17943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
17953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
17963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return UINT32_MAX;
17973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return idx;
17983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
17993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
180036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
18013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren ()
18023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
18033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!m_data_32 && !m_data_64)
18043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return 0;
18053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
18063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
18073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool
18093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update()
18103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
18113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    m_children.clear();
1812a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1813a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = 0;
1814a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_32;
1815a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_32 = NULL;
1816a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    delete m_data_64;
1817a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_data_64 = NULL;
1818a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1819a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1820a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsDynamic())
1821a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->GetStaticValue();
1822a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!valobj_sp)
1823a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1824a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
1825a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    Error error;
1826a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (valobj_sp->IsPointerType())
1827a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1828a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        valobj_sp = valobj_sp->Dereference(error);
1829a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        if (error.Fail() || !valobj_sp)
1830a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata            return false;
1831a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1832a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    error.Clear();
1833a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
1834a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (!process_sp)
1835a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
1836a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    m_ptr_size = process_sp->GetAddressByteSize();
1837a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
1838a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (m_ptr_size == 4)
1839a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1840a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_32 = new DataDescriptor_32();
1841a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
1842a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1843a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    else
1844a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    {
1845a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        m_data_64 = new DataDescriptor_64();
1846a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
1847a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    }
1848a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata    if (error.Fail())
1849a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata        return false;
18503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return false;
18513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
18523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
1853800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool
1854800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::MightHaveChildren ()
1855800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{
1856f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata    return true;
1857800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata}
1858800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata
18593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP
186036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
18613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{
18623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr);
18633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
18643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    uint32_t num_children = CalculateNumChildren();
18663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= num_children)
18683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
18693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (m_children.empty())
18713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
18723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // do the scan phase
18733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
18743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t tries = 0;
18763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        uint32_t test_idx = 0;
18773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        while(tries < num_children)
18793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        {
18803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = m_keys_ptr + (test_idx * m_ptr_size);
18813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = m_values_ptr + (test_idx * m_ptr_size);;
18823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
18833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!process_sp)
18843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
18853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            Error error;
18863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
18873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
18883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
18893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
18903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (error.Fail())
18913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                return lldb::ValueObjectSP();
18923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            test_idx++;
18943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            if (!key_at_idx || !val_at_idx)
18963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata                continue;
18973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            tries++;
18983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
18993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
19003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
19013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata            m_children.push_back(descriptor);
19023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        }
19033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
19043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
19053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (idx >= m_children.size()) // should never happen
19063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        return lldb::ValueObjectSP();
19073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata
19083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    DictionaryItemDescriptor &dict_item = m_children[idx];
19093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    if (!dict_item.valobj_sp)
19103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    {
19113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        // make the new ValueObject
19123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString expr;
19135f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
19143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        StreamString idx_name;
191536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        idx_name.Printf("[%zu]",idx);
19163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
19173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    }
19183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata    return dict_item.valobj_sp;
19193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata}
1920f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1921689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
1922689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get()),
1923689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_exe_ctx_ref(),
1924689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_count(0),
1925689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_base_data_address(0),
1926689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_options()
1927689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    {
1928689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        if (valobj_sp)
1929689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            Update();
1930689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        m_options.SetCoerceToId(false)
1931689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata                 .SetUnwindOnError(true)
1932689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata                 .SetKeepInMemory(true)
1933689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata                 .SetUseDynamic(lldb::eDynamicCanRunTarget);
1934689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
1935689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1936689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
1937689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::CalculateNumChildren ()
1938689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
1939689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return m_count;
1940689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1941689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1942689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP
1943689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx)
1944689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
1945689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (idx >= m_count)
1946689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
1947689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (m_base_data_address == 0 || m_count == 0)
1948689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
1949689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t byte_idx = (idx >> 3); // divide by 8 to get byte index
1950689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t bit_index = (idx & 7); // efficient idx % 8 for bit index
1951689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    lldb::addr_t byte_location = m_base_data_address + byte_idx;
1952689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
1953689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!process_sp)
1954689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
1955689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint8_t byte = 0;
1956689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint8_t mask = 0;
1957689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    Error err;
1958689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err);
1959689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (err.Fail() || bytes_read == 0)
1960689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
1961689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    switch (bit_index)
1962689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    {
1963689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 0:
1964689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 1; break;
1965689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 1:
1966689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 2; break;
1967689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 2:
1968689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 4; break;
1969689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 3:
1970689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 8; break;
1971689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 4:
1972689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 16; break;
1973689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 5:
1974689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 32; break;
1975689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 6:
1976689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 64; break;
1977689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 7:
1978689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 128; break;
1979689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        default:
1980689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            return ValueObjectSP();
1981689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
1982689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    bool bit_set = ((byte & mask) != 0);
1983689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    Target& target(process_sp->GetTarget());
1984689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP retval_sp;
1985689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (bit_set)
1986689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        target.EvaluateExpression("(bool)true", NULL, retval_sp);
1987689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    else
1988689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        target.EvaluateExpression("(bool)false", NULL, retval_sp);
1989689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    StreamString name; name.Printf("[%zu]",idx);
1990689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (retval_sp)
1991689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        retval_sp->SetName(ConstString(name.GetData()));
1992689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return retval_sp;
1993689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1994689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1995689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata/*(std::__1::vector<std::__1::allocator<bool> >) vBool = {
1996689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    __begin_ = 0x00000001001000e0
1997689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    __size_ = 56
1998689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    __cap_alloc_ = {
1999689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        std::__1::__libcpp_compressed_pair_imp<unsigned long, std::__1::allocator<unsigned long> > = {
2000689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            __first_ = 1
2001689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        }
2002689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
2003689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}*/
2004689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2005689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool
2006689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update()
2007689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2008689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
2009689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2010689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2011689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (valobj_sp->IsDynamic())
2012689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        valobj_sp = valobj_sp->GetStaticValue();
2013689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2014689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2015689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
2016689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true));
2017689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!size_sp)
2018689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2019689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_count = size_sp->GetValueAsUnsigned(0);
2020689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_count)
2021689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return true;
2022689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP begin_sp(valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true));
2023689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!begin_sp)
2024689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    {
2025689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        m_count = 0;
2026689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2027689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
2028689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_base_data_address = begin_sp->GetValueAsUnsigned(0);
2029689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_base_data_address)
2030689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    {
2031689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        m_count = 0;
2032689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2033689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
2034689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return true;
2035689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2036689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2037689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool
2038689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::MightHaveChildren ()
2039689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2040689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return true;
2041689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2042689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2043689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
2044689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
2045689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2046689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_count || !m_base_data_address)
2047689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return UINT32_MAX;
2048689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    const char* item_name = name.GetCString();
2049689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
2050689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
2051689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return UINT32_MAX;
2052689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return idx;
2053689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2054689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2055689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::~LibcxxVectorBoolSyntheticFrontEnd ()
2056689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{}
2057689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2058689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd*
2059689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
2060689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2061689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2062689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return NULL;
2063689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return (new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp));
2064689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2065689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2066689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
2067689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
2068689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_exe_ctx_ref(),
2069689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_count(0),
2070689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_base_data_address(0),
2071689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_options()
2072689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2073689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (valobj_sp)
2074689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        Update();
2075689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_options.SetCoerceToId(false)
2076689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    .SetUnwindOnError(true)
2077689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    .SetKeepInMemory(true)
2078689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
2079689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2080689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2081689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
2082689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::CalculateNumChildren ()
2083689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2084689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return m_count;
2085689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2086689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2087689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP
2088689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx)
2089689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2090689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (idx >= m_count)
2091689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
2092689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (m_base_data_address == 0 || m_count == 0)
2093689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
2094689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t byte_idx = (idx >> 3); // divide by 8 to get byte index
2095689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t bit_index = (idx & 7); // efficient idx % 8 for bit index
2096689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    lldb::addr_t byte_location = m_base_data_address + byte_idx;
2097689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
2098689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!process_sp)
2099689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
2100689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint8_t byte = 0;
2101689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint8_t mask = 0;
2102689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    Error err;
2103689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err);
2104689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (err.Fail() || bytes_read == 0)
2105689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return ValueObjectSP();
2106689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    switch (bit_index)
2107689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    {
2108689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 0:
2109689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 1; break;
2110689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 1:
2111689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 2; break;
2112689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 2:
2113689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 4; break;
2114689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 3:
2115689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 8; break;
2116689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 4:
2117689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 16; break;
2118689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 5:
2119689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 32; break;
2120689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 6:
2121689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 64; break;
2122689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        case 7:
2123689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            mask = 128; break;
2124689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        default:
2125689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata            return ValueObjectSP();
2126689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    }
2127689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    bool bit_set = ((byte & mask) != 0);
2128689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    Target& target(process_sp->GetTarget());
2129689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP retval_sp;
2130689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (bit_set)
2131689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        target.EvaluateExpression("(bool)true", NULL, retval_sp);
2132689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    else
2133689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        target.EvaluateExpression("(bool)false", NULL, retval_sp);
2134689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    StreamString name; name.Printf("[%zu]",idx);
2135689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (retval_sp)
2136689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        retval_sp->SetName(ConstString(name.GetData()));
2137689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return retval_sp;
2138689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2139689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2140689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata/*((std::vector<std::allocator<bool> >) vBool = {
2141689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bvector_base<std::allocator<bool> >) std::_Bvector_base<std::allocator<bool> > = {
2142689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bvector_base<std::allocator<bool> >::_Bvector_impl) _M_impl = {
2143689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator) _M_start = {
2144689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = {
2145689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_p = 0x0016b160
2146689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (unsigned int) _M_offset = 0
2147689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2148689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2149689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator) _M_finish = {
2150689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = {
2151689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_p = 0x0016b16c
2152689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (unsigned int) _M_offset = 16
2153689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2154689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2155689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_end_of_storage = 0x0016b170
2156689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2157689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2158689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata }
2159689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata*/
2160689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2161689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool
2162689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::Update()
2163689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2164689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
2165689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2166689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2167689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (valobj_sp->IsDynamic())
2168689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        valobj_sp = valobj_sp->GetStaticValue();
2169689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2170689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2171689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
2172689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2173689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP m_impl_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_impl"), true));
2174689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_impl_sp)
2175689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2176689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2177689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP m_start_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_start"), true));
2178689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP m_finish_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_finish"), true));
2179689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2180689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    ValueObjectSP start_p_sp, finish_p_sp, finish_offset_sp;
2181689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2182689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_start_sp || !m_finish_sp)
2183689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2184689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2185689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    start_p_sp = m_start_sp->GetChildMemberWithName(ConstString("_M_p"), true);
2186689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    finish_p_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_p"), true);
2187689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    finish_offset_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_offset"), true);
2188689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2189689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!start_p_sp || !finish_offset_sp || !finish_p_sp)
2190689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2191689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2192689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    m_base_data_address = start_p_sp->GetValueAsUnsigned(0);
2193689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_base_data_address)
2194689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2195689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2196689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    lldb::addr_t end_data_address(finish_p_sp->GetValueAsUnsigned(0));
2197689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!end_data_address)
2198689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2199689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2200689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (end_data_address < m_base_data_address)
2201689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
2202689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    else
2203689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        m_count = finish_offset_sp->GetValueAsUnsigned(0) + (end_data_address-m_base_data_address)*8;
2204689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2205689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return true;
2206689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2207689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2208689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool
2209689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::MightHaveChildren ()
2210689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2211689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return true;
2212689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2213689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2214689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
2215689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
2216689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2217689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!m_count || !m_base_data_address)
2218689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return UINT32_MAX;
2219689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    const char* item_name = name.GetCString();
2220689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
2221689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
2222689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return UINT32_MAX;
2223689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return idx;
2224689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2225689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2226689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::~LibstdcppVectorBoolSyntheticFrontEnd ()
2227689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{}
2228689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2229689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd*
2230689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
2231689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
2232689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    if (!valobj_sp)
2233689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return NULL;
2234689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return (new LibstdcppVectorBoolSyntheticFrontEnd(valobj_sp));
2235689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
2236689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
2237caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
2238f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
2239caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
2240caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
2241f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
2242caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
2243caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
2244f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
2245caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
2246caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
2247f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
2248db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
2249db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool
2250db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ;
2251db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
2252db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool
2253db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ;
2254