X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-prettyprint.c;h=fdc520d84432a8bee1cfc59901176ab10914848e;hb=2e62ab400ff96334c92e5acf0a462cb9dc0d19a7;hp=4092fdb79f3e9a0a71b9c3a9d14a9d88a812385a;hpb=aed57c537116ae91f553ac835b3f96d1f87b3bb0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index 4092fdb79f..fdc520d844 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -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,7 +92,7 @@ search_pp_list (PyObject *list, PyObject *value) static PyObject * find_pretty_printer_from_objfiles (PyObject *value) { - for (objfile *obj : all_objfiles (current_program_space)) + for (objfile *obj : current_program_space->objfiles ()) { gdbpy_ref<> objf = objfile_to_objfile_object (obj); if (objf == NULL) @@ -191,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); @@ -213,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; } @@ -313,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")) @@ -351,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. */ @@ -481,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) { @@ -618,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) @@ -691,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 ())); @@ -737,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)