gdb/python: move styling support to gdb.styling

This commit moves the two Python functions that are used for styling
into a new module, gdb.styling, there's then a small update in
python.c so GDB can find the functions in their new location.

The motivation for this change is purely to try and reduce the clutter
in the top-level gdb module, and encapsulate related functions into
modules.  I did ponder documenting these functions as part of the
Python API, however, doing so would effectively "fix" the API, and I'm
still wondering if there's improvements that could be made, also, the
colorize function is only called in some cases now that GDB prefers
libsource-highlight, so it's not entirely sure how this would work as
part of a user facing API.

Still, despite these functions never having been part of a documented
API, it is possible that a user out there has overridden these to, in
some way, customize how GDB performs styling.  Moving the function as
I propose in this patch could break things for that user, however,
fixing this breakage is trivial, and, as these functions were never
documented, I don't think we should be obliged to not break user code
that relies on them.
This commit is contained in:
Andrew Burgess 2021-10-26 00:08:46 +01:00 committed by Andrew Burgess
parent e867795e8b
commit 7b8c55afd0
4 changed files with 69 additions and 39 deletions

View file

@ -248,36 +248,3 @@ def with_parameter(name, value):
yield None
finally:
set_parameter(name, old_value)
try:
from pygments import formatters, lexers, highlight
def colorize(filename, contents):
# Don't want any errors.
try:
lexer = lexers.get_lexer_for_filename(filename, stripnl=False)
formatter = formatters.TerminalFormatter()
return highlight(contents, lexer, formatter).encode(
host_charset(), "backslashreplace"
)
except:
return None
def colorize_disasm(content, gdbarch):
# Don't want any errors.
try:
lexer = lexers.get_lexer_by_name("asm")
formatter = formatters.TerminalFormatter()
return highlight(content, lexer, formatter).rstrip().encode()
except:
return None
except:
def colorize(filename, contents):
return None
def colorize_disasm(content, gdbarch):
return None

View file

@ -0,0 +1,50 @@
# Styling related hooks.
# Copyright (C) 2010-2022 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Utilities for styling."""
import gdb
try:
from pygments import formatters, lexers, highlight
def colorize(filename, contents):
# Don't want any errors.
try:
lexer = lexers.get_lexer_for_filename(filename, stripnl=False)
formatter = formatters.TerminalFormatter()
return highlight(contents, lexer, formatter).encode(
gdb.host_charset(), "backslashreplace"
)
except:
return None
def colorize_disasm(content, gdbarch):
# Don't want any errors.
try:
lexer = lexers.get_lexer_by_name("asm")
formatter = formatters.TerminalFormatter()
return highlight(content, lexer, formatter).rstrip().encode()
except:
return None
except:
def colorize(filename, contents):
return None
def colorize_disasm(content, gdbarch):
return None

View file

@ -1156,11 +1156,17 @@ gdbpy_colorize (const std::string &filename, const std::string &contents)
gdbpy_enter enter_py;
if (gdb_python_module == nullptr
|| !PyObject_HasAttrString (gdb_python_module, "colorize"))
gdbpy_ref<> module (PyImport_ImportModule ("gdb.styling"));
if (module == nullptr)
{
gdbpy_print_stack ();
return {};
}
if (!PyObject_HasAttrString (module.get (), "colorize"))
return {};
gdbpy_ref<> hook (PyObject_GetAttrString (gdb_python_module, "colorize"));
gdbpy_ref<> hook (PyObject_GetAttrString (module.get (), "colorize"));
if (hook == nullptr)
{
gdbpy_print_stack ();
@ -1227,11 +1233,17 @@ gdbpy_colorize_disasm (const std::string &content, gdbarch *gdbarch)
gdbpy_enter enter_py;
if (gdb_python_module == nullptr
|| !PyObject_HasAttrString (gdb_python_module, "colorize_disasm"))
gdbpy_ref<> module (PyImport_ImportModule ("gdb.styling"));
if (module == nullptr)
{
gdbpy_print_stack ();
return {};
}
if (!PyObject_HasAttrString (module.get (), "colorize_disasm"))
return {};
gdbpy_ref<> hook (PyObject_GetAttrString (gdb_python_module,
gdbpy_ref<> hook (PyObject_GetAttrString (module.get (),
"colorize_disasm"));
if (hook == nullptr)
{