def format_char(c): if c == 0: return "\\0" elif c == 0x07: return "\\a" elif c == 0x08: return "\\b" elif c == 0x0c: return "\\f" elif c == 0x0a: return "\\n" elif c == 0x0d: return "\\r" elif c == 0x09: return "\\t" elif c == 0x0b: return "\\v" elif c == 0x5c: return "\\" elif c == 0x22: return "\\\"" elif c == 0x27: return "\\'" elif c < 0x20 or c >= 0x80 and c <= 0xff: return "\\x%02x" % c elif c >= 0x0100: return "\\u%04x" % c else: return chr(c) # Take an SBValue that is either a char* or char16_t* and formats it like lldb # would when printing it. def format_string(lldb_value, length=100): ptr = lldb_value.GetValueAsUnsigned(0) char_type = lldb_value.GetType().GetPointeeType() if char_type.GetByteSize() == 1: s = "\"" size = 1 mask = 0xff elif char_type.GetByteSize() == 2: s = "u\"" size = 2 mask = 0xffff else: return "(cannot format string with char type %s)" % char_type.GetName() i = 0 terminated = False while i < length: c = lldb_value.CreateValueFromAddress("x", ptr + i * size, char_type).GetValueAsUnsigned(0) & mask if c == 0: terminated = True break s += format_char(c) i = i + 1 s += "\"" if not terminated and i != length: s += "..." return s # Dereferences a raw pointer, nsCOMPtr, RefPtr, nsAutoPtr, already_AddRefed or # mozilla::RefPtr; otherwise returns the value unchanged. def dereference(lldb_value): if lldb_value.TypeIsPointerType(): return lldb_value.Dereference() name = lldb_value.GetType().GetUnqualifiedType().GetName() if name.startswith("nsCOMPtr<") or name.startswith("RefPtr<") or name.startswith("nsAutoPtr<") or name.startswith("already_AddRefed<"): return lldb_value.GetChildMemberWithName("mRawPtr") if name.startswith("mozilla::RefPtr<"): return lldb_value.GetChildMemberWithName("ptr") return lldb_value