| """ | |
| Example data formatters for strings represented as (pointer,length) pairs | |
| encoded in UTF8/16/32 for use with the LLDB debugger | |
| To use in your projects, tweak the children names as appropriate for your data structures | |
| and use as summaries for your data types | |
| Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| See https://llvm.org/LICENSE.txt for license information. | |
| SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| """ | |
| import lldb | |
| def utf8_summary(value, unused): | |
| pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0) | |
| length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0) | |
| if pointer == 0: | |
| return False | |
| if length == 0: | |
| return '""' | |
| error = lldb.SBError() | |
| string_data = value.process.ReadMemory(pointer, length, error) | |
| return '"%s"' % (string_data) # utf8 is safe to emit as-is on OSX | |
| def utf16_summary(value, unused): | |
| pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0) | |
| length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0) | |
| # assume length is in bytes - if in UTF16 chars, just multiply by 2 | |
| if pointer == 0: | |
| return False | |
| if length == 0: | |
| return '""' | |
| error = lldb.SBError() | |
| string_data = value.process.ReadMemory(pointer, length, error) | |
| # utf8 is safe to emit as-is on OSX | |
| return '"%s"' % (string_data.decode("utf-16").encode("utf-8")) | |
| def utf32_summary(value, unused): | |
| pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0) | |
| length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0) | |
| # assume length is in bytes - if in UTF32 chars, just multiply by 4 | |
| if pointer == 0: | |
| return False | |
| if length == 0: | |
| return '""' | |
| error = lldb.SBError() | |
| string_data = value.process.ReadMemory(pointer, length, error) | |
| # utf8 is safe to emit as-is on OSX | |
| return '"%s"' % (string_data.decode("utf-32").encode("utf-8")) |