diff options
Diffstat (limited to 'gdb/python/py-prettyprint.c')
-rw-r--r-- | gdb/python/py-prettyprint.c | 98 |
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); +} |