From 7abcb5e9a7be9411e3bbdacd860132823fe616f7 Mon Sep 17 00:00:00 2001 From: bitFiedler Date: Tue, 18 Mar 2025 14:01:25 +0100 Subject: [PATCH] fixes issue 4691 (#4693) * bugfix removeprefix not available in python version < 3.9 there was a problem in my cLion gdb that comes with python version 3.8. the pretty printer script do not work because the removeprefix function is added in version 3.9. therefore we need a fix for that. Signed-off-by: Matthias Popp * fix indentation, use the same indentation size at in class JsonValuePrinter the indentation size was a mix up, we should use always the same indentation size of 4 Signed-off-by: Matthias Popp * use prefix as variable easier handling or easier to change Signed-off-by: Matthias Popp * add variables for easier access Signed-off-by: Matthias Popp --------- Signed-off-by: Matthias Popp Co-authored-by: Matthias Popp --- tools/gdb_pretty_printer/nlohmann-json.py | 29 +++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tools/gdb_pretty_printer/nlohmann-json.py b/tools/gdb_pretty_printer/nlohmann-json.py index 3984f592f..2c120befd 100644 --- a/tools/gdb_pretty_printer/nlohmann-json.py +++ b/tools/gdb_pretty_printer/nlohmann-json.py @@ -15,18 +15,21 @@ class JsonValuePrinter: def json_lookup_function(val): if m := ns_pattern.fullmatch(str(val.type.strip_typedefs().name)): - name = m.group('name') - if name and name.startswith('basic_json<') and name.endswith('>'): - m = ns_pattern.fullmatch(str(val["m_data"]['m_type'])) - t = m.group('name') - if t and t.startswith('detail::value_t::'): - try: - union_val = val["m_data"]['m_value'][t.removeprefix('detail::value_t::')] - if union_val.type.code == gdb.TYPE_CODE_PTR: - return gdb.default_visualizer(union_val.dereference()) - else: - return JsonValuePrinter(union_val) - except Exception: - return JsonValuePrinter(val["m_data"]['m_type']) + name = m.group('name') + if name and name.startswith('basic_json<') and name.endswith('>'): + m_data = val['m_data'] + m_type = m_data['m_type'] + m = ns_pattern.fullmatch(str(m_type)) + t = m.group('name') + prefix = 'detail::value_t::' + if t and t.startswith(prefix): + try: + union_val = m_data['m_value'][t.replace(prefix, '', 1)] + if union_val.type.code == gdb.TYPE_CODE_PTR: + return gdb.default_visualizer(union_val.dereference()) + else: + return JsonValuePrinter(union_val) + except Exception: + return JsonValuePrinter(m_type) gdb.pretty_printers.append(json_lookup_function)