| # Pretty-printers for GCCellPtr values. |
| |
| import gdb |
| import mozilla.prettyprinters |
| |
| from mozilla.prettyprinters import pretty_printer |
| |
| # Forget any printers from previous loads of this module. |
| mozilla.prettyprinters.clear_module_printers(__name__) |
| |
| # Cache information about the JS::TraceKind type for this objfile. |
| class GCCellPtrTypeCache(object): |
| def __init__(self, cache): |
| self.TraceKind_t = gdb.lookup_type('JS::TraceKind') |
| |
| # Build a mapping from TraceKind enum values to the types they denote. |
| e = gdb.types.make_enum_dict(self.TraceKind_t) |
| kind_to_type = {} |
| def kind(k, t): |
| kind_to_type[e['JS::TraceKind::' + k]] = gdb.lookup_type(t) |
| kind('Object', 'JSObject') |
| kind('String', 'JSString') |
| kind('Symbol', 'JS::Symbol') |
| kind('Script', 'JSScript') |
| kind('Shape', 'js::Shape') |
| kind('ObjectGroup', 'js::ObjectGroup') |
| kind('BaseShape', 'js::BaseShape') |
| kind('JitCode', 'js::jit::JitCode') |
| kind('LazyScript', 'js::LazyScript') |
| self.kind_to_type = kind_to_type |
| |
| self.Null = e['JS::TraceKind::Null'] |
| self.mask = gdb.parse_and_eval('JS::OutOfLineTraceKindMask') |
| |
| @pretty_printer('JS::GCCellPtr') |
| class GCCellPtr(object): |
| def __init__(self, value, cache): |
| self.value = value |
| if not cache.mod_GCCellPtr: |
| cache.mod_GCCellPtr = GCCellPtrTypeCache(cache) |
| self.cache = cache |
| |
| def to_string(self): |
| ptr = self.value['ptr'] |
| kind = ptr & self.cache.mod_GCCellPtr.mask |
| if kind == self.cache.mod_GCCellPtr.Null: |
| return "JS::GCCellPtr(nullptr)" |
| tipe = self.cache.mod_GCCellPtr.kind_to_type[int(kind)] |
| return "JS::GCCellPtr(({}*) {})".format(tipe, ptr.cast(self.cache.void_ptr_t)) |