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
10884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec#include "lldb/lldb-python.h"
11884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec
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
26fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#include <algorithm>
27fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata
28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb;
29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private;
30caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters;
31caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
32caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj,
34f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* target_type,
35f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          const char* selector,
36f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                          uint64_t &value)
37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target_type || !*target_type)
39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!selector || !*selector)
41caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StreamString expr;
43b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea    expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector);
44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::ValueObjectSP result_sp;
46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    Target* target = exe_ctx.GetTargetPtr();
47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
48caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!target || !stack_frame)
49caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
50d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
5147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
52d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    options.SetCoerceToId(false)
53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata    .SetUnwindOnError(true)
5499611fe5a2a450087e7d9cbdb91c7d3fdcb5a5c2Sean Callanan    .SetKeepInMemory(true);
55d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
56caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    target->EvaluateExpression(expr.GetData(),
57caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                               stack_frame,
58d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               result_sp,
59d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                               options);
60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!result_sp)
61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    value = result_sp->GetValueAsUnsigned(0);
63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
64caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
65caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
66ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool
67ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj,
68ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                                                            const char* target_type,
69ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                                                            const char* selector,
70ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                                                            Stream &stream)
71ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{
72ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!target_type || !*target_type)
73ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
74ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!selector || !*selector)
75ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
76ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    StreamString expr;
7704d3bb2436e3cbecd3d461715aaf5cc99e93c828Enrico Granata    expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector);
78ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
79ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    lldb::ValueObjectSP result_sp;
80ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
81ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
82ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!target || !stack_frame)
83ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
84ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata
85ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    EvaluateExpressionOptions options;
86ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    options.SetCoerceToId(false)
87ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    .SetUnwindOnError(true)
88ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    .SetKeepInMemory(true)
89ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
90ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata
91ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    target->EvaluateExpression(expr.GetData(),
92ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                               stack_frame,
93ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                               result_sp,
94ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata                               options);
95ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!result_sp)
96ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
97ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    stream.Printf("%s",result_sp->GetSummaryAsCString());
98ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    return true;
99ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata}
100ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata
101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                uint64_t index)
106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
1155f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index);
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
136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP
137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
138f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* return_type,
139f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* selector,
140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                                                const char* key)
141f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
142f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP valobj_sp;
143f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!return_type || !*return_type)
144f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
145f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!selector || !*selector)
146f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
147f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!key || !*key)
148f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
149f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr_path_stream;
150f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    valobj.GetExpressionPath(expr_path_stream, false);
151f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StreamString expr;
152f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key);
153f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
154f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    lldb::ValueObjectSP result_sp;
155f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    Target* target = exe_ctx.GetTargetPtr();
156f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    StackFrame* stack_frame = exe_ctx.GetFramePtr();
157f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    if (!target || !stack_frame)
158f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        return valobj_sp;
159f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
16047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    EvaluateExpressionOptions options;
161f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    options.SetCoerceToId(false)
162f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUnwindOnError(true)
163f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetKeepInMemory(true)
164f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
165f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
166f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    target->EvaluateExpression(expr.GetData(),
167f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               stack_frame,
168f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               valobj_sp,
169f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata                               options);
170f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata    return valobj_sp;
171f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
172f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
173cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata// use this call if you already have an LLDB-side buffer for the data
174cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType>
175f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatastatic bool
176cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataDumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
177cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            const SourceDataType*,
178cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            UTF8**,
179cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            UTF8*,
180cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                            ConversionFlags),
181cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       DataExtractor& data,
182cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       Stream& stream,
183cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       char prefix_token = '@',
184cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                       char quote = '"',
185fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata                       uint32_t sourceSize = 0)
186f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
187cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (prefix_token != 0)
188cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",prefix_token);
189cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (quote != 0)
190cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",quote);
191cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd())
192f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
193cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        const int bufferSPSize = data.GetByteSize();
194cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        if (sourceSize == 0)
195cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        {
196cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            const int origin_encoding = 8*sizeof(SourceDataType);
1970cd33406723ceed5c08d41ff6946006298f3f133Greg Clayton            sourceSize = bufferSPSize/(origin_encoding / 4);
198cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        }
199cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
200cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart();
201f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        SourceDataType *data_end_ptr = data_ptr + sourceSize;
202f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
203f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        while (data_ptr < data_end_ptr)
204f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
205f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            if (!*data_ptr)
206f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            {
207f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                data_end_ptr = data_ptr;
208f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                break;
209f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            }
210f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            data_ptr++;
211f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
212f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
213cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        data_ptr = (SourceDataType*)data.GetDataStart();
214f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
21506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        lldb::DataBufferSP utf8_data_buffer_sp;
21606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        UTF8* utf8_data_ptr = nullptr;
21706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        UTF8* utf8_data_end_ptr = nullptr;
218cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
219f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        if (ConvertFunction)
22006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        {
22166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            utf8_data_buffer_sp.reset(new DataBufferHeap(4*bufferSPSize,0));
22206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes();
22366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            utf8_data_end_ptr = utf8_data_ptr + utf8_data_buffer_sp->GetByteSize();
224f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion );
22506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr
22606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        }
227f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        else
228f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
229f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            // just copy the pointers - the cast is necessary to make the compiler happy
230f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            // but this should only happen if we are reading UTF8 data
231f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            utf8_data_ptr = (UTF8*)data_ptr;
232f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            utf8_data_end_ptr = (UTF8*)data_end_ptr;
233f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
234f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
235b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // since we tend to accept partial data (and even partially malformed data)
236b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // we might end up with no NULL terminator before the end_ptr
237b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        // hence we need to take a slower route and ensure we stay within boundaries
238f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++)
239f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        {
240f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            if (!*utf8_data_ptr)
241f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata                break;
242f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata            stream.Printf("%c",*utf8_data_ptr);
243f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        }
244f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
245cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (quote != 0)
246cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%c",quote);
247f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
248f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
249f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
250cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType>
25166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataclass ReadUTFBufferAndDumpToStreamOptions
25266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata{
25366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatapublic:
25466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    typedef ConversionResult (*ConvertFunctionType) (const SourceDataType**,
25566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata                                                     const SourceDataType*,
25666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata                                                     UTF8**,
25766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata                                                     UTF8*,
25866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata                                                     ConversionFlags);
25966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
26066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions () :
26166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_conversion_function(NULL),
26266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_location(0),
26366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_process_sp(),
26466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_stream(NULL),
26566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_prefix_token('@'),
26666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_quote('"'),
26766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_source_size(0),
26866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    m_needs_zero_termination(true)
26966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
27066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
27166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
27266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
27366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetConversionFunction (ConvertFunctionType f)
27466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
27566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_conversion_function = f;
27666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
27766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
27866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
27966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ConvertFunctionType
28066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetConversionFunction () const
28166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
28266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_conversion_function;
28366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
28466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
28566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
28666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetLocation (uint64_t l)
28766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
28866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_location = l;
28966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
29066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
29166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
29266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    uint64_t
29366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetLocation () const
29466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
29566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_location;
29666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
29766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
29866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
29966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetProcessSP (ProcessSP p)
30066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
30166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_process_sp = p;
30266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
30366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
30466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
30566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ProcessSP
30666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetProcessSP () const
30766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
30866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_process_sp;
30966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
31066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
31166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
31266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetStream (Stream* s)
31366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
31466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_stream = s;
31566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
31666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
31766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
31866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    Stream*
31966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetStream () const
32066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
32166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_stream;
32266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
32366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
32466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
32566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetPrefixToken (char p)
32666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
32766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_prefix_token = p;
32866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
32966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
33066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
33166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    char
33266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetPrefixToken () const
33366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
33466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_prefix_token;
33566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
33666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
33766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
33866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetQuote (char q)
33966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
34066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_quote = q;
34166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
34266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
34366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
34466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    char
34566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetQuote () const
34666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
34766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_quote;
34866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
34966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
35066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
35166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetSourceSize (uint32_t s)
35266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
35366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_source_size = s;
35466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
35566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
35666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
35766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    uint32_t
35866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetSourceSize () const
35966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
36066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_source_size;
36166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
36266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
36366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions&
36466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    SetNeedsZeroTermination (bool z)
36566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
36666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        m_needs_zero_termination = z;
36766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return *this;
36866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
36966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
37066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    bool
37166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    GetNeedsZeroTermination () const
37266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
37366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return m_needs_zero_termination;
37466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
37566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
37666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataprivate:
37766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ConvertFunctionType m_conversion_function;
37866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    uint64_t m_location;
37966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ProcessSP m_process_sp;
38066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    Stream* m_stream;
38166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    char m_prefix_token;
38266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    char m_quote;
38366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    uint32_t m_source_size;
38466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    bool m_needs_zero_termination;
38566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata};
38666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
38766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatatemplate<typename SourceDataType>
388cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatastatic bool
38966cd2b51a3e5003e2692215277525f79bb86c55bEnrico GranataReadUTFBufferAndDumpToStream (const ReadUTFBufferAndDumpToStreamOptions<SourceDataType>& options)
390cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
39166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (options.GetLocation() == 0 || options.GetLocation() == LLDB_INVALID_ADDRESS)
392cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
39366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
39466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ProcessSP process_sp(options.GetProcessSP());
39566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
396cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!process_sp)
397cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
398cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
399347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi    const int type_width = sizeof(SourceDataType);
400347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi    const int origin_encoding = 8 * type_width ;
401cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
402cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
403cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    // if not UTF8, I need a conversion function to return proper UTF8
40466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (origin_encoding != 8 && !options.GetConversionFunction())
40566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return false;
40666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
40766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (!options.GetStream())
408cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
409cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
41066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    uint32_t sourceSize = options.GetSourceSize();
41166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    bool needs_zero_terminator = options.GetNeedsZeroTermination();
41266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
41354f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata    if (!sourceSize)
41466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    {
41554f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata        sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
41666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        needs_zero_terminator = true;
41766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    }
41854f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata    else
41954f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata        sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary());
42054f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata
421347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi    const int bufferSPSize = sourceSize * type_width;
422cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
423cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
424cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
425cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!buffer_sp->GetBytes())
426cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
427cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
428347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi    Error error;
429347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi    char *buffer = reinterpret_cast<char *>(buffer_sp->GetBytes());
430347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi
43166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    size_t data_read = 0;
43266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (needs_zero_terminator)
43366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        data_read = process_sp->ReadStringFromMemory(options.GetLocation(), buffer, bufferSPSize, error, type_width);
43466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    else
43566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        data_read = process_sp->ReadMemoryFromInferior(options.GetLocation(), (char*)buffer_sp->GetBytes(), bufferSPSize, error);
43666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
437cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (error.Fail() || data_read == 0)
438cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    {
43966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.GetStream()->Printf("unable to read data");
440cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return true;
441cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    }
442cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
443cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());
444cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
44566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    return DumpUTFBufferToStream(options.GetConversionFunction(), data, *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), sourceSize);
446cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
447cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
448f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
449f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream)
450f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
451f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
452f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!process_sp)
453f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
454f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
455f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
456f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
457f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!valobj_addr)
458f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
459f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
46066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
46166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetLocation(valobj_addr);
46266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetConversionFunction(ConvertUTF16toUTF8);
46366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetProcessSP(process_sp);
46466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetStream(&stream);
46566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetPrefixToken('u');
46666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
46766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (!ReadUTFBufferAndDumpToStream(options))
468f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
469f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        stream.Printf("Summary Unavailable");
470f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return true;
471f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
472f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
473f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
474f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
475f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
476f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
477f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream)
478f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
479f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
480f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!process_sp)
481f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
482f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
483f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
484f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
485f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    if (!valobj_addr)
486f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return false;
487f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
48866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    ReadUTFBufferAndDumpToStreamOptions<UTF32> options;
48966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetLocation(valobj_addr);
49066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetConversionFunction(ConvertUTF32toUTF8);
49166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetProcessSP(process_sp);
49266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    options.SetStream(&stream);
493bf5d9d4730cd1fedef4ff02ed25cc47be06e0c8aEnrico Granata    options.SetPrefixToken('U');
49466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
49566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata    if (!ReadUTFBufferAndDumpToStream(options))
496f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    {
497f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        stream.Printf("Summary Unavailable");
498f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata        return true;
499f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    }
500f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
501f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata    return true;
502f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
503f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
504f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool
505f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream)
506f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{
50706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
50806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    if (!process_sp)
50906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
51006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
511b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    lldb::addr_t data_addr = 0;
512b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
513b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (valobj.IsPointerType())
514b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        data_addr = valobj.GetValueAsUnsigned(0);
515b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    else if (valobj.IsArrayType())
516b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        data_addr = valobj.GetAddressOf();
51706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
518b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS)
51906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
52006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
52152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::ASTContext* ast = valobj.GetClangType().GetASTContext();
52252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
52306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    if (!ast)
52406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        return false;
52506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
52652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType wchar_clang_type = ClangASTContext::GetBasicType(ast, lldb::eBasicTypeWChar);
52752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t wchar_size = wchar_clang_type.GetBitSize();
52806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata
52906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    switch (wchar_size)
53006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    {
53106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 8:
53266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        {
53306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 8
53466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
53566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            ReadUTFBufferAndDumpToStreamOptions<UTF8> options;
53666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetLocation(data_addr);
53766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetConversionFunction(nullptr);
53866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetProcessSP(process_sp);
53966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetStream(&stream);
54066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetPrefixToken('L');
54166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
54266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            return ReadUTFBufferAndDumpToStream(options);
54366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        }
54406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 16:
54566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        {
54606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 16
54766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
54866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetLocation(data_addr);
54966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetConversionFunction(ConvertUTF16toUTF8);
55066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetProcessSP(process_sp);
55166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetStream(&stream);
55266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetPrefixToken('L');
55366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
55466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            return ReadUTFBufferAndDumpToStream(options);
55566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        }
55606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        case 32:
55766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        {
55806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            // utf 32
55966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            ReadUTFBufferAndDumpToStreamOptions<UTF32> options;
56066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetLocation(data_addr);
56166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetConversionFunction(ConvertUTF32toUTF8);
56266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetProcessSP(process_sp);
56366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetStream(&stream);
56466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetPrefixToken('L');
56566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata
56666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            return ReadUTFBufferAndDumpToStream(options);
56766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        }
568cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        default:
569cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            stream.Printf("size for wchar_t is not valid");
570cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return true;
571cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    }
572cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return true;
573cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
574cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
575cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
576cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream)
577cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
578cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
579cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
580cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
581cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
582cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
583cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!value.empty())
584cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%s ", value.c_str());
585cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
586cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1);
587cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
588cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
589cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
590cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream)
591cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
592cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
593cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
594cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
595cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
596cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
597cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!value.empty())
598cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        stream.Printf("%s ", value.c_str());
599cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
600cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1);
601cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata}
602cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
603cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool
604cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream)
605cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{
606cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    DataExtractor data;
607cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    valobj.GetData(data);
608cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
60952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::ASTContext* ast = valobj.GetClangType().GetASTContext();
610cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
611cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    if (!ast)
612cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        return false;
613cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
61452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType wchar_clang_type = ClangASTContext::GetBasicType(ast, lldb::eBasicTypeWChar);
61552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t wchar_size = wchar_clang_type.GetBitSize();
616cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    std::string value;
617cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata
618cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    switch (wchar_size)
619cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata    {
620cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 8:
621cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 8
622cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatChar, value);
623cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
624cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
625cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF8>(nullptr,
626cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               data,
627cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               stream,
628cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               'L',
629cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               '\'',
630cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                               1);
631cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 16:
632cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 16
633cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
634cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
635cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
636cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,
637cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                data,
638cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                stream,
639cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                'L',
640cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                '\'',
641cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                1);
642cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata        case 32:
643cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            // utf 32
644cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
645cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            if (!value.empty())
646cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                stream.Printf("%s ", value.c_str());
647cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata            return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,
648cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                data,
649cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                stream,
650cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                'L',
651cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                '\'',
652cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata                                                1);
65306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata        default:
65406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            stream.Printf("size for wchar_t is not valid");
65506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata            return true;
65606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    }
65706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata    return true;
658f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata}
659f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata
660829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// the field layout in a libc++ string (cap, side, data or data, size, cap)
661829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granataenum LibcxxStringLayoutMode
662829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata{
663829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    eLibcxxStringLayoutModeCSD = 0,
664829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    eLibcxxStringLayoutModeDSC = 1,
665829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    eLibcxxStringLayoutModeInvalid = 0xffff
666829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata};
667829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
668829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// this function abstracts away the layout and mode details of a libc++ string
669829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// and returns the address of the data and the size ready for callers to consume
670b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatastatic bool
671b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataExtractLibcxxStringInfo (ValueObject& valobj,
672b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                         ValueObjectSP &location_sp,
673b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata                         uint64_t& size)
674b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
675b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0}));
676b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!D)
677b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
678b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
679829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    ValueObjectSP layout_decider(D->GetChildAtIndexPath({0,0}));
680829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
681829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    // this child should exist
682829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    if (!layout_decider)
683b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
684b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
685829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    ConstString g_data_name("__data_");
686829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    ConstString g_size_name("__size_");
687829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    bool short_mode = false; // this means the string is in short-mode and the data is stored inline
688829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    LibcxxStringLayoutMode layout = (layout_decider->GetName() == g_data_name) ? eLibcxxStringLayoutModeDSC : eLibcxxStringLayoutModeCSD;
689829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    uint64_t size_mode_value = 0;
690829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
691829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    if (layout == eLibcxxStringLayoutModeDSC)
692829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    {
693829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        ValueObjectSP size_mode(D->GetChildAtIndexPath({1,1,0}));
694829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        if (!size_mode)
695829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata            return false;
696829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
697829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        if (size_mode->GetName() != g_size_name)
698829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        {
699829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata            // we are hitting the padding structure, move along
700829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata            size_mode = D->GetChildAtIndexPath({1,1,1});
701829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata            if (!size_mode)
702829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata                return false;
703829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        }
704829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
705829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        size_mode_value = (size_mode->GetValueAsUnsigned(0));
706829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        short_mode = ((size_mode_value & 0x80) == 0);
707829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    }
708829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    else
709829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    {
710829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0}));
711829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        if (!size_mode)
712829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata            return false;
713829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata
714829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        size_mode_value = (size_mode->GetValueAsUnsigned(0));
715829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        short_mode = ((size_mode_value & 1) == 0);
716829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    }
717b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
718829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    if (short_mode)
719b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
720b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP s(D->GetChildAtIndex(1, true));
721b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!s)
722b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
723829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        location_sp = s->GetChildAtIndex((layout == eLibcxxStringLayoutModeDSC) ? 0 : 1, true);
724829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        size = (layout == eLibcxxStringLayoutModeDSC) ? size_mode_value : ((size_mode_value >> 1) % 256);
725b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return (location_sp.get() != nullptr);
726b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
727b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    else
728b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
729b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP l(D->GetChildAtIndex(0, true));
730b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!l)
731b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
732829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        // we can use the layout_decider object as the data pointer
733829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata        location_sp = (layout == eLibcxxStringLayoutModeDSC) ? layout_decider : l->GetChildAtIndex(2, true);
734b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        ValueObjectSP size_vo(l->GetChildAtIndex(1, true));
735b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        if (!size_vo || !location_sp)
736b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata            return false;
737b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        size = size_vo->GetValueAsUnsigned(0);
738b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
739b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
740b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
741b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
742b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool
743b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream)
744b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
745b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    uint64_t size = 0;
746b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP location_sp((ValueObject*)nullptr);
747b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
748b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
749b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (size == 0)
750b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
751b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        stream.Printf("L\"\"");
752b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
753829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata    }
754b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!location_sp)
755b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
756b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    return WCharStringSummaryProvider(*location_sp.get(), stream);
757b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
758b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
759b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool
760b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream)
761b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{
762b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    uint64_t size = 0;
763b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    ValueObjectSP location_sp((ValueObject*)nullptr);
764b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
765b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
766b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (size == 0)
767b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    {
768b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        stream.Printf("\"\"");
769b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return true;
770b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    }
771b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    if (!location_sp)
772b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata        return false;
773b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    Error error;
77432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (location_sp->ReadPointedString(stream,
77532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata                                       error,
77632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata                                       0, // max length is decided by the settings
77732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata                                       false) == 0) // do not honor array (terminates on first 0 byte even for a char[])
77832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        stream.Printf("\"\""); // if nothing was read, print an empty string
779b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata    return error.Success();
780b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata}
781b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata
782280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatabool
783280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatalldb_private::formatters::ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream)
784280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata{
785280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
786280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    if (!process_sp)
787280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata        return false;
788280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
789280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
790280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
791280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    if (!runtime)
792280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata        return false;
793280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
794d387b462eecb908af265ecc7006781b4532073adGreg Clayton    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0)));
795280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
796280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    if (!descriptor.get() || !descriptor->IsValid())
797280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata        return false;
798280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
799280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
800280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
801280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    if (!class_name || !*class_name)
802280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata        return false;
803280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
804280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    stream.Printf("%s",class_name);
805280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata    return true;
806280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata}
807280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata
80839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granataclass ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd
80939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{
81039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatapublic:
81139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    ObjCClassSyntheticChildrenFrontEnd (lldb::ValueObjectSP valobj_sp) :
81239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    SyntheticChildrenFrontEnd(*valobj_sp.get())
81339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
81439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
81539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
81639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual size_t
81739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    CalculateNumChildren ()
81839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
81939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata        return 0;
82039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
82139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
82239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual lldb::ValueObjectSP
82339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    GetChildAtIndex (size_t idx)
82439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
82539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata        return lldb::ValueObjectSP();
82639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
82739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
82839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual bool
82939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    Update()
83039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
83139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata        return false;
83239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
83339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
83439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual bool
83539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    MightHaveChildren ()
83639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
83739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata        return false;
83839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
83939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
84039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual size_t
84139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    GetIndexOfChildWithName (const ConstString &name)
84239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
84339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata        return UINT32_MAX;
84439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
84539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
84639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    virtual
84739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    ~ObjCClassSyntheticChildrenFrontEnd ()
84839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    {
84939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    }
85039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata};
85139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
85239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico GranataSyntheticChildrenFrontEnd*
85339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatalldb_private::formatters::ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
85439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{
85539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata    return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp);
85639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata}
85739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata
858caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at>
859caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
860f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream)
861caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
862caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
863caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
864caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
865caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
866caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
867caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
868caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
869caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
870caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
871caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
872caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
873caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
874caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
875caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
876caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_64bit = (process_sp->GetAddressByteSize() == 8);
877caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
878caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
879caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
880caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
881caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
882caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t value = 0;
883caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
884caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
8857685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
8867685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata    if (!class_name || !*class_name)
8877685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata        return false;
8887685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata
889caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!strcmp(class_name,"NSConcreteData") ||
890caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"NSConcreteMutableData") ||
891caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        !strcmp(class_name,"__NSCFData"))
892caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
893caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint32_t offset = (is_64bit ? 16 : 8);
894caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        Error error;
895caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error);
896caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
897caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
898caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
899caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
900caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
901f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata        if (!ExtractValueFromObjCExpression(valobj, "int", "length", value))
902caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
903caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
904caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
9055f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    stream.Printf("%s%" PRIu64 " byte%s%s",
906caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "@\"" : ""),
907caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  value,
9087b61b79d4a6a606b8efc11d7a8b2aa63a9880d46Enrico Granata                  (value != 1 ? "s" : ""),
909caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                  (needs_at ? "\"" : ""));
910caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
911caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
912caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
913caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
914f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granatastatic bool
915f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico GranataReadAsciiBufferAndDumpToStream (lldb::addr_t location,
916f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                lldb::ProcessSP& process_sp,
917f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                Stream& dest,
918fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata                                uint32_t size = 0,
919f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                Error* error = NULL,
920f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                size_t *data_read = NULL,
921f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                char prefix_token = '@',
922f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata                                char quote = '"')
923f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata{
924f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    Error my_error;
925f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    size_t my_data_read;
926f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    if (!process_sp || location == 0)
927f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        return false;
928f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
92954f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata    if (!size)
93054f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata        size = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
93154f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata    else
93254f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata        size = std::min(size,process_sp->GetTarget().GetMaximumSizeOfStringSummary());
933f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
934f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    lldb::DataBufferSP buffer_sp(new DataBufferHeap(size,0));
935f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
936f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    my_data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), size, my_error);
937f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
938f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    if (error)
939f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        *error = my_error;
940f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    if (data_read)
941f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        *data_read = my_data_read;
942f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
943f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    if (my_error.Fail())
944f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        return false;
945d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata
946d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata    dest.Printf("%c%c",prefix_token,quote);
947d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata
948f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    if (my_data_read)
949d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata        dest.Printf("%s",(char*)buffer_sp->GetBytes());
950d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata
951d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata    dest.Printf("%c",quote);
952f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
953f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    return true;
954f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata}
955f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata
956caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool
957f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream)
958caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{
959caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ProcessSP process_sp = valobj.GetProcessSP();
960caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!process_sp)
961caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
962caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
963caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
964caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
965caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!runtime)
966caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
967caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
968caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
969caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
970caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!descriptor.get() || !descriptor->IsValid())
971caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
972caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
973caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint32_t ptr_size = process_sp->GetAddressByteSize();
974caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
975caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
976caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
977caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (!valobj_addr)
978caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
979caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
980caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    const char* class_name = descriptor->GetClassName().GetCString();
981caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
98225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata    if (!class_name || !*class_name)
98325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata        return false;
98425c9adecf763053ff953b4d437b022075d30dd13Enrico Granata
985caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint64_t info_bits_location = valobj_addr + ptr_size;
986caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (process_sp->GetByteOrder() != lldb::eByteOrderLittle)
987caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        info_bits_location += 3;
988caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
989f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata    Error error;
990caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
991caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error);
992caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (error.Fail())
993caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        return false;
994caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
995caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_mutable = (info_bits & 1) == 1;
996caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_inline = (info_bits & 0x60) == 0;
997caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool has_explicit_length = (info_bits & (1 | 4)) != 4;
998caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_unicode = (info_bits & 0x10) == 0x10;
999caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    bool is_special = strcmp(class_name,"NSPathStore2") == 0;
1000fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata    bool has_null = (info_bits & 8) == 8;
1001fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata
1002fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata    size_t explicit_length = 0;
1003fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata    if (!has_null && has_explicit_length && !is_special)
1004fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata    {
1005fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        lldb::addr_t explicit_length_offset = 2*ptr_size;
1006fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        if (is_mutable and not is_inline)
1007fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length_offset = explicit_length_offset + ptr_size; //  notInlineMutable.length;
1008fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        else if (is_inline)
1009fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length = explicit_length + 0; // inline1.length;
1010fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        else if (not is_inline and not is_mutable)
1011fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length_offset = explicit_length_offset + ptr_size; // notInlineImmutable1.length;
1012fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        else
1013fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length_offset = 0;
1014fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata
1015fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        if (explicit_length_offset)
1016fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        {
1017fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length_offset = valobj_addr + explicit_length_offset;
1018fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            explicit_length = process_sp->ReadUnsignedIntegerFromMemory(explicit_length_offset, 4, 0, error);
1019fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        }
1020fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata    }
1021fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata
1022caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (strcmp(class_name,"NSString") &&
1023caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFStringRef") &&
1024caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"CFMutableStringRef") &&
1025caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFConstantString") &&
1026caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"__NSCFString") &&
1027caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFConstantString") &&
1028caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSCFString") &&
1029caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        strcmp(class_name,"NSPathStore2"))
1030caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1031f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        // not one of us - but tell me class name
1032f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        stream.Printf("class name = %s",class_name);
1033f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        return true;
1034caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1035caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1036caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    if (is_mutable)
1037caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1038caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 2 * ptr_size + valobj_addr;
1039caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
1040caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
1041caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
1042caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (has_explicit_length and is_unicode)
104366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        {
104466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
104566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetConversionFunction(ConvertUTF16toUTF8);
104666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetLocation(location);
104766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetProcessSP(process_sp);
104866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetStream(&stream);
104966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetPrefixToken('@');
105066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetQuote('"');
105166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetSourceSize(explicit_length);
105266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            options.SetNeedsZeroTermination(false);
105366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata            return ReadUTFBufferAndDumpToStream (options);
105466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        }
1055caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
1056fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata            return ReadAsciiBufferAndDumpToStream(location+1,process_sp,stream, explicit_length);
1057caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1058caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable)
1059caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1060caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = 3 * ptr_size + valobj_addr;
1061fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length);
1062caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1063caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_unicode)
1064caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1065f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        uint64_t location = valobj_addr + 2*ptr_size;
1066caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (is_inline)
1067caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
1068caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (!has_explicit_length)
1069caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            {
1070caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                stream.Printf("found new combo");
1071caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return true;
1072caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            }
1073caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            else
1074caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                location += ptr_size;
107566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        }
1076caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        else
1077caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        {
1078caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location = process_sp->ReadPointerFromMemory(location, error);
1079caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            if (error.Fail())
1080caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata                return false;
1081caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        }
108266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
108366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetConversionFunction(ConvertUTF16toUTF8);
108466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetLocation(location);
108566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetProcessSP(process_sp);
108666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetStream(&stream);
108766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetPrefixToken('@');
108866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetQuote('"');
108966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetSourceSize(explicit_length);
109066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetNeedsZeroTermination(has_explicit_length == false);
109166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return ReadUTFBufferAndDumpToStream (options);
1092caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1093caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_special)
1094caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1095caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
109666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
109766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetConversionFunction(ConvertUTF16toUTF8);
109866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetLocation(location);
109966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetProcessSP(process_sp);
110066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetStream(&stream);
110166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetPrefixToken('@');
110266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetQuote('"');
110366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetSourceSize(explicit_length);
110466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        options.SetNeedsZeroTermination(has_explicit_length == false);
110566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata        return ReadUTFBufferAndDumpToStream (options);
1106caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1107caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else if (is_inline)
1108caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1109f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        uint64_t location = valobj_addr + 2*ptr_size;
1110caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (!has_explicit_length)
1111caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            location++;
1112fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length);
1113caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1114caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    else
1115caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    {
1116f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata        uint64_t location = valobj_addr + 2*ptr_size;
1117caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        location = process_sp->ReadPointerFromMemory(location, error);
1118caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata        if (error.Fail())
1119caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata            return false;
1120237bbc15b73b4244279e4e155d54d804baadfd81Enrico Granata        if (has_explicit_length && !has_null)
1121237bbc15b73b4244279e4e155d54d804baadfd81Enrico Granata            explicit_length++; // account for the fact that there is no NULL and we need to have one added
1122fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata        return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length);
1123caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    }
1124caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1125caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    stream.Printf("class name = %s",class_name);
1126caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata    return true;
1127caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1128caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata}
1129caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
11309abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool
1131dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream)
1132dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{
1133dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    TargetSP target_sp(valobj.GetTargetSP());
1134dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (!target_sp)
1135dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
1136dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize();
113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint64_t pointer_value = valobj.GetValueAsUnsigned(0);
113852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!pointer_value)
1139dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
114052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    pointer_value += addr_size;
114152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType type(valobj.GetClangType());
1142dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ExecutionContext exe_ctx(target_sp,false);
114352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointer_value, exe_ctx, type));
1144dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (!child_ptr_sp)
1145dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return false;
1146dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    DataExtractor data;
1147dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    child_ptr_sp->GetData(data);
1148dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type));
1149dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    child_sp->GetValueAsUnsigned(0);
1150dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    if (child_sp)
1151dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata        return NSStringSummaryProvider(*child_sp, stream);
1152dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    return false;
1153dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata}
1154dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata
1155dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool
1156dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream)
1157dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{
1158dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata    return NSAttributedStringSummaryProvider(valobj, stream);
1159dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata}
1160dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata
1161dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool
11629abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream)
11639abbfba957db139beed19866f61599424ddcd37aEnrico Granata{
11649abbfba957db139beed19866f61599424ddcd37aEnrico Granata    stream.Printf("%s",valobj.GetObjectDescription());
11659abbfba957db139beed19866f61599424ddcd37aEnrico Granata    return true;
11669abbfba957db139beed19866f61599424ddcd37aEnrico Granata}
11679abbfba957db139beed19866f61599424ddcd37aEnrico Granata
1168db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool
1169db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream)
1170db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{
117152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t type_info = valobj.GetClangType().GetTypeInfo();
1172db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1173db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    ValueObjectSP real_guy_sp = valobj.GetSP();
1174db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
117552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (type_info & ClangASTType::eTypeIsPointer)
1176db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1177db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        Error err;
1178db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        real_guy_sp = valobj.Dereference(err);
1179db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        if (err.Fail() || !real_guy_sp)
1180db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata            return false;
1181db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
118252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else if (type_info & ClangASTType::eTypeIsReference)
1183db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1184db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        real_guy_sp =  valobj.GetChildAtIndex(0, true);
1185db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        if (!real_guy_sp)
1186db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata            return false;
1187db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
1188db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    uint64_t value = real_guy_sp->GetValueAsUnsigned(0);
1189db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (value == 0)
1190db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    {
1191db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        stream.Printf("NO");
1192db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        return true;
1193db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    }
1194db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    stream.Printf("YES");
1195db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    return true;
1196db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata}
1197db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1198db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate <bool is_sel_ptr>
1199db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool
1200db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream)
1201db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{
12021f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    lldb::ValueObjectSP valobj_sp;
1203db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
120452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType charstar (valobj.GetClangType().GetBasicTypeFromAST(eBasicTypeChar).GetPointerType());
120552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
120652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!charstar)
12071f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        return false;
12081f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata
12091f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
1210db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
12111f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (is_sel_ptr)
12121f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    {
12131f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
12141f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        if (data_address == LLDB_INVALID_ADDRESS)
12151f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata            return false;
12161f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar);
12171f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    }
12181f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    else
12191f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    {
12201f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        DataExtractor data;
12211f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj.GetData(data);
12221f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar);
12231f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    }
12241f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata
12251f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata    if (!valobj_sp)
12261f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata        return false;
1227db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1228db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    stream.Printf("%s",valobj_sp->GetSummaryAsCString());
1229db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    return true;
1230db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata}
1231db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1232cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// POSIX has an epoch on Jan-1-1970, but Cocoa prefers Jan-1-2001
1233cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// this call gives the POSIX equivalent of the Cocoa epoch
1234cba09f60618744e2155bc97c9049fa9c797698adEnrico Granatatime_t
1235cc5d27417b9f958d596a438290a9adb17674b487Enrico Granatalldb_private::formatters::GetOSXEpoch ()
1236cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata{
1237cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata    static time_t epoch = 0;
1238cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata    if (!epoch)
1239cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata    {
1240cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tzset();
1241cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm tm_epoch;
1242cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_sec = 0;
1243cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_hour = 0;
1244cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_min = 0;
1245cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_mon = 0;
1246cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_mday = 1;
1247cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_year = 2001-1900; // for some reason, we need to subtract 1900 from this field. not sure why.
1248cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_isdst = -1;
1249cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_gmtoff = 0;
1250cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        tm_epoch.tm_zone = NULL;
1251cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata        epoch = timegm(&tm_epoch);
1252cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata    }
1253cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata    return epoch;
1254cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata}
1255cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata
1256ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t
1257ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractIndexFromString (const char* item_name)
1258f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1259ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!item_name || !*item_name)
1260ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return UINT32_MAX;
1261ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (*item_name != '[')
1262ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return UINT32_MAX;
1263ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    item_name++;
1264ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    char* endptr = NULL;
1265ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    unsigned long int idx = ::strtoul(item_name, &endptr, 0);
1266ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (idx == 0 && endptr == item_name)
1267ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return UINT32_MAX;
1268ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (idx == ULONG_MAX)
1269ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return UINT32_MAX;
1270ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    return idx;
1271ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata}
1272ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata
127332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
127432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata                                                                                            ConstString item_name) :
127532d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
127632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_exe_ctx_ref(),
127732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_name(item_name),
127832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_sp()
1279f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
128032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (valobj_sp)
128132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        Update();
1282f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata}
1283f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata
1284f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool
128532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::Update()
1286f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{
1287d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata    m_item_sp.reset();
1288d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata
1289247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
1290ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata    if (!valobj_sp)
1291ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
129232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
1293247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata    if (!valobj_sp)
1294247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata        return false;
129532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
129632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name,true));
129732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!item_ptr)
1298ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata        return false;
129932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (item_ptr->GetValueAsUnsigned(0) == 0)
1300689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata        return false;
130132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    Error err;
130232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
130352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_item_sp = ValueObject::CreateValueObjectFromAddress("item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, item_ptr->GetClangType().GetPointeeType());
130432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (err.Fail())
130532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        m_item_sp.reset();
1306d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata    return false;
1307689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1308689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1309689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
131032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::CalculateNumChildren ()
1311689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
131232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return 1;
1313689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1314689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1315689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP
131632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx)
1317689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
131832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (idx == 0)
131932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return m_item_sp;
132032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return lldb::ValueObjectSP();
1321689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1322689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1323689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool
132432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::MightHaveChildren ()
1325689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
1326689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata    return true;
1327689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1328689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1329689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t
133032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
1331689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
133232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (name == ConstString("item"))
133332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return 0;
133432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return UINT32_MAX;
1335689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1336689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
133732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::~VectorIteratorSyntheticFrontEnd ()
1338689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{
1339689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}
1340689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata
1341caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1342f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
1343caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata
1344caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool
1345f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
1346db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1347db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool
1348db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ;
1349db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
1350db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool
1351db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ;
1352