Source code for libdebug.debugger.internal_debugger_instance_manager
#
# This file is part of libdebug Python library (https://github.com/libdebug/libdebug).
# Copyright (c) 2024 Gabriele Digregorio, Roberto Alessandro Bertolini. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for details.
#
from __future__ import annotations
from contextlib import contextmanager
from typing import TYPE_CHECKING
from libdebug.debugger.internal_debugger_holder import internal_debugger_holder
if TYPE_CHECKING:
from libdebug.debugger.internal_debugger import InternalDebugger
[docs]
def get_global_internal_debugger() -> InternalDebugger:
"""Can be used to retrieve a temporarily-global internal debugger."""
if internal_debugger_holder.global_internal_debugger is None:
raise RuntimeError("No internal debugger available")
return internal_debugger_holder.global_internal_debugger
[docs]
def provide_internal_debugger(reference: object) -> InternalDebugger:
"""Provide a internal debugger.
Args:
reference (object): the object that needs the internal debugger.
Returns:
InternalDebugger: the internal debugger.
"""
if reference in internal_debugger_holder.internal_debuggers:
return internal_debugger_holder.internal_debuggers[reference]
if internal_debugger_holder.global_internal_debugger is None:
raise RuntimeError("No internal debugger available")
internal_debugger_holder.internal_debuggers[reference] = internal_debugger_holder.global_internal_debugger
return internal_debugger_holder.global_internal_debugger
[docs]
def link_to_internal_debugger(reference: object, internal_debugger: InternalDebugger) -> None:
"""Link a reference to a InternalDebugger.
Args:
reference (object): the object that needs the internal debugger.
internal_debugger (InternalDebugger): the internal debugger.
"""
internal_debugger_holder.internal_debuggers[reference] = internal_debugger
[docs]
@contextmanager
def extend_internal_debugger(referrer: object) -> ...:
"""Extend the internal debugger.
Args:
referrer (object): the referrer object.
Yields:
InternalDebugger: the internal debugger.
"""
with internal_debugger_holder.internal_debugger_lock:
if referrer not in internal_debugger_holder.internal_debuggers:
raise RuntimeError("Referrer isn't linked to any internal debugger.")
internal_debugger_holder.global_internal_debugger = internal_debugger_holder.internal_debuggers[referrer]
yield
internal_debugger_holder.global_internal_debugger = None