X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-prettyprint.c;h=fdc520d84432a8bee1cfc59901176ab10914848e;hb=2e62ab400ff96334c92e5acf0a462cb9dc0d19a7;hp=7aa83bce41a733ec3d6837c2bd3014bd3129d612;hpb=1bdb0c5472c10b1af38b915df48ceee417192aa3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index 7aa83bce41..fdc520d844 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -1,6 +1,6 @@ /* Python pretty-printing - Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2008-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -18,45 +18,53 @@ along with this program. If not, see . */ #include "defs.h" -#include "exceptions.h" #include "objfiles.h" #include "symtab.h" #include "language.h" #include "valprint.h" - +#include "extension-priv.h" #include "python.h" - -#ifdef HAVE_PYTHON #include "python-internal.h" +/* Return type of print_string_repr. */ + +enum string_repr_result + { + /* The string method returned None. */ + string_repr_none, + /* The string method had an error. */ + string_repr_error, + /* Everything ok. */ + string_repr_ok + }; + /* 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 will return None. On error, it will set the Python error and return NULL. */ -static PyObject * +static gdbpy_ref<> search_pp_list (PyObject *list, PyObject *value) { Py_ssize_t pp_list_size, list_index; - PyObject *function, *printer = NULL; pp_list_size = PyList_Size (list); for (list_index = 0; list_index < pp_list_size; list_index++) { - function = PyList_GetItem (list, list_index); + PyObject *function = PyList_GetItem (list, list_index); if (! function) return NULL; /* Skip if disabled. */ if (PyObject_HasAttr (function, gdbpy_enabled_cst)) { - PyObject *attr = PyObject_GetAttr (function, gdbpy_enabled_cst); + gdbpy_ref<> attr (PyObject_GetAttr (function, gdbpy_enabled_cst)); int cmp; - if (!attr) + if (attr == NULL) return NULL; - cmp = PyObject_IsTrue (attr); + cmp = PyObject_IsTrue (attr.get ()); if (cmp == -1) return NULL; @@ -64,16 +72,15 @@ search_pp_list (PyObject *list, PyObject *value) continue; } - printer = PyObject_CallFunctionObjArgs (function, value, NULL); - if (! printer) + gdbpy_ref<> printer (PyObject_CallFunctionObjArgs (function, value, + NULL)); + if (printer == NULL) return NULL; else if (printer != Py_None) return printer; - - Py_DECREF (printer); } - Py_RETURN_NONE; + return gdbpy_ref<>::new_reference (Py_None); } /* Subroutine of find_pretty_printer to simplify it. @@ -85,33 +92,26 @@ search_pp_list (PyObject *list, PyObject *value) static PyObject * find_pretty_printer_from_objfiles (PyObject *value) { - PyObject *pp_list; - PyObject *function; - 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) - { - PyObject *objf = objfile_to_objfile_object (obj); - if (!objf) - { - /* Ignore the error and continue. */ - PyErr_Clear (); - continue; - } - - pp_list = objfpy_get_printers (objf, NULL); - function = search_pp_list (pp_list, value); - Py_XDECREF (pp_list); - - /* If there is an error in any objfile list, abort the search and exit. */ - if (! function) - 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; - - Py_DECREF (function); - } + /* 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; } @@ -122,19 +122,15 @@ find_pretty_printer_from_objfiles (PyObject *value) The result is Py_None, suitably inc-ref'd, if no pretty-printer was found. Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer_from_progspace (PyObject *value) { - PyObject *pp_list; - PyObject *function; - PyObject *obj = pspace_to_pspace_object (current_program_space); + gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space); - if (!obj) + if (obj == NULL) return NULL; - pp_list = pspy_get_printers (obj, NULL); - function = search_pp_list (pp_list, value); - Py_XDECREF (pp_list); - return function; + gdbpy_ref<> pp_list (pspy_get_printers (obj.get (), NULL)); + return search_pp_list (pp_list.get (), value); } /* Subroutine of find_pretty_printer to simplify it. @@ -143,52 +139,41 @@ find_pretty_printer_from_progspace (PyObject *value) The result is Py_None, suitably inc-ref'd, if no pretty-printer was found. Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer_from_gdb (PyObject *value) { - PyObject *pp_list; - PyObject *function; - - /* Fetch the global pretty printer dictionary. */ - if (! PyObject_HasAttrString (gdb_module, "pretty_printers")) - Py_RETURN_NONE; - pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers"); - if (pp_list == NULL || ! PyList_Check (pp_list)) - { - Py_XDECREF (pp_list); - Py_RETURN_NONE; - } - - function = search_pp_list (pp_list, value); - Py_XDECREF (pp_list); - return function; + /* Fetch the global pretty printer list. */ + if (gdb_python_module == NULL + || ! PyObject_HasAttrString (gdb_python_module, "pretty_printers")) + return gdbpy_ref<>::new_reference (Py_None); + gdbpy_ref<> pp_list (PyObject_GetAttrString (gdb_python_module, + "pretty_printers")); + if (pp_list == NULL || ! PyList_Check (pp_list.get ())) + return gdbpy_ref<>::new_reference (Py_None); + + return search_pp_list (pp_list.get (), value); } /* Find the pretty-printing constructor function for VALUE. If no pretty-printer exists, return None. If one exists, return a new reference. On error, set the Python error and return NULL. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer (PyObject *value) { - PyObject *function; - - /* Look at the pretty-printer dictionary for each objfile + /* Look at the pretty-printer list for each objfile in the current program-space. */ - function = find_pretty_printer_from_objfiles (value); + gdbpy_ref<> function (find_pretty_printer_from_objfiles (value)); if (function == NULL || function != Py_None) return function; - Py_DECREF (function); - /* Look at the pretty-printer dictionary for the current program-space. */ + /* Look at the pretty-printer list for the current program-space. */ function = find_pretty_printer_from_progspace (value); if (function == NULL || function != Py_None) return function; - Py_DECREF (function); - /* Look at the pretty-printer dictionary in the gdb module. */ - function = find_pretty_printer_from_gdb (value); - return function; + /* Look at the pretty-printer list in the gdb module. */ + return find_pretty_printer_from_gdb (value); } /* Pretty-print a single value, via the printer object PRINTER. @@ -196,32 +181,40 @@ find_pretty_printer (PyObject *value) is returned. If the function returns Py_NONE that means the pretty printer returned the Python None as a value. Otherwise, if the function returns a value, *OUT_VALUE is set to the value, and NULL - is returned. On error, *OUT_VALUE is set to NULL, and NULL is - returned. */ + is returned. On error, *OUT_VALUE is set to NULL, NULL is + returned, with a python exception set. */ -static PyObject * +static gdbpy_ref<> pretty_print_one_value (PyObject *printer, struct value **out_value) { - volatile struct gdb_exception except; - PyObject *result = NULL; + gdbpy_ref<> result; *out_value = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL); - if (result) + if (!PyObject_HasAttr (printer, gdbpy_to_string_cst)) + result = gdbpy_ref<>::new_reference (Py_None); + else { - if (! gdbpy_is_string (result) && ! gdbpy_is_lazy_string (result) - && result != Py_None) + result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, + NULL)); + if (result != NULL) { - *out_value = convert_value_from_python (result); - if (PyErr_Occurred ()) - *out_value = NULL; - Py_DECREF (result); - result = NULL; + if (! gdbpy_is_string (result.get ()) + && ! gdbpy_is_lazy_string (result.get ()) + && result != Py_None) + { + *out_value = convert_value_from_python (result.get ()); + if (PyErr_Occurred ()) + *out_value = NULL; + result = NULL; + } } } } + catch (const gdb_exception &except) + { + } return result; } @@ -230,21 +223,24 @@ pretty_print_one_value (PyObject *printer, struct value **out_value) NULL if there is no display_hint method, or if the method did not return a string. On error, print stack trace and return NULL. On success, return an xmalloc()d string. */ -char * +gdb::unique_xmalloc_ptr gdbpy_get_display_hint (PyObject *printer) { - PyObject *hint; - char *result = NULL; + gdb::unique_xmalloc_ptr result; if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst)) return NULL; - hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL); - if (hint) + gdbpy_ref<> hint (PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, + NULL)); + if (hint != NULL) { - if (gdbpy_is_string (hint)) - result = python_string_to_host_string (hint); - Py_DECREF (hint); + if (gdbpy_is_string (hint.get ())) + { + result = python_string_to_host_string (hint.get ()); + if (result == NULL) + gdbpy_print_stack (); + } } else gdbpy_print_stack (); @@ -252,12 +248,30 @@ gdbpy_get_display_hint (PyObject *printer) return result; } -/* Helper for apply_val_pretty_printer which calls to_string and - formats the result. If the value returnd is Py_None, nothing is - printed and the function returns a 1; in all other cases data is - printed as given by the pretty printer and the function returns 0. -*/ -static int +/* A wrapper for gdbpy_print_stack that ignores MemoryError. */ + +static void +print_stack_unless_memory_error (struct ui_file *stream) +{ + if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error)) + { + gdbpy_err_fetch fetched_error; + gdb::unique_xmalloc_ptr msg = fetched_error.to_string (); + + if (msg == NULL || *msg == '\0') + fprintf_filtered (stream, _("")); + else + fprintf_filtered (stream, _(""), + msg.get ()); + } + else + gdbpy_print_stack (); +} + +/* Helper for gdbpy_apply_val_pretty_printer which calls to_string and + formats the result. */ + +static enum string_repr_result print_string_repr (PyObject *printer, const char *hint, struct ui_file *stream, int recurse, const struct value_print_options *options, @@ -265,58 +279,53 @@ print_string_repr (PyObject *printer, const char *hint, struct gdbarch *gdbarch) { struct value *replacement = NULL; - PyObject *py_str = NULL; - int is_py_none = 0; + enum string_repr_result result = string_repr_ok; - py_str = pretty_print_one_value (printer, &replacement); - if (py_str) + gdbpy_ref<> py_str = pretty_print_one_value (printer, &replacement); + if (py_str != NULL) { if (py_str == Py_None) - is_py_none = 1; - else + result = string_repr_none; + else if (gdbpy_is_lazy_string (py_str.get ())) { - gdb_byte *output = NULL; + CORE_ADDR addr; long length; struct type *type; - char *encoding = NULL; - PyObject *string = NULL; - int is_lazy; + gdb::unique_xmalloc_ptr encoding; + struct value_print_options local_opts = *options; - is_lazy = gdbpy_is_lazy_string (py_str); - if (is_lazy) - output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding); - else - { - string = python_string_to_target_python_string (py_str); - if (string) - { - output = PyString_AsString (string); - length = PyString_Size (string); - type = builtin_type (gdbarch)->builtin_char; - } - else - gdbpy_print_stack (); - - } - - if (output) + gdbpy_extract_lazy_string (py_str.get (), &addr, &type, + &length, &encoding); + + local_opts.addressprint = 0; + val_print_string (type, encoding.get (), addr, (int) length, + stream, &local_opts); + } + else + { + gdbpy_ref<> string + = python_string_to_target_python_string (py_str.get ()); + if (string != NULL) { - if (is_lazy || (hint && !strcmp (hint, "string"))) - LA_PRINT_STRING (stream, type, output, length, encoding, - 0, options); + char *output; + long length; + struct type *type; + + output = PyBytes_AS_STRING (string.get ()); + length = PyBytes_GET_SIZE (string.get ()); + type = builtin_type (gdbarch)->builtin_char; + + if (hint && !strcmp (hint, "string")) + LA_PRINT_STRING (stream, type, (gdb_byte *) output, + length, NULL, 0, options); else fputs_filtered (output, stream); } else - gdbpy_print_stack (); - - if (string) - Py_DECREF (string); - else - xfree (output); - - xfree (encoding); - Py_DECREF (py_str); + { + result = string_repr_error; + print_stack_unless_memory_error (stream); + } } } else if (replacement) @@ -327,88 +336,15 @@ print_string_repr (PyObject *printer, const char *hint, common_val_print (replacement, stream, recurse, &opts, language); } else - gdbpy_print_stack (); - - return is_py_none; -} - -static void -py_restore_tstate (void *p) -{ - PyFrameObject *frame = p; - PyThreadState *tstate = PyThreadState_GET (); - - tstate->frame = frame; -} - -/* Create a dummy PyFrameObject, needed to work around - a Python-2.4 bug with generators. */ -static PyObject * -push_dummy_python_frame () -{ - PyObject *empty_string, *null_tuple, *globals; - PyCodeObject *code; - PyFrameObject *frame; - PyThreadState *tstate; - - empty_string = PyString_FromString (""); - if (!empty_string) - return NULL; - - null_tuple = PyTuple_New (0); - if (!null_tuple) - { - Py_DECREF (empty_string); - return NULL; - } - - code = PyCode_New (0, /* argcount */ - 0, /* nlocals */ - 0, /* stacksize */ - 0, /* flags */ - empty_string, /* code */ - null_tuple, /* consts */ - null_tuple, /* names */ - null_tuple, /* varnames */ -#if PYTHON_API_VERSION >= 1010 - null_tuple, /* freevars */ - null_tuple, /* cellvars */ -#endif - empty_string, /* filename */ - empty_string, /* name */ - 1, /* firstlineno */ - empty_string /* lnotab */ - ); - - Py_DECREF (empty_string); - Py_DECREF (null_tuple); - - if (!code) - return NULL; - - globals = PyDict_New (); - if (!globals) { - Py_DECREF (code); - return NULL; + result = string_repr_error; + print_stack_unless_memory_error (stream); } - tstate = PyThreadState_GET (); - - frame = PyFrame_New (tstate, code, globals, NULL); - - Py_DECREF (globals); - Py_DECREF (code); - - if (!frame) - return NULL; - - tstate->frame = frame; - make_cleanup (py_restore_tstate, frame->f_back); - return (PyObject *) frame; + return result; } -/* Helper for apply_val_pretty_printer that formats children of the +/* 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. */ static void @@ -420,8 +356,6 @@ print_children (PyObject *printer, const char *hint, { int is_map, is_array, done_flag, pretty; unsigned int i; - PyObject *children, *iter, *frame; - struct cleanup *cleanups; if (! PyObject_HasAttr (printer, gdbpy_children_cst)) return; @@ -431,64 +365,69 @@ print_children (PyObject *printer, const char *hint, is_map = hint && ! strcmp (hint, "map"); is_array = hint && ! strcmp (hint, "array"); - children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, - NULL); - if (! children) + gdbpy_ref<> children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, + NULL)); + if (children == NULL) { - gdbpy_print_stack (); + print_stack_unless_memory_error (stream); return; } - cleanups = make_cleanup_py_decref (children); - - iter = PyObject_GetIter (children); - if (!iter) + gdbpy_ref<> iter (PyObject_GetIter (children.get ())); + if (iter == NULL) { - gdbpy_print_stack (); - goto done; + print_stack_unless_memory_error (stream); + return; } - make_cleanup_py_decref (iter); - /* Use the prettyprint_arrays option if we are printing an array, + /* Use the prettyformat_arrays option if we are printing an array, and the pretty option otherwise. */ - pretty = is_array ? options->prettyprint_arrays : options->pretty; - - /* 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. */ - frame = push_dummy_python_frame (); - if (!frame) + if (is_array) + pretty = options->prettyformat_arrays; + else { - gdbpy_print_stack (); - goto done; + if (options->prettyformat == Val_prettyformat) + pretty = 1; + else + pretty = options->prettyformat_structs; } - make_cleanup_py_decref (frame); done_flag = 0; for (i = 0; i < options->print_max; ++i) { - PyObject *py_v, *item = PyIter_Next (iter); - char *name; - struct cleanup *inner_cleanup; + PyObject *py_v; + const char *name; - if (! item) + gdbpy_ref<> item (PyIter_Next (iter.get ())); + if (item == NULL) { if (PyErr_Occurred ()) - gdbpy_print_stack (); + print_stack_unless_memory_error (stream); /* Set a flag so we can know whether we printed all the available elements. */ - else + else done_flag = 1; break; } - if (! PyArg_ParseTuple (item, "sO", &name, &py_v)) + if (! PyTuple_Check (item.get ()) || PyTuple_Size (item.get ()) != 2) + { + PyErr_SetString (PyExc_TypeError, + _("Result of children iterator not a tuple" + " of two elements.")); + gdbpy_print_stack (); + continue; + } + if (! PyArg_ParseTuple (item.get (), "sO", &name, &py_v)) { + /* The user won't necessarily get a stack trace here, so provide + more context. */ + if (gdbpy_print_python_errors_p ()) + fprintf_unfiltered (gdb_stderr, + _("Bad result from children iterator.\n")); gdbpy_print_stack (); - Py_DECREF (item); continue; } - inner_cleanup = make_cleanup_py_decref (item); /* Print initial "{". For other elements, there are three cases: @@ -544,31 +483,29 @@ print_children (PyObject *printer, const char *hint, fputs_filtered (" = ", stream); } - if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v)) + if (gdbpy_is_lazy_string (py_v)) { - gdb_byte *output = NULL; + CORE_ADDR addr; + struct type *type; + long length; + gdb::unique_xmalloc_ptr encoding; + struct value_print_options local_opts = *options; - if (gdbpy_is_lazy_string (py_v)) - { - struct type *type; - long length; - char *encoding = NULL; - - output = gdbpy_extract_lazy_string (py_v, &type, - &length, &encoding); - if (!output) - gdbpy_print_stack (); - LA_PRINT_STRING (stream, type, output, length, encoding, - 0, options); - xfree (encoding); - xfree (output); - } + gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding); + + local_opts.addressprint = 0; + val_print_string (type, encoding.get (), addr, (int) length, stream, + &local_opts); + } + else if (gdbpy_is_string (py_v)) + { + gdb::unique_xmalloc_ptr output; + + output = python_string_to_host_string (py_v); + if (!output) + gdbpy_print_stack (); else - { - output = python_string_to_host_string (py_v); - fputs_filtered (output, stream); - xfree (output); - } + fputs_filtered (output.get (), stream); } else { @@ -580,13 +517,21 @@ 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) fputs_filtered ("] = ", stream); - - do_cleanups (inner_cleanup); } if (i) @@ -607,74 +552,70 @@ print_children (PyObject *printer, const char *hint, } fputs_filtered ("}", stream); } - - done: - do_cleanups (cleanups); } -int -apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, - int embedded_offset, CORE_ADDR address, - struct ui_file *stream, int recurse, - const struct value *val, - const struct value_print_options *options, - const struct language_defn *language) +enum ext_lang_rc +gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang, + struct type *type, + LONGEST embedded_offset, CORE_ADDR address, + struct ui_file *stream, int recurse, + struct value *val, + const struct value_print_options *options, + const struct language_defn *language) { struct gdbarch *gdbarch = get_type_arch (type); - PyObject *printer = NULL; - PyObject *val_obj = NULL; struct value *value; - char *hint = NULL; - struct cleanup *cleanups; - int result = 0; - int is_py_none = 0; - cleanups = ensure_python_env (gdbarch, language); + enum string_repr_result print_result; + + if (value_lazy (val)) + value_fetch_lazy (val); + + /* No pretty-printer support for unavailable values. */ + if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type))) + return EXT_LANG_RC_NOP; + + if (!gdb_python_initialized) + return EXT_LANG_RC_NOP; + + gdbpy_enter enter_py (gdbarch, language); /* Instantiate the printer. */ - if (valaddr) - valaddr += embedded_offset; - value = value_from_contents_and_address (type, valaddr, - address + embedded_offset); - if (val != NULL) + value = value_from_component (val, type, embedded_offset); + + gdbpy_ref<> val_obj (value_to_value_object (value)); + if (val_obj == NULL) { - set_value_component_location (value, val); - /* set_value_component_location resets the address, so we may - need to set it again. */ - if (VALUE_LVAL (value) != lval_internalvar - && VALUE_LVAL (value) != lval_internalvar_component - && VALUE_LVAL (value) != lval_computed) - set_value_address (value, address + embedded_offset); + print_stack_unless_memory_error (stream); + return EXT_LANG_RC_ERROR; } - val_obj = value_to_value_object (value); - if (! val_obj) - goto done; - /* Find the constructor. */ - printer = find_pretty_printer (val_obj); - Py_DECREF (val_obj); - make_cleanup_py_decref (printer); - if (! printer || printer == Py_None) - goto done; + gdbpy_ref<> printer (find_pretty_printer (val_obj.get ())); + if (printer == NULL) + { + print_stack_unless_memory_error (stream); + return EXT_LANG_RC_ERROR; + } - /* If we are printing a map, we want some special formatting. */ - hint = gdbpy_get_display_hint (printer); - make_cleanup (free_current_contents, &hint); + if (printer == Py_None) + return EXT_LANG_RC_NOP; - /* Print the section */ - is_py_none = print_string_repr (printer, hint, stream, recurse, - options, language, gdbarch); - print_children (printer, hint, stream, recurse, options, language, - is_py_none); + if (val_print_check_max_depth (stream, recurse, options, language)) + return EXT_LANG_RC_OK; - result = 1; + /* If we are printing a map, we want some special formatting. */ + gdb::unique_xmalloc_ptr hint (gdbpy_get_display_hint (printer.get ())); + /* Print the section */ + print_result = print_string_repr (printer.get (), hint.get (), stream, + recurse, options, language, gdbarch); + if (print_result != string_repr_error) + print_children (printer.get (), hint.get (), stream, recurse, options, + language, print_result == string_repr_none); - done: if (PyErr_Occurred ()) - gdbpy_print_stack (); - do_cleanups (cleanups); - return result; + print_stack_unless_memory_error (stream); + return EXT_LANG_RC_OK; } @@ -687,45 +628,41 @@ apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, set to the replacement value and this function returns NULL. On error, *REPLACEMENT is set to NULL and this function also returns NULL. */ -PyObject * +gdbpy_ref<> apply_varobj_pretty_printer (PyObject *printer_obj, - struct value **replacement) + struct value **replacement, + struct ui_file *stream) { - PyObject *py_str = NULL; - *replacement = NULL; - py_str = pretty_print_one_value (printer_obj, replacement); + gdbpy_ref<> py_str = pretty_print_one_value (printer_obj, replacement); if (*replacement == NULL && py_str == NULL) - gdbpy_print_stack (); + print_stack_unless_memory_error (stream); return py_str; } /* Find a pretty-printer object for the varobj module. Returns a new reference to the object if successful; returns NULL if not. VALUE - is the value for which a printer tests to determine if it + is the value for which a printer tests to determine if it can pretty-print the value. */ -PyObject * +gdbpy_ref<> gdbpy_get_varobj_pretty_printer (struct value *value) { - PyObject *val_obj; - PyObject *pretty_printer = NULL; - volatile struct gdb_exception except; - - TRY_CATCH (except, RETURN_MASK_ALL) + try { value = value_copy (value); } - GDB_PY_HANDLE_EXCEPTION (except); - - val_obj = value_to_value_object (value); - if (! val_obj) + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + gdbpy_ref<> val_obj (value_to_value_object (value)); + if (val_obj == NULL) return NULL; - pretty_printer = find_pretty_printer (val_obj); - Py_DECREF (val_obj); - return pretty_printer; + return find_pretty_printer (val_obj.get ()); } /* A Python function which wraps find_pretty_printer and instantiates @@ -736,7 +673,6 @@ PyObject * gdbpy_default_visualizer (PyObject *self, PyObject *args) { PyObject *val_obj; - PyObject *cons; struct value *value; if (! PyArg_ParseTuple (args, "O", &val_obj)) @@ -744,26 +680,10 @@ gdbpy_default_visualizer (PyObject *self, PyObject *args) value = value_object_to_value (val_obj); if (! value) { - PyErr_SetString (PyExc_TypeError, + PyErr_SetString (PyExc_TypeError, _("Argument must be a gdb.Value.")); return NULL; } - cons = find_pretty_printer (val_obj); - return cons; + return find_pretty_printer (val_obj).release (); } - -#else /* HAVE_PYTHON */ - -int -apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, - int embedded_offset, CORE_ADDR address, - struct ui_file *stream, int recurse, - const struct value *val, - const struct value_print_options *options, - const struct language_defn *language) -{ - return 0; -} - -#endif /* HAVE_PYTHON */