aboutsummaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2013-05-20 20:29:44 +0000
committerTom Tromey <tromey@redhat.com>2013-05-20 20:29:44 +0000
commit0646da15da19313ef79611081904ce5e723b0646 (patch)
tree02c510f44c5af574f09f21e8ea3e0eb5f18bf4dc /gdb/python
parent999633ede794b0241c4fde66903f341890037200 (diff)
downloadgdb-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/python')
-rw-r--r--gdb/python/py-inferior.c21
-rw-r--r--gdb/python/py-prettyprint.c3
-rw-r--r--gdb/python/py-type.c3
-rw-r--r--gdb/python/python-internal.h2
-rw-r--r--gdb/python/python.c19
5 files changed, 48 insertions, 0 deletions
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 18ddecd..edbad9e 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -85,6 +85,9 @@ python_on_normal_stop (struct bpstats *bs, int print_frame)
struct cleanup *cleanup;
enum gdb_signal stop_signal;
+ if (!gdb_python_initialized)
+ return;
+
if (!find_thread_ptid (inferior_ptid))
return;
@@ -103,6 +106,9 @@ python_on_resume (ptid_t ptid)
{
struct cleanup *cleanup;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (target_gdbarch (), current_language);
if (emit_continue_event (ptid) < 0)
@@ -117,6 +123,9 @@ python_inferior_exit (struct inferior *inf)
struct cleanup *cleanup;
const LONGEST *exit_code = NULL;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (target_gdbarch (), current_language);
if (inf->has_exit_code)
@@ -139,6 +148,9 @@ python_new_objfile (struct objfile *objfile)
if (objfile == NULL)
return;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
if (emit_new_objfile_event (objfile) < 0)
@@ -231,6 +243,9 @@ add_thread_object (struct thread_info *tp)
inferior_object *inf_obj;
struct threadlist_entry *entry;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (python_gdbarch, python_language);
thread_obj = create_thread_object (tp);
@@ -260,6 +275,9 @@ delete_thread_object (struct thread_info *tp, int ignore)
inferior_object *inf_obj;
struct threadlist_entry **entry, *tmp;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (python_gdbarch, python_language);
inf_obj = (inferior_object *) find_inferior_object (PIDGET(tp->ptid));
@@ -726,6 +744,9 @@ py_free_inferior (struct inferior *inf, void *datum)
inferior_object *inf_obj = datum;
struct threadlist_entry *th_entry, *th_tmp;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (python_gdbarch, python_language);
inf_obj->inferior = NULL;
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index b50e757..aa9476e 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -708,6 +708,9 @@ apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
return 0;
+ if (!gdb_python_initialized)
+ return 0;
+
cleanups = ensure_python_env (gdbarch, language);
/* Instantiate the printer. */
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 05e251b..dd3a751 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -1192,6 +1192,9 @@ save_objfile_types (struct objfile *objfile, void *datum)
htab_t copied_types;
struct cleanup *cleanup;
+ if (!gdb_python_initialized)
+ return;
+
/* This prevents another thread from freeing the objects we're
operating on. */
cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 695bcd3..f434b66 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -189,6 +189,8 @@ struct program_space;
struct bpstats;
struct inferior;
+extern int gdb_python_initialized;
+
extern PyObject *gdb_module;
extern PyObject *gdb_python_module;
extern PyTypeObject value_object_type
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 5b5afcf..e8a70da 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -150,6 +150,10 @@ ensure_python_env (struct gdbarch *gdbarch,
{
struct python_env *env = xmalloc (sizeof *env);
+ /* We should not ever enter Python unless initialized. */
+ if (!gdb_python_initialized)
+ error (_("Python not initialized"));
+
env->state = PyGILState_Ensure ();
env->gdbarch = python_gdbarch;
env->language = python_language;
@@ -896,6 +900,9 @@ before_prompt_hook (const char *current_gdb_prompt)
struct cleanup *cleanup;
char *prompt = NULL;
+ if (!gdb_python_initialized)
+ return;
+
cleanup = ensure_python_env (get_current_arch (), current_language);
if (gdb_python_module
@@ -1159,6 +1166,9 @@ source_python_script_for_objfile (struct objfile *objfile, FILE *file,
{
struct cleanup *cleanups;
+ if (!gdb_python_initialized)
+ return;
+
cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
gdbpy_current_objfile = objfile;
@@ -1220,6 +1230,9 @@ start_type_printers (void)
struct cleanup *cleanups;
PyObject *type_module, *func, *result_obj = NULL;
+ if (!gdb_python_initialized)
+ return NULL;
+
cleanups = ensure_python_env (get_current_arch (), current_language);
type_module = PyImport_ImportModule ("gdb.types");
@@ -1266,6 +1279,9 @@ apply_type_printers (void *printers, struct type *type)
if (printers_obj == NULL)
return NULL;
+ if (!gdb_python_initialized)
+ return NULL;
+
cleanups = ensure_python_env (get_current_arch (), current_language);
type_obj = type_to_type_object (type);
@@ -1324,6 +1340,9 @@ free_type_printers (void *arg)
if (printers == NULL)
return;
+ if (!gdb_python_initialized)
+ return;
+
cleanups = ensure_python_env (get_current_arch (), current_language);
Py_DECREF (printers);
do_cleanups (cleanups);