diff options
author | Tom Tromey <tromey@redhat.com> | 2013-05-20 20:29:44 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2013-05-20 20:29:44 +0000 |
commit | 0646da15da19313ef79611081904ce5e723b0646 (patch) | |
tree | 02c510f44c5af574f09f21e8ea3e0eb5f18bf4dc /gdb/varobj.c | |
parent | 999633ede794b0241c4fde66903f341890037200 (diff) | |
download | gdb-0646da15da19313ef79611081904ce5e723b0646.zip gdb-0646da15da19313ef79611081904ce5e723b0646.tar.gz gdb-0646da15da19313ef79611081904ce5e723b0646.tar.bz2 |
* mi/mi-main.c: Include python-internal.h.
(mi_cmd_list_features): Check gdb_python_initialized.
* python/py-inferior.c (python_on_normal_stop, python_on_resume)
(python_inferior_exit, python_new_objfile, add_thread_object)
(delete_thread_object, py_free_inferior): Check
gdb_python_initialized.
* python/py-prettyprint.c (apply_val_pretty_printer): Check
gdb_python_initialized.
* python/py-type.c (save_objfile_types): Check
gdb_python_initialized.
* python/python-internal.h (gdb_python_initialized): Declare.
* python/python.c (ensure_python_env): Throw exception if
Python not initialized.
(before_prompt_hook, source_python_script_for_objfile)
(start_type_printers, apply_type_printers,
free_type_printers): Check gdb_python_initialized.
* varobj.c (varobj_get_display_hint)
(dynamic_varobj_has_child_method, update_dynamic_varobj_children)
(install_new_value_visualizer, varobj_set_visualizer)
(value_get_print_value): Check gdb_python_initialized.
Diffstat (limited to 'gdb/varobj.c')
-rw-r--r-- | gdb/varobj.c | 182 |
1 files changed, 100 insertions, 82 deletions
diff --git a/gdb/varobj.c b/gdb/varobj.c index 467e59a..70ed28f 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -935,7 +935,12 @@ varobj_get_display_hint (struct varobj *var) char *result = NULL; #if HAVE_PYTHON - struct cleanup *back_to = varobj_ensure_python_env (var); + struct cleanup *back_to; + + if (!gdb_python_initialized) + return NULL; + + back_to = varobj_ensure_python_env (var); if (var->pretty_printer) result = gdbpy_get_display_hint (var->pretty_printer); @@ -1067,6 +1072,9 @@ dynamic_varobj_has_child_method (struct varobj *var) PyObject *printer = var->pretty_printer; int result; + if (!gdb_python_initialized) + return 0; + back_to = varobj_ensure_python_env (var); result = PyObject_HasAttr (printer, gdbpy_children_cst); do_cleanups (back_to); @@ -1092,6 +1100,9 @@ update_dynamic_varobj_children (struct varobj *var, int i; PyObject *printer = var->pretty_printer; + if (!gdb_python_initialized) + return 0; + back_to = varobj_ensure_python_env (var); *cchanged = 0; @@ -1623,6 +1634,9 @@ install_new_value_visualizer (struct varobj *var) #if HAVE_PYTHON /* If the constructor is None, then we want the raw value. If VAR does not have a value, just skip this. */ + if (!gdb_python_initialized) + return; + if (var->constructor != Py_None && var->value) { struct cleanup *cleanup; @@ -1899,6 +1913,9 @@ varobj_set_visualizer (struct varobj *var, const char *visualizer) PyObject *mainmod, *globals, *constructor; struct cleanup *back_to; + if (!gdb_python_initialized) + return; + back_to = varobj_ensure_python_env (var); mainmod = PyImport_AddModule ("__main__"); @@ -2862,92 +2879,93 @@ value_get_print_value (struct value *value, enum varobj_display_formats format, gdbarch = get_type_arch (value_type (value)); #if HAVE_PYTHON - { - PyObject *value_formatter = var->pretty_printer; + if (gdb_python_initialized) + { + PyObject *value_formatter = var->pretty_printer; - varobj_ensure_python_env (var); + varobj_ensure_python_env (var); - if (value_formatter) - { - /* First check to see if we have any children at all. If so, - we simply return {...}. */ - if (dynamic_varobj_has_child_method (var)) - { - do_cleanups (old_chain); - return xstrdup ("{...}"); - } + if (value_formatter) + { + /* First check to see if we have any children at all. If so, + we simply return {...}. */ + if (dynamic_varobj_has_child_method (var)) + { + do_cleanups (old_chain); + return xstrdup ("{...}"); + } - if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst)) - { - struct value *replacement; - PyObject *output = NULL; + if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst)) + { + struct value *replacement; + PyObject *output = NULL; - output = apply_varobj_pretty_printer (value_formatter, - &replacement, - stb); + output = apply_varobj_pretty_printer (value_formatter, + &replacement, + stb); - /* If we have string like output ... */ - if (output) - { - make_cleanup_py_decref (output); - - /* If this is a lazy string, extract it. For lazy - strings we always print as a string, so set - string_print. */ - if (gdbpy_is_lazy_string (output)) - { - gdbpy_extract_lazy_string (output, &str_addr, &type, - &len, &encoding); - make_cleanup (free_current_contents, &encoding); - string_print = 1; - } - else - { - /* If it is a regular (non-lazy) string, extract - it and copy the contents into THEVALUE. If the - hint says to print it as a string, set - string_print. Otherwise just return the extracted - string as a value. */ - - char *s = python_string_to_target_string (output); - - if (s) - { - char *hint; - - hint = gdbpy_get_display_hint (value_formatter); - if (hint) - { - if (!strcmp (hint, "string")) - string_print = 1; - xfree (hint); - } - - len = strlen (s); - thevalue = xmemdup (s, len + 1, len + 1); - type = builtin_type (gdbarch)->builtin_char; - xfree (s); - - if (!string_print) - { - do_cleanups (old_chain); - return thevalue; - } - - make_cleanup (xfree, thevalue); - } - else - gdbpy_print_stack (); - } - } - /* If the printer returned a replacement value, set VALUE - to REPLACEMENT. If there is not a replacement value, - just use the value passed to this function. */ - if (replacement) - value = replacement; - } - } - } + /* If we have string like output ... */ + if (output) + { + make_cleanup_py_decref (output); + + /* If this is a lazy string, extract it. For lazy + strings we always print as a string, so set + string_print. */ + if (gdbpy_is_lazy_string (output)) + { + gdbpy_extract_lazy_string (output, &str_addr, &type, + &len, &encoding); + make_cleanup (free_current_contents, &encoding); + string_print = 1; + } + else + { + /* If it is a regular (non-lazy) string, extract + it and copy the contents into THEVALUE. If the + hint says to print it as a string, set + string_print. Otherwise just return the extracted + string as a value. */ + + char *s = python_string_to_target_string (output); + + if (s) + { + char *hint; + + hint = gdbpy_get_display_hint (value_formatter); + if (hint) + { + if (!strcmp (hint, "string")) + string_print = 1; + xfree (hint); + } + + len = strlen (s); + thevalue = xmemdup (s, len + 1, len + 1); + type = builtin_type (gdbarch)->builtin_char; + xfree (s); + + if (!string_print) + { + do_cleanups (old_chain); + return thevalue; + } + + make_cleanup (xfree, thevalue); + } + else + gdbpy_print_stack (); + } + } + /* If the printer returned a replacement value, set VALUE + to REPLACEMENT. If there is not a replacement value, + just use the value passed to this function. */ + if (replacement) + value = replacement; + } + } + } #endif get_formatted_print_options (&opts, format_code[(int) format]); |