blob: c28821788ac2a771b0f365fe76202f09c8e4b2ef [file] [log] [blame]
Enrico Granataf615b802013-02-15 23:38:37 +00001//===-- NSArray.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eugene Zelenko8d15f332015-10-20 01:10:59 +000010// C Includes
11// C++ Includes
12// Other libraries and framework includes
13#include "clang/AST/ASTContext.h"
14
15// Project includes
Enrico Granata170c3952015-09-14 22:18:32 +000016#include "Cocoa.h"
Enrico Granataf615b802013-02-15 23:38:37 +000017
Enrico Granataf615b802013-02-15 23:38:37 +000018#include "lldb/Core/DataBufferHeap.h"
19#include "lldb/Core/Error.h"
20#include "lldb/Core/Stream.h"
21#include "lldb/Core/ValueObject.h"
22#include "lldb/Core/ValueObjectConstResult.h"
Enrico Granata419d7912015-09-04 00:33:51 +000023#include "lldb/DataFormatters/FormattersHelpers.h"
Jim Ingham151c0322015-09-15 21:13:50 +000024#include "lldb/Expression/FunctionCaller.h"
Enrico Granataf615b802013-02-15 23:38:37 +000025#include "lldb/Host/Endian.h"
26#include "lldb/Symbol/ClangASTContext.h"
Enrico Granata675f49b2015-10-07 18:36:53 +000027#include "lldb/Target/Language.h"
Enrico Granataf615b802013-02-15 23:38:37 +000028#include "lldb/Target/ObjCLanguageRuntime.h"
Jason Molenda705b1802014-06-13 02:37:02 +000029#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h"
Enrico Granataf615b802013-02-15 23:38:37 +000030#include "lldb/Target/Target.h"
31
32using namespace lldb;
33using namespace lldb_private;
34using namespace lldb_private::formatters;
35
Jason Molenda705b1802014-06-13 02:37:02 +000036namespace lldb_private {
37 namespace formatters {
38 class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
39 {
40 public:
41 NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
Eugene Zelenko8d15f332015-10-20 01:10:59 +000042
43 ~NSArrayMSyntheticFrontEnd() override = default;
44
45 size_t
46 CalculateNumChildren() override;
Jason Molenda705b1802014-06-13 02:37:02 +000047
Eugene Zelenko8d15f332015-10-20 01:10:59 +000048 lldb::ValueObjectSP
49 GetChildAtIndex(size_t idx) override;
Jason Molenda705b1802014-06-13 02:37:02 +000050
Eugene Zelenko8d15f332015-10-20 01:10:59 +000051 bool
52 Update() override = 0;
Jason Molenda705b1802014-06-13 02:37:02 +000053
Eugene Zelenko8d15f332015-10-20 01:10:59 +000054 bool
55 MightHaveChildren() override;
Jason Molenda705b1802014-06-13 02:37:02 +000056
Eugene Zelenko8d15f332015-10-20 01:10:59 +000057 size_t
58 GetIndexOfChildWithName(const ConstString &name) override;
Jason Molenda705b1802014-06-13 02:37:02 +000059
60 protected:
61 virtual lldb::addr_t
62 GetDataAddress () = 0;
63
64 virtual uint64_t
65 GetUsedCount () = 0;
66
67 virtual uint64_t
68 GetOffset () = 0;
69
70 virtual uint64_t
71 GetSize () = 0;
72
73 ExecutionContextRef m_exe_ctx_ref;
74 uint8_t m_ptr_size;
Greg Claytona1e5dc82015-08-11 22:53:00 +000075 CompilerType m_id_type;
Jason Molenda705b1802014-06-13 02:37:02 +000076 std::vector<lldb::ValueObjectSP> m_children;
77 };
78
79 class NSArrayMSyntheticFrontEnd_109 : public NSArrayMSyntheticFrontEnd
80 {
Eugene Zelenko8d15f332015-10-20 01:10:59 +000081 public:
82 NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp);
83
84 ~NSArrayMSyntheticFrontEnd_109() override;
85
86 bool
87 Update() override;
88
89 protected:
90 lldb::addr_t
91 GetDataAddress() override;
92
93 uint64_t
94 GetUsedCount() override;
95
96 uint64_t
97 GetOffset() override;
98
99 uint64_t
100 GetSize() override;
101
Jason Molenda705b1802014-06-13 02:37:02 +0000102 private:
103 struct DataDescriptor_32
104 {
105 uint32_t _used;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000106 uint32_t _priv1 : 2;
Jason Molenda705b1802014-06-13 02:37:02 +0000107 uint32_t _size : 30;
108 uint32_t _priv2 : 2;
109 uint32_t _offset : 30;
110 uint32_t _priv3;
111 uint32_t _data;
112 };
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000113
Jason Molenda705b1802014-06-13 02:37:02 +0000114 struct DataDescriptor_64
115 {
116 uint64_t _used;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000117 uint64_t _priv1 : 2;
Jason Molenda705b1802014-06-13 02:37:02 +0000118 uint64_t _size : 62;
119 uint64_t _priv2 : 2;
120 uint64_t _offset : 62;
121 uint32_t _priv3;
122 uint64_t _data;
123 };
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000124
Jason Molenda705b1802014-06-13 02:37:02 +0000125 DataDescriptor_32 *m_data_32;
126 DataDescriptor_64 *m_data_64;
127 };
128
129 class NSArrayMSyntheticFrontEnd_1010 : public NSArrayMSyntheticFrontEnd
130 {
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000131 public:
132 NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp);
133
134 ~NSArrayMSyntheticFrontEnd_1010() override;
135
136 bool
137 Update() override;
138
139 protected:
140 lldb::addr_t
141 GetDataAddress() override;
142
143 uint64_t
144 GetUsedCount() override;
145
146 uint64_t
147 GetOffset() override;
148
149 uint64_t
150 GetSize() override;
151
Jason Molenda705b1802014-06-13 02:37:02 +0000152 private:
153 struct DataDescriptor_32
154 {
155 uint32_t _used;
156 uint32_t _offset;
157 uint32_t _size : 28;
158 uint64_t _priv1 : 4;
159 uint32_t _priv2;
160 uint32_t _data;
161 };
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000162
Jason Molenda705b1802014-06-13 02:37:02 +0000163 struct DataDescriptor_64
164 {
165 uint64_t _used;
166 uint64_t _offset;
167 uint64_t _size : 60;
168 uint64_t _priv1 : 4;
169 uint32_t _priv2;
170 uint64_t _data;
171 };
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000172
Jason Molenda705b1802014-06-13 02:37:02 +0000173 DataDescriptor_32 *m_data_32;
174 DataDescriptor_64 *m_data_64;
175 };
176
177 class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
178 {
179 public:
180 NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000181
182 ~NSArrayISyntheticFrontEnd() override = default;
183
184 size_t
185 CalculateNumChildren() override;
Jason Molenda705b1802014-06-13 02:37:02 +0000186
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000187 lldb::ValueObjectSP
188 GetChildAtIndex(size_t idx) override;
Jason Molenda705b1802014-06-13 02:37:02 +0000189
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000190 bool
191 Update() override;
Jason Molenda705b1802014-06-13 02:37:02 +0000192
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000193 bool
194 MightHaveChildren() override;
Jason Molenda705b1802014-06-13 02:37:02 +0000195
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000196 size_t
197 GetIndexOfChildWithName(const ConstString &name) override;
198
Jason Molenda705b1802014-06-13 02:37:02 +0000199 private:
200 ExecutionContextRef m_exe_ctx_ref;
201 uint8_t m_ptr_size;
202 uint64_t m_items;
203 lldb::addr_t m_data_ptr;
Greg Claytona1e5dc82015-08-11 22:53:00 +0000204 CompilerType m_id_type;
Jason Molenda705b1802014-06-13 02:37:02 +0000205 std::vector<lldb::ValueObjectSP> m_children;
206 };
207
Enrico Granatabbf1da32015-10-14 22:45:04 +0000208 class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd
209 {
210 public:
211 NSArray0SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000212
213 ~NSArray0SyntheticFrontEnd() override = default;
214
215 size_t
216 CalculateNumChildren() override;
Enrico Granatabbf1da32015-10-14 22:45:04 +0000217
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000218 lldb::ValueObjectSP
219 GetChildAtIndex(size_t idx) override;
Enrico Granatabbf1da32015-10-14 22:45:04 +0000220
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000221 bool
222 Update() override;
Enrico Granatabbf1da32015-10-14 22:45:04 +0000223
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000224 bool
225 MightHaveChildren() override;
Enrico Granatabbf1da32015-10-14 22:45:04 +0000226
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000227 size_t
228 GetIndexOfChildWithName(const ConstString &name) override;
Enrico Granatabbf1da32015-10-14 22:45:04 +0000229 };
Enrico Granata936499a2016-02-29 21:06:50 +0000230
231 class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd
232 {
233 public:
234 NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
235
236 ~NSArray1SyntheticFrontEnd() override = default;
237
238 size_t
239 CalculateNumChildren() override;
240
241 lldb::ValueObjectSP
242 GetChildAtIndex(size_t idx) override;
243
244 bool
245 Update() override;
246
247 bool
248 MightHaveChildren() override;
249
250 size_t
251 GetIndexOfChildWithName(const ConstString &name) override;
252 };
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000253 } // namespace formatters
254} // namespace lldb_private
Jason Molenda705b1802014-06-13 02:37:02 +0000255
Enrico Granataf615b802013-02-15 23:38:37 +0000256bool
Enrico Granataf35bc632014-11-06 21:55:30 +0000257lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
Enrico Granataf615b802013-02-15 23:38:37 +0000258{
Enrico Granata675f49b2015-10-07 18:36:53 +0000259 static ConstString g_TypeHint("NSArray");
260
Enrico Granataf615b802013-02-15 23:38:37 +0000261 ProcessSP process_sp = valobj.GetProcessSP();
262 if (!process_sp)
263 return false;
264
265 ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
266
267 if (!runtime)
268 return false;
269
270 ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
271
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000272 if (!descriptor || !descriptor->IsValid())
Enrico Granataf615b802013-02-15 23:38:37 +0000273 return false;
274
275 uint32_t ptr_size = process_sp->GetAddressByteSize();
276
277 lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
278
279 if (!valobj_addr)
280 return false;
281
282 uint64_t value = 0;
283
Enrico Granata936499a2016-02-29 21:06:50 +0000284 ConstString class_name(descriptor->GetClassName());
Enrico Granataf615b802013-02-15 23:38:37 +0000285
Enrico Granata936499a2016-02-29 21:06:50 +0000286 static const ConstString g_NSArrayI("__NSArrayI");
287 static const ConstString g_NSArrayM("__NSArrayM");
288 static const ConstString g_NSArray0("__NSArray0");
289 static const ConstString g_NSArray1("__NSSingleObjectArrayI");
290 static const ConstString g_NSArrayCF("__NSCFArray");
291
292 if (class_name.IsEmpty())
Enrico Granataf615b802013-02-15 23:38:37 +0000293 return false;
294
Enrico Granata936499a2016-02-29 21:06:50 +0000295 if (class_name == g_NSArrayI)
Enrico Granataf615b802013-02-15 23:38:37 +0000296 {
297 Error error;
298 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
299 if (error.Fail())
300 return false;
301 }
Enrico Granata936499a2016-02-29 21:06:50 +0000302 else if (class_name == g_NSArrayM)
Enrico Granataf615b802013-02-15 23:38:37 +0000303 {
304 Error error;
305 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
306 if (error.Fail())
307 return false;
308 }
Enrico Granata936499a2016-02-29 21:06:50 +0000309 else if (class_name == g_NSArray0)
Enrico Granatabbf1da32015-10-14 22:45:04 +0000310 {
311 value = 0;
312 }
Enrico Granata936499a2016-02-29 21:06:50 +0000313 else if (class_name == g_NSArray1)
314 {
315 value = 1;
316 }
317 else if (class_name == g_NSArrayCF)
Enrico Granataf615b802013-02-15 23:38:37 +0000318 {
319 Error error;
320 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error);
321 if (error.Fail())
322 return false;
323 }
324 else
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000325 return false;
Enrico Granataf615b802013-02-15 23:38:37 +0000326
Enrico Granata675f49b2015-10-07 18:36:53 +0000327 std::string prefix,suffix;
328 if (Language* language = Language::FindPlugin(options.GetLanguage()))
329 {
330 if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix))
331 {
332 prefix.clear();
333 suffix.clear();
334 }
335 }
336
337 stream.Printf("%s%" PRIu64 " %s%s%s",
338 prefix.c_str(),
Enrico Granataf615b802013-02-15 23:38:37 +0000339 value,
Enrico Granata675f49b2015-10-07 18:36:53 +0000340 "element",
341 value == 1 ? "" : "s",
342 suffix.c_str());
Enrico Granataf615b802013-02-15 23:38:37 +0000343 return true;
344}
345
346lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
Jason Molenda705b1802014-06-13 02:37:02 +0000347SyntheticChildrenFrontEnd(*valobj_sp),
Enrico Granata675f49b2015-10-07 18:36:53 +0000348m_exe_ctx_ref(),
349m_ptr_size(8),
Jason Molenda705b1802014-06-13 02:37:02 +0000350m_id_type(),
351m_children()
Enrico Granataf615b802013-02-15 23:38:37 +0000352{
353 if (valobj_sp)
Greg Clayton57ee3062013-07-11 22:46:58 +0000354 {
Jason Molenda705b1802014-06-13 02:37:02 +0000355 clang::ASTContext *ast = valobj_sp->GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext()->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +0000356 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000357 m_id_type = CompilerType(ast, ast->ObjCBuiltinIdTy);
Jason Molenda705b1802014-06-13 02:37:02 +0000358 if (valobj_sp->GetProcessSP())
359 m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize();
Greg Clayton57ee3062013-07-11 22:46:58 +0000360 }
Enrico Granataf615b802013-02-15 23:38:37 +0000361}
362
Jason Molenda705b1802014-06-13 02:37:02 +0000363lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp) :
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000364 NSArrayMSyntheticFrontEnd(valobj_sp),
365 m_data_32(nullptr),
366 m_data_64(nullptr)
Jason Molenda705b1802014-06-13 02:37:02 +0000367{
368}
369
370lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp) :
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000371 NSArrayMSyntheticFrontEnd(valobj_sp),
372 m_data_32(nullptr),
373 m_data_64(nullptr)
Jason Molenda705b1802014-06-13 02:37:02 +0000374{
375}
376
Enrico Granataf615b802013-02-15 23:38:37 +0000377size_t
378lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren ()
379{
Jason Molenda705b1802014-06-13 02:37:02 +0000380 return GetUsedCount();
Enrico Granataf615b802013-02-15 23:38:37 +0000381}
382
383lldb::ValueObjectSP
384lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
385{
Enrico Granataf615b802013-02-15 23:38:37 +0000386 if (idx >= CalculateNumChildren())
387 return lldb::ValueObjectSP();
Jason Molenda705b1802014-06-13 02:37:02 +0000388 lldb::addr_t object_at_idx = GetDataAddress();
Enrico Granatab65b3032013-03-26 21:44:13 +0000389 size_t pyhs_idx = idx;
Jason Molenda705b1802014-06-13 02:37:02 +0000390 pyhs_idx += GetOffset();
391 if (GetSize() <= pyhs_idx)
392 pyhs_idx -= GetSize();
Enrico Granatab65b3032013-03-26 21:44:13 +0000393 object_at_idx += (pyhs_idx * m_ptr_size);
Enrico Granataf615b802013-02-15 23:38:37 +0000394 StreamString idx_name;
Deepak Panickal99fbc072014-03-03 15:39:47 +0000395 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
Enrico Granatae29df232014-12-09 19:51:20 +0000396 lldb::ValueObjectSP retval_sp = CreateValueObjectFromAddress(idx_name.GetData(),
397 object_at_idx,
398 m_exe_ctx_ref,
399 m_id_type);
Enrico Granataf615b802013-02-15 23:38:37 +0000400 m_children.push_back(retval_sp);
401 return retval_sp;
402}
403
404bool
Jason Molenda705b1802014-06-13 02:37:02 +0000405lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update()
406{
407 m_children.clear();
408 ValueObjectSP valobj_sp = m_backend.GetSP();
409 m_ptr_size = 0;
410 delete m_data_32;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000411 m_data_32 = nullptr;
Jason Molenda705b1802014-06-13 02:37:02 +0000412 delete m_data_64;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000413 m_data_64 = nullptr;
Jason Molenda705b1802014-06-13 02:37:02 +0000414 if (!valobj_sp)
415 return false;
416 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
417 Error error;
418 error.Clear();
419 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
420 if (!process_sp)
421 return false;
422 m_ptr_size = process_sp->GetAddressByteSize();
423 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
424 if (m_ptr_size == 4)
425 {
426 m_data_32 = new DataDescriptor_32();
427 process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
428 }
429 else
430 {
431 m_data_64 = new DataDescriptor_64();
432 process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
433 }
434 if (error.Fail())
435 return false;
436 return false;
437}
438
439bool
440lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::Update()
Enrico Granataf615b802013-02-15 23:38:37 +0000441{
442 m_children.clear();
443 ValueObjectSP valobj_sp = m_backend.GetSP();
444 m_ptr_size = 0;
445 delete m_data_32;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000446 m_data_32 = nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000447 delete m_data_64;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000448 m_data_64 = nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000449 if (!valobj_sp)
450 return false;
451 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
452 Error error;
Enrico Granataf615b802013-02-15 23:38:37 +0000453 error.Clear();
454 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
455 if (!process_sp)
456 return false;
457 m_ptr_size = process_sp->GetAddressByteSize();
Enrico Granata723e1292013-04-23 01:13:50 +0000458 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
Enrico Granataf615b802013-02-15 23:38:37 +0000459 if (m_ptr_size == 4)
460 {
461 m_data_32 = new DataDescriptor_32();
462 process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
463 }
464 else
465 {
466 m_data_64 = new DataDescriptor_64();
467 process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
468 }
469 if (error.Fail())
470 return false;
471 return false;
472}
473
474bool
475lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren ()
476{
477 return true;
478}
479
480size_t
481lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
482{
Enrico Granataf615b802013-02-15 23:38:37 +0000483 const char* item_name = name.GetCString();
484 uint32_t idx = ExtractIndexFromString(item_name);
485 if (idx < UINT32_MAX && idx >= CalculateNumChildren())
486 return UINT32_MAX;
487 return idx;
488}
489
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000490lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::~NSArrayMSyntheticFrontEnd_109()
491{
492 delete m_data_32;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000493 m_data_32 = nullptr;
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000494 delete m_data_64;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000495 m_data_64 = nullptr;
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000496}
497
Jason Molenda705b1802014-06-13 02:37:02 +0000498lldb::addr_t
499lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetDataAddress ()
500{
501 if (!m_data_32 && !m_data_64)
502 return LLDB_INVALID_ADDRESS;
503 return m_data_32 ? m_data_32->_data :
504 m_data_64->_data;
505}
506
507uint64_t
508lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetUsedCount ()
509{
510 if (!m_data_32 && !m_data_64)
511 return 0;
512 return m_data_32 ? m_data_32->_used :
513 m_data_64->_used;
514}
515
516uint64_t
517lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetOffset ()
518{
519 if (!m_data_32 && !m_data_64)
520 return 0;
521 return m_data_32 ? m_data_32->_offset :
522 m_data_64->_offset;
523}
524
525uint64_t
526lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetSize ()
527{
528 if (!m_data_32 && !m_data_64)
529 return 0;
530 return m_data_32 ? m_data_32->_size :
531 m_data_64->_size;
532}
533
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000534lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::~NSArrayMSyntheticFrontEnd_1010()
Jason Molenda705b1802014-06-13 02:37:02 +0000535{
536 delete m_data_32;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000537 m_data_32 = nullptr;
Jason Molenda705b1802014-06-13 02:37:02 +0000538 delete m_data_64;
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000539 m_data_64 = nullptr;
Jason Molenda705b1802014-06-13 02:37:02 +0000540}
541
542lldb::addr_t
543lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetDataAddress ()
544{
545 if (!m_data_32 && !m_data_64)
546 return LLDB_INVALID_ADDRESS;
547 return m_data_32 ? m_data_32->_data :
548 m_data_64->_data;
549}
550
551uint64_t
552lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetUsedCount ()
553{
554 if (!m_data_32 && !m_data_64)
555 return 0;
556 return m_data_32 ? m_data_32->_used :
557 m_data_64->_used;
558}
559
560uint64_t
561lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetOffset ()
562{
563 if (!m_data_32 && !m_data_64)
564 return 0;
565 return m_data_32 ? m_data_32->_offset :
566 m_data_64->_offset;
567}
568
569uint64_t
570lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetSize ()
571{
572 if (!m_data_32 && !m_data_64)
573 return 0;
574 return m_data_32 ? m_data_32->_size :
575 m_data_64->_size;
576}
577
Enrico Granataf615b802013-02-15 23:38:37 +0000578lldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000579 SyntheticChildrenFrontEnd(*valobj_sp),
580 m_exe_ctx_ref(),
581 m_ptr_size(8),
582 m_items(0),
583 m_data_ptr(0)
Enrico Granataf615b802013-02-15 23:38:37 +0000584{
Greg Claytonf73034f2015-09-08 18:15:05 +0000585 if (valobj_sp)
Greg Clayton57ee3062013-07-11 22:46:58 +0000586 {
Greg Claytonf73034f2015-09-08 18:15:05 +0000587 CompilerType type = valobj_sp->GetCompilerType();
588 if (type)
589 {
590 ClangASTContext *ast = valobj_sp->GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext();
591 if (ast)
592 m_id_type = CompilerType(ast->getASTContext(), ast->getASTContext()->ObjCBuiltinIdTy);
593 }
Greg Clayton57ee3062013-07-11 22:46:58 +0000594 }
Enrico Granataf615b802013-02-15 23:38:37 +0000595}
596
Enrico Granataf615b802013-02-15 23:38:37 +0000597size_t
598lldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
599{
600 const char* item_name = name.GetCString();
601 uint32_t idx = ExtractIndexFromString(item_name);
602 if (idx < UINT32_MAX && idx >= CalculateNumChildren())
603 return UINT32_MAX;
604 return idx;
605}
606
607size_t
608lldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren ()
609{
610 return m_items;
611}
612
613bool
614lldb_private::formatters::NSArrayISyntheticFrontEnd::Update()
615{
616 m_ptr_size = 0;
617 m_items = 0;
618 m_data_ptr = 0;
619 m_children.clear();
620 ValueObjectSP valobj_sp = m_backend.GetSP();
Enrico Granataf615b802013-02-15 23:38:37 +0000621 if (!valobj_sp)
622 return false;
623 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
624 Error error;
Enrico Granataf615b802013-02-15 23:38:37 +0000625 error.Clear();
626 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
627 if (!process_sp)
628 return false;
629 m_ptr_size = process_sp->GetAddressByteSize();
Enrico Granata723e1292013-04-23 01:13:50 +0000630 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
Enrico Granataf615b802013-02-15 23:38:37 +0000631 m_items = process_sp->ReadPointerFromMemory(data_location, error);
632 if (error.Fail())
633 return false;
634 m_data_ptr = data_location+m_ptr_size;
635 return false;
636}
637
638bool
639lldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren ()
640{
641 return true;
642}
643
644lldb::ValueObjectSP
645lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx)
646{
647 if (idx >= CalculateNumChildren())
648 return lldb::ValueObjectSP();
649 lldb::addr_t object_at_idx = m_data_ptr;
650 object_at_idx += (idx * m_ptr_size);
651 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
652 if (!process_sp)
653 return lldb::ValueObjectSP();
654 Error error;
Enrico Granataf615b802013-02-15 23:38:37 +0000655 if (error.Fail())
656 return lldb::ValueObjectSP();
Enrico Granataf615b802013-02-15 23:38:37 +0000657 StreamString idx_name;
Deepak Panickal99fbc072014-03-03 15:39:47 +0000658 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
Enrico Granatae29df232014-12-09 19:51:20 +0000659 lldb::ValueObjectSP retval_sp = CreateValueObjectFromAddress(idx_name.GetData(),
660 object_at_idx,
661 m_exe_ctx_ref,
662 m_id_type);
Enrico Granataf615b802013-02-15 23:38:37 +0000663 m_children.push_back(retval_sp);
664 return retval_sp;
665}
666
Enrico Granatabbf1da32015-10-14 22:45:04 +0000667lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000668 SyntheticChildrenFrontEnd(*valobj_sp)
Enrico Granatabbf1da32015-10-14 22:45:04 +0000669{
670}
671
Enrico Granatabbf1da32015-10-14 22:45:04 +0000672size_t
673lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
674{
675 return UINT32_MAX;
676}
677
678size_t
679lldb_private::formatters::NSArray0SyntheticFrontEnd::CalculateNumChildren ()
680{
681 return 0;
682}
683
684bool
685lldb_private::formatters::NSArray0SyntheticFrontEnd::Update()
686{
687 return false;
688}
689
690bool
691lldb_private::formatters::NSArray0SyntheticFrontEnd::MightHaveChildren ()
692{
693 return false;
694}
695
696lldb::ValueObjectSP
697lldb_private::formatters::NSArray0SyntheticFrontEnd::GetChildAtIndex (size_t idx)
698{
699 return lldb::ValueObjectSP();
700}
701
Enrico Granata936499a2016-02-29 21:06:50 +0000702lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
703SyntheticChildrenFrontEnd (*valobj_sp.get())
704{
705}
706
707size_t
708lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
709{
710 static const ConstString g_zero("[0]");
711
712 if (name == g_zero)
713 return 0;
714
715 return UINT32_MAX;
716}
717
718size_t
719lldb_private::formatters::NSArray1SyntheticFrontEnd::CalculateNumChildren ()
720{
721 return 1;
722}
723
724bool
725lldb_private::formatters::NSArray1SyntheticFrontEnd::Update()
726{
727 return false;
728}
729
730bool
731lldb_private::formatters::NSArray1SyntheticFrontEnd::MightHaveChildren ()
732{
733 return true;
734}
735
736lldb::ValueObjectSP
737lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex (size_t idx)
738{
739 static const ConstString g_zero("[0]");
740
741 if (idx == 0)
742 {
743 CompilerType id_type(m_backend.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID));
744 return m_backend.GetSyntheticChildAtOffset(m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, g_zero);
745 }
746 return lldb::ValueObjectSP();
747}
748
Enrico Granataf615b802013-02-15 23:38:37 +0000749SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
750{
Jason Molenda705b1802014-06-13 02:37:02 +0000751 if (!valobj_sp)
752 return nullptr;
753
Enrico Granataf615b802013-02-15 23:38:37 +0000754 lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
755 if (!process_sp)
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000756 return nullptr;
Enrico Granata15a67f492015-09-23 20:12:19 +0000757 AppleObjCRuntime *runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>(process_sp->GetObjCLanguageRuntime());
Enrico Granataf615b802013-02-15 23:38:37 +0000758 if (!runtime)
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000759 return nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000760
Greg Clayton99558cc42015-08-24 23:46:31 +0000761 CompilerType valobj_type(valobj_sp->GetCompilerType());
Jason Molenda705b1802014-06-13 02:37:02 +0000762 Flags flags(valobj_type.GetTypeInfo());
763
Enrico Granata622be232014-10-21 20:52:14 +0000764 if (flags.IsClear(eTypeIsPointer))
Enrico Granataf615b802013-02-15 23:38:37 +0000765 {
766 Error error;
767 valobj_sp = valobj_sp->AddressOf(error);
768 if (error.Fail() || !valobj_sp)
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000769 return nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000770 }
771
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000772 ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp));
Enrico Granataf615b802013-02-15 23:38:37 +0000773
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000774 if (!descriptor || !descriptor->IsValid())
775 return nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000776
Enrico Granata936499a2016-02-29 21:06:50 +0000777 ConstString class_name(descriptor->GetClassName());
Enrico Granataf615b802013-02-15 23:38:37 +0000778
Enrico Granata936499a2016-02-29 21:06:50 +0000779 static const ConstString g_NSArrayI("__NSArrayI");
780 static const ConstString g_NSArrayM("__NSArrayM");
781 static const ConstString g_NSArray0("__NSArray0");
782 static const ConstString g_NSArray1("__NSSingleObjectArrayI");
783
784 if (class_name.IsEmpty())
Eugene Zelenkobbd16812016-02-29 19:41:30 +0000785 return nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000786
Enrico Granata936499a2016-02-29 21:06:50 +0000787 if (class_name == g_NSArrayI)
Enrico Granataf615b802013-02-15 23:38:37 +0000788 {
789 return (new NSArrayISyntheticFrontEnd(valobj_sp));
790 }
Enrico Granata936499a2016-02-29 21:06:50 +0000791 else if (class_name == g_NSArrayM)
Enrico Granatabbf1da32015-10-14 22:45:04 +0000792 {
793 return (new NSArray0SyntheticFrontEnd(valobj_sp));
794 }
Enrico Granata936499a2016-02-29 21:06:50 +0000795 else if (class_name == g_NSArray1)
796 {
797 return (new NSArray1SyntheticFrontEnd(valobj_sp));
798 }
799 else if (class_name == g_NSArrayM)
Enrico Granataf615b802013-02-15 23:38:37 +0000800 {
Jason Molenda705b1802014-06-13 02:37:02 +0000801 if (runtime->GetFoundationVersion() >= 1100)
802 return (new NSArrayMSyntheticFrontEnd_1010(valobj_sp));
803 else
804 return (new NSArrayMSyntheticFrontEnd_109(valobj_sp));
Enrico Granataf615b802013-02-15 23:38:37 +0000805 }
Enrico Granata2543d292016-02-12 07:50:15 +0000806
807 return nullptr;
Enrico Granataf615b802013-02-15 23:38:37 +0000808}