X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-prettyprint.c;h=fdc520d84432a8bee1cfc59901176ab10914848e;hb=2e62ab400ff96334c92e5acf0a462cb9dc0d19a7;hp=fa4107c30ddc0386ab62781ac11305bd211f308e;hpb=a31abe80ea4c45b544f3ae04bc63ccaeba530e0f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index fa4107c30d..fdc520d844 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -1,6 +1,6 @@ /* Python pretty-printing - Copyright (C) 2008-2018 Free Software Foundation, Inc. + Copyright (C) 2008-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -25,7 +25,6 @@ #include "extension-priv.h" #include "python.h" #include "python-internal.h" -#include "py-ref.h" /* Return type of print_string_repr. */ @@ -93,28 +92,26 @@ search_pp_list (PyObject *list, PyObject *value) static PyObject * find_pretty_printer_from_objfiles (PyObject *value) { - struct objfile *obj; + for (objfile *obj : current_program_space->objfiles ()) + { + gdbpy_ref<> objf = objfile_to_objfile_object (obj); + if (objf == NULL) + { + /* Ignore the error and continue. */ + PyErr_Clear (); + continue; + } - ALL_OBJFILES (obj) - { - gdbpy_ref<> objf = objfile_to_objfile_object (obj); - if (objf == NULL) - { - /* Ignore the error and continue. */ - PyErr_Clear (); - continue; - } - - gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), NULL)); - gdbpy_ref<> function (search_pp_list (pp_list.get (), value)); - - /* If there is an error in any objfile list, abort the search and exit. */ - if (function == NULL) - return NULL; + gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), NULL)); + gdbpy_ref<> function (search_pp_list (pp_list.get (), value)); - if (function != Py_None) - return function.release (); - } + /* If there is an error in any objfile list, abort the search and exit. */ + if (function == NULL) + return NULL; + + if (function != Py_None) + return function.release (); + } Py_RETURN_NONE; } @@ -193,7 +190,7 @@ pretty_print_one_value (PyObject *printer, struct value **out_value) gdbpy_ref<> result; *out_value = NULL; - TRY + try { if (!PyObject_HasAttr (printer, gdbpy_to_string_cst)) result = gdbpy_ref<>::new_reference (Py_None); @@ -215,10 +212,9 @@ pretty_print_one_value (PyObject *printer, struct value **out_value) } } } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { } - END_CATCH return result; } @@ -259,16 +255,8 @@ print_stack_unless_memory_error (struct ui_file *stream) { if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error)) { - PyObject *type, *value, *trace; - - PyErr_Fetch (&type, &value, &trace); - - gdbpy_ref<> type_ref (type); - gdbpy_ref<> value_ref (value); - gdbpy_ref<> trace_ref (trace); - - gdb::unique_xmalloc_ptr - msg (gdbpy_exception_to_string (type, value)); + gdbpy_err_fetch fetched_error; + gdb::unique_xmalloc_ptr msg = fetched_error.to_string (); if (msg == NULL || *msg == '\0') fprintf_filtered (stream, _("")); @@ -323,13 +311,8 @@ print_string_repr (PyObject *printer, const char *hint, long length; struct type *type; -#ifdef IS_PY3K output = PyBytes_AS_STRING (string.get ()); length = PyBytes_GET_SIZE (string.get ()); -#else - output = PyString_AsString (string.get ()); - length = PyString_Size (string.get ()); -#endif type = builtin_type (gdbarch)->builtin_char; if (hint && !strcmp (hint, "string")) @@ -361,88 +344,6 @@ print_string_repr (PyObject *printer, const char *hint, return result; } -#ifndef IS_PY3K - -/* Create a dummy PyFrameObject, needed to work around - a Python-2.4 bug with generators. */ -class dummy_python_frame -{ - public: - - dummy_python_frame (); - - ~dummy_python_frame () - { - if (m_valid) - m_tstate->frame = m_saved_frame; - } - - bool failed () const - { - return !m_valid; - } - - private: - - bool m_valid; - PyFrameObject *m_saved_frame; - gdbpy_ref<> m_frame; - PyThreadState *m_tstate; -}; - -dummy_python_frame::dummy_python_frame () -: m_valid (false), - m_saved_frame (NULL), - m_tstate (NULL) -{ - PyCodeObject *code; - PyFrameObject *frame; - - gdbpy_ref<> empty_string (PyString_FromString ("")); - if (empty_string == NULL) - return; - - gdbpy_ref<> null_tuple (PyTuple_New (0)); - if (null_tuple == NULL) - return; - - code = PyCode_New (0, /* argcount */ - 0, /* locals */ - 0, /* stacksize */ - 0, /* flags */ - empty_string.get (), /* code */ - null_tuple.get (), /* consts */ - null_tuple.get (), /* names */ - null_tuple.get (), /* varnames */ -#if PYTHON_API_VERSION >= 1010 - null_tuple.get (), /* freevars */ - null_tuple.get (), /* cellvars */ -#endif - empty_string.get (), /* filename */ - empty_string.get (), /* name */ - 1, /* firstlineno */ - empty_string.get () /* lnotab */ - ); - if (code == NULL) - return; - gdbpy_ref<> code_holder ((PyObject *) code); - - gdbpy_ref<> globals (PyDict_New ()); - if (globals == NULL) - return; - - m_tstate = PyThreadState_GET (); - frame = PyFrame_New (m_tstate, code, globals.get (), NULL); - if (frame == NULL) - return; - - m_frame.reset ((PyObject *) frame); - m_tstate->frame = frame; - m_saved_frame = frame->f_back; - m_valid = true; -} -#endif - /* Helper for gdbpy_apply_val_pretty_printer that formats children of the printer, if any exist. If is_py_none is true, then nothing has been printed by to_string, and format output accordingly. */ @@ -491,18 +392,6 @@ print_children (PyObject *printer, const char *hint, pretty = options->prettyformat_structs; } - /* Manufacture a dummy Python frame to work around Python 2.4 bug, - where it insists on having a non-NULL tstate->frame when - a generator is called. */ -#ifndef IS_PY3K - dummy_python_frame frame; - if (frame.failed ()) - { - gdbpy_print_stack (); - return; - } -#endif - done_flag = 0; for (i = 0; i < options->print_max; ++i) { @@ -628,7 +517,17 @@ print_children (PyObject *printer, const char *hint, error (_("Error while executing Python code.")); } else - common_val_print (value, stream, recurse + 1, options, language); + { + /* When printing the key of a map we allow one additional + level of depth. This means the key will print before the + value does. */ + struct value_print_options opt = *options; + if (is_map && i % 2 == 0 + && opt.max_depth != -1 + && opt.max_depth < INT_MAX) + ++opt.max_depth; + common_val_print (value, stream, recurse + 1, &opt, language); + } } if (is_map && i % 2 == 0) @@ -701,6 +600,9 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang, if (printer == Py_None) return EXT_LANG_RC_NOP; + if (val_print_check_max_depth (stream, recurse, options, language)) + return EXT_LANG_RC_OK; + /* If we are printing a map, we want some special formatting. */ gdb::unique_xmalloc_ptr hint (gdbpy_get_display_hint (printer.get ())); @@ -747,15 +649,14 @@ apply_varobj_pretty_printer (PyObject *printer_obj, gdbpy_ref<> gdbpy_get_varobj_pretty_printer (struct value *value) { - TRY + try { value = value_copy (value); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH gdbpy_ref<> val_obj (value_to_value_object (value)); if (val_obj == NULL)