gdb-stubs fixes (#9439)

* fix: Union subprinters with `None`

See a4418a9c6f/gdb/python/lib/gdb/printing.py (L52-L55)

* fix: Allow callables as argument to `printer`

See a4418a9c6f/gdb/python/lib/gdb/printing.py (L77) and the description of "function / old way" in the body of `register_pretty_printer`.

The new union's signature is equivalent to `gdb.printing.PrettyPrinter(...).__call__`.

* fix: make `gdb.Block` iterable over `gdb.Symbol`

See https://sourceware.org/gdb/onlinedocs/gdb/Blocks-In-Python.html#Blocks-In-Python:

> A gdb.Block is iterable. The iterator returns the symbols (see [Symbols In Python](https://sourceware.org/gdb/onlinedocs/gdb/Symbols-In-Python.html#Symbols-In-Python)) local to the block.

Implementation of `gdb.BlockIterator` is given in https://github.com/bminor/binutils-gdb/blob/gdb-12-branch/gdb/python/py-block.c. As with many of the other classes, `BlockIterator` is actually imported from the built-in `_gdb` module (a4418a9c6f/gdb/python/lib/gdb/__init__.py (L28)).

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
bzoracler
2023-01-06 05:07:36 +13:00
committed by GitHub
parent 605378de6e
commit dfe844c200
2 changed files with 13 additions and 3 deletions

View File

@@ -492,6 +492,12 @@ class Block:
is_static: bool
def is_valid(self) -> bool: ...
def __iter__(self) -> BlockIterator: ...
class BlockIterator:
def is_valid(self) -> bool: ...
def __iter__(self: _typeshed.Self) -> _typeshed.Self: ...
def __next__(self) -> Symbol: ...
# Symbols

View File

@@ -1,4 +1,4 @@
from collections.abc import Iterable
from collections.abc import Callable, Iterable
import gdb
from gdb import _PrettyPrinterLookupFunction
@@ -6,7 +6,7 @@ from gdb import _PrettyPrinterLookupFunction
class PrettyPrinter:
name: str
subprinters: list[SubPrettyPrinter]
subprinters: list[SubPrettyPrinter] | None
enabled: bool
def __init__(self, name: str, subprinters: Iterable[SubPrettyPrinter] | None = ...) -> None: ...
@@ -26,4 +26,8 @@ class RegexpCollectionPrettyPrinter(PrettyPrinter):
class FlagEnumerationPrinter(PrettyPrinter):
def __init__(self, enum_type: str) -> None: ...
def register_pretty_printer(obj: gdb.Objfile | gdb.Progspace | None, printer: PrettyPrinter, replace: bool = ...) -> None: ...
def register_pretty_printer(
obj: gdb.Objfile | gdb.Progspace | None,
printer: PrettyPrinter | Callable[[gdb.Value], gdb._PrettyPrinter | None],
replace: bool = ...,
) -> None: ...