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/python | |
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/python')
-rw-r--r-- | gdb/python/py-inferior.c | 21 | ||||
-rw-r--r-- | gdb/python/py-prettyprint.c | 3 | ||||
-rw-r--r-- | gdb/python/py-type.c | 3 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 2 | ||||
-rw-r--r-- | gdb/python/python.c | 19 |
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); |