1ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata//===-- NSArray.cpp ---------------------------------------------*- C++ -*-===// 2ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// 3ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// The LLVM Compiler Infrastructure 4ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// 5ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// This file is distributed under the University of Illinois Open Source 6ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// License. See LICENSE.TXT for details. 7ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata// 8ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata//===----------------------------------------------------------------------===// 9ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h" 11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec 12ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h" 13ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 14ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Core/DataBufferHeap.h" 15ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Core/Error.h" 16ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Core/Stream.h" 17ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Core/ValueObject.h" 18ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Core/ValueObjectConstResult.h" 19ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Host/Endian.h" 20ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Symbol/ClangASTContext.h" 21ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 22ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata#include "lldb/Target/Target.h" 23ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 24ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatausing namespace lldb; 25ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatausing namespace lldb_private; 26ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatausing namespace lldb_private::formatters; 27ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 28ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 29ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream) 30ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 31ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 32ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!process_sp) 33ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 34ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 35ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 36ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 37ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!runtime) 38ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 39ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 40ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 41ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 42ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 43ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 44ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 45ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 46ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 47ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 48ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 49ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_addr) 50ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 51ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 52ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata uint64_t value = 0; 53ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 54ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 55ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 56ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!class_name || !*class_name) 57ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 58ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 59ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!strcmp(class_name,"__NSArrayI")) 60ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 61ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 62ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 63ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 64ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 65ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 66ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else if (!strcmp(class_name,"__NSArrayM")) 67ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 68ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 69ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 70ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 71ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 72ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 73ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else if (!strcmp(class_name,"__NSCFArray")) 74ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 75ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 76ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error); 77ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 78ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 79ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 80ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else 81ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 82ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) 83ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 84ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 85ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 86ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata stream.Printf("@\"%" PRIu64 " object%s\"", 87ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata value, 88ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata value == 1 ? "" : "s"); 89ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 90ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 91ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 92ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 9352f792329be5db8e38961350589e97e8f2823acdGreg Clayton SyntheticChildrenFrontEnd(*valobj_sp.get()), 9452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_exe_ctx_ref(), 9552f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ptr_size(8), 9652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data_32(NULL), 9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data_64(NULL) 98ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 99ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (valobj_sp) 10052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 10152f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ASTContext *ast = valobj_sp->GetClangType().GetASTContext(); 10252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast) 10352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_id_type = ClangASTType(ast, ast->ObjCBuiltinIdTy); 10452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 105ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 106ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 107ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 108ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren () 109ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 110ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (m_data_32) 111ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return m_data_32->_used; 112ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (m_data_64) 113ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return m_data_64->_used; 114ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return 0; 115ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 116ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 117ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb::ValueObjectSP 118ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx) 119ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 120ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!m_data_32 && !m_data_64) 121ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return lldb::ValueObjectSP(); 122ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx >= CalculateNumChildren()) 123ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return lldb::ValueObjectSP(); 124ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data); 125dea1f151f49d4d490d0971633013a5b5dcaaa13cEnrico Granata size_t pyhs_idx = idx; 126dea1f151f49d4d490d0971633013a5b5dcaaa13cEnrico Granata pyhs_idx += (m_data_32 ? m_data_32->offset : m_data_64->offset); 127dea1f151f49d4d490d0971633013a5b5dcaaa13cEnrico Granata if ((m_data_32 ? m_data_32->_size : m_data_64->_size) <= pyhs_idx) 128dea1f151f49d4d490d0971633013a5b5dcaaa13cEnrico Granata pyhs_idx -= (m_data_32 ? m_data_32->_size : m_data_64->_size); 129dea1f151f49d4d490d0971633013a5b5dcaaa13cEnrico Granata object_at_idx += (pyhs_idx * m_ptr_size); 130ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StreamString idx_name; 131ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata idx_name.Printf("[%zu]",idx); 132ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), 133ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata object_at_idx, 134ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_exe_ctx_ref, 135ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_id_type); 136ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_children.push_back(retval_sp); 137ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return retval_sp; 138ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 139ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 140ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 141ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::Update() 142ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 143ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_children.clear(); 144ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 145ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_ptr_size = 0; 146ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata delete m_data_32; 147ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_32 = NULL; 148ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata delete m_data_64; 149ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_64 = NULL; 150ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_sp) 151ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 152ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 153ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 154ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata error.Clear(); 155ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 156ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!process_sp) 157ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 158ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 159fe26a2333298602bac55decfee87bc6d33b79d54Enrico Granata uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; 160ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (m_ptr_size == 4) 161ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 162ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_32 = new DataDescriptor_32(); 163ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 164ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 165ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else 166ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 167ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_64 = new DataDescriptor_64(); 168ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 169ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 170ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 171ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 172ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 173ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 174ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 175ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 176ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren () 177ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 178ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 179ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 180ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 181ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 182ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 183ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 184ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!m_data_32 && !m_data_64) 185ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 186ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* item_name = name.GetCString(); 187ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 188ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 189ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 190ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return idx; 191ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 192ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 193ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd () 194ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 195ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata delete m_data_32; 196ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_32 = NULL; 197ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata delete m_data_64; 198ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_64 = NULL; 199ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 200ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 201ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 20252f792329be5db8e38961350589e97e8f2823acdGreg Clayton SyntheticChildrenFrontEnd (*valobj_sp.get()), 20352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_exe_ctx_ref (), 20452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ptr_size (8), 20552f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_items (0), 20652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data_ptr (0) 207ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 208ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (valobj_sp) 20952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ASTContext *ast = valobj_sp->GetClangType().GetASTContext(); 21152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast) 21252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_id_type = ClangASTType(ast, ast->ObjCBuiltinIdTy); 21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 214ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 215ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 216ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd () 217ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 218ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 219ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 220ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 221ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 222ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 223ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* item_name = name.GetCString(); 224ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 225ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 226ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 227ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return idx; 228ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 229ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 230ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 231ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren () 232ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 233ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return m_items; 234ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 235ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 236ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 237ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::Update() 238ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 239ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_ptr_size = 0; 240ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_items = 0; 241ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_ptr = 0; 242ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_children.clear(); 243ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 244ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_sp) 245ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 246ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 247ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 248ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata error.Clear(); 249ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 250ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!process_sp) 251ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 252ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 253fe26a2333298602bac55decfee87bc6d33b79d54Enrico Granata uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; 254ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_items = process_sp->ReadPointerFromMemory(data_location, error); 255ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 256ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 257ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_data_ptr = data_location+m_ptr_size; 258ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 259ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 260ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 261ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 262ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren () 263ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 264ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 265ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 266ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 267ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb::ValueObjectSP 268ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx) 269ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 270ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx >= CalculateNumChildren()) 271ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return lldb::ValueObjectSP(); 272ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::addr_t object_at_idx = m_data_ptr; 273ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata object_at_idx += (idx * m_ptr_size); 274ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 275ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!process_sp) 276ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return lldb::ValueObjectSP(); 277ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 278ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail()) 279ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return lldb::ValueObjectSP(); 280ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StreamString idx_name; 281ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata idx_name.Printf("[%zu]",idx); 282cfeaa431414cb7c0bdfaf03a2d78a402873641dfEnrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, m_exe_ctx_ref, m_id_type); 283ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata m_children.push_back(retval_sp); 284ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return retval_sp; 285ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 286ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 287ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 288ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 289ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); 290ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!process_sp) 291ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return NULL; 292ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 293ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!runtime) 294ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return NULL; 295ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 296ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_sp->IsPointerType()) 297ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 298ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Error error; 299ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata valobj_sp = valobj_sp->AddressOf(error); 300ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (error.Fail() || !valobj_sp) 301ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return NULL; 302ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 303ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 304ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); 305ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 306ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 307ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return NULL; 308ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 309ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 310ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 311ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!class_name || !*class_name) 312ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return NULL; 313ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 314ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!strcmp(class_name,"__NSArrayI")) 315ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 316ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return (new NSArrayISyntheticFrontEnd(valobj_sp)); 317ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 318ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else if (!strcmp(class_name,"__NSArrayM")) 319ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 320ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return (new NSArrayMSyntheticFrontEnd(valobj_sp)); 321ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 322ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata else 323ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata { 324ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp)); 325ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata } 326ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 327ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 328ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 329ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()) 330ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{} 331ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 332ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 333ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren () 334ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 335ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata uint64_t count = 0; 336ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) 337ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return count; 338ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return 0; 339ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 340ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 341ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb::ValueObjectSP 342ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) 343ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 344ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StreamString idx_name; 345ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata idx_name.Printf("[%zu]",idx); 346ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx); 347ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (valobj_sp) 348ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata valobj_sp->SetName(ConstString(idx_name.GetData())); 349ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return valobj_sp; 350ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 351ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 352ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 353ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update() 354ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 355ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 356ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 357ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 358ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 359ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::MightHaveChildren () 360ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 361ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 362ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 363ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 364ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 365ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 366ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 367ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return 0; 368ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 369ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 370ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd () 371ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{} 372