CXXFormatterFunctions.cpp revision 1f9df7804f59193fdfbba3d73bb81f99c689f486
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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h" 13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 142a64f9ad2f6abf7a43bb03346a5af50f9df204f7Dmitri Gribenko#include "llvm/Support/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" 22db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Symbol/ClangASTContext.h" 23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 24caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h" 25caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 26caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb; 27caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private; 28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters; 29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 30caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 31f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, 32f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* target_type, 33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 34f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t &value) 35caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 36caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target_type || !*target_type) 37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!selector || !*selector) 39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 41b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); 42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 43caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 48d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 4947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 50d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 51d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 5299611fe5a2a450087e7d9cbdb91c7d3fdcb5a5c2Sean Callanan .SetKeepInMemory(true); 53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 54caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 55caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 56d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 57d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 58caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 59caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = result_sp->GetValueAsUnsigned(0); 61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 64f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 65f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 66f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 67f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 68f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t index) 69f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 70f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 71f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 72f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 73f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 74f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 75f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 76f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 77f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); 79f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 80f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 81f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 82f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 83f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 84f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 85f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 8647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 87f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 88f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 89f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 90f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 91f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 92f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 93f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 94f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 95f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 96f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 97f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 98f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 99f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* key) 104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!key || !*key) 111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); 116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 12347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 136cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata// use this call if you already have an LLDB-side buffer for the data 137cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 138f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatastatic bool 139cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataDumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**, 140cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const SourceDataType*, 141cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8**, 142cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8*, 143cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata ConversionFlags), 144cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor& data, 145cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata Stream& stream, 146cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char prefix_token = '@', 147cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char quote = '"', 148cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata int sourceSize = 0) 149f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 150cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (prefix_token != 0) 151cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",prefix_token); 152cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 153cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 154cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd()) 155f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 156cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int bufferSPSize = data.GetByteSize(); 157cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (sourceSize == 0) 158cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 159cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int origin_encoding = 8*sizeof(SourceDataType); 1600cd33406723ceed5c08d41ff6946006298f3f133Greg Clayton sourceSize = bufferSPSize/(origin_encoding / 4); 161cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 162cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 163cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart(); 164f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata SourceDataType *data_end_ptr = data_ptr + sourceSize; 165f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 166f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata while (data_ptr < data_end_ptr) 167f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 168f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*data_ptr) 169f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 170f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_end_ptr = data_ptr; 171f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 172f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 173f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_ptr++; 174f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 175f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 176cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data_ptr = (SourceDataType*)data.GetDataStart(); 177f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 17806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata lldb::DataBufferSP utf8_data_buffer_sp; 17906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_ptr = nullptr; 18006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_end_ptr = nullptr; 181cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 182f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (ConvertFunction) 18306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 18406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_buffer_sp.reset(new DataBufferHeap(bufferSPSize,0)); 18506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); 18606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_end_ptr = utf8_data_ptr + bufferSPSize; 187f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion ); 18806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr 18906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 190f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata else 191f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 192f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // just copy the pointers - the cast is necessary to make the compiler happy 193f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // but this should only happen if we are reading UTF8 data 194f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_ptr = (UTF8*)data_ptr; 195f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_end_ptr = (UTF8*)data_end_ptr; 196f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 197f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 198b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // since we tend to accept partial data (and even partially malformed data) 199b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // we might end up with no NULL terminator before the end_ptr 200b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // hence we need to take a slower route and ensure we stay within boundaries 201f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++) 202f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 203f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*utf8_data_ptr) 204f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 205f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("%c",*utf8_data_ptr); 206f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 207f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 208cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 209cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 210f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 211f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 212f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 213cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 214cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatastatic bool 215cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceDataType**, 216cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const SourceDataType*, 217cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8**, 218cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8*, 219cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata ConversionFlags), 220cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata uint64_t location, 221cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const ProcessSP& process_sp, 222cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata Stream& stream, 223cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char prefix_token = '@', 224cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char quote = '"', 225cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata int sourceSize = 0) 226cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 227cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (location == 0 || location == LLDB_INVALID_ADDRESS) 228cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 229cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!process_sp) 230cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 231cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 232cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int origin_encoding = 8*sizeof(SourceDataType); 233cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32) 234cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 235cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // if not UTF8, I need a conversion function to return proper UTF8 236cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (origin_encoding != 8 && !ConvertFunction) 237cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 238cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 239cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (sourceSize == 0) 240cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); 241cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int bufferSPSize = sourceSize * (origin_encoding >> 2); 242cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 243cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata Error error; 244cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0)); 245cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 246cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!buffer_sp->GetBytes()) 247cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 248cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 249cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error); 250cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (error.Fail() || data_read == 0) 251cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 252cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("unable to read data"); 253cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 254cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 255cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 256cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); 257cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 258cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream(ConvertFunction, data, stream, prefix_token, quote, sourceSize); 259cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 260cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 261f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 262f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream) 263f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 264f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 265f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 266f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 267f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 268f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 269f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 270f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 271f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 272f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 273cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8,valobj_addr, 274f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata process_sp, 275f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream, 276cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'u')) 277f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 278f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 279f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 280f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 281f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 282f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 283f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 284f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 285f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 286f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream) 287f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 288f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 289f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 290f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 291f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 292f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 293f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 294f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 295f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 296f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 297cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8,valobj_addr, 298f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata process_sp, 299f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream, 300cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'U')) 301f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 302f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 303f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 304f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 305f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 306f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 307f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 308f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 309f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 310f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream) 311f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 31206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 31306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!process_sp) 31406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 31506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 316b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata lldb::addr_t data_addr = 0; 317b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 318b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (valobj.IsPointerType()) 319b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetValueAsUnsigned(0); 320b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else if (valobj.IsArrayType()) 321b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetAddressOf(); 32206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 323b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS) 32406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 32506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 32606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata clang::ASTContext* ast = valobj.GetClangAST(); 32706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 32806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!ast) 32906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 33006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 33106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType()); 33206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 33306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata switch (wchar_size) 33406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 33506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 8: 33606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 8 337cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF8>(nullptr, data_addr, 33806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata process_sp, 33906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream, 340cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L'); 34106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 16: 34206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 16 343cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8, data_addr, 34406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata process_sp, 34506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream, 346cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L'); 34706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 32: 34806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 32 349cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8, data_addr, 35006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata process_sp, 35106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream, 352cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L'); 353cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata default: 354cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("size for wchar_t is not valid"); 355cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 356cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 357cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 358cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 359cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 360cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 361cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream) 362cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 363cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 364cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 365cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 366cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 367cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 368cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 369cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 370cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 371cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1); 372cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 373cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 374cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 375cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream) 376cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 377cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 378cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 379cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 380cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 381cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 382cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 383cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 384cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 385cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1); 386cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 387cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 388cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 389cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream) 390cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 391cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 392cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 393cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 394cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata clang::ASTContext* ast = valobj.GetClangAST(); 395cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 396cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!ast) 397cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 398cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 399cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 400cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 401cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType()); 402cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 403cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata switch (wchar_size) 404cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 405cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 8: 406cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 8 407cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatChar, value); 408cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 409cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 410cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF8>(nullptr, 411cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 412cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 413cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 414cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 415cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 416cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 16: 417cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 16 418cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 419cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 420cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 421cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8, 422cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 423cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 424cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 425cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 426cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 427cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 32: 428cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 32 429cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 430cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 431cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 432cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8, 433cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 434cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 435cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 436cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 437cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 43806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata default: 43906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream.Printf("size for wchar_t is not valid"); 44006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 44106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 44206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 443f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 444f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 445b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// this function extracts information from a libcxx std::basic_string<> 446b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// irregardless of template arguments. it reports the size (in item count not bytes) 447b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// and the location in memory where the string data can be found 448b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatastatic bool 449b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataExtractLibcxxStringInfo (ValueObject& valobj, 450b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP &location_sp, 451b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t& size) 452b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 453b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0})); 454b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!D) 455b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 456b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 457b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0})); 458b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!size_mode) 459b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 460b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 461b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size_mode_value(size_mode->GetValueAsUnsigned(0)); 462b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 463b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if ((size_mode_value & 1) == 0) // this means the string is in short-mode and the data is stored inline 464b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 465b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP s(D->GetChildAtIndex(1, true)); 466b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!s) 467b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 468b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata size = ((size_mode_value >> 1) % 256); 469b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata location_sp = s->GetChildAtIndex(1, true); 470b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return (location_sp.get() != nullptr); 471b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 472b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else 473b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 474b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP l(D->GetChildAtIndex(0, true)); 475b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!l) 476b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 477b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata location_sp = l->GetChildAtIndex(2, true); 478b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); 479b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!size_vo || !location_sp) 480b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 481b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata size = size_vo->GetValueAsUnsigned(0); 482b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 483b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 484b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 485b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 486b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 487b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream) 488b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 489b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 490b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 491b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 492b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 493b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 494b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 495b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("L\"\""); 496b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 497b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 498b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 499b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 500b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return WCharStringSummaryProvider(*location_sp.get(), stream); 501b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 502b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 503b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 504b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream) 505b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 506b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 507b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 508b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 509b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 510b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 511b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 512b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("\"\""); 513b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 514b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 515b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 516b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 517b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata Error error; 518b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata location_sp->ReadPointedString(stream, 519b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata error, 520b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 0, // max length is decided by the settings 521b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata false); // do not honor array (terminates on first 0 byte even for a char[]) 522b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return error.Success(); 523b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 524b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 525caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool name_entries> 526caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 527f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream) 528caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 529caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 530caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 531caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 532caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 533caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 534caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 535caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 536caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 537caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 538caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 539caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 540caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 541caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 542caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 543caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 544caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (ptr_size == 8); 545caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 546caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 547caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 548caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 549caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 550caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 551caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 552caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 553caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 5547685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 5557685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 5567685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 5577685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 558caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"__NSDictionaryI")) 559caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 560caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 561caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 562caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 563caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 564caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); 565caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 566caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSDictionaryM")) 567caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 568caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 569caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 570caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 571caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 572caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); 573caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 574caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSCFDictionary")) 575caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 576caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 577caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error); 578caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 579caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 580caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_64bit) 581caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value &= ~0x0f1f000000000000UL; 58206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 583caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 584caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 585f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) 586caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 587caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 588caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 5895f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("%s%" PRIu64 " %s%s", 590caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? "@\"" : ""), 591caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 592caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")), 593caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (name_entries ? "\"" : "")); 594caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 595caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 596caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 597caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 598f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream) 599caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 600caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 601caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 602caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 603caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 604caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 605caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 606caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 607caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 608caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 609caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 610caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 611caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 612caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 613caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 614caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 615caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 616caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 617caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 618caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 619caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 620caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 621caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 622caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 623caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 6247685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 6257685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 6267685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 6277685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 628caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"__NSArrayI")) 629caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 630caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 631caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 632caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 633caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 634caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 635caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSArrayM")) 636caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 637caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 638caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); 639caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 640caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 641caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 642caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (!strcmp(class_name,"__NSCFArray")) 643caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 644caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 645caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error); 646caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 647caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 648caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 649caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 650caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 651f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) 652caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 653caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 654caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 6555f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("@\"%" PRIu64 " object%s\"", 656caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 657caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value == 1 ? "" : "s"); 658caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 659caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 660caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 661caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at> 662caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 663f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream) 664caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 665caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 666caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 667caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 668caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 669caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 670caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 671caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 672caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 673caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 674caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 675caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 676caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 677caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 678caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 679caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (process_sp->GetAddressByteSize() == 8); 680caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 681caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 682caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 683caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 684caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 685caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 686caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 687caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 6887685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 6897685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 6907685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 6917685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 692caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSConcreteData") || 693caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"NSConcreteMutableData") || 694caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"__NSCFData")) 695caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 696caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t offset = (is_64bit ? 16 : 8); 697caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 698caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); 699caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 700caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 701caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 702caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 703caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 704f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "length", value)) 705caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 706caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 707caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 7085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("%s%" PRIu64 " byte%s%s", 709caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "@\"" : ""), 710caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 711caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (value > 1 ? "s" : ""), 712caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "\"" : "")); 713caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 714caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 715caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 716caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 717caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 718f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream) 719caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 720caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 721caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 722caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 723caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 724caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 725caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 726caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 727caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 728caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 729caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 730caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 731caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 732caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 733caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 734caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 735caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 736caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 737caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 738caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 739caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 740caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 741caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 742caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 7437685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 7447685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 7457685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 746caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber")) 747caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 748caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (descriptor->IsTagged()) 749caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 750caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them 751caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8; 752caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t i_bits = (valobj_addr & 0xF0) >> 4; 753caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 754caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata switch (i_bits) 755caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 756caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 0: 757caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(char)%hhd",(char)value); 758caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 759caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 4: 760caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(short)%hd",(short)value); 761caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 762caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 8: 763caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(int)%d",(int)value); 764caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 765caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 12: 7665f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("(long)%" PRId64,value); 767caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 768caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata default: 7693ca24b48096ca34bdcfed26e85bb0d6be6169153Enrico Granata stream.Printf("unexpected value:(info=%" PRIu64 ", value=%" PRIu64,i_bits,value); 770caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 771caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 772caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 773caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 774caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 775caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 776caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 777caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F); 778caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t data_location = valobj_addr + 2*ptr_size; 779caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 780caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 781caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 782caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata switch (data_type) 783caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 784caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 1: // 0B00001 785caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error); 786caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 787caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 788caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(char)%hhd",(char)value); 789caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 790caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 2: // 0B0010 791caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error); 792caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 793caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 794caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(short)%hd",(short)value); 795caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 796caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 3: // 0B0011 797caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); 798caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 799caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 800caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(int)%d",(int)value); 801caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 802caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 17: // 0B10001 803caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata data_location += 8; 804caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 4: // 0B0100 805caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); 806caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 807caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 8085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("(long)%" PRId64,value); 809caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 810caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 5: // 0B0101 811caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 812caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); 813caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 814caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 815caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata float flt_value = *((float*)&flt_as_int); 816caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(float)%f",flt_value); 817caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 818caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 819caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata case 6: // 0B0110 820caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 821caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); 822caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 823caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 824caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata double dbl_value = *((double*)&dbl_as_lng); 825caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("(double)%g",dbl_value); 826caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 827caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 828caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata default: 829caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("absurd: dt=%d",data_type); 830caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata break; 831caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 832caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 833caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 834caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 835caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 836caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 837f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata // similar to ExtractValueFromObjCExpression but uses summary instead of value 838caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr_path_stream; 839caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata valobj.GetExpressionPath(expr_path_stream, false); 840caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 841caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata expr.Printf("(NSString*)[%s stringValue]",expr_path_stream.GetData()); 842caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 843caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 844caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 845caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 846caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 847caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 848d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 84947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 850d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 851d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 852d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetKeepInMemory(true) 853d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 854d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 855caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 856caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 857d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 858d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 859caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 860caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 861caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("%s",result_sp->GetSummaryAsCString()); 862caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 863caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 864caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 865caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 866caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 867f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) 868caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 869caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 870caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 871caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 872caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 873caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 874caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 875caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 876caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 877caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 878caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 879caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 880caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 881caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 882caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 883caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 884caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 885caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 886caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 887caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 888caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 889caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 890caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 891caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 89225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata if (!class_name || !*class_name) 89325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata return false; 89425c9adecf763053ff953b4d437b022075d30dd13Enrico Granata 895caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t info_bits_location = valobj_addr + ptr_size; 896caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) 897caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata info_bits_location += 3; 898caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 899caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 900caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 901caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); 902caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 903caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 904caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 905caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_mutable = (info_bits & 1) == 1; 906caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_inline = (info_bits & 0x60) == 0; 907caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool has_explicit_length = (info_bits & (1 | 4)) != 4; 908caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_unicode = (info_bits & 0x10) == 0x10; 909caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_special = strcmp(class_name,"NSPathStore2") == 0; 910caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 911caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (strcmp(class_name,"NSString") && 912caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFStringRef") && 913caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFMutableStringRef") && 914caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFConstantString") && 915caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFString") && 916caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFConstantString") && 917caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFString") && 918caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSPathStore2")) 919caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 920caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata // probably not one of us - bail out 921caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 922caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 923caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 924caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_mutable) 925caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 926caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 2 * ptr_size + valobj_addr; 927caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 928caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 929caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 930caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (has_explicit_length and is_unicode) 931cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@'); 932caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 933caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 934caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 935caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 936caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 937caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 938caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 939caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 940caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 941caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 942caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 943caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 944caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable) 945caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 946caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 3 * ptr_size + valobj_addr; 947caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 948caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 949caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 950caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 951caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 952caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 953caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 954caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 955caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_unicode) 956caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 957caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 958caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_inline) 959caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 960caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 961caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 962caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("found new combo"); 963caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 964caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 965caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 966caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location += ptr_size; 967caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 968caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 969caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 970caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 971caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 972caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 973caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 974cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@'); 975caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 976caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_special) 977caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 978caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8); 979cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@'); 980caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 981caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline) 982caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 983caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 984caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 985caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 986caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 987caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 988caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 989caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 990caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 991caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 992caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 993caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 994caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 995caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 996caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0); 997caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 998caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 999caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1000caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0)); 1001caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error); 1002caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1003caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1004caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (data_read) 1005caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes()); 1006caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1007caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1008caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1009caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("class name = %s",class_name); 1010caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1011caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1012caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 1013caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 10149abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool 1015dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1016dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1017dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata TargetSP target_sp(valobj.GetTargetSP()); 1018dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!target_sp) 1019dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1020dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); 1021dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata uint64_t pointee = valobj.GetValueAsUnsigned(0); 1022dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!pointee) 1023dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1024dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata pointee += addr_size; 1025dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ClangASTType type(valobj.GetClangAST(),valobj.GetClangType()); 1026dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ExecutionContext exe_ctx(target_sp,false); 1027dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointee, exe_ctx, type)); 1028dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!child_ptr_sp) 1029dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1030dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata DataExtractor data; 1031dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_ptr_sp->GetData(data); 1032dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type)); 1033dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_sp->GetValueAsUnsigned(0); 1034dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (child_sp) 1035dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSStringSummaryProvider(*child_sp, stream); 1036dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1037dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1038dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1039dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 1040dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1041dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1042dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSAttributedStringSummaryProvider(valobj, stream); 1043dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1044dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1045dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 10469abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream) 10479abbfba957db139beed19866f61599424ddcd37aEnrico Granata{ 10489abbfba957db139beed19866f61599424ddcd37aEnrico Granata stream.Printf("%s",valobj.GetObjectDescription()); 10499abbfba957db139beed19866f61599424ddcd37aEnrico Granata return true; 10509abbfba957db139beed19866f61599424ddcd37aEnrico Granata} 10519abbfba957db139beed19866f61599424ddcd37aEnrico Granata 1052db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1053979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granatalldb_private::formatters::NSURLSummaryProvider (ValueObject& valobj, Stream& stream) 1054979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata{ 1055979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 1056979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!process_sp) 1057979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1058979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1059979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1060979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1061979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!runtime) 1062979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1063979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1064979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 1065979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1066979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 1067979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1068979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1069979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 1070979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1071979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 1072979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1073979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!valobj_addr) 1074979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1075979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1076979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 1077979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1078979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!class_name || !*class_name) 1079979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1080979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1081979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (strcmp(class_name, "NSURL") == 0) 1082979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata { 1083979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata uint64_t offset_text = ptr_size + ptr_size + 8; // ISA + pointer + 8 bytes of data (even on 32bit) 1084979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata uint64_t offset_base = offset_text + ptr_size; 1085979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ClangASTType type(valobj.GetClangAST(),valobj.GetClangType()); 1086979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset_text, type, true)); 1087979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ValueObjectSP base(valobj.GetSyntheticChildAtOffset(offset_base, type, true)); 10882fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata if (!text) 1089979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1090979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (text->GetValueAsUnsigned(0) == 0) 1091979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1092979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata StreamString summary; 1093979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!NSStringSummaryProvider(*text, summary)) 1094979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 10952fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata if (base && base->GetValueAsUnsigned(0)) 1096979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata { 1097979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (summary.GetSize() > 0) 1098979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata summary.GetString().resize(summary.GetSize()-1); 1099979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata summary.Printf(" -- "); 1100979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata StreamString base_summary; 11012fd26158cadd9abd1592c5b72ac60c6e1e31c43fEnrico Granata if (NSURLSummaryProvider(*base, base_summary) && base_summary.GetSize() > 0) 1102979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata summary.Printf("%s",base_summary.GetSize() > 2 ? base_summary.GetData() + 2 : base_summary.GetData()); 1103979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata } 1104979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (summary.GetSize()) 1105979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata { 1106979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata stream.Printf("%s",summary.GetData()); 1107979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return true; 1108979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata } 1109979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata } 1110979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata else 1111979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata { 1112979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata // similar to ExtractValueFromObjCExpression but uses summary instead of value 1113979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata StreamString expr_path_stream; 1114979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 1115979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata StreamString expr; 1116979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata expr.Printf("(NSString*)[%s description]",expr_path_stream.GetData()); 1117979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 1118979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata lldb::ValueObjectSP result_sp; 1119979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 1120979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 1121979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!target || !stack_frame) 1122979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1123979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1124979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata EvaluateExpressionOptions options; 1125979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata options.SetCoerceToId(false) 1126979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata .SetUnwindOnError(true) 1127979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata .SetKeepInMemory(true) 1128979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 1129979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1130979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata target->EvaluateExpression(expr.GetData(), 1131979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata stack_frame, 1132979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata result_sp, 1133979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata options); 1134979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata if (!result_sp) 1135979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1136979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata stream.Printf("%s",result_sp->GetSummaryAsCString()); 1137979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return true; 1138979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata } 1139979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata return false; 1140979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata} 1141979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granata 1142979c4b526eb31cbed5475ec62ef10fe53cbf8c45Enrico Granatabool 1143db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream) 1144db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 1145db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata const uint32_t type_info = ClangASTContext::GetTypeInfo(valobj.GetClangType(), 1146db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata valobj.GetClangAST(), 1147db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata NULL); 1148db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1149db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ValueObjectSP real_guy_sp = valobj.GetSP(); 1150db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1151db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (type_info & ClangASTContext::eTypeIsPointer) 1152db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1153db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata Error err; 1154db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.Dereference(err); 1155db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (err.Fail() || !real_guy_sp) 1156db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1157db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1158db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata else if (type_info & ClangASTContext::eTypeIsReference) 1159db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1160db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.GetChildAtIndex(0, true); 1161db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (!real_guy_sp) 1162db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1163db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1164db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata uint64_t value = real_guy_sp->GetValueAsUnsigned(0); 1165db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (value == 0) 1166db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1167db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("NO"); 1168db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1169db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1170db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("YES"); 1171db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1172db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1173db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1174db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate <bool is_sel_ptr> 1175db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1176db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream) 1177db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 11781f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::ValueObjectSP valobj_sp; 1179db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 11801f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!valobj.GetClangAST()) 1181db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1182db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata void* char_opaque_type = valobj.GetClangAST()->CharTy.getAsOpaquePtr(); 11831f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!char_opaque_type) 11841f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 1185db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ClangASTType charstar(valobj.GetClangAST(),ClangASTType::GetPointerType(valobj.GetClangAST(), char_opaque_type)); 11861f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 11871f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); 1188db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 11891f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (is_sel_ptr) 11901f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 11911f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); 11921f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (data_address == LLDB_INVALID_ADDRESS) 11931f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 11941f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar); 11951f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 11961f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata else 11971f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 11981f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata DataExtractor data; 11991f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj.GetData(data); 12001f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); 12011f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 12021f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 12031f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!valobj_sp) 12041f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 1205db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1206db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("%s",valobj_sp->GetSummaryAsCString()); 1207db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1208db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1209db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1210f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 1211f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 1212f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(), 1213f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8), 1214f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_32(NULL), 1215f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_64(NULL) 1216f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1217247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp) 1218f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1219247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr()); 1220247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Update(); 1221f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1222f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1223f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 122436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 1225f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren () 1226f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1227f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (m_data_32) 1228f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_data_32->_used; 1229f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (m_data_64) 1230f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_data_64->_used; 1231f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 1232f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1233f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1234f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 123536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx) 1236f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1237f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!m_data_32 && !m_data_64) 1238f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 1239f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx >= CalculateNumChildren()) 1240f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 1241f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data); 1242f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx += (idx * m_ptr_size); 1243f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 124436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 1245f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), 1246f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx, 1247f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_exe_ctx_ref, 1248f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_id_type); 1249f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.push_back(retval_sp); 1250f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 1251f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1252f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1253f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 1254f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::Update() 1255f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1256f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.clear(); 1257247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1258247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = 0; 1259247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata delete m_data_32; 1260247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_32 = NULL; 1261247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata delete m_data_64; 1262247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_64 = NULL; 1263247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsDynamic()) 1264247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1265247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 1266247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1267247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1268247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Error error; 1269247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsPointerType()) 1270247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 1271247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1272247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail() || !valobj_sp) 1273247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1274247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 1275247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata error.Clear(); 1276247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1277247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!process_sp) 1278247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1279247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1280247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1281247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (m_ptr_size == 4) 1282247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 1283247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_32 = new DataDescriptor_32(); 1284247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 1285247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 1286247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata else 1287247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 1288247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_64 = new DataDescriptor_64(); 1289247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 1290247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 1291247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail()) 1292247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1293f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 1294f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1295f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1296800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1297800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren () 1298800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1299f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1300800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1301800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 1302f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatastatic uint32_t 1303f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataExtractIndexFromString (const char* item_name) 1304f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1305f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!item_name || !*item_name) 1306f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1307f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (*item_name != '[') 1308f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1309f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata item_name++; 1310f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = 0; 1311f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata while(*item_name) 1312f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1313f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata char x = *item_name; 1314f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (x == ']') 1315f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata break; 1316f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (x < '0' || x > '9') 1317f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1318f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata idx = 10*idx + (x-'0'); 1319f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata item_name++; 1320f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1321f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 1322f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1323f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1324f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 1325f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 1326f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1327f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!m_data_32 && !m_data_64) 1328f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1329f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* item_name = name.GetCString(); 1330f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 1331f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 1332f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1333f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 1334f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1335f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1336f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd () 1337f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1338f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata delete m_data_32; 1339f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_data_32 = NULL; 1340f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata delete m_data_64; 1341f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_data_64 = NULL; 1342f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1343f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1344f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 1345f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 1346f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_exe_ctx_ref(), 1347f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_ptr_size(8), 1348f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_items(0), 1349f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatam_data_ptr(0) 1350f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1351247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp) 1352f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1353247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr()); 1354247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Update(); 1355f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1356f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1357f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1358f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd () 1359f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1360f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1361f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1362f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 1363f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 1364f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1365f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* item_name = name.GetCString(); 1366f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 1367f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 1368f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return UINT32_MAX; 1369f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return idx; 1370f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1371f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 137236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 1373f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren () 1374f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1375f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return m_items; 1376f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1377f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1378f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 1379f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::Update() 1380f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1381247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = 0; 1382247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_items = 0; 1383247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_ptr = 0; 1384f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.clear(); 1385247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1386247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsDynamic()) 1387247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1388247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 1389247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1390247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1391247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata Error error; 1392247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (valobj_sp->IsPointerType()) 1393247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata { 1394247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1395247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail() || !valobj_sp) 1396247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1397247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata } 1398247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata error.Clear(); 1399247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1400247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!process_sp) 1401247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1402247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1403247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1404247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_items = process_sp->ReadPointerFromMemory(data_location, error); 1405247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (error.Fail()) 1406247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 1407247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata m_data_ptr = data_location+m_ptr_size; 1408f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 1409f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1410f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1411800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1412800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren () 1413800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1414f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1415800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1416800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 1417f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 141836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx) 1419f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1420f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (idx >= CalculateNumChildren()) 1421f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 1422f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::addr_t object_at_idx = m_data_ptr; 1423f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx += (idx * m_ptr_size); 1424f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 1425f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!process_sp) 1426f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 1427f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error error; 1428f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata object_at_idx = process_sp->ReadPointerFromMemory(object_at_idx, error); 1429f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (error.Fail()) 1430f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return lldb::ValueObjectSP(); 1431f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 14325f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("(id)%" PRIu64,object_at_idx); 1433f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 143436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 1435f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 1436f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata m_children.push_back(retval_sp); 1437f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 1438f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1439f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1440f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 1441f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1442f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); 1443f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!process_sp) 1444f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 1445f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1446f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!runtime) 1447f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 1448f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1449f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!valobj_sp->IsPointerType()) 1450f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1451f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error error; 1452f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp = valobj_sp->AddressOf(error); 1453f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (error.Fail() || !valobj_sp) 1454f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 1455f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1456f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1457f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); 1458f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1459f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 1460f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return NULL; 1461f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1462f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 14637685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 14647685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 14657685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return NULL; 14667685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 1467f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!strcmp(class_name,"__NSArrayI")) 1468f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1469f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayISyntheticFrontEnd(valobj_sp)); 1470f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1471f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata else if (!strcmp(class_name,"__NSArrayM")) 1472f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1473f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayMSyntheticFrontEnd(valobj_sp)); 1474f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1475f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata else 1476f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 1477f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp)); 1478f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 1479f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1480f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1481f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 1482f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()) 1483f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{} 1484f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 148536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 1486f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren () 1487f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1488f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t count = 0; 1489f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) 1490f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return count; 1491f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 1492f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1493f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1494f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 149536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) 1496f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1497f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString idx_name; 149836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 1499f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx); 1500f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (valobj_sp) 1501f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp->SetName(ConstString(idx_name.GetData())); 1502f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 1503f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1504f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1505f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 1506f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update() 1507f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1508f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return false; 1509f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1510f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1511800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1512800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::MightHaveChildren () 1513800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1514f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1515800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1516800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 1517f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 1518f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 1519f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1520f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return 0; 1521f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1522f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1523f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd () 1524f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{} 1525f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 15263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 15273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 15283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); 15303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 15313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 15323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 15333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!runtime) 15343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 15353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!valobj_sp->IsPointerType()) 15373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 15383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 15393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata valobj_sp = valobj_sp->AddressOf(error); 15403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail() || !valobj_sp) 15413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 15423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 15433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); 15453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 15473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return NULL; 15483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 15507685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 15517685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 15527685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return NULL; 15537685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 15543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!strcmp(class_name,"__NSDictionaryI")) 15553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 15563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); 15573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 15583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata else if (!strcmp(class_name,"__NSDictionaryM")) 15593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 15603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); 15613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 15623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata else 15633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 15643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp)); 15653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 15663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 15673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 15693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()) 15703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{} 15713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 157236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 15733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren () 15743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 15753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint64_t count = 0; 15763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) 15773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return count; 15783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 15793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 15803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 15813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 158236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) 15833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 15843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 158536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 15863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString valobj_expr_path; 15873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_backend.GetExpressionPath(valobj_expr_path, false); 15883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString key_fetcher_expr; 158936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%zu]",valobj_expr_path.GetData(),idx); 15903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString value_fetcher_expr; 15913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData()); 15923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString object_fetcher_expr; 1593fd3d28dc02a37c61354b5b687d4ce9aea53d62d3Enrico 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()); 15943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::ValueObjectSP child_sp; 15953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp, 159647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions().SetKeepInMemory(true)); 15973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (child_sp) 15983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata child_sp->SetName(ConstString(idx_name.GetData())); 15993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return child_sp; 16003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 16023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 16033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update() 16043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 16063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 1608800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1609800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::MightHaveChildren () 1610800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1611f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1612800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1613800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 1614f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 16153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 16163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 16183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 16203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd () 16213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{} 16223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 16233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 16243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()), 16253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_exe_ctx_ref(), 16263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_ptr_size(8), 16273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32(NULL), 16283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64(NULL) 16293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 1630a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp) 1631a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Update(); 16323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 16343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd () 16353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_32; 16373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32 = NULL; 16383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_64; 16393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64 = NULL; 16403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 1642f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 16433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 16443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* item_name = name.GetCString(); 16463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 16473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 16483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return UINT32_MAX; 16493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return idx; 16503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 165236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 16533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren () 16543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!m_data_32 && !m_data_64) 16563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 16573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (m_data_32 ? m_data_32->_used : m_data_64->_used); 16583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 16593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 16603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 16613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() 16623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 16633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.clear(); 1664a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_32; 1665a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = NULL; 1666a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_64; 1667a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = NULL; 1668a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = 0; 1669a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1670a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1671a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1672a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsDynamic()) 1673a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1674a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1675a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1676a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1677a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Error error; 1678a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsPointerType()) 1679a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1680a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1681a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail() || !valobj_sp) 1682a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1683a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1684a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata error.Clear(); 1685a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1686a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!process_sp) 1687a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1688a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1689a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1690a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (m_ptr_size == 4) 1691a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1692a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = new DataDescriptor_32(); 1693a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 1694a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1695a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata else 1696a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1697a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = new DataDescriptor_64(); 1698a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 1699a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1700a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail()) 1701a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1702a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_ptr = data_location + m_ptr_size; 17033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 17043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 17053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 1706800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1707800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren () 1708800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1709f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1710800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1711800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 17123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 171336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx) 17143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 17153a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t num_children = CalculateNumChildren(); 17163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= num_children) 17183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 17193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17203a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (m_children.empty()) 17213a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 17223a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // do the scan phase 17233a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t key_at_idx = 0, val_at_idx = 0; 17243a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17253a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t tries = 0; 17263a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t test_idx = 0; 17273a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17283a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata while(tries < num_children) 17293a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 17303a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size); 17313a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = key_at_idx + m_ptr_size; 17323a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 17333a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 17343a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 17353a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 17363a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); 17373a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 17383a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 17393a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); 17403a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 17413a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 17423a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17433a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata test_idx++; 17443a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17453a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!key_at_idx || !val_at_idx) 17463a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata continue; 17473a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata tries++; 17483a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17493a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; 17503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.push_back(descriptor); 17523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 17533a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 17543a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17553a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= m_children.size()) // should never happen 17563a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 17573a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17583a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor &dict_item = m_children[idx]; 17593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!dict_item.valobj_sp) 17603a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 17613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // make the new ValueObject 17623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString expr; 17635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr); 17643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 176536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 17663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 17673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 17683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return dict_item.valobj_sp; 17693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 17703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 17723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()), 17733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_exe_ctx_ref(), 17743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_ptr_size(8), 17753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32(NULL), 17763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64(NULL) 17773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 1778a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp) 1779a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Update (); 17803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 17813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 17823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd () 17833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 17843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_32; 17853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_32 = NULL; 17863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata delete m_data_64; 17873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_data_64 = NULL; 17883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 17893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 1790f509c5ec066599a3399fced39ea36996184939e8Enrico Granatasize_t 17913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 17923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 17933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata const char* item_name = name.GetCString(); 17943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t idx = ExtractIndexFromString(item_name); 17953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 17963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return UINT32_MAX; 17973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return idx; 17983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 17993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 180036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 18013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren () 18023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 18033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!m_data_32 && !m_data_64) 18043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return 0; 18053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return (m_data_32 ? m_data_32->_used : m_data_64->_used); 18063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 18073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatabool 18093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update() 18103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 18113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.clear(); 1812a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1813a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = 0; 1814a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_32; 1815a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = NULL; 1816a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata delete m_data_64; 1817a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = NULL; 1818a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1819a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1820a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsDynamic()) 1821a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->GetStaticValue(); 1822a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!valobj_sp) 1823a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1824a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 1825a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata Error error; 1826a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (valobj_sp->IsPointerType()) 1827a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1828a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata valobj_sp = valobj_sp->Dereference(error); 1829a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail() || !valobj_sp) 1830a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1831a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1832a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata error.Clear(); 1833a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); 1834a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (!process_sp) 1835a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 1836a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_ptr_size = process_sp->GetAddressByteSize(); 1837a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; 1838a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (m_ptr_size == 4) 1839a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1840a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_32 = new DataDescriptor_32(); 1841a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); 1842a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1843a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata else 1844a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata { 1845a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata m_data_64 = new DataDescriptor_64(); 1846a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); 1847a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata } 1848a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata if (error.Fail()) 1849a787c1ad2a5ab1d5be6be1936d776c8406bc8d53Enrico Granata return false; 18503a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return false; 18513a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 18523a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 1853800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatabool 1854800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granatalldb_private::formatters::NSDictionaryMSyntheticFrontEnd::MightHaveChildren () 1855800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata{ 1856f3c10481f8ea2aa45ea02ec24dd70cbe3f7b24f9Enrico Granata return true; 1857800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata} 1858800332c3988c78ea002b64b698f38b58ed95d3baEnrico Granata 18593a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granatalldb::ValueObjectSP 186036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonlldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx) 18613a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata{ 18623a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr); 18633a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); 18643a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18653a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t num_children = CalculateNumChildren(); 18663a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18673a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= num_children) 18683a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 18693a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18703a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (m_children.empty()) 18713a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 18723a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // do the scan phase 18733a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata lldb::addr_t key_at_idx = 0, val_at_idx = 0; 18743a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18753a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t tries = 0; 18763a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata uint32_t test_idx = 0; 18773a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18783a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata while(tries < num_children) 18793a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 18803a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = m_keys_ptr + (test_idx * m_ptr_size); 18813a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = m_values_ptr + (test_idx * m_ptr_size);; 18823a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); 18833a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!process_sp) 18843a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 18853a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata Error error; 18863a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); 18873a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 18883a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 18893a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); 18903a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (error.Fail()) 18913a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 18923a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18933a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata test_idx++; 18943a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18953a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!key_at_idx || !val_at_idx) 18963a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata continue; 18973a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata tries++; 18983a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 18993a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; 19003a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 19013a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata m_children.push_back(descriptor); 19023a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 19033a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 19043a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 19053a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (idx >= m_children.size()) // should never happen 19063a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return lldb::ValueObjectSP(); 19073a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata 19083a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata DictionaryItemDescriptor &dict_item = m_children[idx]; 19093a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata if (!dict_item.valobj_sp) 19103a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata { 19113a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata // make the new ValueObject 19123a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString expr; 19135f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr); 19143a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata StreamString idx_name; 191536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton idx_name.Printf("[%zu]",idx); 19163a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref); 19173a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata } 19183a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata return dict_item.valobj_sp; 19193a08fd1ab40ac76a732836ee5b1b5aa23605f669Enrico Granata} 1920f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1921689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 1922689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()), 1923689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_exe_ctx_ref(), 1924689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_count(0), 1925689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_base_data_address(0), 1926689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_options() 1927689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata { 1928689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (valobj_sp) 1929689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Update(); 1930689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_options.SetCoerceToId(false) 1931689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetUnwindOnError(true) 1932689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetKeepInMemory(true) 1933689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 1934689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 1935689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1936689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 1937689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::CalculateNumChildren () 1938689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1939689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return m_count; 1940689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1941689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1942689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP 1943689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx) 1944689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1945689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (idx >= m_count) 1946689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 1947689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (m_base_data_address == 0 || m_count == 0) 1948689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 1949689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t byte_idx = (idx >> 3); // divide by 8 to get byte index 1950689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t bit_index = (idx & 7); // efficient idx % 8 for bit index 1951689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata lldb::addr_t byte_location = m_base_data_address + byte_idx; 1952689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); 1953689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!process_sp) 1954689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 1955689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint8_t byte = 0; 1956689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint8_t mask = 0; 1957689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Error err; 1958689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err); 1959689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (err.Fail() || bytes_read == 0) 1960689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 1961689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata switch (bit_index) 1962689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata { 1963689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 0: 1964689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 1; break; 1965689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 1: 1966689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 2; break; 1967689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 2: 1968689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 4; break; 1969689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 3: 1970689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 8; break; 1971689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 4: 1972689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 16; break; 1973689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 5: 1974689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 32; break; 1975689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 6: 1976689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 64; break; 1977689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 7: 1978689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 128; break; 1979689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata default: 1980689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 1981689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 1982689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata bool bit_set = ((byte & mask) != 0); 1983689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Target& target(process_sp->GetTarget()); 1984689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP retval_sp; 1985689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (bit_set) 1986689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata target.EvaluateExpression("(bool)true", NULL, retval_sp); 1987689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata else 1988689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata target.EvaluateExpression("(bool)false", NULL, retval_sp); 1989689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata StreamString name; name.Printf("[%zu]",idx); 1990689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (retval_sp) 1991689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata retval_sp->SetName(ConstString(name.GetData())); 1992689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return retval_sp; 1993689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1994689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1995689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata/*(std::__1::vector<std::__1::allocator<bool> >) vBool = { 1996689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata __begin_ = 0x00000001001000e0 1997689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata __size_ = 56 1998689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata __cap_alloc_ = { 1999689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata std::__1::__libcpp_compressed_pair_imp<unsigned long, std::__1::allocator<unsigned long> > = { 2000689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata __first_ = 1 2001689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2002689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2003689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata}*/ 2004689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2005689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 2006689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() 2007689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2008689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 2009689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2010689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2011689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (valobj_sp->IsDynamic()) 2012689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata valobj_sp = valobj_sp->GetStaticValue(); 2013689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2014689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2015689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 2016689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true)); 2017689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!size_sp) 2018689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2019689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_count = size_sp->GetValueAsUnsigned(0); 2020689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_count) 2021689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 2022689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP begin_sp(valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true)); 2023689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!begin_sp) 2024689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata { 2025689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_count = 0; 2026689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2027689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2028689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_base_data_address = begin_sp->GetValueAsUnsigned(0); 2029689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_base_data_address) 2030689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata { 2031689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_count = 0; 2032689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2033689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2034689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 2035689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2036689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2037689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 2038689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::MightHaveChildren () 2039689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2040689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 2041689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2042689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2043689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 2044689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 2045689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2046689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_count || !m_base_data_address) 2047689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return UINT32_MAX; 2048689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata const char* item_name = name.GetCString(); 2049689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint32_t idx = ExtractIndexFromString(item_name); 2050689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 2051689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return UINT32_MAX; 2052689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return idx; 2053689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2054689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2055689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::~LibcxxVectorBoolSyntheticFrontEnd () 2056689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{} 2057689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2058689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd* 2059689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 2060689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2061689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2062689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return NULL; 2063689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return (new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp)); 2064689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2065689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2066689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : 2067689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 2068689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_exe_ctx_ref(), 2069689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_count(0), 2070689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_base_data_address(0), 2071689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatam_options() 2072689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2073689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (valobj_sp) 2074689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Update(); 2075689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_options.SetCoerceToId(false) 2076689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetUnwindOnError(true) 2077689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetKeepInMemory(true) 2078689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 2079689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2080689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2081689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 2082689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::CalculateNumChildren () 2083689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2084689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return m_count; 2085689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2086689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2087689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP 2088689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx) 2089689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2090689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (idx >= m_count) 2091689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 2092689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (m_base_data_address == 0 || m_count == 0) 2093689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 2094689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t byte_idx = (idx >> 3); // divide by 8 to get byte index 2095689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t bit_index = (idx & 7); // efficient idx % 8 for bit index 2096689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata lldb::addr_t byte_location = m_base_data_address + byte_idx; 2097689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); 2098689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!process_sp) 2099689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 2100689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint8_t byte = 0; 2101689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint8_t mask = 0; 2102689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Error err; 2103689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err); 2104689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (err.Fail() || bytes_read == 0) 2105689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 2106689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata switch (bit_index) 2107689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata { 2108689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 0: 2109689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 1; break; 2110689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 1: 2111689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 2; break; 2112689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 2: 2113689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 4; break; 2114689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 3: 2115689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 8; break; 2116689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 4: 2117689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 16; break; 2118689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 5: 2119689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 32; break; 2120689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 6: 2121689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 64; break; 2122689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata case 7: 2123689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata mask = 128; break; 2124689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata default: 2125689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return ValueObjectSP(); 2126689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2127689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata bool bit_set = ((byte & mask) != 0); 2128689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata Target& target(process_sp->GetTarget()); 2129689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP retval_sp; 2130689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (bit_set) 2131689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata target.EvaluateExpression("(bool)true", NULL, retval_sp); 2132689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata else 2133689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata target.EvaluateExpression("(bool)false", NULL, retval_sp); 2134689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata StreamString name; name.Printf("[%zu]",idx); 2135689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (retval_sp) 2136689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata retval_sp->SetName(ConstString(name.GetData())); 2137689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return retval_sp; 2138689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2139689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2140689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata/*((std::vector<std::allocator<bool> >) vBool = { 2141689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bvector_base<std::allocator<bool> >) std::_Bvector_base<std::allocator<bool> > = { 2142689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bvector_base<std::allocator<bool> >::_Bvector_impl) _M_impl = { 2143689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator) _M_start = { 2144689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = { 2145689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_p = 0x0016b160 2146689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (unsigned int) _M_offset = 0 2147689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2148689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2149689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator) _M_finish = { 2150689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = { 2151689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_p = 0x0016b16c 2152689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (unsigned int) _M_offset = 16 2153689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2154689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2155689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata (_Bit_type *) _M_end_of_storage = 0x0016b170 2156689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2157689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2158689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata } 2159689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata*/ 2160689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2161689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 2162689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::Update() 2163689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2164689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 2165689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2166689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2167689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (valobj_sp->IsDynamic()) 2168689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata valobj_sp = valobj_sp->GetStaticValue(); 2169689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2170689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2171689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 2172689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2173689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP m_impl_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_impl"), true)); 2174689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_impl_sp) 2175689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2176689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2177689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP m_start_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_start"), true)); 2178689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP m_finish_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_finish"), true)); 2179689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2180689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata ValueObjectSP start_p_sp, finish_p_sp, finish_offset_sp; 2181689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2182689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_start_sp || !m_finish_sp) 2183689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2184689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2185689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata start_p_sp = m_start_sp->GetChildMemberWithName(ConstString("_M_p"), true); 2186689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata finish_p_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_p"), true); 2187689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata finish_offset_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_offset"), true); 2188689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2189689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!start_p_sp || !finish_offset_sp || !finish_p_sp) 2190689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2191689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2192689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_base_data_address = start_p_sp->GetValueAsUnsigned(0); 2193689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_base_data_address) 2194689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2195689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2196689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata lldb::addr_t end_data_address(finish_p_sp->GetValueAsUnsigned(0)); 2197689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!end_data_address) 2198689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2199689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2200689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (end_data_address < m_base_data_address) 2201689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 2202689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata else 2203689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata m_count = finish_offset_sp->GetValueAsUnsigned(0) + (end_data_address-m_base_data_address)*8; 2204689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2205689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 2206689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2207689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2208689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 2209689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::MightHaveChildren () 2210689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2211689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 2212689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2213689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2214689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 2215689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 2216689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2217689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!m_count || !m_base_data_address) 2218689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return UINT32_MAX; 2219689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata const char* item_name = name.GetCString(); 2220689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata uint32_t idx = ExtractIndexFromString(item_name); 2221689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (idx < UINT32_MAX && idx >= CalculateNumChildren()) 2222689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return UINT32_MAX; 2223689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return idx; 2224689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2225689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2226689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::~LibstdcppVectorBoolSyntheticFrontEnd () 2227689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{} 2228689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2229689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico GranataSyntheticChildrenFrontEnd* 2230689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 2231689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 2232689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata if (!valobj_sp) 2233689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return NULL; 2234689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return (new LibstdcppVectorBoolSyntheticFrontEnd(valobj_sp)); 2235689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 2236689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 2237caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 2238f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ; 2239caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 2240caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 2241f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ; 2242caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 2243caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 2244f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 2245caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 2246caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 2247f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 2248db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 2249db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 2250db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ; 2251db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 2252db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 2253db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ; 2254