Coverage Report

Created: 2023-09-21 18:56

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/ObjC/NSSet.cpp
Line
Count
Source (jump to first uncovered line)
1
//===-- NSSet.cpp ---------------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "NSSet.h"
10
#include "CFBasicHash.h"
11
12
#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h"
13
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
14
#include "lldb/Core/ValueObject.h"
15
#include "lldb/Core/ValueObjectConstResult.h"
16
#include "lldb/DataFormatters/FormattersHelpers.h"
17
#include "lldb/Target/Language.h"
18
#include "lldb/Target/Target.h"
19
#include "lldb/Utility/DataBufferHeap.h"
20
#include "lldb/Utility/Endian.h"
21
#include "lldb/Utility/Status.h"
22
#include "lldb/Utility/Stream.h"
23
24
using namespace lldb;
25
using namespace lldb_private;
26
using namespace lldb_private::formatters;
27
28
std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
29
0
NSSet_Additionals::GetAdditionalSummaries() {
30
0
  static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
31
0
  return g_map;
32
0
}
33
34
std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
35
0
NSSet_Additionals::GetAdditionalSynthetics() {
36
0
  static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
37
0
      g_map;
38
0
  return g_map;
39
0
}
40
41
namespace lldb_private {
42
namespace formatters {
43
class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
44
public:
45
  NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
46
47
  ~NSSetISyntheticFrontEnd() override;
48
49
  size_t CalculateNumChildren() override;
50
51
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
52
53
  bool Update() override;
54
55
  bool MightHaveChildren() override;
56
57
  size_t GetIndexOfChildWithName(ConstString name) override;
58
59
private:
60
  struct DataDescriptor_32 {
61
    uint32_t _used : 26;
62
    uint32_t _szidx : 6;
63
  };
64
65
  struct DataDescriptor_64 {
66
    uint64_t _used : 58;
67
    uint32_t _szidx : 6;
68
  };
69
70
  struct SetItemDescriptor {
71
    lldb::addr_t item_ptr;
72
    lldb::ValueObjectSP valobj_sp;
73
  };
74
75
  ExecutionContextRef m_exe_ctx_ref;
76
  uint8_t m_ptr_size = 8;
77
  DataDescriptor_32 *m_data_32 = nullptr;
78
  DataDescriptor_64 *m_data_64 = nullptr;
79
  lldb::addr_t m_data_ptr = LLDB_INVALID_ADDRESS;
80
  std::vector<SetItemDescriptor> m_children;
81
};
82
83
class NSCFSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
84
public:
85
  NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
86
87
  size_t CalculateNumChildren() override;
88
89
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
90
91
  bool Update() override;
92
93
  bool MightHaveChildren() override;
94
95
  size_t GetIndexOfChildWithName(ConstString name) override;
96
97
private:
98
  struct SetItemDescriptor {
99
    lldb::addr_t item_ptr;
100
    lldb::ValueObjectSP valobj_sp;
101
  };
102
103
  ExecutionContextRef m_exe_ctx_ref;
104
  uint8_t m_ptr_size = 8;
105
  lldb::ByteOrder m_order = lldb::eByteOrderInvalid;
106
107
  CFBasicHash m_hashtable;
108
109
  CompilerType m_pair_type;
110
  std::vector<SetItemDescriptor> m_children;
111
};
112
113
template <typename D32, typename D64>
114
class GenericNSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
115
public:
116
  GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
117
118
  ~GenericNSSetMSyntheticFrontEnd() override;
119
120
  size_t CalculateNumChildren() override;
121
122
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
123
124
  bool Update() override;
125
126
  bool MightHaveChildren() override;
127
128
  size_t GetIndexOfChildWithName(ConstString name) override;
129
130
private:
131
132
  struct SetItemDescriptor {
133
    lldb::addr_t item_ptr;
134
    lldb::ValueObjectSP valobj_sp;
135
  };
136
137
  ExecutionContextRef m_exe_ctx_ref;
138
  uint8_t m_ptr_size = 8;
139
  D32 *m_data_32;
140
  D64 *m_data_64;
141
  std::vector<SetItemDescriptor> m_children;
142
};
143
  
144
namespace Foundation1300 {
145
  struct DataDescriptor_32 {
146
    uint32_t _used : 26;
147
    uint32_t _size;
148
    uint32_t _mutations;
149
    uint32_t _objs_addr;
150
  };
151
  
152
  struct DataDescriptor_64 {
153
    uint64_t _used : 58;
154
    uint64_t _size;
155
    uint64_t _mutations;
156
    uint64_t _objs_addr;
157
  };
158
  
159
  using NSSetMSyntheticFrontEnd =
160
      GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
161
}
162
  
163
namespace Foundation1428 {
164
  struct DataDescriptor_32 {
165
    uint32_t _used : 26;
166
    uint32_t _size;
167
    uint32_t _objs_addr;
168
    uint32_t _mutations;
169
  };
170
  
171
  struct DataDescriptor_64 {
172
    uint64_t _used : 58;
173
    uint64_t _size;
174
    uint64_t _objs_addr;
175
    uint64_t _mutations;
176
  };
177
  
178
  using NSSetMSyntheticFrontEnd =
179
      GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
180
}
181
  
182
namespace Foundation1437 {
183
  struct DataDescriptor_32 {
184
    uint32_t _cow;
185
    // __table storage
186
    uint32_t _objs_addr;
187
    uint32_t _muts;
188
    uint32_t _used : 26;
189
    uint32_t _szidx : 6;
190
  };
191
  
192
  struct DataDescriptor_64 {
193
    uint64_t _cow;
194
    // __Table storage
195
    uint64_t _objs_addr;
196
    uint32_t _muts;
197
    uint32_t _used : 26;
198
    uint32_t _szidx : 6;
199
  };
200
  
201
  using NSSetMSyntheticFrontEnd =
202
      GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
203
  
204
  template <typename DD>
205
  uint64_t
206
  __NSSetMSize_Impl(lldb_private::Process &process, lldb::addr_t valobj_addr,
207
32
                    Status &error) {
208
32
    const lldb::addr_t start_of_descriptor =
209
32
        valobj_addr + process.GetAddressByteSize();
210
32
    DD descriptor = DD();
211
32
    process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor),
212
32
                       error);
213
32
    if (error.Fail()) {
214
0
      return 0;
215
0
    }
216
32
    return descriptor._used;
217
32
  }
Unexecuted instantiation: unsigned long long lldb_private::formatters::Foundation1437::__NSSetMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor_32>(lldb_private::Process&, unsigned long long, lldb_private::Status&)
unsigned long long lldb_private::formatters::Foundation1437::__NSSetMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor_64>(lldb_private::Process&, unsigned long long, lldb_private::Status&)
Line
Count
Source
207
32
                    Status &error) {
208
32
    const lldb::addr_t start_of_descriptor =
209
32
        valobj_addr + process.GetAddressByteSize();
210
32
    DD descriptor = DD();
211
32
    process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor),
212
32
                       error);
213
32
    if (error.Fail()) {
214
0
      return 0;
215
0
    }
216
32
    return descriptor._used;
217
32
  }
218
  
219
  uint64_t
220
  __NSSetMSize(lldb_private::Process &process, lldb::addr_t valobj_addr,
221
32
               Status &error) {
222
32
    if (process.GetAddressByteSize() == 4) {
223
0
      return __NSSetMSize_Impl<DataDescriptor_32>(process, valobj_addr, error);
224
32
    } else {
225
32
      return __NSSetMSize_Impl<DataDescriptor_64>(process, valobj_addr, error);
226
32
    }
227
32
  }
228
}
229
  
230
class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
231
public:
232
  NSSetCodeRunningSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
233
234
  ~NSSetCodeRunningSyntheticFrontEnd() override;
235
236
  size_t CalculateNumChildren() override;
237
238
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
239
240
  bool Update() override;
241
242
  bool MightHaveChildren() override;
243
244
  size_t GetIndexOfChildWithName(ConstString name) override;
245
};
246
} // namespace formatters
247
} // namespace lldb_private
248
249
template <bool cf_style>
250
bool lldb_private::formatters::NSSetSummaryProvider(
251
68
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
252
68
  static constexpr llvm::StringLiteral g_TypeHint("NSSet");
253
254
68
  ProcessSP process_sp = valobj.GetProcessSP();
255
68
  if (!process_sp)
256
0
    return false;
257
258
68
  ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
259
260
68
  if (!runtime)
261
0
    return false;
262
263
68
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
264
68
      runtime->GetClassDescriptor(valobj));
265
266
68
  if (!descriptor || 
!descriptor->IsValid()62
)
267
6
    return false;
268
269
62
  uint32_t ptr_size = process_sp->GetAddressByteSize();
270
62
  bool is_64bit = (ptr_size == 8);
271
272
62
  lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
273
274
62
  if (!valobj_addr)
275
2
    return false;
276
277
60
  uint64_t value = 0;
278
279
60
  ConstString class_name(descriptor->GetClassName());
280
281
60
  static const ConstString g_SetI("__NSSetI");
282
60
  static const ConstString g_OrderedSetI("__NSOrderedSetI");
283
60
  static const ConstString g_SetM("__NSSetM");
284
60
  static const ConstString g_SetCF("__NSCFSet");
285
60
  static const ConstString g_SetCFRef("CFSetRef");
286
287
60
  if (class_name.IsEmpty())
288
0
    return false;
289
290
60
  if (class_name == g_SetI || 
class_name == g_OrderedSetI48
) {
291
16
    Status error;
292
16
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
293
16
                                                      ptr_size, 0, error);
294
16
    if (error.Fail())
295
0
      return false;
296
16
    value &= (is_64bit ? ~0xFC00000000000000UL : 
~0xFC000000U0
);
297
44
  } else if (class_name == g_SetM) {
298
32
    AppleObjCRuntime *apple_runtime =
299
32
        llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
300
32
    Status error;
301
32
    if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
302
32
      value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
303
32
    } else {
304
0
      value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
305
0
                                                        ptr_size, 0, error);
306
0
      value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
307
0
    }
308
32
    if (error.Fail())
309
0
      return false;
310
32
  } else 
if (12
class_name == g_SetCF12
||
class_name == g_SetCFRef0
) {
311
12
    ExecutionContext exe_ctx(process_sp);
312
12
    CFBasicHash cfbh;
313
12
    if (!cfbh.Update(valobj_addr, exe_ctx))
314
0
      return false;
315
12
    value = cfbh.GetCount();
316
12
  } else {
317
0
    auto &map(NSSet_Additionals::GetAdditionalSummaries());
318
0
    auto iter = map.find(class_name), end = map.end();
319
0
    if (iter != end)
320
0
      return iter->second(valobj, stream, options);
321
0
    else
322
0
      return false;
323
0
  }
324
325
60
  llvm::StringRef prefix, suffix;
326
60
  if (Language *language = Language::FindPlugin(options.GetLanguage()))
327
60
    std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
328
329
60
  stream << prefix;
330
60
  stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? 
""0
: "s");
331
60
  stream << suffix;
332
60
  return true;
333
60
}
bool lldb_private::formatters::NSSetSummaryProvider<true>(lldb_private::ValueObject&, lldb_private::Stream&, lldb_private::TypeSummaryOptions const&)
Line
Count
Source
251
6
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
252
6
  static constexpr llvm::StringLiteral g_TypeHint("NSSet");
253
254
6
  ProcessSP process_sp = valobj.GetProcessSP();
255
6
  if (!process_sp)
256
0
    return false;
257
258
6
  ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
259
260
6
  if (!runtime)
261
0
    return false;
262
263
6
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
264
6
      runtime->GetClassDescriptor(valobj));
265
266
6
  if (!descriptor || !descriptor->IsValid())
267
0
    return false;
268
269
6
  uint32_t ptr_size = process_sp->GetAddressByteSize();
270
6
  bool is_64bit = (ptr_size == 8);
271
272
6
  lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
273
274
6
  if (!valobj_addr)
275
0
    return false;
276
277
6
  uint64_t value = 0;
278
279
6
  ConstString class_name(descriptor->GetClassName());
280
281
6
  static const ConstString g_SetI("__NSSetI");
282
6
  static const ConstString g_OrderedSetI("__NSOrderedSetI");
283
6
  static const ConstString g_SetM("__NSSetM");
284
6
  static const ConstString g_SetCF("__NSCFSet");
285
6
  static const ConstString g_SetCFRef("CFSetRef");
286
287
6
  if (class_name.IsEmpty())
288
0
    return false;
289
290
6
  if (class_name == g_SetI || class_name == g_OrderedSetI) {
291
0
    Status error;
292
0
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
293
0
                                                      ptr_size, 0, error);
294
0
    if (error.Fail())
295
0
      return false;
296
0
    value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
297
6
  } else if (class_name == g_SetM) {
298
0
    AppleObjCRuntime *apple_runtime =
299
0
        llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
300
0
    Status error;
301
0
    if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
302
0
      value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
303
0
    } else {
304
0
      value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
305
0
                                                        ptr_size, 0, error);
306
0
      value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
307
0
    }
308
0
    if (error.Fail())
309
0
      return false;
310
6
  } else if (class_name == g_SetCF || 
class_name == g_SetCFRef0
) {
311
6
    ExecutionContext exe_ctx(process_sp);
312
6
    CFBasicHash cfbh;
313
6
    if (!cfbh.Update(valobj_addr, exe_ctx))
314
0
      return false;
315
6
    value = cfbh.GetCount();
316
6
  } else {
317
0
    auto &map(NSSet_Additionals::GetAdditionalSummaries());
318
0
    auto iter = map.find(class_name), end = map.end();
319
0
    if (iter != end)
320
0
      return iter->second(valobj, stream, options);
321
0
    else
322
0
      return false;
323
0
  }
324
325
6
  llvm::StringRef prefix, suffix;
326
6
  if (Language *language = Language::FindPlugin(options.GetLanguage()))
327
6
    std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
328
329
6
  stream << prefix;
330
6
  stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? 
""0
: "s");
331
6
  stream << suffix;
332
6
  return true;
333
6
}
bool lldb_private::formatters::NSSetSummaryProvider<false>(lldb_private::ValueObject&, lldb_private::Stream&, lldb_private::TypeSummaryOptions const&)
Line
Count
Source
251
62
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
252
62
  static constexpr llvm::StringLiteral g_TypeHint("NSSet");
253
254
62
  ProcessSP process_sp = valobj.GetProcessSP();
255
62
  if (!process_sp)
256
0
    return false;
257
258
62
  ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
259
260
62
  if (!runtime)
261
0
    return false;
262
263
62
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
264
62
      runtime->GetClassDescriptor(valobj));
265
266
62
  if (!descriptor || 
!descriptor->IsValid()56
)
267
6
    return false;
268
269
56
  uint32_t ptr_size = process_sp->GetAddressByteSize();
270
56
  bool is_64bit = (ptr_size == 8);
271
272
56
  lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
273
274
56
  if (!valobj_addr)
275
2
    return false;
276
277
54
  uint64_t value = 0;
278
279
54
  ConstString class_name(descriptor->GetClassName());
280
281
54
  static const ConstString g_SetI("__NSSetI");
282
54
  static const ConstString g_OrderedSetI("__NSOrderedSetI");
283
54
  static const ConstString g_SetM("__NSSetM");
284
54
  static const ConstString g_SetCF("__NSCFSet");
285
54
  static const ConstString g_SetCFRef("CFSetRef");
286
287
54
  if (class_name.IsEmpty())
288
0
    return false;
289
290
54
  if (class_name == g_SetI || 
class_name == g_OrderedSetI42
) {
291
16
    Status error;
292
16
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
293
16
                                                      ptr_size, 0, error);
294
16
    if (error.Fail())
295
0
      return false;
296
16
    value &= (is_64bit ? ~0xFC00000000000000UL : 
~0xFC000000U0
);
297
38
  } else if (class_name == g_SetM) {
298
32
    AppleObjCRuntime *apple_runtime =
299
32
        llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
300
32
    Status error;
301
32
    if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
302
32
      value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
303
32
    } else {
304
0
      value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
305
0
                                                        ptr_size, 0, error);
306
0
      value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
307
0
    }
308
32
    if (error.Fail())
309
0
      return false;
310
32
  } else 
if (6
class_name == g_SetCF6
||
class_name == g_SetCFRef0
) {
311
6
    ExecutionContext exe_ctx(process_sp);
312
6
    CFBasicHash cfbh;
313
6
    if (!cfbh.Update(valobj_addr, exe_ctx))
314
0
      return false;
315
6
    value = cfbh.GetCount();
316
6
  } else {
317
0
    auto &map(NSSet_Additionals::GetAdditionalSummaries());
318
0
    auto iter = map.find(class_name), end = map.end();
319
0
    if (iter != end)
320
0
      return iter->second(valobj, stream, options);
321
0
    else
322
0
      return false;
323
0
  }
324
325
54
  llvm::StringRef prefix, suffix;
326
54
  if (Language *language = Language::FindPlugin(options.GetLanguage()))
327
54
    std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
328
329
54
  stream << prefix;
330
54
  stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? 
""0
: "s");
331
54
  stream << suffix;
332
54
  return true;
333
54
}
334
335
SyntheticChildrenFrontEnd *
336
lldb_private::formatters::NSSetSyntheticFrontEndCreator(
337
84
    CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) {
338
84
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
339
84
  if (!process_sp)
340
0
    return nullptr;
341
84
  ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
342
84
  if (!runtime)
343
0
    return nullptr;
344
345
84
  CompilerType valobj_type(valobj_sp->GetCompilerType());
346
84
  Flags flags(valobj_type.GetTypeInfo());
347
348
84
  if (flags.IsClear(eTypeIsPointer)) {
349
8
    Status error;
350
8
    valobj_sp = valobj_sp->AddressOf(error);
351
8
    if (error.Fail() || !valobj_sp)
352
0
      return nullptr;
353
8
  }
354
355
84
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
356
84
      runtime->GetClassDescriptor(*valobj_sp));
357
358
84
  if (!descriptor || !descriptor->IsValid())
359
0
    return nullptr;
360
361
84
  ConstString class_name = descriptor->GetClassName();
362
363
84
  static const ConstString g_SetI("__NSSetI");
364
84
  static const ConstString g_OrderedSetI("__NSOrderedSetI");
365
84
  static const ConstString g_SetM("__NSSetM");
366
84
  static const ConstString g_SetCF("__NSCFSet");
367
84
  static const ConstString g_SetCFRef("CFSetRef");
368
369
84
  if (class_name.IsEmpty())
370
0
    return nullptr;
371
372
84
  if (class_name == g_SetI || 
class_name == g_OrderedSetI64
) {
373
32
    return (new NSSetISyntheticFrontEnd(valobj_sp));
374
52
  } else if (class_name == g_SetM) {
375
36
    AppleObjCRuntime *apple_runtime =
376
36
        llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
377
36
    if (apple_runtime) {
378
36
      if (apple_runtime->GetFoundationVersion() >= 1437)
379
36
        return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp));
380
0
      else if (apple_runtime->GetFoundationVersion() >= 1428)
381
0
        return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp));
382
0
      else
383
0
        return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
384
36
    } else {
385
0
      return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
386
0
    }
387
36
  } else 
if (16
class_name == g_SetCF16
||
class_name == g_SetCFRef0
) {
388
16
    return (new NSCFSetSyntheticFrontEnd(valobj_sp));
389
16
  } else {
390
0
    auto &map(NSSet_Additionals::GetAdditionalSynthetics());
391
0
    auto iter = map.find(class_name), end = map.end();
392
0
    if (iter != end)
393
0
      return iter->second(synth, valobj_sp);
394
0
    return nullptr;
395
0
  }
396
84
}
397
398
lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd(
399
    lldb::ValueObjectSP valobj_sp)
400
32
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref() {
401
32
  if (valobj_sp)
402
32
    Update();
403
32
}
404
405
32
lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() {
406
32
  delete m_data_32;
407
32
  m_data_32 = nullptr;
408
32
  delete m_data_64;
409
32
  m_data_64 = nullptr;
410
32
}
411
412
size_t
413
lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName(
414
0
    ConstString name) {
415
0
  const char *item_name = name.GetCString();
416
0
  uint32_t idx = ExtractIndexFromString(item_name);
417
0
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
418
0
    return UINT32_MAX;
419
0
  return idx;
420
0
}
421
422
size_t
423
36
lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren() {
424
36
  if (!m_data_32 && !m_data_64)
425
0
    return 0;
426
36
  return (m_data_32 ? 
m_data_32->_used0
: m_data_64->_used);
427
36
}
428
429
52
bool lldb_private::formatters::NSSetISyntheticFrontEnd::Update() {
430
52
  m_children.clear();
431
52
  delete m_data_32;
432
52
  m_data_32 = nullptr;
433
52
  delete m_data_64;
434
52
  m_data_64 = nullptr;
435
52
  m_ptr_size = 0;
436
52
  ValueObjectSP valobj_sp = m_backend.GetSP();
437
52
  if (!valobj_sp)
438
0
    return false;
439
52
  if (!valobj_sp)
440
0
    return false;
441
52
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
442
52
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
443
52
  if (!process_sp)
444
0
    return false;
445
52
  m_ptr_size = process_sp->GetAddressByteSize();
446
52
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
447
52
  Status error;
448
52
  if (m_ptr_size == 4) {
449
0
    m_data_32 = new DataDescriptor_32();
450
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32),
451
0
                           error);
452
52
  } else {
453
52
    m_data_64 = new DataDescriptor_64();
454
52
    process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64),
455
52
                           error);
456
52
  }
457
52
  if (error.Fail())
458
0
    return false;
459
52
  m_data_ptr = data_location + m_ptr_size;
460
52
  return true;
461
52
}
462
463
0
bool lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren() {
464
0
  return true;
465
0
}
466
467
lldb::ValueObjectSP
468
28
lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex(size_t idx) {
469
28
  uint32_t num_children = CalculateNumChildren();
470
471
28
  if (idx >= num_children)
472
0
    return lldb::ValueObjectSP();
473
474
28
  ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
475
28
  if (!process_sp)
476
0
    return lldb::ValueObjectSP();
477
478
28
  if (m_children.empty()) {
479
    // do the scan phase
480
8
    lldb::addr_t obj_at_idx = 0;
481
482
8
    uint32_t tries = 0;
483
8
    uint32_t test_idx = 0;
484
485
48
    while (tries < num_children) {
486
40
      obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
487
40
      if (!process_sp)
488
0
        return lldb::ValueObjectSP();
489
40
      Status error;
490
40
      obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
491
40
      if (error.Fail())
492
0
        return lldb::ValueObjectSP();
493
494
40
      test_idx++;
495
496
40
      if (!obj_at_idx)
497
12
        continue;
498
28
      tries++;
499
500
28
      SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
501
502
28
      m_children.push_back(descriptor);
503
28
    }
504
8
  }
505
506
28
  if (idx >= m_children.size()) // should never happen
507
0
    return lldb::ValueObjectSP();
508
509
28
  SetItemDescriptor &set_item = m_children[idx];
510
28
  if (!set_item.valobj_sp) {
511
28
    auto ptr_size = process_sp->GetAddressByteSize();
512
28
    DataBufferHeap buffer(ptr_size, 0);
513
28
    switch (ptr_size) {
514
0
    case 0: // architecture has no clue - fail
515
0
      return lldb::ValueObjectSP();
516
0
    case 4:
517
0
      *reinterpret_cast<uint32_t *>(buffer.GetBytes()) =
518
0
          static_cast<uint32_t>(set_item.item_ptr);
519
0
      break;
520
28
    case 8:
521
28
      *reinterpret_cast<uint64_t *>(buffer.GetBytes()) =
522
28
          static_cast<uint64_t>(set_item.item_ptr);
523
28
      break;
524
0
    default:
525
0
      lldbassert(false && "pointer size is not 4 nor 8");
526
28
    }
527
28
    StreamString idx_name;
528
28
    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
529
530
28
    DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
531
28
                       process_sp->GetByteOrder(),
532
28
                       process_sp->GetAddressByteSize());
533
534
28
    set_item.valobj_sp = CreateValueObjectFromData(
535
28
        idx_name.GetString(), data, m_exe_ctx_ref,
536
28
        m_backend.GetCompilerType().GetBasicTypeFromAST(
537
28
            lldb::eBasicTypeObjCID));
538
28
  }
539
28
  return set_item.valobj_sp;
540
28
}
541
542
lldb_private::formatters::NSCFSetSyntheticFrontEnd::NSCFSetSyntheticFrontEnd(
543
    lldb::ValueObjectSP valobj_sp)
544
16
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_hashtable(),
545
16
      m_pair_type() {}
546
547
size_t
548
lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetIndexOfChildWithName(
549
0
    ConstString name) {
550
0
  const char *item_name = name.GetCString();
551
0
  const uint32_t idx = ExtractIndexFromString(item_name);
552
0
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
553
0
    return UINT32_MAX;
554
0
  return idx;
555
0
}
556
557
size_t
558
12
lldb_private::formatters::NSCFSetSyntheticFrontEnd::CalculateNumChildren() {
559
12
  if (!m_hashtable.IsValid())
560
0
    return 0;
561
12
  return m_hashtable.GetCount();
562
12
}
563
564
16
bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::Update() {
565
16
  m_children.clear();
566
16
  ValueObjectSP valobj_sp = m_backend.GetSP();
567
16
  m_ptr_size = 0;
568
16
  if (!valobj_sp)
569
0
    return false;
570
16
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
571
572
16
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
573
16
  if (!process_sp)
574
0
    return false;
575
16
  m_ptr_size = process_sp->GetAddressByteSize();
576
16
  m_order = process_sp->GetByteOrder();
577
16
  return m_hashtable.Update(valobj_sp->GetValueAsUnsigned(0), m_exe_ctx_ref);
578
16
}
579
580
0
bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::MightHaveChildren() {
581
0
  return true;
582
0
}
583
584
lldb::ValueObjectSP
585
lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetChildAtIndex(
586
8
    size_t idx) {
587
8
  lldb::addr_t m_values_ptr = m_hashtable.GetValuePointer();
588
589
8
  const uint32_t num_children = CalculateNumChildren();
590
591
8
  if (idx >= num_children)
592
0
    return lldb::ValueObjectSP();
593
594
8
  if (m_children.empty()) {
595
4
    ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
596
4
    if (!process_sp)
597
0
      return lldb::ValueObjectSP();
598
599
4
    Status error;
600
4
    lldb::addr_t val_at_idx = 0;
601
602
4
    uint32_t tries = 0;
603
4
    uint32_t test_idx = 0;
604
605
    // Iterate over inferior memory, reading value pointers by shifting the
606
    // cursor by test_index * m_ptr_size. Returns an empty ValueObject if a read
607
    // fails, otherwise, continue until the number of tries matches the number
608
    // of childen.
609
12
    while (tries < num_children) {
610
8
      val_at_idx = m_values_ptr + (test_idx * m_ptr_size);
611
612
8
      val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
613
8
      if (error.Fail())
614
0
        return lldb::ValueObjectSP();
615
616
8
      test_idx++;
617
618
8
      if (!val_at_idx)
619
0
        continue;
620
8
      tries++;
621
622
8
      SetItemDescriptor descriptor = {val_at_idx, lldb::ValueObjectSP()};
623
624
8
      m_children.push_back(descriptor);
625
8
    }
626
4
  }
627
628
8
  if (idx >= m_children.size()) // should never happen
629
0
    return lldb::ValueObjectSP();
630
631
8
  SetItemDescriptor &set_item = m_children[idx];
632
8
  if (!set_item.valobj_sp) {
633
634
8
    WritableDataBufferSP buffer_sp(new DataBufferHeap(m_ptr_size, 0));
635
636
8
    switch (m_ptr_size) {
637
0
    case 0: // architecture has no clue - fail
638
0
      return lldb::ValueObjectSP();
639
0
    case 4:
640
0
      *reinterpret_cast<uint32_t *>(buffer_sp->GetBytes()) =
641
0
          static_cast<uint32_t>(set_item.item_ptr);
642
0
      break;
643
8
    case 8:
644
8
      *reinterpret_cast<uint64_t *>(buffer_sp->GetBytes()) =
645
8
          static_cast<uint64_t>(set_item.item_ptr);
646
8
      break;
647
0
    default:
648
0
      lldbassert(false && "pointer size is not 4 nor 8");
649
8
    }
650
8
    StreamString idx_name;
651
8
    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
652
653
8
    DataExtractor data(buffer_sp, m_order, m_ptr_size);
654
655
8
    set_item.valobj_sp = CreateValueObjectFromData(
656
8
        idx_name.GetString(), data, m_exe_ctx_ref,
657
8
        m_backend.GetCompilerType().GetBasicTypeFromAST(
658
8
            lldb::eBasicTypeObjCID));
659
8
  }
660
661
8
  return set_item.valobj_sp;
662
8
}
663
664
template <typename D32, typename D64>
665
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<
666
    D32, D64>::GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
667
36
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(),
668
36
      m_data_32(nullptr), m_data_64(nullptr) {
669
36
  if (valobj_sp)
670
36
    Update();
671
36
}
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Line
Count
Source
667
36
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(),
668
36
      m_data_32(nullptr), m_data_64(nullptr) {
669
36
  if (valobj_sp)
670
36
    Update();
671
36
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
672
673
template <typename D32, typename D64>
674
lldb_private::formatters::
675
36
  GenericNSSetMSyntheticFrontEnd<D32, D64>::~GenericNSSetMSyntheticFrontEnd<D32, D64>() {
676
36
  delete m_data_32;
677
36
  m_data_32 = nullptr;
678
36
  delete m_data_64;
679
36
  m_data_64 = nullptr;
680
36
}
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd()
Line
Count
Source
675
36
  GenericNSSetMSyntheticFrontEnd<D32, D64>::~GenericNSSetMSyntheticFrontEnd<D32, D64>() {
676
36
  delete m_data_32;
677
36
  m_data_32 = nullptr;
678
36
  delete m_data_64;
679
36
  m_data_64 = nullptr;
680
36
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd()
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd()
681
682
template <typename D32, typename D64>
683
size_t
684
lldb_private::formatters::
685
  GenericNSSetMSyntheticFrontEnd<D32, D64>::GetIndexOfChildWithName(
686
0
    ConstString name) {
687
0
  const char *item_name = name.GetCString();
688
0
  uint32_t idx = ExtractIndexFromString(item_name);
689
0
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
690
0
    return UINT32_MAX;
691
0
  return idx;
692
0
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString)
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString)
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString)
693
694
template <typename D32, typename D64>
695
size_t
696
lldb_private::formatters::
697
80
  GenericNSSetMSyntheticFrontEnd<D32, D64>::CalculateNumChildren() {
698
80
  if (!m_data_32 && !m_data_64)
699
0
    return 0;
700
80
  return (m_data_32 ? 
m_data_32->_used0
: m_data_64->_used);
701
80
}
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::CalculateNumChildren()
Line
Count
Source
697
80
  GenericNSSetMSyntheticFrontEnd<D32, D64>::CalculateNumChildren() {
698
80
  if (!m_data_32 && !m_data_64)
699
0
    return 0;
700
80
  return (m_data_32 ? 
m_data_32->_used0
: m_data_64->_used);
701
80
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::CalculateNumChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::CalculateNumChildren()
702
703
template <typename D32, typename D64>
704
bool
705
lldb_private::formatters::
706
56
  GenericNSSetMSyntheticFrontEnd<D32, D64>::Update() {
707
56
  m_children.clear();
708
56
  ValueObjectSP valobj_sp = m_backend.GetSP();
709
56
  m_ptr_size = 0;
710
56
  delete m_data_32;
711
56
  m_data_32 = nullptr;
712
56
  delete m_data_64;
713
56
  m_data_64 = nullptr;
714
56
  if (!valobj_sp)
715
0
    return false;
716
56
  if (!valobj_sp)
717
0
    return false;
718
56
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
719
56
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
720
56
  if (!process_sp)
721
0
    return false;
722
56
  m_ptr_size = process_sp->GetAddressByteSize();
723
56
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
724
56
  Status error;
725
56
  if (m_ptr_size == 4) {
726
0
    m_data_32 = new D32();
727
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
728
0
                           error);
729
56
  } else {
730
56
    m_data_64 = new D64();
731
56
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
732
56
                           error);
733
56
  }
734
56
  return error.Success();
735
56
}
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::Update()
Line
Count
Source
706
56
  GenericNSSetMSyntheticFrontEnd<D32, D64>::Update() {
707
56
  m_children.clear();
708
56
  ValueObjectSP valobj_sp = m_backend.GetSP();
709
56
  m_ptr_size = 0;
710
56
  delete m_data_32;
711
56
  m_data_32 = nullptr;
712
56
  delete m_data_64;
713
56
  m_data_64 = nullptr;
714
56
  if (!valobj_sp)
715
0
    return false;
716
56
  if (!valobj_sp)
717
0
    return false;
718
56
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
719
56
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
720
56
  if (!process_sp)
721
0
    return false;
722
56
  m_ptr_size = process_sp->GetAddressByteSize();
723
56
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
724
56
  Status error;
725
56
  if (m_ptr_size == 4) {
726
0
    m_data_32 = new D32();
727
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
728
0
                           error);
729
56
  } else {
730
56
    m_data_64 = new D64();
731
56
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
732
56
                           error);
733
56
  }
734
56
  return error.Success();
735
56
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::Update()
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::Update()
736
737
template <typename D32, typename D64>
738
bool
739
lldb_private::formatters::
740
0
  GenericNSSetMSyntheticFrontEnd<D32, D64>::MightHaveChildren() {
741
0
  return true;
742
0
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::MightHaveChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::MightHaveChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::MightHaveChildren()
743
744
template <typename D32, typename D64>
745
lldb::ValueObjectSP
746
lldb_private::formatters::
747
68
  GenericNSSetMSyntheticFrontEnd<D32, D64>::GetChildAtIndex(size_t idx) {
748
68
  lldb::addr_t m_objs_addr =
749
68
      (m_data_32 ? 
m_data_32->_objs_addr0
: m_data_64->_objs_addr);
750
751
68
  uint32_t num_children = CalculateNumChildren();
752
753
68
  if (idx >= num_children)
754
0
    return lldb::ValueObjectSP();
755
756
68
  ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
757
68
  if (!process_sp)
758
0
    return lldb::ValueObjectSP();
759
760
68
  if (m_children.empty()) {
761
    // do the scan phase
762
12
    lldb::addr_t obj_at_idx = 0;
763
764
12
    uint32_t tries = 0;
765
12
    uint32_t test_idx = 0;
766
767
160
    while (tries < num_children) {
768
148
      obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
769
148
      if (!process_sp)
770
0
        return lldb::ValueObjectSP();
771
148
      Status error;
772
148
      obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
773
148
      if (error.Fail())
774
0
        return lldb::ValueObjectSP();
775
776
148
      test_idx++;
777
778
148
      if (!obj_at_idx)
779
80
        continue;
780
68
      tries++;
781
782
68
      SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
783
784
68
      m_children.push_back(descriptor);
785
68
    }
786
12
  }
787
788
68
  if (idx >= m_children.size()) // should never happen
789
0
    return lldb::ValueObjectSP();
790
791
68
  SetItemDescriptor &set_item = m_children[idx];
792
68
  if (!set_item.valobj_sp) {
793
68
    auto ptr_size = process_sp->GetAddressByteSize();
794
68
    DataBufferHeap buffer(ptr_size, 0);
795
68
    switch (ptr_size) {
796
0
    case 0: // architecture has no clue?? - fail
797
0
      return lldb::ValueObjectSP();
798
0
    case 4:
799
0
      *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
800
0
      break;
801
68
    case 8:
802
68
      *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
803
68
      break;
804
0
    default:
805
0
      assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
806
68
    }
807
68
    StreamString idx_name;
808
68
    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
809
810
68
    DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
811
68
                       process_sp->GetByteOrder(),
812
68
                       process_sp->GetAddressByteSize());
813
814
68
    set_item.valobj_sp = CreateValueObjectFromData(
815
68
        idx_name.GetString(), data, m_exe_ctx_ref,
816
68
        m_backend.GetCompilerType().GetBasicTypeFromAST(
817
68
            lldb::eBasicTypeObjCID));
818
68
  }
819
68
  return set_item.valobj_sp;
820
68
}
lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GetChildAtIndex(unsigned long)
Line
Count
Source
747
68
  GenericNSSetMSyntheticFrontEnd<D32, D64>::GetChildAtIndex(size_t idx) {
748
68
  lldb::addr_t m_objs_addr =
749
68
      (m_data_32 ? 
m_data_32->_objs_addr0
: m_data_64->_objs_addr);
750
751
68
  uint32_t num_children = CalculateNumChildren();
752
753
68
  if (idx >= num_children)
754
0
    return lldb::ValueObjectSP();
755
756
68
  ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
757
68
  if (!process_sp)
758
0
    return lldb::ValueObjectSP();
759
760
68
  if (m_children.empty()) {
761
    // do the scan phase
762
12
    lldb::addr_t obj_at_idx = 0;
763
764
12
    uint32_t tries = 0;
765
12
    uint32_t test_idx = 0;
766
767
160
    while (tries < num_children) {
768
148
      obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
769
148
      if (!process_sp)
770
0
        return lldb::ValueObjectSP();
771
148
      Status error;
772
148
      obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
773
148
      if (error.Fail())
774
0
        return lldb::ValueObjectSP();
775
776
148
      test_idx++;
777
778
148
      if (!obj_at_idx)
779
80
        continue;
780
68
      tries++;
781
782
68
      SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
783
784
68
      m_children.push_back(descriptor);
785
68
    }
786
12
  }
787
788
68
  if (idx >= m_children.size()) // should never happen
789
0
    return lldb::ValueObjectSP();
790
791
68
  SetItemDescriptor &set_item = m_children[idx];
792
68
  if (!set_item.valobj_sp) {
793
68
    auto ptr_size = process_sp->GetAddressByteSize();
794
68
    DataBufferHeap buffer(ptr_size, 0);
795
68
    switch (ptr_size) {
796
0
    case 0: // architecture has no clue?? - fail
797
0
      return lldb::ValueObjectSP();
798
0
    case 4:
799
0
      *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
800
0
      break;
801
68
    case 8:
802
68
      *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
803
68
      break;
804
0
    default:
805
0
      assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
806
68
    }
807
68
    StreamString idx_name;
808
68
    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
809
810
68
    DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
811
68
                       process_sp->GetByteOrder(),
812
68
                       process_sp->GetAddressByteSize());
813
814
68
    set_item.valobj_sp = CreateValueObjectFromData(
815
68
        idx_name.GetString(), data, m_exe_ctx_ref,
816
68
        m_backend.GetCompilerType().GetBasicTypeFromAST(
817
68
            lldb::eBasicTypeObjCID));
818
68
  }
819
68
  return set_item.valobj_sp;
820
68
}
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GetChildAtIndex(unsigned long)
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GetChildAtIndex(unsigned long)
821
822
template bool lldb_private::formatters::NSSetSummaryProvider<true>(
823
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);
824
825
template bool lldb_private::formatters::NSSetSummaryProvider<false>(
826
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);