# Pretty-printer for SpiderMonkey symbols. import gdb import mozilla.prettyprinters from mozilla.prettyprinters import ptr_pretty_printer # Forget any printers from previous loads of this module. mozilla.prettyprinters.clear_module_printers(__name__) # JS::SymbolCode enumerators InSymbolRegistry = 0xfffffffe UniqueSymbol = 0xffffffff @ptr_pretty_printer("JS::Symbol") class JSSymbolPtr(mozilla.prettyprinters.Pointer): def __init__(self, value, cache): super(JSSymbolPtr, self).__init__(value, cache) self.value = value def to_string(self): code = int(self.value['code_']) & 0xffffffff desc = str(self.value['description_']) if code == InSymbolRegistry: return "Symbol.for({})".format(desc) elif code == UniqueSymbol: return "Symbol({})".format(desc) else: # Well-known symbol. Strip off the quotes added by the JSString * # pretty-printer. assert desc[0] == '"' assert desc[-1] == '"' return desc[1:-1]