aboutsummaryrefslogtreecommitdiff
path: root/gdb/python/py-prettyprint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/python/py-prettyprint.c')
-rw-r--r--gdb/python/py-prettyprint.c98
1 files changed, 97 insertions, 1 deletions
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index a25a1b6..4ef45b2 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -39,6 +39,10 @@ enum gdbpy_string_repr_result
string_repr_ok
};
+/* If non-null, points to options that are in effect while
+ printing. */
+const struct value_print_options *gdbpy_current_print_options;
+
/* Helper function for find_pretty_printer which iterates over a list,
calls each function and inspects output. This will return a
printer object if one recognizes VALUE. If no printer is found, it
@@ -604,6 +608,9 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
if (printer == Py_None)
return EXT_LANG_RC_NOP;
+ scoped_restore set_options = make_scoped_restore (&gdbpy_current_print_options,
+ options);
+
/* If we are printing a map, we want some special formatting. */
gdb::unique_xmalloc_ptr<char> hint (gdbpy_get_display_hint (printer.get ()));
@@ -632,8 +639,12 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
gdbpy_ref<>
apply_varobj_pretty_printer (PyObject *printer_obj,
struct value **replacement,
- struct ui_file *stream)
+ struct ui_file *stream,
+ const value_print_options *opts)
{
+ scoped_restore set_options = make_scoped_restore (&gdbpy_current_print_options,
+ opts);
+
*replacement = NULL;
gdbpy_ref<> py_str = pretty_print_one_value (printer_obj, replacement);
@@ -688,3 +699,88 @@ gdbpy_default_visualizer (PyObject *self, PyObject *args)
return find_pretty_printer (val_obj).release ();
}
+
+/* Helper function to set a boolean in a dictionary. */
+static int
+set_boolean (PyObject *dict, const char *name, bool val)
+{
+ gdbpy_ref<> val_obj (PyBool_FromLong (val));
+ if (val_obj == nullptr)
+ return -1;
+ return PyDict_SetItemString (dict, name, val_obj.get ());
+}
+
+/* Helper function to set an integer in a dictionary. */
+static int
+set_unsigned (PyObject *dict, const char *name, unsigned int val)
+{
+ gdbpy_ref<> val_obj = gdb_py_object_from_ulongest (val);
+ if (val_obj == nullptr)
+ return -1;
+ return PyDict_SetItemString (dict, name, val_obj.get ());
+}
+
+/* Implement gdb.print_options. */
+PyObject *
+gdbpy_print_options (PyObject *unused1, PyObject *unused2)
+{
+ gdbpy_ref<> result (PyDict_New ());
+ if (result == nullptr)
+ return nullptr;
+
+ value_print_options opts;
+ gdbpy_get_print_options (&opts);
+
+ if (set_boolean (result.get (), "raw",
+ opts.raw) < 0
+ || set_boolean (result.get (), "pretty_arrays",
+ opts.prettyformat_arrays) < 0
+ || set_boolean (result.get (), "pretty_structs",
+ opts.prettyformat_structs) < 0
+ || set_boolean (result.get (), "array_indexes",
+ opts.print_array_indexes) < 0
+ || set_boolean (result.get (), "symbols",
+ opts.symbol_print) < 0
+ || set_boolean (result.get (), "unions",
+ opts.unionprint) < 0
+ || set_boolean (result.get (), "address",
+ opts.addressprint) < 0
+ || set_boolean (result.get (), "deref_refs",
+ opts.deref_ref) < 0
+ || set_boolean (result.get (), "actual_objects",
+ opts.objectprint) < 0
+ || set_boolean (result.get (), "static_members",
+ opts.static_field_print) < 0
+ || set_boolean (result.get (), "deref_refs",
+ opts.deref_ref) < 0
+ || set_unsigned (result.get (), "max_elements",
+ opts.print_max) < 0
+ || set_unsigned (result.get (), "max_depth",
+ opts.max_depth) < 0
+ || set_unsigned (result.get (), "repeat_threshold",
+ opts.repeat_count_threshold) < 0)
+ return nullptr;
+
+ if (opts.format != 0)
+ {
+ char str[2] = { (char) opts.format, 0 };
+ gdbpy_ref<> fmtstr = host_string_to_python_string (str);
+ if (fmtstr == nullptr)
+ return nullptr;
+ if (PyDict_SetItemString (result.get (), "format", fmtstr.get ()) < 0)
+ return nullptr;
+ }
+
+ return result.release ();
+}
+
+/* Helper function that either finds the prevailing print options, or
+ calls get_user_print_options. */
+void
+gdbpy_get_print_options (value_print_options *opts)
+{
+ if (gdbpy_current_print_options != nullptr)
+ *opts = *gdbpy_current_print_options;
+ else
+ get_user_print_options (opts);
+}