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