* 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.
This commit is contained in:
Tom Tromey 2013-05-20 20:29:44 +00:00
parent 999633ede7
commit 0646da15da
8 changed files with 169 additions and 76 deletions

View file

@ -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 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. */
/* 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);
char *s = python_string_to_target_string (output);
if (s)
{
char *hint;
if (s)
{
char *hint;
hint = gdbpy_get_display_hint (value_formatter);
if (hint)
{
if (!strcmp (hint, "string"))
string_print = 1;
xfree (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);
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;
}
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;
}
}
}
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]);