Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. # LibDOM related commands and utilities for gdb
  2.  
  3. import gdb
  4.  
  5. def dom_get_type_ptr(typename):
  6.     return gdb.lookup_type(typename).pointer()
  7.  
  8. def dom_node_at(ptr):
  9.     nodetype = dom_get_type_ptr("dom_node_internal")
  10.     return ptr.cast(nodetype).dereference()
  11.  
  12. def dom_document_at(ptr):
  13.     doctype = dom_get_type_ptr("dom_document")
  14.     return ptr.cast(doctype).dereference()
  15.  
  16. def dom_node_type(node):
  17.     return node["type"]
  18.  
  19. def dom_node_refcnt(node):
  20.     return node["base"]["refcnt"]
  21.  
  22. def lwc_string_value(strptr):
  23.     cptr = strptr+1
  24.     charptr = cptr.cast(dom_get_type_ptr("char"))
  25.     return charptr.string()
  26.  
  27. def dom_string__is_intern(intstr):
  28.     return str(intstr['type']) == "DOM_STRING_INTERNED"
  29.  
  30. def cdata_string_value(cdata):
  31.     cptr = cdata['ptr']
  32.     charptr = cptr.cast(dom_get_type_ptr("char"))
  33.     return charptr.string()
  34.  
  35. def dom_string_value(stringptr):
  36.     intstr = stringptr.cast(dom_get_type_ptr("dom_string_internal")).dereference()
  37.     if intstr.address == gdb.parse_and_eval("(dom_string_internal*)0"):
  38.         return ""
  39.     if dom_string__is_intern(intstr):
  40.         return lwc_string_value(intstr['data']['intern'])
  41.     else:
  42.         return cdata_string_value(intstr['data']['cdata'])
  43.  
  44. def dom_node_name(node):
  45.     namestr = node["name"]
  46.     return " '%s'" % dom_string_value(namestr)
  47.  
  48. def dom_node_pending_offset():
  49.     return gdb.parse_and_eval("(int)&((struct dom_node_internal *)0)->pending_list")
  50.  
  51. def dom_print_node(node, prefix = ""):
  52.     print("%s%s @ %s [%s]%s" % (prefix, dom_node_type(node),
  53.                                 node.address, dom_node_refcnt(node),
  54.                                 dom_node_name(node)))
  55.  
  56. def dom_walk_tree(node, prefix = ""):
  57.     dom_print_node(node, prefix)
  58.     current = node['first_child'].dereference()
  59.     while current.address != 0:
  60.         dom_walk_tree(current, "%s  " % prefix)
  61.         current = current['next'].dereference()
  62.  
  63. def dom_document_show(doc):
  64.     print "Node Tree:"
  65.     node = dom_node_at(doc.address)
  66.     dom_walk_tree(node, "  ")
  67.     pending = doc['pending_nodes']
  68.     if pending['next'] != pending.address:
  69.         print "Pending Node trees:"
  70.         current_list_entry = pending['next']
  71.         while current_list_entry is not None:
  72.             voidp = current_list_entry.cast(dom_get_type_ptr("void"))
  73.             voidp = voidp - dom_node_pending_offset()
  74.             node = dom_node_at(voidp)
  75.             dom_walk_tree(node, "  ")
  76.             current_list_entry = node['pending_list']['next']
  77.             if current_list_entry == pending.address:
  78.                 current_list_entry = None
  79.    
  80.  
  81. class DOMCommand(gdb.Command):
  82.     """DOM related commands"""
  83.  
  84.     def __init__(self):
  85.         gdb.Command.__init__(self, "dom", gdb.COMMAND_DATA,
  86.                              gdb.COMPLETE_COMMAND, True)
  87.  
  88. class DOMNodeCommand(gdb.Command):
  89.     """DOMNode related commands"""
  90.  
  91.     def __init__(self):
  92.         gdb.Command.__init__(self, "dom node", gdb.COMMAND_DATA,
  93.                              gdb.COMPLETE_COMMAND, True)
  94.  
  95. class DOMDocumentCommand(gdb.Command):
  96.     """DOMDocument related commands"""
  97.  
  98.     def __init__(self):
  99.         gdb.Command.__init__(self, "dom document", gdb.COMMAND_DATA,
  100.                              gdb.COMPLETE_COMMAND, True)
  101.  
  102. class DOMNodeShowCommand(gdb.Command):
  103.     """Show a node at a given address."""
  104.  
  105.     def __init__(self):
  106.         gdb.Command.__init__(self, "dom node show", gdb.COMMAND_DATA,
  107.                              gdb.COMPLETE_NONE, True)
  108.  
  109.     def invoke(self, arg, from_tty):
  110.         args = gdb.string_to_argv(arg)
  111.         self._invoke(*args)
  112.  
  113.     def _invoke(self, nodeptr):
  114.         _ptr = gdb.parse_and_eval(nodeptr)
  115.         node = dom_node_at(_ptr)
  116.         dom_print_node(node)
  117.  
  118. class DOMNodeWalkCommand(gdb.Command):
  119.     """Walk a node tree at a given address."""
  120.  
  121.     def __init__(self):
  122.         gdb.Command.__init__(self, "dom node walk", gdb.COMMAND_DATA,
  123.                              gdb.COMPLETE_NONE, True)
  124.  
  125.     def invoke(self, arg, from_tty):
  126.         args = gdb.string_to_argv(arg)
  127.         self._invoke(*args)
  128.  
  129.     def _invoke(self, nodeptr):
  130.         _ptr = gdb.parse_and_eval(nodeptr)
  131.         node = dom_node_at(_ptr)
  132.         dom_walk_tree(node)
  133.  
  134. class DOMDocumentShowCommand(gdb.Command):
  135.     """Show a document at a given address."""
  136.  
  137.     def __init__(self):
  138.         gdb.Command.__init__(self, "dom document show", gdb.COMMAND_DATA,
  139.                              gdb.COMPLETE_NONE, True)
  140.  
  141.     def invoke(self, arg, from_tty):
  142.         args = gdb.string_to_argv(arg)
  143.         self._invoke(*args)
  144.  
  145.     def _invoke(self, docptr):
  146.         _ptr = gdb.parse_and_eval(docptr)
  147.         doc = dom_document_at(_ptr)
  148.         dom_document_show(doc)
  149.  
  150. DOMCommand()
  151.  
  152. DOMNodeCommand()
  153. DOMNodeShowCommand()
  154. DOMNodeWalkCommand()
  155.  
  156. DOMDocumentCommand()
  157. DOMDocumentShowCommand()
  158.