From 518690a14b7fbec9898211de88b76da3d08ab895 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sat, 6 Apr 2024 23:10:51 +0200 Subject: [PATCH 01/12] etc: Add gdb pretty printers for time::time_t. --- etc/gdb_pretty/__init__.py | 5 +++ etc/gdb_pretty/printers.py | 77 ++++++++++++++++++++++++++++++++++++++ etc/openage.gdbinit | 12 ++++++ 3 files changed, 94 insertions(+) create mode 100644 etc/gdb_pretty/__init__.py create mode 100644 etc/gdb_pretty/printers.py create mode 100644 etc/openage.gdbinit diff --git a/etc/gdb_pretty/__init__.py b/etc/gdb_pretty/__init__.py new file mode 100644 index 0000000000..0e697d0676 --- /dev/null +++ b/etc/gdb_pretty/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2024-2024 the openage authors. See copying.md for legal info. + +""" +GDB pretty printers for openage. +""" diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py new file mode 100644 index 0000000000..28d4bd7234 --- /dev/null +++ b/etc/gdb_pretty/printers.py @@ -0,0 +1,77 @@ +# Copyright 2024-2024 the openage authors. See copying.md for legal info. + +""" +Pretty printers for GDB. +""" + +import gdb + + +class PrinterControl(gdb.printing.PrettyPrinter): + """ + Exposes a pretty printer for a specific type name. + """ + + def __init__(self, type_name: str, printer): + super().__init__(type_name) + self.printer = printer + + def __call__(self, val): + if val.type.name == self.name: + return self.printer(val) + + +def printer(type_name: str): + """ + Decorator for pretty printers. + + :param type_name: The name of the type to register the printer for. + :type type_name: str + """ + def _register_printer(printer): + """ + Registers the printer with GDB. + """ + gdb.printing.register_pretty_printer( + None, + PrinterControl(type_name, printer) + ) + + return _register_printer + + +@printer('openage::time::time_t') +class TimePrinter: + """ + Pretty printer for openage::time::time_t. + """ + + def __init__(self, val: gdb.Value): + self.__val = val + + def to_string(self): + # convert the fixed point value to double + seconds = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) + return f'{seconds:.5f}s' + + def children(self): + yield ('raw_value', self.__val['raw_value']) + # calculate the precision of the fixed point value + # 16 * log10(2) = 16 * 0.30103 = 4.81648 + # do this manualy because it's usually optimized out by the compiler + precision = int(16 * 0.30103 + 1) + yield ('approx_precision', precision) + + +# def add_pretty_printer(val): +# if str(val.type) == 'openage::time::time_t': +# return TimePrinter(val) + +# return None + + +# def register_openage_printers(objfile): +# """ +# Register the openage pretty printers with GDB. +# """ +# gdb.pretty_printers.append(add_pretty_printer) diff --git a/etc/openage.gdbinit b/etc/openage.gdbinit new file mode 100644 index 0000000000..69d42aeb51 --- /dev/null +++ b/etc/openage.gdbinit @@ -0,0 +1,12 @@ +python +import sys, os + +print(f".gdbinit Python: current working directory is {os.getcwd()}") +print(f".gdbinit Python: adding custom pretty-printers directory to the GDB path: {os.getcwd() + '../../etc'}") + +sys.path.insert(0, "../../etc") + +import gdb_pretty.printers +# from gdb_pretty.printers import register_openage_printers +# register_openage_printers(None) +end From 50d2f761f2899add91e4665c04054b1b9c9f1c78 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 01:05:29 +0200 Subject: [PATCH 02/12] etc: Regex option for pretty printing types. --- etc/gdb_pretty/printers.py | 91 +++++++++++++++++++++++++++----------- etc/openage.gdbinit | 6 +-- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 28d4bd7234..e854427df4 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -5,23 +5,60 @@ """ import gdb +import re class PrinterControl(gdb.printing.PrettyPrinter): """ - Exposes a pretty printer for a specific type name. + Exposes a pretty printer for a specific type. + + Printer are searched in the following order: + 1. Exact type name _with_ typedefs + 2. Regex of type name _without_ typedefs """ - def __init__(self, type_name: str, printer): - super().__init__(type_name) - self.printer = printer + def __init__(self, name: str): + super().__init__(name) + + self.name_printers = {} + self.regex_printers = {} + + def add_printer(self, type_name: str, printer): + """ + Adds a printer for a specific type name. + """ + self.name_printers[type_name] = printer + + def add_printer_regex(self, regex: str, printer): + """ + Adds a printer for a specific type name. - def __call__(self, val): - if val.type.name == self.name: - return self.printer(val) + :param regex: The regex to match the type name. + :type regex: str + """ + self.regex_printers[re.compile(regex)] = printer + def __call__(self, val: gdb.Value): + # Check the exact type name with typedefa + type_name = val.type.name + if type_name in self.name_printers: + return self.name_printers[val.type.name](val) -def printer(type_name: str): + # Check the type name without typedefs and regex + type_name = val.type.unqualified().strip_typedefs().tag + if type_name is None: + return None + + for regex, printer in self.regex_printers.items(): + if regex.match(type_name): + return printer(val) + + +pp = PrinterControl('openage') +gdb.printing.register_pretty_printer(None, pp) + + +def printer(type_name: str, regex: str = None): """ Decorator for pretty printers. @@ -32,10 +69,23 @@ def _register_printer(printer): """ Registers the printer with GDB. """ - gdb.printing.register_pretty_printer( - None, - PrinterControl(type_name, printer) - ) + pp.add_printer(type_name, printer) + + return _register_printer + + +def printer_regex(regex: str): + """ + Decorator for pretty printers. + + :param regex: The regex to match the type name. + :type regex: str + """ + def _register_printer(printer): + """ + Registers the printer with GDB. + """ + pp.add_printer_regex(regex, printer) return _register_printer @@ -52,7 +102,8 @@ def __init__(self, val: gdb.Value): def to_string(self): # convert the fixed point value to double seconds = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) - return f'{seconds:.5f}s' + # show as seconds with millisecond precision + return f'{seconds:.3f}s' def children(self): yield ('raw_value', self.__val['raw_value']) @@ -61,17 +112,3 @@ def children(self): # do this manualy because it's usually optimized out by the compiler precision = int(16 * 0.30103 + 1) yield ('approx_precision', precision) - - -# def add_pretty_printer(val): -# if str(val.type) == 'openage::time::time_t': -# return TimePrinter(val) - -# return None - - -# def register_openage_printers(objfile): -# """ -# Register the openage pretty printers with GDB. -# """ -# gdb.pretty_printers.append(add_pretty_printer) diff --git a/etc/openage.gdbinit b/etc/openage.gdbinit index 69d42aeb51..c0e8b86ce4 100644 --- a/etc/openage.gdbinit +++ b/etc/openage.gdbinit @@ -1,12 +1,10 @@ python import sys, os -print(f".gdbinit Python: current working directory is {os.getcwd()}") -print(f".gdbinit Python: adding custom pretty-printers directory to the GDB path: {os.getcwd() + '../../etc'}") +print("Loading openage.gdbinit") +print(f"Adding custom pretty-printers directory to the GDB path: {os.getcwd() + '../../etc'}") sys.path.insert(0, "../../etc") import gdb_pretty.printers -# from gdb_pretty.printers import register_openage_printers -# register_openage_printers(None) end From d0b742dd0cb149ee32003b0dfa09d0fdf924ceef Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 01:06:01 +0200 Subject: [PATCH 03/12] etc: Add gdb pretty print for util::FixedPoint. --- etc/gdb_pretty/printers.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index e854427df4..daf844fe18 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -112,3 +112,21 @@ def children(self): # do this manualy because it's usually optimized out by the compiler precision = int(16 * 0.30103 + 1) yield ('approx_precision', precision) + + +@printer_regex('^openage::util::FixedPoint<.*>') +class FixedPointPrinter: + """ + Pretty printer for openage::util::FixedPoint. + """ + + def __init__(self, val: gdb.Value): + self.__val = val + + def to_string(self): + # convert the fixed point value to double + num = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) + return f'{num:.5f}' + + def children(self): + yield ('raw_value', self.__val['raw_value']) From dc9f8918da9cc79758bb0146809b4932f1d47afe Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 01:10:39 +0200 Subject: [PATCH 04/12] etc: Ignore warnings about non-existent Python gdb module. gdb module is important by gdb itself. --- etc/gdb_pretty/printers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index daf844fe18..81611ca543 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -4,7 +4,7 @@ Pretty printers for GDB. """ -import gdb +import gdb # type: ignore import re From f62c44a12ba6f90941c609531d568c74125e0312 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 01:38:22 +0200 Subject: [PATCH 05/12] buildsys: Check pretty printers with sanity checks. --- buildsystem/codecompliance/__main__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/buildsystem/codecompliance/__main__.py b/buildsystem/codecompliance/__main__.py index dded8dd0a9..2a4f8b4084 100644 --- a/buildsystem/codecompliance/__main__.py +++ b/buildsystem/codecompliance/__main__.py @@ -1,4 +1,4 @@ -# Copyright 2014-2023 the openage authors. See copying.md for legal info. +# Copyright 2014-2024 the openage authors. See copying.md for legal info. """ Entry point for the code compliance checker. @@ -231,7 +231,7 @@ def find_all_issues(args, check_files=None): if args.pystyle: from .pystyle import find_issues - yield from find_issues(check_files, ('openage', 'buildsystem')) + yield from find_issues(check_files, ('openage', 'buildsystem', 'etc/gdb_pretty')) if args.cython: from buildsystem.codecompliance.cython import find_issues @@ -243,12 +243,12 @@ def find_all_issues(args, check_files=None): if args.pylint: from .pylint import find_issues - yield from find_issues(check_files, ('openage', 'buildsystem')) + yield from find_issues(check_files, ('openage', 'buildsystem', 'etc/gdb_pretty')) if args.textfiles: from .textfiles import find_issues yield from find_issues( - ('openage', 'libopenage', 'buildsystem', 'doc', 'legal'), + ('openage', 'libopenage', 'buildsystem', 'doc', 'legal', 'etc/gdb_pretty'), ('.pxd', '.pyx', '.pxi', '.py', '.h', '.cpp', '.template', '', '.txt', '.md', '.conf', @@ -257,13 +257,13 @@ def find_all_issues(args, check_files=None): if args.legal: from .legal import find_issues yield from find_issues(check_files, - ('openage', 'buildsystem', 'libopenage'), + ('openage', 'buildsystem', 'libopenage', 'etc/gdb_pretty'), args.test_git_change_years) if args.filemodes: from .modes import find_issues yield from find_issues(check_files, ('openage', 'buildsystem', - 'libopenage')) + 'libopenage', 'etc/gdb_pretty')) if __name__ == '__main__': From cc56b19416377c2d32ae2f15c8245dd52d5c694d Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 01:40:00 +0200 Subject: [PATCH 06/12] Fix pylint complaints. --- etc/gdb_pretty/printers.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 81611ca543..9757a56848 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -4,8 +4,8 @@ Pretty printers for GDB. """ -import gdb # type: ignore import re +import gdb # type: ignore class PrinterControl(gdb.printing.PrettyPrinter): @@ -53,12 +53,14 @@ def __call__(self, val: gdb.Value): if regex.match(type_name): return printer(val) + return None + pp = PrinterControl('openage') gdb.printing.register_pretty_printer(None, pp) -def printer(type_name: str, regex: str = None): +def printer_typedef(type_name: str): """ Decorator for pretty printers. @@ -90,7 +92,7 @@ def _register_printer(printer): return _register_printer -@printer('openage::time::time_t') +@printer_typedef('openage::time::time_t') class TimePrinter: """ Pretty printer for openage::time::time_t. @@ -100,12 +102,20 @@ def __init__(self, val: gdb.Value): self.__val = val def to_string(self): + """ + Get the time as a string. + + Format: SS.sss (e.g. 12.345s) + """ # convert the fixed point value to double seconds = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) # show as seconds with millisecond precision return f'{seconds:.3f}s' def children(self): + """ + Get the displayed children of the time value. + """ yield ('raw_value', self.__val['raw_value']) # calculate the precision of the fixed point value # 16 * log10(2) = 16 * 0.30103 = 4.81648 @@ -124,9 +134,17 @@ def __init__(self, val: gdb.Value): self.__val = val def to_string(self): + """ + Get the fixed point value as a string. + + Format: 0.12345 + """ # convert the fixed point value to double num = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) return f'{num:.5f}' def children(self): + """ + Get the displayed children of the fixed point value. + """ yield ('raw_value', self.__val['raw_value']) From 6454661b0a9d237cfda069c7075934fd48e68e8e Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 06:00:44 +0200 Subject: [PATCH 07/12] etc: Fix member value being optimized out in gcc. --- etc/gdb_pretty/printers.py | 23 ++++++++++++++++------- libopenage/gamestate/simulation.cpp | 4 ++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 9757a56848..42078d2dca 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -107,8 +107,11 @@ def to_string(self): Format: SS.sss (e.g. 12.345s) """ + fractional_bits = int(self.__val.type.template_argument(1)) + # convert the fixed point value to double - seconds = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) + to_double_factor = 1 / pow(2, fractional_bits) + seconds = float(self.__val['raw_value']) * to_double_factor # show as seconds with millisecond precision return f'{seconds:.3f}s' @@ -117,11 +120,6 @@ def children(self): Get the displayed children of the time value. """ yield ('raw_value', self.__val['raw_value']) - # calculate the precision of the fixed point value - # 16 * log10(2) = 16 * 0.30103 = 4.81648 - # do this manualy because it's usually optimized out by the compiler - precision = int(16 * 0.30103 + 1) - yield ('approx_precision', precision) @printer_regex('^openage::util::FixedPoint<.*>') @@ -139,8 +137,11 @@ def to_string(self): Format: 0.12345 """ + fractional_bits = int(self.__val.type.template_argument(1)) + # convert the fixed point value to double - num = float(self.__val['raw_value']) * float(self.__val['to_double_factor']) + to_double_factor = 1 / pow(2, fractional_bits) + num = float(self.__val['raw_value']) * to_double_factor return f'{num:.5f}' def children(self): @@ -148,3 +149,11 @@ def children(self): Get the displayed children of the fixed point value. """ yield ('raw_value', self.__val['raw_value']) + + # calculate the precision of the fixed point value + # 16 * log10(2) = 16 * 0.30103 = 4.81648 + # do this manualy because it's usually optimized out by the compiler + fractional_bits = int(self.__val.type.template_argument(1)) + + precision = int(fractional_bits * 0.30103 + 1) + yield ('approx_precision', precision) diff --git a/libopenage/gamestate/simulation.cpp b/libopenage/gamestate/simulation.cpp index e883bd56f7..ed2627c95e 100644 --- a/libopenage/gamestate/simulation.cpp +++ b/libopenage/gamestate/simulation.cpp @@ -1,4 +1,4 @@ -// Copyright 2013-2023 the openage authors. See copying.md for legal info. +// Copyright 2013-2024 the openage authors. See copying.md for legal info. #include "simulation.h" @@ -45,7 +45,7 @@ GameSimulation::GameSimulation(const util::Path &root_dir, void GameSimulation::run() { this->start(); while (this->running) { - auto current_time = this->time_loop->get_clock()->get_time(); + time::time_t current_time = this->time_loop->get_clock()->get_time(); this->event_loop->reach_time(current_time, this->game->get_state()); } log::log(MSG(info) << "Game simulation loop exited"); From d72de6176743e69cfa2e77a277b26a6bf20b2d52 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 06:33:55 +0200 Subject: [PATCH 08/12] doc: Document that we have pretty printers. --- doc/debug.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/debug.md b/doc/debug.md index e8f838e0b2..cf6c8880fc 100644 --- a/doc/debug.md +++ b/doc/debug.md @@ -21,10 +21,28 @@ gdb -ex 'set breakpoint pending on' -ex 'b openage::run_game' -ex run --args run ``` The game will be paused at the start of the function run_game() located in `libopenage/main.cpp` -#### Note: -The `run` executable is a compiled version of `run.py` that also embeds the interpreter. +**Note:** The `run` executable is a compiled version of `run.py` that also embeds the interpreter. The game is intended to be run by `run.py` but it is much easier to debug the `./run` file +### Pretty Printers + +Enabling pretty printing will make GDB's output much more readable, so we always recommend +to configure it in your setup. Your [favourite IDE](/doc/ide/) probably an option to enable pretty printers +for the standard library types. If not, you can get them from the [gcc repository](https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3/python/libstdcxx) and register them in your local `.gdbinit` file. + +Additionally, we have created several custom GDB pretty printers for types used in `libopenage`, +the C++ library that contains the openage engine core. To enable them, you have to load the project's +own init file [openage.gdbinit](/etc/openage.gdbinit) when running GDB: + +```gdb +(gdb) source /etc/openage.gdbinit +``` + +Your IDE may be able to do this automatically for a debug run. Alternatively, you can configure +an [auto-loader](https://sourceware.org/gdb/current/onlinedocs/gdb.html/Python-Auto_002dloading.html#Python-Auto_002dloading) +that loads the scripts for you. + + ### GDBGUI [gdbgui](https://github.com/cs01/gdbgui) is a browser-based frontend for GDB. From 0b146e27fcab9bd17c356a94ef9af11b91ade500 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 16:53:33 +0200 Subject: [PATCH 09/12] etc: Pretty print openage::util::Vector. --- etc/gdb_pretty/printers.py | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 42078d2dca..2a0be8b167 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -157,3 +157,48 @@ def children(self): precision = int(fractional_bits * 0.30103 + 1) yield ('approx_precision', precision) + + +@printer_regex('^openage::util::Vector<.*>') +class VectorPrinter: + """ + Pretty printer for openage::util::Vector. + """ + + def __init__(self, val: gdb.Value): + self.__val = val + + def to_string(self): + """ + Get the vector as a string. + """ + size = self.__val.type.template_argument(0) + int_type = self.__val.type.template_argument(1) + return f'openage::util::Vector<{size}, {int_type}>' + + def children(self): + """ + Get the displayed children of the vector. + """ + size = self.__val.type.template_argument(0) + for i in range(size): + yield (str(i), self.__val['_M_elems'][i]) + + def child(self, index): + """ + Get the child at the given index. + """ + return self.__val['_M_elems'][index] + + def num_children(self): + """ + Get the number of children of the vector. + """ + return self.__val.type.template_argument(0) + + @staticmethod + def display_hint(): + """ + Get the display hint for the vector. + """ + return 'array' From f34022c4c8984291f0f12a454449e7caeb78777c Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 17:32:11 +0200 Subject: [PATCH 10/12] etc: Add reminder to inherit from gdb.ValuePrinter later. --- etc/gdb_pretty/printers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 2a0be8b167..2d3c6e9fe5 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -96,6 +96,8 @@ def _register_printer(printer): class TimePrinter: """ Pretty printer for openage::time::time_t. + + TODO: Inherit from gdb.ValuePrinter when gdb 14.1 is available in all distros. """ def __init__(self, val: gdb.Value): @@ -126,6 +128,8 @@ def children(self): class FixedPointPrinter: """ Pretty printer for openage::util::FixedPoint. + + TODO: Inherit from gdb.ValuePrinter when gdb 14.1 is available in all distros. """ def __init__(self, val: gdb.Value): @@ -163,6 +167,8 @@ def children(self): class VectorPrinter: """ Pretty printer for openage::util::Vector. + + TODO: Inherit from gdb.ValuePrinter when gdb 14.1 is available in all distros. """ def __init__(self, val: gdb.Value): From 6a234ef8ee8c1221cf109e4a58648e15d09367ea Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 18:05:46 +0200 Subject: [PATCH 11/12] etc: Pretty print openage::curve::Keyframe. --- etc/gdb_pretty/printers.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index 2d3c6e9fe5..e02ce9c292 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -208,3 +208,28 @@ def display_hint(): Get the display hint for the vector. """ return 'array' + + +@printer_regex('^openage::curve::Keyframe<.*>') +class KeyframePrinter: + """ + Pretty printer for openage::curve::Keyframe. + + TODO: Inherit from gdb.ValuePrinter when gdb 14.1 is available in all distros. + """ + + def __init__(self, val: gdb.Value): + self.__val = val + + def to_string(self): + """ + Get the keyframe as a string. + """ + return f'openage::curve::Keyframe<{self.__val.type.template_argument(0)}>' + + def children(self): + """ + Get the displayed children of the keyframe. + """ + yield ('time', self.__val['time']) + yield ('value', self.__val['value']) From e79a403ef84666e37be54000a73b0e9da811434d Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 7 Apr 2024 18:34:07 +0200 Subject: [PATCH 12/12] etc: TODOs for future extensions of pretty printer. --- etc/gdb_pretty/printers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/etc/gdb_pretty/printers.py b/etc/gdb_pretty/printers.py index e02ce9c292..e5bbb42d84 100644 --- a/etc/gdb_pretty/printers.py +++ b/etc/gdb_pretty/printers.py @@ -233,3 +233,9 @@ def children(self): """ yield ('time', self.__val['time']) yield ('value', self.__val['value']) + +# TODO: curve types +# TODO: coord types +# TODO: pathfinding types +# TODO: input event codes +# TODO: eigen types https://github.com/dmillard/eigengdb