1*f77bb46dSJim Ingham""" Adds the 'toggle-disassembly' command to switch you into a disassembly only mode """
2*f77bb46dSJim Inghamimport lldb
3*f77bb46dSJim Ingham
4*f77bb46dSJim Inghamclass DisassemblyMode:
5*f77bb46dSJim Ingham    def __init__(self, debugger, unused):
6*f77bb46dSJim Ingham        self.dbg = debugger
7*f77bb46dSJim Ingham        self.interp = debugger.GetCommandInterpreter()
8*f77bb46dSJim Ingham        self.store_state()
9*f77bb46dSJim Ingham        self.mode_off = True
10*f77bb46dSJim Ingham
11*f77bb46dSJim Ingham    def store_state(self):
12*f77bb46dSJim Ingham        self.dis_count = self.get_string_value("stop-disassembly-count")
13*f77bb46dSJim Ingham        self.dis_display = self.get_string_value("stop-disassembly-display")
14*f77bb46dSJim Ingham        self.before_count = self.get_string_value("stop-line-count-before")
15*f77bb46dSJim Ingham        self.after_count = self.get_string_value("stop-line-count-after")
16*f77bb46dSJim Ingham
17*f77bb46dSJim Ingham    def get_string_value(self, setting):
18*f77bb46dSJim Ingham        result = lldb.SBCommandReturnObject()
19*f77bb46dSJim Ingham        self.interp.HandleCommand("settings show " + setting, result)
20*f77bb46dSJim Ingham        value = result.GetOutput().split(" = ")[1].rstrip("\n")
21*f77bb46dSJim Ingham        return value
22*f77bb46dSJim Ingham
23*f77bb46dSJim Ingham    def set_value(self, setting, value):
24*f77bb46dSJim Ingham        result = lldb.SBCommandReturnObject()
25*f77bb46dSJim Ingham        self.interp.HandleCommand("settings set " + setting + " " + value, result)
26*f77bb46dSJim Ingham
27*f77bb46dSJim Ingham    def __call__(self, debugger, command, exe_ctx, result):
28*f77bb46dSJim Ingham        if self.mode_off:
29*f77bb46dSJim Ingham            self.mode_off = False
30*f77bb46dSJim Ingham            self.store_state()
31*f77bb46dSJim Ingham            self.set_value("stop-disassembly-display","always")
32*f77bb46dSJim Ingham            self.set_value("stop-disassembly-count", "8")
33*f77bb46dSJim Ingham            self.set_value("stop-line-count-before", "0")
34*f77bb46dSJim Ingham            self.set_value("stop-line-count-after", "0")
35*f77bb46dSJim Ingham            result.AppendMessage("Disassembly mode on.")
36*f77bb46dSJim Ingham        else:
37*f77bb46dSJim Ingham            self.mode_off = True
38*f77bb46dSJim Ingham            self.set_value("stop-disassembly-display",self.dis_display)
39*f77bb46dSJim Ingham            self.set_value("stop-disassembly-count", self.dis_count)
40*f77bb46dSJim Ingham            self.set_value("stop-line-count-before", self.before_count)
41*f77bb46dSJim Ingham            self.set_value("stop-line-count-after", self.after_count)
42*f77bb46dSJim Ingham            result.AppendMessage("Disassembly mode off.")
43*f77bb46dSJim Ingham
44*f77bb46dSJim Ingham    def get_short_help(self):
45*f77bb46dSJim Ingham        return "Toggles between a disassembly only mode and normal source mode\n"
46*f77bb46dSJim Ingham
47*f77bb46dSJim Inghamdef __lldb_init_module(debugger, unused):
48*f77bb46dSJim Ingham    debugger.HandleCommand("command script add -c disassembly_mode.DisassemblyMode toggle-disassembly")
49