11364750dSJames Henderson# DExTer : Debugging Experience Tester
21364750dSJames Henderson# ~~~~~~   ~         ~~         ~   ~~
31364750dSJames Henderson#
41364750dSJames Henderson# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
51364750dSJames Henderson# See https://llvm.org/LICENSE.txt for license information.
61364750dSJames Henderson# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
71364750dSJames Henderson"""Abstract Base class for controlling debuggers."""
81364750dSJames Henderson
91364750dSJames Hendersonimport abc
101364750dSJames Henderson
11*f98ee40fSTobias Hieta
121364750dSJames Hendersonclass DebuggerControllerBase(object, metaclass=abc.ABCMeta):
133a094d8bSJeremy Morse    def __init__(self, context, step_collection):
143a094d8bSJeremy Morse        self.context = context
153a094d8bSJeremy Morse        self.step_collection = step_collection
163a094d8bSJeremy Morse
171364750dSJames Henderson    @abc.abstractclassmethod
181364750dSJames Henderson    def _run_debugger_custom(self):
191364750dSJames Henderson        """Specify your own implementation of run_debugger_custom in your own
201364750dSJames Henderson        controller.
211364750dSJames Henderson        """
221364750dSJames Henderson        pass
231364750dSJames Henderson
241364750dSJames Henderson    def run_debugger(self, debugger):
25*f98ee40fSTobias Hieta        """Responsible for correctly launching and tearing down the debugger."""
261364750dSJames Henderson        self.debugger = debugger
273a094d8bSJeremy Morse
283a094d8bSJeremy Morse        # Fetch command line options, if any.
293a094d8bSJeremy Morse        the_cmdline = []
303a094d8bSJeremy Morse        commands = self.step_collection.commands
31*f98ee40fSTobias Hieta        if "DexCommandLine" in commands:
32*f98ee40fSTobias Hieta            cmd_line_objs = commands["DexCommandLine"]
333a094d8bSJeremy Morse            assert len(cmd_line_objs) == 1
343a094d8bSJeremy Morse            cmd_line_obj = cmd_line_objs[0]
353a094d8bSJeremy Morse            the_cmdline = cmd_line_obj.the_cmdline
363a094d8bSJeremy Morse
371364750dSJames Henderson        with self.debugger:
3875b31692SStephen Tozer            if not self.debugger.loading_error:
393a094d8bSJeremy Morse                self._run_debugger_custom(the_cmdline)
4075b31692SStephen Tozer
411364750dSJames Henderson        # We may need to pickle this debugger controller after running the
421364750dSJames Henderson        # debugger. Debuggers are not picklable objects, so set to None.
431364750dSJames Henderson        self.debugger = None
44