1import gc 2import types 3 4# from pychess.Utils.Board import Board 5from pychess.Utils.GameModel import GameModel 6# from pychess.Utils.lutils.LBoard import LBoard 7from pychess.widgets.BoardView import BoardView 8from pychess.widgets.BoardControl import BoardControl 9from pychess.widgets.gamewidget import GameWidget 10from pychess.widgets.pydock.PyDockTop import PyDockTop 11from pychess.widgets.pydock.PyDockLeaf import PyDockLeaf 12# from pychess.widgets.pydock.ArrowButton import ArrowButton 13# from pychess.widgets.pydock.StarArrowButton import StarArrowButton 14# from pychess.widgets.pydock.HighlightArea import HighlightArea 15from pychess.Players.CECPEngine import CECPEngine 16from pychess.Players.UCIEngine import UCIEngine 17from pychess.Players.Human import Human 18from pychess.Players.ICPlayer import ICPlayer 19from pychess.ic.ICGameModel import ICGameModel 20from pychess.ic import ICLogon 21from pychess.perspectives import perspective_manager 22 23 24def obj_referrers(klass): 25 find_obj = False 26 for obj in gc.get_objects(): 27 # closures are evil ! 28 if isinstance(obj, types.FunctionType) and obj.__closure__ is not None: 29 for c in obj.__closure__: 30 try: 31 if isinstance(c.cell_contents, klass): 32 print('!!!', obj, c.cell_contents) 33 except ValueError: 34 print("Cell is empty...") 35 if isinstance(obj, klass): 36 find_obj = True 37 rs = gc.get_referrers(obj) 38 print("---------------------------referrers of %s" % klass.__name__) 39 for ob in rs: 40 print(type(ob), ob.__name__ if type(ob) is type else repr(ob)[:140]) 41 rs1 = gc.get_referrers(ob) 42 for ob1 in rs1: 43 print(' ', type(ob1), ob1.__name__ if type(ob1) is type else repr(ob1)[:140]) 44 print("---------------------------") 45 if not find_obj: 46 print("Nothing refrences %s" % klass.__name__) 47 48 49def print_obj_referrers(): 50 perspective = perspective_manager.get_perspective("games") 51 if len(perspective.gamewidgets) > 0: 52 return 53 54 for klass in ( 55 ICGameModel, 56 GameModel, 57 GameWidget, 58 BoardView, 59 BoardControl, 60 CECPEngine, 61 UCIEngine, 62 Human, 63 ICPlayer, 64 # TODO: 65 # ArrowButton, 66 # StarArrowButton, 67 # HighlightArea, 68 # Board, 69 # LBoard, 70 ): 71 obj_referrers(klass) 72 73 if ICLogon.dialog is None or not hasattr(ICLogon.dialog, "lounge"): 74 for klass in ( 75 PyDockTop, 76 PyDockLeaf, 77 ): 78 obj_referrers(klass) 79 80 print("---------------------------------") 81 82 83def print_muppy_sumary(): 84 # http://pythonhosted.org/Pympler/index.html 85 try: 86 from pympler import muppy, summary 87 except ImportError: 88 print("WARNING: pympler not installed") 89 return 90 # from pympler.classtracker import ClassTracker 91 # from pympler.classtracker_stats import HtmlStats 92 global all_objects, obj_summary, class_tracker 93 if all_objects is None: 94 all_objects = muppy.get_objects() 95 obj_summary = summary.summarize(all_objects) 96 summary.print_(obj_summary) 97 98 # class_tracker = ClassTracker() 99 # class_tracker.track_class(FICSPlayer, trace=1) 100 # class_tracker.track_class(ICGameModel, resolution_level=2, trace=1) 101 else: 102 obj_summary2 = summary.summarize(muppy.get_objects()) 103 diff = summary.get_diff(obj_summary, obj_summary2) 104 summary.print_(diff, limit=200) 105 106 # class_tracker.create_snapshot('usage') 107 # HtmlStats(tracker=class_tracker).create_html('profile.html') 108 109 110all_objects = None 111obj_summary = None 112class_tracker = None 113