home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / util / gcutil.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  13.7 KB  |  418 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. import wx
  6. import gc
  7. import sys
  8. from weakref import ref
  9. from inspect import currentframe
  10. from types import FrameType
  11. from util.primitives.refs import better_ref_types
  12. from logging import getLogger
  13. log = getLogger('gcutil')
  14. import locale
  15. enc = locale.getpreferredencoding()
  16. SET_AS_ROOT = wx.NewId()
  17. SET_SHELL_OBJ = wx.NewId()
  18. NEW_GCTREE = wx.NewId()
  19. DELETE = wx.NewId()
  20. custom_reprs = {
  21.     FrameType: (lambda f: '%r for %r' % (f, f.f_code)) }
  22. weak = (ref, better_ref_types)
  23.  
  24. def nameof(obj):
  25.     for r in gc.get_referrers(obj):
  26.         for r2 in gc.get_referrers(r):
  27.             if r is getattr(r2, '__dict__', object()):
  28.                 for k, v in r.iteritems():
  29.                     if v is obj:
  30.                         return '[%r attribute of %r]' % (k, r2)
  31.                 
  32.             v is obj
  33.         
  34.     
  35.  
  36.  
  37. def isweak(obj):
  38.     return isinstance(obj, weak)
  39.  
  40.  
  41. class gctree_ref(ref):
  42.     
  43.     def __init__(self, obj, cb = None):
  44.         ref.__init__(self, obj, cb)
  45.  
  46.  
  47.  
  48. def deref(wr):
  49.     if isinstance(wr, gctree_ref):
  50.         return wr()
  51.     return wr
  52.  
  53.  
  54. def repritem(i):
  55.     funcinfo = funcinfo
  56.     import util
  57.     
  58.     try:
  59.         if type(i) in custom_reprs:
  60.             return custom_reprs[type(i)](i)
  61.         repr_txt = unicode(repr(i)).decode(enc, 'replace')[:300]
  62.         if repr_txt.startswith('<function <lambda> at'):
  63.             repr_txt = funcinfo(i)
  64.         else:
  65.             repr_txt = repr(i.__class__) + ': ' + repr_txt
  66.     except Exception:
  67.         return '<%s at %x>' % (type(i).__name__, id(i))
  68.  
  69.     return repr_txt
  70.  
  71.  
  72. def makeref(obj):
  73.     
  74.     try:
  75.         return gctree_ref(obj)
  76.     except TypeError:
  77.         e = None
  78.         if repr(e).find('cannot create weak reference to') != -1:
  79.             return obj
  80.         raise 
  81.     except:
  82.         repr(e).find('cannot create weak reference to') != -1
  83.  
  84.  
  85.  
  86. class colors:
  87.     cycle = wx.Color(128, 128, 128)
  88.     weakref = wx.Color(80, 170, 80)
  89.     root = wx.Color(255, 0, 0)
  90.  
  91.  
  92. class LazyTree(wx.TreeCtrl):
  93.     
  94.     def __init__(self, parent, root = None):
  95.         super(LazyTree, self).__init__(parent)
  96.         Bind = self.Bind
  97.         Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnExpandItem)
  98.         Bind(wx.EVT_TREE_ITEM_COLLAPSING, self.OnCollapseItem)
  99.         Bind(wx.EVT_TREE_ITEM_MENU, self.OnTreeMenuItem)
  100.         Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
  101.         Bind(wx.EVT_MENU, self.OnMenu)
  102.         Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
  103.         self._LazyTree__collapsing = False
  104.         self.getChildren = gc.get_referrers
  105.         if root is not None:
  106.             self.setroot(root)
  107.         
  108.  
  109.     
  110.     def setfunc(self, func):
  111.         self.getChildren = func
  112.         self.setroot(deref(self.rootref))
  113.  
  114.     
  115.     def setroot(self, root):
  116.         self.DeleteAllItems()
  117.         rootId = self.AddRoot(repritem(root))
  118.         self.SetPyData(rootId, makeref(root))
  119.         self.SetItemHasChildren(rootId)
  120.         self.rootref = makeref(root)
  121.  
  122.     
  123.     def OnRightDown(self, e):
  124.         (item, area) = self.HitTest(e.Position)
  125.         self.SelectItem(item)
  126.         e.Skip()
  127.  
  128.     
  129.     def OnKeyDown(self, e):
  130.         if e.KeyCode == wx.WXK_DELETE:
  131.             self.Delete(self.GetSelection())
  132.         else:
  133.             e.Skip()
  134.  
  135.     
  136.     def OnExpandItem(self, event):
  137.         parentItem = event.Item
  138.         wr = self.GetPyData(parentItem)
  139.         parent = deref(wr)
  140.         if parent is None:
  141.             return None
  142.         curframe = currentframe()
  143.         count = 0
  144.         for child in self.getChildren(parent):
  145.             childStr = repritem(child)
  146.             if child is parent:
  147.                 continue
  148.             
  149.             if 'gcutil' in childStr and 'OnExpandItem' in childStr:
  150.                 continue
  151.             
  152.             if type(child).__module__.startswith('guppy.'):
  153.                 continue
  154.             
  155.             childItem = self.AppendItem(parentItem, childStr)
  156.             self.SetPyData(childItem, makeref(child))
  157.             if self.IsCycle(childItem):
  158.                 self.SetItemTextColour(childItem, colors.cycle)
  159.             elif isweak(child):
  160.                 self.SetItemTextColour(childItem, colors.weakref)
  161.                 self.SetItemHasChildren(childItem, True)
  162.             else:
  163.                 self.SetItemHasChildren(childItem, True)
  164.             count += 1
  165.         
  166.         if count == 1:
  167.             self.Expand(childItem)
  168.         elif count == 0:
  169.             self.SetItemHasChildren(parentItem, False)
  170.         
  171.  
  172.     
  173.     def IsCycle(self, item):
  174.         GetItemParent = self.GetItemParent
  175.         GetPyData = self.GetPyData
  176.         
  177.         def GetPyData(item, get_data = self.GetPyData):
  178.             return deref(get_data(item))
  179.  
  180.         obj = GetPyData(item)
  181.         while True:
  182.             item = GetItemParent(item)
  183.             if not item.Ok():
  184.                 break
  185.             
  186.             if GetPyData(item) is obj:
  187.                 return True
  188.             continue
  189.             GetPyData(item) is obj
  190.         return False
  191.  
  192.     
  193.     def OnCollapseItem(self, event):
  194.         if self._LazyTree__collapsing:
  195.             return event.Veto()
  196.         self._LazyTree__collapsing = True
  197.         item = event.Item
  198.         self.CollapseAndReset(item)
  199.         self.SetItemHasChildren(item)
  200.         self._LazyTree__collapsing = False
  201.  
  202.     
  203.     def OnTreeMenuItem(self, e):
  204.         m = wx.Menu()
  205.         m.Append(NEW_GCTREE, 'New GCTree with this object')
  206.         m.Append(SET_AS_ROOT, 'Set as Root')
  207.         if hasattr(wx.GetApp(), 'shell_locals'):
  208.             m.Append(SET_SHELL_OBJ, 'Set in Shell as "obj"')
  209.         
  210.         m.AppendSeparator()
  211.         m.Append(DELETE, 'Delete')
  212.         self.PopupMenu(m)
  213.  
  214.     
  215.     def OnMenu(self, e):
  216.         obj = self.GetPyData(self.GetSelection())
  217.         i = e.Id
  218.         if i == SET_AS_ROOT:
  219.             self.setroot(obj)
  220.         elif i == SET_SHELL_OBJ:
  221.             wx.GetApp().shell_locals.update(obj = obj)
  222.         elif i == NEW_GCTREE:
  223.             gctree(makeref(obj))
  224.         elif i == DELETE:
  225.             self.Delete(self.GetSelection())
  226.         
  227.  
  228.  
  229.  
  230. class GCInfoPanel(wx.Panel):
  231.     
  232.     def __init__(self, parent):
  233.         wx.Panel.__init__(self, parent)
  234.         self.Sizer = s = wx.FlexGridSizer(0, 2, 5, 5)
  235.         rows = [
  236.             ('__repr__', repritem),
  237.             ('Reference Count', sys.getrefcount),
  238.             ('referrers', (lambda obj: len(gc.get_referrers(obj))))]
  239.         if hasattr(sys, 'getsizeof'):
  240.             rows.extend([
  241.                 ('Size', sys.getsizeof)])
  242.         
  243.         self.ctrls = []
  244.         for label, func in rows:
  245.             s.Add(wx.StaticText(self, -1, label))
  246.             ctrl = wx.StaticText(self, -1, '')
  247.             s.Add(ctrl)
  248.             self.ctrls.append((ctrl, func))
  249.         
  250.  
  251.     
  252.     def set_object(self, obj):
  253.         for ctrl, func in self.ctrls:
  254.             
  255.             try:
  256.                 ctrl.Label = str(func(obj))
  257.             continue
  258.             except Exception:
  259.                 e = None
  260.                 ctrl.Label = str(e)
  261.                 continue
  262.             
  263.  
  264.         
  265.         self.Layout()
  266.  
  267.  
  268.  
  269. class GCTreeFrame(wx.Frame):
  270.     
  271.     def __init__(self, item):
  272.         size = wx.Size(1000, 600)
  273.         wx.Frame.__init__(self, None, name = 'GCTreeFrame', size = size)
  274.         split = wx.SplitterWindow(self, style = wx.SP_LIVE_UPDATE)
  275.         self.gcinfopanel = GCInfoPanel(split)
  276.         tree = LazyTree(split, item)
  277.         
  278.         def OnSelection(e):
  279.             tree_item = e.Item
  280.             if tree_item:
  281.                 wr = tree.GetPyData(tree_item)
  282.                 self.gcinfopanel.set_object(deref(wr))
  283.             
  284.  
  285.         tree.Bind(wx.EVT_TREE_SEL_CHANGED, OnSelection)
  286.         self.SetTitle(repritem(item))
  287.         split.SetSashGravity(1)
  288.         split.SetMinimumPaneSize(100)
  289.         split.SplitVertically(tree, self.gcinfopanel)
  290.         ((None, None), wx.CallAfter)((lambda : split.SetSashPosition(size.width - 250)))
  291.         panel = wx.Panel(self)
  292.         b1 = wx.RadioButton(panel, -1, 'refer&rers')
  293.         b2 = wx.RadioButton(panel, -1, 'referen&ts')
  294.         
  295.         def onradio(e, itemref = (None, makeref(item))):
  296.             func = None if e.EventObject is b1 else gc.get_referents
  297.             tree.setfunc(func)
  298.  
  299.         self.Bind(wx.EVT_RADIOBUTTON, onradio)
  300.         self.Bind(wx.EVT_CLOSE, self._GCTreeFrame__onclose)
  301.         b1.SetValue(True)
  302.         b1.SetToolTipString(gc.get_referrers.__doc__)
  303.         b2.SetToolTipString(gc.get_referents.__doc__)
  304.         s2 = panel.Sizer = wx.BoxSizer(wx.HORIZONTAL)
  305.         s2.AddMany([
  306.             (5, 10),
  307.             (b1, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL),
  308.             (10, 20),
  309.             (b2, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)])
  310.         s = wx.BoxSizer(wx.VERTICAL)
  311.         s.AddMany([
  312.             (split, 1, wx.EXPAND),
  313.             (panel, 0, wx.EXPAND)])
  314.         self.Sizer = s
  315.         s.Layout()
  316.  
  317.     
  318.     def __onclose(self, e):
  319.         self.Destroy()
  320.         wx.CallAfter(collect_garbage)
  321.  
  322.     
  323.     def onradio(self):
  324.         pass
  325.  
  326.  
  327.  
  328. def collect_garbage():
  329.     (sys.last_traceback, sys.last_value, sys.last_type) = (None, None, None)
  330.     gc.collect()
  331.  
  332.  
  333. def gctree(obj):
  334.     collect_garbage()
  335.     GCTreeFrame(obj).Show()
  336.  
  337.  
  338. try:
  339.     import sip
  340. except ImportError:
  341.     pass
  342.  
  343.  
  344. def leaked():
  345.     collect_garbage()
  346.     import util
  347.     return (lambda .0: for o in .0:
  348. if sip.isdeleted(o):
  349. ocontinue)(util.uncollectable(sip.wrapper))
  350.  
  351.  
  352. def count(identifier):
  353.     collect_garbage()
  354.     if isinstance(identifier, basestring):
  355.         obj_gen = byclassname(identifier)
  356.     else:
  357.         obj_gen = byclass(identifier)
  358.     return sum((lambda .0: for o in .0:
  359. 1)(obj_gen))
  360.  
  361.  
  362. def byclass(cls):
  363.     collect_garbage()
  364.     return (lambda .0: for o in .0:
  365. if isinstance(o, cls):
  366. ocontinue)(gc.get_objects())
  367.  
  368.  
  369. def byclassname(classname):
  370.     collect_garbage()
  371.     return (lambda .0: for o in .0:
  372. if type(o).__name__ == classname:
  373. ocontinue)(gc.get_objects())
  374.  
  375.  
  376. def last(gen):
  377.     gen = iter(gen)
  378.     while True:
  379.         i = None
  380.         
  381.         try:
  382.             i = gen.next()
  383.         continue
  384.         except StopIteration:
  385.             return i
  386.         
  387.  
  388.         None<EXCEPTION MATCH>StopIteration
  389.  
  390.  
  391. def newest(classname):
  392.     return last(byclassname(classname))
  393.  
  394.  
  395. def byaddress(addr):
  396.     objs = _[1]
  397.     if objs:
  398.         if len(objs) == 1:
  399.             return objs[0]
  400.         raise AssertionError('found more than one object at that address: %r' % objs)
  401.     objs
  402.  
  403. if __name__ == '__main__':
  404.     from tests.testapp import testapp
  405.     import gui.native.helpers as gui
  406.     a = 5
  407.     b = [
  408.         'some items',
  409.         a]
  410.     c = [
  411.         b,
  412.         'some other items']
  413.     app = testapp('../../')
  414.     frame = GCTreeFrame(c)
  415.     frame.Show()
  416.     app.MainLoop()
  417.  
  418.