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