CXXFormatterFunctions.cpp revision 47beabb1386be44e3f90dbc30a0b22c23b93a4dc
1caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// 2caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 3caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// The LLVM Compiler Infrastructure 4caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 5caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// This file is distributed under the University of Illinois Open Source 6caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// License. See LICENSE.TXT for details. 7caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 8caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===----------------------------------------------------------------------===// 9caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 10caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/CXXFormatterFunctions.h" 11caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 12caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// needed to get ConvertUTF16/32ToUTF8 13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#define CLANG_NEEDS_THESE_ONE_DAY 14caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "clang/Basic/ConvertUTF.h" 15caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 16f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/DataBufferHeap.h" 17f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/Error.h" 18caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/Stream.h" 19caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/ValueObject.h" 20f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/ValueObjectConstResult.h" 21f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Host/Endian.h" 22caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h" 24caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 25caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb; 26caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private; 27caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters; 28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 30f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, 31f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* target_type, 32f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t &value) 34caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 35caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target_type || !*target_type) 36caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!selector || !*selector) 38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr_path_stream; 40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata valobj.GetExpressionPath(expr_path_stream, false); 41caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata expr.Printf("(%s)[%s %s]",target_type,expr_path_stream.GetData(),selector); 43caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 48caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 49d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 5047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 51d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 52d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetKeepInMemory(true) 54d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 55d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 56caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 57caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 58d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 59d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = result_sp->GetValueAsUnsigned(0); 63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 64caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 65caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 66f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 67f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 68f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 69f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 70f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t index) 71f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 72f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 73f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 74f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 75f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 76f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 77f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 78f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 79f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 80f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(%s)[%s %s:%lld]",return_type,expr_path_stream.GetData(),selector,index); 81f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 82f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 83f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 84f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 85f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 86f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 87f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 8847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 89f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 90f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 91f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 92f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 93f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 94f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 95f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 96f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 97f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 98f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 99f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* key) 106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!key || !*key) 113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); 118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 123f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 12547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 138caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool name_entries> 139caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream) 141caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 142caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 143caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 144caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 145caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 146caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 147caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 148caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 149caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 150caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 151caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 152caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 153caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 154caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 155caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 156caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 157caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (ptr_size == 8); 158caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 159caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 160caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 161caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 162caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 163caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 164caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 165caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 166caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 1677685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 1687685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 1697685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 1707685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 171caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"__NSDictionaryI")) 172caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 173caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 174caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 175caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 176caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 177caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); 178caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 179caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSDictionaryM")) 180caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 181caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 182caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 183caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 184caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 185caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); 186caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 187caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSCFDictionary")) 188caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 189caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 190caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error); 191caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 192caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 193caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_64bit) 194caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= ~0x0f1f000000000000UL; 195caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 196caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 197caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 198f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) 199caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 200caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 201caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 202caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("%s%llu %s%s", 203caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? "@\"" : ""), 204caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 205caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")), 206caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? "\"" : "")); 207caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 208caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 209caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 210caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 211f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream) 212caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 213caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 214caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 215caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 216caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 217caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 218caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 219caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 220caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 221caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 222caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 223caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 224caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 225caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 226caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 227caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 228caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 229caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 230caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 231caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 232caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 233caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 234caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 235caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 236caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 2377685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 2387685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 2397685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 2407685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 241caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"__NSArrayI")) 242caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 243caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 244caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 245caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 246caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 247caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 248caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSArrayM")) 249caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 250caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 251caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 252caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 253caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 254caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 255caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSCFArray")) 256caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 257caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 258caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error); 259caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 260caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 261caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 262caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 263caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 264f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) 265caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 266caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 267caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 268caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%llu object%s\"", 269caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 270caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value == 1 ? "" : "s"); 271caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 272caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 273caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 274caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at> 275caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 276f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream) 277caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 278caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 279caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 280caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 281caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 282caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 283caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 284caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 285caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 286caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 287caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 288caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 289caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 290caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 291caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 292caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (process_sp->GetAddressByteSize() == 8); 293caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 294caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 295caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 296caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 297caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 298caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 299caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 300caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 3017685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 3027685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 3037685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 3047685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 305caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSConcreteData") || 306caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"NSConcreteMutableData") || 307caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"__NSCFData")) 308caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 309caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t offset = (is_64bit ? 16 : 8); 310caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 311caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); 312caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 313caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 314caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 315caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 316caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 317f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "length", value)) 318caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 319caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 320caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 321caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("%s%llu byte%s%s", 322caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "@\"" : ""), 323caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 324caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (value > 1 ? "s" : ""), 325caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "\"" : "")); 326caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 327caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 328caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 329caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 330caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 331f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream) 332caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 333caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 334caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 335caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 336caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 337caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 338caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 339caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 340caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 341caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 342caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 343caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 344caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 345caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 346caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 347caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 348caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 349caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 350caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 351caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 352caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 353caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 354caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 355caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 3567685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 3577685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 3587685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 359caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber")) 360caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 361caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (descriptor->IsTagged()) 362caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 363caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them 364caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8; 365caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t i_bits = (valobj_addr & 0xF0) >> 4; 366caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 367caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata switch (i_bits) 368caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 369caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 0: 370caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(char)%hhd",(char)value); 371caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 372caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 4: 373caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(short)%hd",(short)value); 374caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 375caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 8: 376caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(int)%d",(int)value); 377caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 378caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 12: 379caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(long)%lld",value); 380caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 381caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata default: 382caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("absurd value:(info=%llu, value=%llu",i_bits,value); 383caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 384caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 385caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 386caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 387caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 388caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 389caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 390caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F); 391caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t data_location = valobj_addr + 2*ptr_size; 392caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 393caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 394caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 395caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata switch (data_type) 396caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 397caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 1: // 0B00001 398caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error); 399caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 400caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 401caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(char)%hhd",(char)value); 402caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 403caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 2: // 0B0010 404caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error); 405caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 406caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 407caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(short)%hd",(short)value); 408caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 409caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 3: // 0B0011 410caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); 411caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 412caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 413caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(int)%d",(int)value); 414caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 415caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 17: // 0B10001 416caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata data_location += 8; 417caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 4: // 0B0100 418caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); 419caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 420caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 421caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(long)%lld",value); 422caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 423caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 5: // 0B0101 424caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 425caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); 426caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 427caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 428caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata float flt_value = *((float*)&flt_as_int); 429caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(float)%f",flt_value); 430caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 431caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 432caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 6: // 0B0110 433caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 434caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); 435caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 436caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 437caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata double dbl_value = *((double*)&dbl_as_lng); 438caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(double)%g",dbl_value); 439caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 440caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 441caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata default: 442caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("absurd: dt=%d",data_type); 443caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 444caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 445caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 446caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 447caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 448caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 449caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 450f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata // similar to ExtractValueFromObjCExpression but uses summary instead of value 451caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr_path_stream; 452caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata valobj.GetExpressionPath(expr_path_stream, false); 453caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 454caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata expr.Printf("(NSString*)[%s stringValue]",expr_path_stream.GetData()); 455caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 456caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 457caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 458caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 459caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 460caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 461d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 46247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 463d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 464d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 465d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetKeepInMemory(true) 466d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 467d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 468caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 469caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 470d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 471d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 472caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 473caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 474caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("%s",result_sp->GetSummaryAsCString()); 475caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 476caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 477caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 478caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 479b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granatastatic bool 480b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico GranataReadUTFBufferAndDumpToStream (uint64_t location, 481b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata const ProcessSP& process_sp, 482b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata Stream& stream) 483b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata{ 484b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata Error error; 485b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 486b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), 1024, error); 487b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata if (error.Fail()) 488b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata { 489b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata stream.Printf("unable to read data"); 490b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return true; 491b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata } 492b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata else 493b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata stream.Printf("@\""); 494b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata if (data_read) 495b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata { 496b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata UTF16 *data_ptr = (UTF16*)buffer_sp->GetBytes(); 497b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata UTF16 *data_end_ptr = data_ptr + 256; 498b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata 499b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata while (data_ptr < data_end_ptr) 500b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata { 501b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata if (!*data_ptr) 502b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata { 503b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata data_end_ptr = data_ptr; 504b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata break; 505b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata } 506b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata data_ptr++; 507b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata } 508b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata 509b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata *data_ptr = 0; 510b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata data_ptr = (UTF16*)buffer_sp->GetBytes(); 511b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata 512b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata lldb::DataBufferSP utf8_data_buffer_sp(new DataBufferHeap(1024,0)); 513b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata UTF8* utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); 514b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata UTF8* utf8_data_end_ptr = utf8_data_ptr + 1024; 515b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata 516b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata ConvertUTF16toUTF8 ( (const UTF16**)&data_ptr, 517b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata data_end_ptr, 518b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata &utf8_data_ptr, 519b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata utf8_data_end_ptr, 520b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata lenientConversion); 521b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); 522b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++) 523b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata { 524b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata if (!*utf8_data_ptr) 525b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata break; 526b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata stream.Printf("%c",*utf8_data_ptr); 527b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata } 528b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata stream.Printf("\""); 529b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return true; 530b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata } 531b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata stream.Printf("\""); 532b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return true; 533b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata} 534b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata 535caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 536f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) 537caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 538caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 539caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 540caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 541caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 542caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 543caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 544caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 545caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 546caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 547caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 548caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 549caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 550caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 551caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 552caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 553caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 554caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 555caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 556caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 557caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 558caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 559caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 560caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 56125c9adecf763053ff953b4d437b022075d30dd13Enrico Granata if (!class_name || !*class_name) 56225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata return false; 56325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata 564caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t info_bits_location = valobj_addr + ptr_size; 565caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) 566caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata info_bits_location += 3; 567caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 568caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 569caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 570caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); 571caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 572caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 573caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 574caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_mutable = (info_bits & 1) == 1; 575caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_inline = (info_bits & 0x60) == 0; 576caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool has_explicit_length = (info_bits & (1 | 4)) != 4; 577caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_unicode = (info_bits & 0x10) == 0x10; 578caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_special = strcmp(class_name,"NSPathStore2") == 0; 579caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 580caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (strcmp(class_name,"NSString") && 581caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFStringRef") && 582caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFMutableStringRef") && 583caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFConstantString") && 584caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFString") && 585caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFConstantString") && 586caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFString") && 587caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSPathStore2")) 588caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 589caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata // probably not one of us - bail out 590caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 591caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 592caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 593caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_mutable) 594caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 595caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 2 * ptr_size + valobj_addr; 596caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 597caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 598caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 599caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (has_explicit_length and is_unicode) 600b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return ReadUTFBufferAndDumpToStream (location, process_sp, stream); 601caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 602caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 603caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 604caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 605caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 606caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 607caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 608caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 609caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 610caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 611caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 612caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 613caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable) 614caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 615caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 3 * ptr_size + valobj_addr; 616caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 617caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 618caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 619caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 620caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 621caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 622caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 623caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 624caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_unicode) 625caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 626caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 627caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_inline) 628caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 629caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 630caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 631caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("found new combo"); 632caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 633caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 634caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 635caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location += ptr_size; 636caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 637caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 638caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 639caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 640caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 641caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 642caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 643b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return ReadUTFBufferAndDumpToStream (location, process_sp, stream); 644caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 645caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_special) 646caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 647caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8); 648b9bd5d11c4a8a09ce6d79c98c856aaa5d31acacfEnrico Granata return ReadUTFBufferAndDumpToStream (location, process_sp, stream); 649caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 650caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline) 651caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 652caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 653caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 654caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 655caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 656caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 657caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 658caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 659caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 660caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 661caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 662caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 663caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 664caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 665caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 666caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 667caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 668caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 669caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 670caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 671caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 672caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 673caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 674caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 675caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 676caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 677caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 678caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("class name = %s",class_name); 679caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 680caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 681caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 682caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 6839abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool 6849abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream) 6859abbfba957db139beed19866f61599424ddcd37aEnrico Granata{ 6869abbfba957db139beed19866f61599424ddcd37aEnrico Granata stream.Printf("%s",valobj.GetObjectDescription()); 6879abbfba957db139beed19866f61599424ddcd37aEnrico Granata return true; 6889abbfba957db139beed19866f61599424ddcd37aEnrico Granata} 6899abbfba957db139beed19866f61599424ddcd37aEnrico Granata 690f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 691f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 692f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(), 693f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8), 694f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_32(NULL), 695f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_64(NULL) 696f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 697247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp) 698f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 699247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr()); 700247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Update(); 701f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 702f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 703f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 704f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 705f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren () 706f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 707f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (m_data_32) 708f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_data_32->_used; 709f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (m_data_64) 710f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_data_64->_used; 711f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 712f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 713f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 714f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 715f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 716f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 717f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!m_data_32 && !m_data_64) 718f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 719f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx >= CalculateNumChildren()) 720f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 721f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data); 722f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx += (idx * m_ptr_size); 723f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 724f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata idx_name.Printf("[%d]",idx); 725f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), 726f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx, 727f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_exe_ctx_ref, 728f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_id_type); 729f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.push_back(retval_sp); 730f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 731f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 732f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 733f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 734f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::Update() 735f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 736f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.clear(); 737247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 738247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = 0; 739247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata delete m_data_32; 740247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_32 = NULL; 741247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata delete m_data_64; 742247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_64 = NULL; 743247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsDynamic()) 744247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 745247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 746247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 747247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 748247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Error error; 749247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsPointerType()) 750247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 751247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->Dereference(error); 752247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail() || !valobj_sp) 753247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 754247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 755247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata error.Clear(); 756247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 757247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!process_sp) 758247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 759247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 760247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 761247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (m_ptr_size == 4) 762247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 763247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_32 = new DataDescriptor_32(); 764247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 765247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 766247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata else 767247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 768247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_64 = new DataDescriptor_64(); 769247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 770247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 771247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail()) 772247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 773f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 774f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 775f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 776f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatastatic uint32_t 777f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataExtractIndexFromString (const char* item_name) 778f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 779f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!item_name || !*item_name) 780f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 781f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (*item_name != '[') 782f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 783f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata item_name++; 784f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = 0; 785f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata while(*item_name) 786f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 787f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata char x = *item_name; 788f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (x == ']') 789f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata break; 790f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (x < '0' || x > '9') 791f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 792f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata idx = 10*idx + (x-'0'); 793f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata item_name++; 794f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 795f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 796f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 797f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 798f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 799f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 800f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 801f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!m_data_32 && !m_data_64) 802f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 803f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* item_name = name.GetCString(); 804f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 805f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 806f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 807f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 808f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 809f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 810f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd () 811f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 812f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata delete m_data_32; 813f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_data_32 = NULL; 814f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata delete m_data_64; 815f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_data_64 = NULL; 816f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 817f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 818f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 819f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 820f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(), 821f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8), 822f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_items(0), 823f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_ptr(0) 824f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 825247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp) 826f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 827247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr()); 828247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Update(); 829f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 830f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 831f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 832f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd () 833f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 834f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 835f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 836f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 837f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 838f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 839f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* item_name = name.GetCString(); 840f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 841f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 842f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 843f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 844f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 845f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 846f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 847f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren () 848f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 849f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_items; 850f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 851f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 852f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 853f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::Update() 854f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 855247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = 0; 856247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_items = 0; 857247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_ptr = 0; 858f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.clear(); 859247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 860247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsDynamic()) 861247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 862247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 863247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 864247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 865247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Error error; 866247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsPointerType()) 867247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 868247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->Dereference(error); 869247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail() || !valobj_sp) 870247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 871247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 872247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata error.Clear(); 873247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 874247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!process_sp) 875247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 876247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 877247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 878247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_items = process_sp->ReadPointerFromMemory(data_location, error); 879247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail()) 880247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 881247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_ptr = data_location+m_ptr_size; 882f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 883f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 884f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 885f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 886f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 887f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 888f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx >= CalculateNumChildren()) 889f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 890f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::addr_t object_at_idx = m_data_ptr; 891f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx += (idx * m_ptr_size); 892f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 893f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!process_sp) 894f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 895f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error error; 896f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx = process_sp->ReadPointerFromMemory(object_at_idx, error); 897f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (error.Fail()) 898f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 899f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 900f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(id)%llu",object_at_idx); 901f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 902f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata idx_name.Printf("[%d]",idx); 903f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 904f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.push_back(retval_sp); 905f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 906f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 907f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 908f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 909f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 910f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); 911f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!process_sp) 912f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 913f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 914f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!runtime) 915f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 916f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 917f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!valobj_sp->IsPointerType()) 918f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 919f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error error; 920f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp = valobj_sp->AddressOf(error); 921f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (error.Fail() || !valobj_sp) 922f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 923f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 924f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 925f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); 926f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 927f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 928f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 929f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 930f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 9317685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 9327685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 9337685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return NULL; 9347685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 935f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!strcmp(class_name,"__NSArrayI")) 936f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 937f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayISyntheticFrontEnd(valobj_sp)); 938f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 939f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata else if (!strcmp(class_name,"__NSArrayM")) 940f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 941f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayMSyntheticFrontEnd(valobj_sp)); 942f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 943f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata else 944f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 945f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp)); 946f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 947f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 948f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 949f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 950f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()) 951f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{} 952f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 953f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 954f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren () 955f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 956f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t count = 0; 957f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) 958f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return count; 959f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 960f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 961f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 962f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 963f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 964f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 965f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 966f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata idx_name.Printf("[%d]",idx); 967f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx); 968f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (valobj_sp) 969f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp->SetName(ConstString(idx_name.GetData())); 970f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 971f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 972f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 973f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 974f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update() 975f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 976f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 977f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 978f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 979f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatauint32_t 980f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 981f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 982f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 983f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 984f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 985f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd () 986f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{} 987f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 9883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 9893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 9903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 9913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); 9923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 9933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 9943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 9953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!runtime) 9963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 9973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 9983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!valobj_sp->IsPointerType()) 9993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 10003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 10013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata valobj_sp = valobj_sp->AddressOf(error); 10023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail() || !valobj_sp) 10033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 10043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 10053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); 10073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 10093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 10103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 10127685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 10137685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 10147685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return NULL; 10157685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 10163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!strcmp(class_name,"__NSDictionaryI")) 10173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 10183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); 10193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 10203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata else if (!strcmp(class_name,"__NSDictionaryM")) 10213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 10223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); 10233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 10243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata else 10253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 10263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp)); 10273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 10283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 10313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()) 10323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{} 10333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 10353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren () 10363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 10373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint64_t count = 0; 10383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) 10393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return count; 10403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 10413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 10443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 10453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 10463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 10473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata idx_name.Printf("[%d]",idx); 10483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString valobj_expr_path; 10493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_backend.GetExpressionPath(valobj_expr_path, false); 10503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString key_fetcher_expr; 10513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%d]",valobj_expr_path.GetData(),idx); 10523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString value_fetcher_expr; 10533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData()); 10543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString object_fetcher_expr; 1055fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata object_fetcher_expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = %s; _lldb_valgen_item.value = %s; _lldb_valgen_item;",key_fetcher_expr.GetData(),value_fetcher_expr.GetData()); 10563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::ValueObjectSP child_sp; 10573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp, 105847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions().SetKeepInMemory(true)); 10593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (child_sp) 10603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata child_sp->SetName(ConstString(idx_name.GetData())); 10613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return child_sp; 10623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 10653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update() 10663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 10673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 10683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 10713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 10723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 10733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 10743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd () 10773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{} 10783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 10803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()), 10813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_exe_ctx_ref(), 10823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_ptr_size(8), 10833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32(NULL), 10843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64(NULL) 10853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 1086a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp) 1087a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Update(); 10883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd () 10913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 10923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_32; 10933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32 = NULL; 10943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_64; 10953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64 = NULL; 10963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 10973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 10983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 10993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 11003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 11013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* item_name = name.GetCString(); 11023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 11033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 11043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return UINT32_MAX; 11053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return idx; 11063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 11073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 11093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren () 11103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 11113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!m_data_32 && !m_data_64) 11123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 11133a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (m_data_32 ? m_data_32->_used : m_data_64->_used); 11143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 11153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 11173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() 11183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 11193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.clear(); 1120a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_32; 1121a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = NULL; 1122a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_64; 1123a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = NULL; 1124a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = 0; 1125a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1126a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1127a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1128a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsDynamic()) 1129a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1130a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1131a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1132a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1133a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Error error; 1134a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsPointerType()) 1135a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1136a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1137a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail() || !valobj_sp) 1138a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1139a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1140a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata error.Clear(); 1141a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1142a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!process_sp) 1143a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1144a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1145a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1146a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (m_ptr_size == 4) 1147a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1148a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = new DataDescriptor_32(); 1149a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 1150a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1151a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata else 1152a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1153a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = new DataDescriptor_64(); 1154a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 1155a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1156a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail()) 1157a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1158a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_ptr = data_location + m_ptr_size; 11593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 11603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 11613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 11633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 11643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 11653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t num_children = CalculateNumChildren(); 11663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= num_children) 11683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 11693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (m_children.empty()) 11713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 11723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // do the scan phase 11733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t key_at_idx = 0, val_at_idx = 0; 11743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t tries = 0; 11763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t test_idx = 0; 11773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata while(tries < num_children) 11793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 11803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size); 11813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = key_at_idx + m_ptr_size; 11823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 11833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 11843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 11853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 11863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); 11873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 11883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 11893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); 11903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 11913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 11923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata test_idx++; 11943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!key_at_idx || !val_at_idx) 11963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata continue; 11973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata tries++; 11983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 11993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; 12003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.push_back(descriptor); 12023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 12033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 12043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= m_children.size()) // should never happen 12063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 12073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor &dict_item = m_children[idx]; 12093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!dict_item.valobj_sp) 12103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 12113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // make the new ValueObject 12123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString expr; 1213fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%llu ; _lldb_valgen_item.value = (id)%llu; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr); 12143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 12153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata idx_name.Printf("[%d]",idx); 12163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 12173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 12183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return dict_item.valobj_sp; 12193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 12203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 12223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()), 12233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_exe_ctx_ref(), 12243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_ptr_size(8), 12253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32(NULL), 12263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64(NULL) 12273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 1228a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp) 1229a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Update (); 12303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 12313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd () 12333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 12343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_32; 12353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32 = NULL; 12363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_64; 12373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64 = NULL; 12383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 12393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 12413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 12423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 12433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* item_name = name.GetCString(); 12443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 12453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 12463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return UINT32_MAX; 12473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return idx; 12483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 12493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatauint32_t 12513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren () 12523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 12533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!m_data_32 && !m_data_64) 12543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 12553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (m_data_32 ? m_data_32->_used : m_data_64->_used); 12563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 12573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 12583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 12593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update() 12603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 12613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.clear(); 1262a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1263a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = 0; 1264a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_32; 1265a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = NULL; 1266a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_64; 1267a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = NULL; 1268a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1269a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1270a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsDynamic()) 1271a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1272a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1273a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1274a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1275a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Error error; 1276a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsPointerType()) 1277a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1278a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1279a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail() || !valobj_sp) 1280a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1281a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1282a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata error.Clear(); 1283a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1284a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!process_sp) 1285a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1286a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1287a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1288a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (m_ptr_size == 4) 1289a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1290a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = new DataDescriptor_32(); 1291a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 1292a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1293a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata else 1294a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1295a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = new DataDescriptor_64(); 1296a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 1297a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1298a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail()) 1299a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 13003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 13013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 13023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 13043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx) 13053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 13063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr); 13073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); 13083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t num_children = CalculateNumChildren(); 13103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= num_children) 13123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 13133a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (m_children.empty()) 13153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 13163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // do the scan phase 13173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t key_at_idx = 0, val_at_idx = 0; 13183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t tries = 0; 13203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t test_idx = 0; 13213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata while(tries < num_children) 13233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 13243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = m_keys_ptr + (test_idx * m_ptr_size); 13253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = m_values_ptr + (test_idx * m_ptr_size);; 13263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 13273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 13283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 13293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 13303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); 13313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 13323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 13333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); 13343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 13353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 13363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata test_idx++; 13383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!key_at_idx || !val_at_idx) 13403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata continue; 13413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata tries++; 13423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; 13443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.push_back(descriptor); 13463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 13473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 13483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= m_children.size()) // should never happen 13503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 13513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 13523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor &dict_item = m_children[idx]; 13533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!dict_item.valobj_sp) 13543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 13553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // make the new ValueObject 13563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString expr; 1357fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico Granata expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%llu ; _lldb_valgen_item.value = (id)%llu; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr); 13583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 13593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata idx_name.Printf("[%d]",idx); 13603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 13613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 13623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return dict_item.valobj_sp; 13633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 1364f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1365caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1366f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ; 1367caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1368caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1369f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ; 1370caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1371caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1372f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 1373caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1374caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1375f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 1376