aboutsummaryrefslogtreecommitdiff
path: root/Release/share/glib-2.0/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'Release/share/glib-2.0/gdb')
-rw-r--r--Release/share/glib-2.0/gdb/glib.py257
-rw-r--r--Release/share/glib-2.0/gdb/glib_gdb.py261
-rw-r--r--Release/share/glib-2.0/gdb/gobject.py305
-rw-r--r--Release/share/glib-2.0/gdb/gobject_gdb.py295
4 files changed, 0 insertions, 1118 deletions
diff --git a/Release/share/glib-2.0/gdb/glib.py b/Release/share/glib-2.0/gdb/glib.py
deleted file mode 100644
index de763ae..0000000
--- a/Release/share/glib-2.0/gdb/glib.py
+++ /dev/null
@@ -1,257 +0,0 @@
-import gdb
-
-# This is not quite right, as local vars may override symname
-def read_global_var (symname):
- return gdb.selected_frame().read_var(symname)
-
-def g_quark_to_string (quark):
- if quark == None:
- return None
- quark = long(quark)
- if quark == 0:
- return None
- try:
- val = read_global_var ("quarks")
- max_q = long(read_global_var ("quark_seq_id"))
- except:
- try:
- val = read_global_var ("g_quarks")
- max_q = long(read_global_var ("g_quark_seq_id"))
- except:
- return None;
- if quark < max_q:
- return val[quark].string()
- return None
-
-# We override the node printers too, so that node->next is not expanded
-class GListNodePrinter:
- "Prints a GList node"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- return "{data=%s, next=0x%x, prev=0x%x}" % (str(self.val["data"]), long(self.val["next"]), long(self.val["prev"]))
-
-class GSListNodePrinter:
- "Prints a GSList node"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- return "{data=%s, next=0x%x}" % (str(self.val["data"]), long(self.val["next"]))
-
-class GListPrinter:
- "Prints a GList"
-
- class _iterator:
- def __init__(self, head, listtype):
- self.link = head
- self.listtype = listtype
- self.count = 0
-
- def __iter__(self):
- return self
-
- def next(self):
- if self.link == 0:
- raise StopIteration
- data = self.link['data']
- self.link = self.link['next']
- count = self.count
- self.count = self.count + 1
- return ('[%d]' % count, data)
-
- def __init__ (self, val, listtype):
- self.val = val
- self.listtype = listtype
-
- def children(self):
- return self._iterator(self.val, self.listtype)
-
- def to_string (self):
- return "0x%x" % (long(self.val))
-
- def display_hint (self):
- return "array"
-
-class GHashPrinter:
- "Prints a GHashTable"
-
- class _iterator:
- def __init__(self, ht, keys_are_strings):
- self.ht = ht
- if ht != 0:
- self.keys = ht["keys"]
- self.values = ht["values"]
- self.hashes = ht["hashes"]
- self.size = ht["size"]
- self.pos = 0
- self.keys_are_strings = keys_are_strings
- self.value = None
-
- def __iter__(self):
- return self
-
- def next(self):
- if self.ht == 0:
- raise StopIteration
- if self.value != None:
- v = self.value
- self.value = None
- return v
- while long(self.pos) < long(self.size):
- self.pos = self.pos + 1
- if long (self.hashes[self.pos]) >= 2:
- key = self.keys[self.pos]
- val = self.values[self.pos]
-
- if self.keys_are_strings:
- key = key.cast (gdb.lookup_type("char").pointer())
-
- # Queue value for next result
- self.value = ('[%dv]'% (self.pos), val)
-
- # Return key
- return ('[%dk]'% (self.pos), key)
- raise StopIteration
-
- def __init__ (self, val):
- self.val = val
- self.keys_are_strings = False
- try:
- string_hash = read_global_var ("g_str_hash")
- except:
- string_hash = None
- if self.val != 0 and string_hash != None and self.val["hash_func"] == string_hash:
- self.keys_are_strings = True
-
- def children(self):
- return self._iterator(self.val, self.keys_are_strings)
-
- def to_string (self):
- return "0x%x" % (long(self.val))
-
- def display_hint (self):
- return "map"
-
-def pretty_printer_lookup (val):
- if is_g_type_instance (val):
- return GTypePrettyPrinter (val)
-
-def pretty_printer_lookup (val):
- # None yet, want things like hash table and list
-
- type = val.type.unqualified()
-
- # If it points to a reference, get the reference.
- if type.code == gdb.TYPE_CODE_REF:
- type = type.target ()
-
- if type.code == gdb.TYPE_CODE_PTR:
- type = type.target().unqualified()
- t = str(type)
- if t == "GList":
- return GListPrinter(val, "GList")
- if t == "GSList":
- return GListPrinter(val, "GSList")
- if t == "GHashTable":
- return GHashPrinter(val)
- else:
- t = str(type)
- if t == "GList":
- return GListNodePrinter(val)
- if t == "GSList *":
- return GListPrinter(val, "GSList")
- return None
-
-def register (obj):
- if obj == None:
- obj = gdb
-
- obj.pretty_printers.append(pretty_printer_lookup)
-
-class ForeachCommand (gdb.Command):
- """Foreach on list"""
-
- def __init__ (self):
- super (ForeachCommand, self).__init__ ("gforeach",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_SYMBOL)
-
- def valid_name (self, name):
- if not name[0].isalpha():
- return False
- return True
-
- def parse_args (self, arg):
- i = arg.find(" ")
- if i <= 0:
- raise Exception ("No var specified")
- var = arg[:i]
- if not self.valid_name(var):
- raise Exception ("Invalid variable name")
-
- while i < len (arg) and arg[i].isspace():
- i = i + 1
-
- if arg[i:i+2] != "in":
- raise Exception ("Invalid syntax, missing in")
-
- i = i + 2
-
- while i < len (arg) and arg[i].isspace():
- i = i + 1
-
- colon = arg.find (":", i)
- if colon == -1:
- raise Exception ("Invalid syntax, missing colon")
-
- val = arg[i:colon]
-
- colon = colon + 1
- while colon < len (arg) and arg[colon].isspace():
- colon = colon + 1
-
- command = arg[colon:]
-
- return (var, val, command)
-
- def do_iter(self, arg, item, command):
- item = item.cast (gdb.lookup_type("void").pointer())
- item = long(item)
- to_eval = "set $%s = (void *)0x%x\n"%(arg, item)
- gdb.execute(to_eval)
- gdb.execute(command)
-
- def slist_iterator (self, arg, container, command):
- l = container.cast (gdb.lookup_type("GSList").pointer())
- while long(l) != 0:
- self.do_iter (arg, l["data"], command)
- l = l["next"]
-
- def list_iterator (self, arg, container, command):
- l = container.cast (gdb.lookup_type("GList").pointer())
- while long(l) != 0:
- self.do_iter (arg, l["data"], command)
- l = l["next"]
-
- def pick_iterator (self, container):
- t = container.type.unqualified()
- if t.code == gdb.TYPE_CODE_PTR:
- t = t.target().unqualified()
- t = str(t)
- if t == "GSList":
- return self.slist_iterator
- if t == "GList":
- return self.list_iterator
- raise Exception("Invalid container type %s"%(str(container.type)))
-
- def invoke (self, arg, from_tty):
- (var, container, command) = self.parse_args(arg)
- container = gdb.parse_and_eval (container)
- func = self.pick_iterator(container)
- func(var, container, command)
-
-ForeachCommand ()
diff --git a/Release/share/glib-2.0/gdb/glib_gdb.py b/Release/share/glib-2.0/gdb/glib_gdb.py
deleted file mode 100644
index 38f101a..0000000
--- a/Release/share/glib-2.0/gdb/glib_gdb.py
+++ /dev/null
@@ -1,261 +0,0 @@
-import gdb
-import sys
-
-if sys.version_info[0] >= 3:
- long = int
-
-# This is not quite right, as local vars may override symname
-def read_global_var (symname):
- return gdb.selected_frame().read_var(symname)
-
-def g_quark_to_string (quark):
- if quark == None:
- return None
- quark = long(quark)
- if quark == 0:
- return None
- try:
- val = read_global_var ("quarks")
- max_q = long(read_global_var ("quark_seq_id"))
- except:
- try:
- val = read_global_var ("g_quarks")
- max_q = long(read_global_var ("g_quark_seq_id"))
- except:
- return None;
- if quark < max_q:
- return val[quark].string()
- return None
-
-# We override the node printers too, so that node->next is not expanded
-class GListNodePrinter:
- "Prints a GList node"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- return "{data=%s, next=0x%x, prev=0x%x}" % (str(self.val["data"]), long(self.val["next"]), long(self.val["prev"]))
-
-class GSListNodePrinter:
- "Prints a GSList node"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- return "{data=%s, next=0x%x}" % (str(self.val["data"]), long(self.val["next"]))
-
-class GListPrinter:
- "Prints a GList"
-
- class _iterator:
- def __init__(self, head, listtype):
- self.link = head
- self.listtype = listtype
- self.count = 0
-
- def __iter__(self):
- return self
-
- def next(self):
- if self.link == 0:
- raise StopIteration
- data = self.link['data']
- self.link = self.link['next']
- count = self.count
- self.count = self.count + 1
- return ('[%d]' % count, data)
-
- __next__ = next
-
- def __init__ (self, val, listtype):
- self.val = val
- self.listtype = listtype
-
- def children(self):
- return self._iterator(self.val, self.listtype)
-
- def to_string (self):
- return "0x%x" % (long(self.val))
-
- def display_hint (self):
- return "array"
-
-class GHashPrinter:
- "Prints a GHashTable"
-
- class _iterator:
- def __init__(self, ht, keys_are_strings):
- self.ht = ht
- if ht != 0:
- self.keys = ht["keys"]
- self.values = ht["values"]
- self.hashes = ht["hashes"]
- self.size = ht["size"]
- self.pos = 0
- self.keys_are_strings = keys_are_strings
- self.value = None
-
- def __iter__(self):
- return self
-
- def next(self):
- if self.ht == 0:
- raise StopIteration
- if self.value != None:
- v = self.value
- self.value = None
- return v
- while long(self.pos) < long(self.size):
- self.pos = self.pos + 1
- if long (self.hashes[self.pos]) >= 2:
- key = self.keys[self.pos]
- val = self.values[self.pos]
-
- if self.keys_are_strings:
- key = key.cast (gdb.lookup_type("char").pointer())
-
- # Queue value for next result
- self.value = ('[%dv]'% (self.pos), val)
-
- # Return key
- return ('[%dk]'% (self.pos), key)
- raise StopIteration
-
- __next__ = next
-
- def __init__ (self, val):
- self.val = val
- self.keys_are_strings = False
- try:
- string_hash = read_global_var ("g_str_hash")
- except:
- string_hash = None
- if self.val != 0 and string_hash != None and self.val["hash_func"] == string_hash:
- self.keys_are_strings = True
-
- def children(self):
- return self._iterator(self.val, self.keys_are_strings)
-
- def to_string (self):
- return "0x%x" % (long(self.val))
-
- def display_hint (self):
- return "map"
-
-def pretty_printer_lookup (val):
- # None yet, want things like hash table and list
-
- type = val.type.unqualified()
-
- # If it points to a reference, get the reference.
- if type.code == gdb.TYPE_CODE_REF:
- type = type.target ()
-
- if type.code == gdb.TYPE_CODE_PTR:
- type = type.target().unqualified()
- t = str(type)
- if t == "GList":
- return GListPrinter(val, "GList")
- if t == "GSList":
- return GListPrinter(val, "GSList")
- if t == "GHashTable":
- return GHashPrinter(val)
- else:
- t = str(type)
- if t == "GList":
- return GListNodePrinter(val)
- if t == "GSList *":
- return GListPrinter(val, "GSList")
- return None
-
-def register (obj):
- if obj == None:
- obj = gdb
-
- obj.pretty_printers.append(pretty_printer_lookup)
-
-class ForeachCommand (gdb.Command):
- """Foreach on list"""
-
- def __init__ (self):
- super (ForeachCommand, self).__init__ ("gforeach",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_SYMBOL)
-
- def valid_name (self, name):
- if not name[0].isalpha():
- return False
- return True
-
- def parse_args (self, arg):
- i = arg.find(" ")
- if i <= 0:
- raise Exception ("No var specified")
- var = arg[:i]
- if not self.valid_name(var):
- raise Exception ("Invalid variable name")
-
- while i < len (arg) and arg[i].isspace():
- i = i + 1
-
- if arg[i:i+2] != "in":
- raise Exception ("Invalid syntax, missing in")
-
- i = i + 2
-
- while i < len (arg) and arg[i].isspace():
- i = i + 1
-
- colon = arg.find (":", i)
- if colon == -1:
- raise Exception ("Invalid syntax, missing colon")
-
- val = arg[i:colon]
-
- colon = colon + 1
- while colon < len (arg) and arg[colon].isspace():
- colon = colon + 1
-
- command = arg[colon:]
-
- return (var, val, command)
-
- def do_iter(self, arg, item, command):
- item = item.cast (gdb.lookup_type("void").pointer())
- item = long(item)
- to_eval = "set $%s = (void *)0x%x\n"%(arg, item)
- gdb.execute(to_eval)
- gdb.execute(command)
-
- def slist_iterator (self, arg, container, command):
- l = container.cast (gdb.lookup_type("GSList").pointer())
- while long(l) != 0:
- self.do_iter (arg, l["data"], command)
- l = l["next"]
-
- def list_iterator (self, arg, container, command):
- l = container.cast (gdb.lookup_type("GList").pointer())
- while long(l) != 0:
- self.do_iter (arg, l["data"], command)
- l = l["next"]
-
- def pick_iterator (self, container):
- t = container.type.unqualified()
- if t.code == gdb.TYPE_CODE_PTR:
- t = t.target().unqualified()
- t = str(t)
- if t == "GSList":
- return self.slist_iterator
- if t == "GList":
- return self.list_iterator
- raise Exception("Invalid container type %s"%(str(container.type)))
-
- def invoke (self, arg, from_tty):
- (var, container, command) = self.parse_args(arg)
- container = gdb.parse_and_eval (container)
- func = self.pick_iterator(container)
- func(var, container, command)
-
-ForeachCommand ()
diff --git a/Release/share/glib-2.0/gdb/gobject.py b/Release/share/glib-2.0/gdb/gobject.py
deleted file mode 100644
index b96d150..0000000
--- a/Release/share/glib-2.0/gdb/gobject.py
+++ /dev/null
@@ -1,305 +0,0 @@
-import gdb
-import glib
-import gdb.backtrace
-import gdb.command.backtrace
-
-# This is not quite right, as local vars may override symname
-def read_global_var (symname):
- return gdb.selected_frame().read_var(symname)
-
-def g_type_to_name (gtype):
- def lookup_fundamental_type (typenode):
- if typenode == 0:
- return None
- val = read_global_var ("static_fundamental_type_nodes")
- if val == None:
- return None
- return val[typenode >> 2].address()
-
- gtype = long(gtype)
- typenode = gtype - gtype % 4
- if typenode > (255 << 2):
- typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer())
- else:
- typenode = lookup_fundamental_type (typenode)
- if typenode != None:
- return glib.g_quark_to_string (typenode["qname"])
- return None
-
-def is_g_type_instance (val):
- def is_g_type_instance_helper (type):
- if str(type) == "GTypeInstance":
- return True
-
- while type.code == gdb.TYPE_CODE_TYPEDEF:
- type = type.target()
-
- if type.code != gdb.TYPE_CODE_STRUCT:
- return False
-
- fields = type.fields()
- if len (fields) < 1:
- return False
-
- first_field = fields[0]
- return is_g_type_instance_helper(first_field.type)
-
- type = val.type
- if type.code != gdb.TYPE_CODE_PTR:
- return False
- type = type.target()
- return is_g_type_instance_helper (type)
-
-def g_type_name_from_instance (instance):
- if long(instance) != 0:
- try:
- inst = instance.cast (gdb.lookup_type("GTypeInstance").pointer())
- klass = inst["g_class"]
- gtype = klass["g_type"]
- name = g_type_to_name (gtype)
- return name
- except RuntimeError:
- pass
- return None
-
-class GTypePrettyPrinter:
- "Prints a GType instance pointer"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- name = g_type_name_from_instance (self.val)
- if name:
- return ("0x%x [%s]")% (long(self.val), name)
- return ("0x%x") % (long(self.val))
-
-def pretty_printer_lookup (val):
- if is_g_type_instance (val):
- return GTypePrettyPrinter (val)
-
- return None
-
-def get_signal_name (id):
- if id == None:
- return None
- id = long(id)
- if id == 0:
- return None
- val = read_global_var ("g_signal_nodes")
- max_s = read_global_var ("g_n_signal_nodes")
- max_s = long(max_s)
- if id < max_s:
- return val[id]["name"].string()
- return None
-
-class GFrameWrapper:
- def __init__ (self, frame):
- self.frame = frame;
-
- def name (self):
- name = self.frame.name()
- if name and name.startswith("IA__"):
- return name[4:]
- return name
-
- def __getattr__ (self, name):
- return getattr (self.frame, name)
-
-# Monkey patch FrameWrapper to avoid IA__ in symbol names
-old__init__ = gdb.command.backtrace.FrameWrapper.__init__
-def monkey_patched_init(self, frame):
- name = frame.name()
- if name and name.startswith("IA__"):
- frame = GFrameWrapper(frame)
- old__init__(self,frame)
-gdb.command.backtrace.FrameWrapper.__init__ = monkey_patched_init
-
-class DummyFrame:
- def __init__ (self, frame):
- self.frame = frame
-
- def name (self):
- return "signal-emission-dummy"
-
- def describe (self, stream, full):
- stream.write (" <...>\n")
-
- def __getattr__ (self, name):
- return getattr (self.frame, name)
-
-class SignalFrame:
- def __init__ (self, frames):
- self.frame = frames[-1]
- self.frames = frames;
-
- def name (self):
- return "signal-emission"
-
- def read_var (self, frame, name, array = None):
- try:
- v = frame.read_var (name)
- if v == None or v.is_optimized_out:
- return None
- if array != None:
- array.append (v)
- return v
- except ValueError:
- return None
-
- def read_object (self, frame, name, array = None):
- try:
- v = frame.read_var (name)
- if v == None or v.is_optimized_out:
- return None
- v = v.cast (gdb.lookup_type("GObject").pointer())
- # Ensure this is a somewhat correct object pointer
- if v != None and g_type_name_from_instance (v):
- if array != None:
- array.append (v)
- return v
- return None
- except ValueError:
- return None
-
- def append (self, array, obj):
- if obj != None:
- array.append (obj)
-
- def or_join_array (self, array):
- if len(array) == 0:
- return "???"
-
- v = {}
- for i in range(len(array)):
- v[str(array[i])] = 1
- array = v.keys()
- s = array[0]
- for i in range(1, len(array)):
- s = s + " or %s"%array[i]
-
- return s
-
- def describe (self, stream, full):
- instances = []
- signals = []
-
- for frame in self.frames:
- name = frame.name()
- if name == "signal_emit_unlocked_R":
- self.read_object (frame, "instance", instances)
- node = self.read_var (frame, "node")
- if node:
- signal = node["name"].string()
- detail = self.read_var (frame, "detail")
- detail = glib.g_quark_to_string (detail)
- if detail != None:
- signal = signal + ":" + detail
- self.append (signals, signal)
-
- if name == "g_signal_emitv":
- instance_and_params = self.read_var (frame, "instance_and_params")
- if instance_and_params:
- instance = instance_and_params[0]["v_pointer"].cast (gdb.Type("GObject").pointer())
- self.append (instances, instance)
- id = self.read_var (frame, "signal_id")
- signal = get_signal_name (id)
- if signal:
- detail = self.read_var (frame, "detail")
- detail = glib.g_quark_to_string (detail)
- if detail != None:
- signal = signal + ":" + detail
- self.append (signals, signal)
-
- if name == "g_signal_emit_valist" or name == "g_signal_emit":
- self.read_object (frame, "instance", instances)
- id = self.read_var (frame, "signal_id")
- signal = get_signal_name (id)
- if signal:
- detail = self.read_var (frame, "detail")
- detail = glib.g_quark_to_string (detail)
- if detail != None:
- signal = signal + ":" + detail
- self.append (signals, signal)
-
- if name == "g_signal_emit_by_name":
- self.read_object (frame, "instance", instances)
- self.read_var (frame, "detailed_signal", signals)
- break
-
- instance = self.or_join_array (instances)
- signal = self.or_join_array (signals)
-
- stream.write (" <emit signal %s on instance %s>\n" % (signal, instance))
-
- def __getattr__ (self, name):
- return getattr (self.frame, name)
-
-class GFrameFilter:
- def __init__ (self, iter):
- self.queue = []
- self.iter = iter
-
- def __iter__ (self):
- return self
-
- def fill (self):
- while len(self.queue) <= 6:
- try:
- f = self.iter.next ()
- self.queue.append (f)
- except StopIteration:
- return
-
- def find_signal_emission (self):
- for i in range (min (len(self.queue), 3)):
- if self.queue[i].name() == "signal_emit_unlocked_R":
- return i
- return -1
-
- def next (self):
- # Ensure we have enough frames for a full signal emission
- self.fill()
-
- # Are we at the end?
- if len(self.queue) == 0:
- raise StopIteration
-
- emission = self.find_signal_emission ()
- if emission > 0:
- start = emission
- while True:
- if start == 0:
- break
- prev_name = self.queue[start-1].name()
- if prev_name.find("_marshal_") or prev_name == "g_closure_invoke":
- start = start - 1
- else:
- break
- end = emission + 1
- while end < len(self.queue):
- if self.queue[end].name() in ["g_signal_emitv",
- "g_signal_emit_valist",
- "g_signal_emit",
- "g_signal_emit_by_name"]:
- end = end + 1
- else:
- break
-
- signal_frames = self.queue[start:end]
- new_frames = []
- for i in range(len(signal_frames)-1):
- new_frames.append(DummyFrame(signal_frames[i]))
- new_frames.append(SignalFrame(signal_frames))
-
- self.queue[start:end] = new_frames
-
- return self.queue.pop(0)
-
-
-def register (obj):
- if obj == None:
- obj = gdb
-
- gdb.backtrace.push_frame_filter (GFrameFilter)
- obj.pretty_printers.append(pretty_printer_lookup)
diff --git a/Release/share/glib-2.0/gdb/gobject_gdb.py b/Release/share/glib-2.0/gdb/gobject_gdb.py
deleted file mode 100644
index 8c30220..0000000
--- a/Release/share/glib-2.0/gdb/gobject_gdb.py
+++ /dev/null
@@ -1,295 +0,0 @@
-import os.path
-import gdb
-import glib_gdb
-import sys
-
-if sys.version_info[0] >= 3:
- long = int
-else:
- import itertools
- map = itertools.imap
-
-# FrameDecorator is new in gdb 7.7, so we adapt to its absence.
-try:
- import gdb.FrameDecorator
- HAVE_GDB_FRAMEDECORATOR = True
- FrameDecorator = gdb.FrameDecorator.FrameDecorator
-except ImportError:
- HAVE_GDB_FRAMEDECORATOR = False
-
-# This is not quite right, as local vars may override symname
-def read_global_var (symname):
- return gdb.selected_frame().read_var(symname)
-
-def g_type_to_name (gtype):
- def lookup_fundamental_type (typenode):
- if typenode == 0:
- return None
- val = read_global_var ("static_fundamental_type_nodes")
- if val == None:
- return None
- return val[typenode >> 2].address()
-
- gtype = long(gtype)
- typenode = gtype - gtype % 4
- if typenode > (255 << 2):
- typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer())
- else:
- typenode = lookup_fundamental_type (typenode)
- if typenode != None:
- return glib_gdb.g_quark_to_string (typenode["qname"])
- return None
-
-def is_g_type_instance (val):
- def is_g_type_instance_helper (type):
- if str(type) == "GTypeInstance":
- return True
-
- while type.code == gdb.TYPE_CODE_TYPEDEF:
- type = type.target()
-
- if type.code != gdb.TYPE_CODE_STRUCT:
- return False
-
- fields = type.fields()
- if len (fields) < 1:
- return False
-
- first_field = fields[0]
- return is_g_type_instance_helper(first_field.type)
-
- type = val.type
- if type.code != gdb.TYPE_CODE_PTR:
- return False
- type = type.target()
- return is_g_type_instance_helper (type)
-
-def g_type_name_from_instance (instance):
- if long(instance) != 0:
- try:
- inst = instance.cast (gdb.lookup_type("GTypeInstance").pointer())
- klass = inst["g_class"]
- gtype = klass["g_type"]
- name = g_type_to_name (gtype)
- return name
- except RuntimeError:
- pass
- return None
-
-class GTypePrettyPrinter:
- "Prints a GType instance pointer"
-
- def __init__ (self, val):
- self.val = val
-
- def to_string (self):
- name = g_type_name_from_instance (self.val)
- if name:
- return ("0x%x [%s]")% (long(self.val), name)
- return ("0x%x") % (long(self.val))
-
-def pretty_printer_lookup (val):
- if is_g_type_instance (val):
- return GTypePrettyPrinter (val)
-
- return None
-
-def get_signal_name (id):
- if id == None:
- return None
- id = long(id)
- if id == 0:
- return None
- val = read_global_var ("g_signal_nodes")
- max_s = read_global_var ("g_n_signal_nodes")
- max_s = long(max_s)
- if id < max_s:
- return val[id]["name"].string()
- return None
-
-def frame_name(frame):
- return str(frame.function())
-
-def frame_var(frame, var):
- return frame.inferior_frame().read_var(var)
-
-
-class SignalFrame(FrameDecorator):
- def __init__ (self, frames):
- FrameDecorator.__init__(self, frames[-1])
- self.frame = frames[-1]
- self.frames = frames
-
- def name (self):
- return "signal-emission"
-
- def read_var (self, frame, name, array = None):
- try:
- v = frame_var (frame, name)
- if v == None or v.is_optimized_out:
- return None
- if array != None:
- array.append (v)
- return v
- except ValueError:
- return None
-
- def read_object (self, frame, name, array = None):
- try:
- v = frame_var (frame, name)
- if v == None or v.is_optimized_out:
- return None
- v = v.cast (gdb.lookup_type("GObject").pointer())
- # Ensure this is a somewhat correct object pointer
- if v != None and g_type_name_from_instance (v):
- if array != None:
- array.append (v)
- return v
- return None
- except ValueError:
- return None
-
- def append (self, array, obj):
- if obj != None:
- array.append (obj)
-
- def or_join_array (self, array):
- if len(array) == 0:
- return "???"
- else:
- return ' or '.join(set(map(str, array)))
-
- def get_detailed_signal_from_frame(self, frame, signal):
- detail = self.read_var (frame, "detail")
- detail = glib_gdb.g_quark_to_string (detail)
- if detail is not None:
- return signal + ":" + detail
- else:
- return detail
-
- def function (self):
- instances = []
- signals = []
-
- for frame in self.frames:
- name = frame_name(frame)
- if name == "signal_emit_unlocked_R":
- self.read_object (frame, "instance", instances)
- node = self.read_var (frame, "node")
- if node:
- signal = node["name"].string()
- signal = self.get_detailed_signal_from_frame(frame, signal)
- self.append(signals, signal)
-
- if name == "g_signal_emitv":
- instance_and_params = self.read_var (frame, "instance_and_params")
- if instance_and_params:
- instance = instance_and_params[0]["v_pointer"].cast (gdb.Type("GObject").pointer())
- self.append (instances, instance)
- id = self.read_var (frame, "signal_id")
- signal = get_signal_name (id)
- if signal:
- signal = self.get_detailed_signal_from_frame(frame, signal)
- self.append (signals, signal)
-
- if name == "g_signal_emit_valist" or name == "g_signal_emit":
- self.read_object (frame, "instance", instances)
- id = self.read_var (frame, "signal_id")
- signal = get_signal_name (id)
- if signal:
- signal = self.get_detailed_signal_from_frame(frame, signal)
- self.append (signals, signal)
-
- if name == "g_signal_emit_by_name":
- self.read_object (frame, "instance", instances)
- self.read_var (frame, "detailed_signal", signals)
- break
-
- instance = self.or_join_array (instances)
- signal = self.or_join_array (signals)
-
- return "<emit signal %s on instance %s>" % (signal, instance)
-
- def elided (self):
- return self.frames[0:-1]
-
- def describe (self, stream, full):
- stream.write (" " + self.function () + "\n")
-
-class GFrameDecorator:
- def __init__ (self, iter):
- self.queue = []
- self.iter = iter
-
- def __iter__ (self):
- return self
-
- def fill (self):
- while len(self.queue) <= 8:
- try:
- f = next(self.iter)
- self.queue.append (f)
- except StopIteration:
- return
-
- def find_signal_emission (self):
- for i in range (min (len(self.queue), 3)):
- if frame_name(self.queue[i]) == "signal_emit_unlocked_R":
- return i
- return -1
-
- def next (self):
- # Ensure we have enough frames for a full signal emission
- self.fill()
-
- # Are we at the end?
- if len(self.queue) == 0:
- raise StopIteration
-
- emission = self.find_signal_emission ()
- if emission > 0:
- start = emission
- while True:
- if start == 0:
- break
- prev_name = frame_name(self.queue[start-1])
- if prev_name.find("_marshal_") >= 0 or prev_name == "g_closure_invoke":
- start = start - 1
- else:
- break
- end = emission + 1
- while end < len(self.queue):
- if frame_name(self.queue[end]) in ["g_signal_emitv",
- "g_signal_emit_valist",
- "g_signal_emit",
- "g_signal_emit_by_name",
- "_g_closure_invoke_va"]:
- end = end + 1
- else:
- break
-
- signal_frames = self.queue[start:end]
- new_frames = [SignalFrame(signal_frames)]
- self.queue[start:end] = new_frames
-
- return self.queue.pop(0)
-
- def __next__ (self):
- return self.next()
-
-class GFrameFilter(object):
- name = 'glib'
- enabled = True
- priority = 100
-
- def filter(self, iterator):
- return GFrameDecorator(iterator)
-
-def register (obj):
- if obj == None:
- obj = gdb
-
- if HAVE_GDB_FRAMEDECORATOR:
- filter = GFrameFilter()
- obj.frame_filters[filter.name] = filter
- obj.pretty_printers.append(pretty_printer_lookup)