* top.c: #include "python/python.h".
authorDoug Evans <dje@google.com>
Tue, 2 Nov 2010 16:48:43 +0000 (16:48 +0000)
committerDoug Evans <dje@google.com>
Tue, 2 Nov 2010 16:48:43 +0000 (16:48 +0000)
(gdb_init): Add a comment regarding initialize_all_files.
Call finish_python_initialization at the end.
* python/python.h (finish_python_initialization): Declare.
* python/python.c (finish_python_initialization): New function.
(_initialize_python): Move python-implemented initialization there
and call it.
(GdbMethods): Use #ifdef HAVE_PYTHON for consistency.

gdb/ChangeLog
gdb/python/python.c
gdb/python/python.h
gdb/top.c

index eb5d6d6..197a708 100644 (file)
@@ -1,3 +1,14 @@
+2010-11-02  Doug Evans  <dje@google.com>
+
+       * top.c: #include "python/python.h".
+       (gdb_init): Add a comment regarding initialize_all_files.
+       Call finish_python_initialization at the end.
+       * python/python.h (finish_python_initialization): Declare.
+       * python/python.c (finish_python_initialization): New function.
+       (_initialize_python): Move python-implemented initialization there
+       and call it.
+       (GdbMethods): Use #ifdef HAVE_PYTHON for consistency.
+
 2010-11-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Revert:
index 78410c6..d4f8c3d 100644 (file)
@@ -997,9 +997,26 @@ Enables or disables printing of Python stack traces."),
   gdbpy_doc_cst = PyString_FromString ("__doc__");
   gdbpy_enabled_cst = PyString_FromString ("enabled");
 
-  /* Remaining initialization is done in Python.
-     - create a couple objects which are used for Python's stdout and stderr
-     - provide function GdbSetPythonDirectory  */
+  /* Release the GIL while gdb runs.  */
+  PyThreadState_Swap (NULL);
+  PyEval_ReleaseLock ();
+
+#endif /* HAVE_PYTHON */
+}
+
+#ifdef HAVE_PYTHON
+
+/* Perform the remaining python initializations.
+   These must be done after GDB is at least mostly initialized.
+   E.g., The "info pretty-printer" command needs the "info" prefix
+   command installed.  */
+
+void
+finish_python_initialization (void)
+{
+  struct cleanup *cleanup;
+
+  cleanup = ensure_python_env (get_current_arch (), current_language);
 
   PyRun_SimpleString ("\
 import os\n\
@@ -1055,16 +1072,14 @@ def GdbSetPythonDirectory (dir):\n\
 GdbSetPythonDirectory (gdb.PYTHONDIR)\n\
 ");
 
-  /* Release the GIL while gdb runs.  */
-  PyThreadState_Swap (NULL);
-  PyEval_ReleaseLock ();
+  do_cleanups (cleanup);
+}
 
 #endif /* HAVE_PYTHON */
-}
 
 \f
 
-#if HAVE_PYTHON
+#ifdef HAVE_PYTHON
 
 static PyMethodDef GdbMethods[] =
 {
index affd4a4..04d5c28 100644 (file)
@@ -24,6 +24,8 @@
 
 extern int gdbpy_global_auto_load;
 
+extern void finish_python_initialization (void);
+
 void eval_python_from_control_command (struct command_line *);
 
 void source_python_script (FILE *stream, const char *file);
index 8ddb2c6..6680c38 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -47,6 +47,7 @@
 #include "main.h"
 #include "event-loop.h"
 #include "gdbthread.h"
+#include "python/python.h"
 
 /* readline include files */
 #include "readline/readline.h"
@@ -1657,7 +1658,10 @@ gdb_init (char *argv0)
   init_cmd_lists ();           /* This needs to be done first */
   initialize_targets ();       /* Setup target_terminal macros for utils.c */
   initialize_utils ();         /* Make errors and warnings possible */
+
+  /* Here is where we call all the _initialize_foo routines.  */
   initialize_all_files ();
+
   /* This creates the current_program_space.  Do this after all the
      _initialize_foo routines have had a chance to install their
      per-sspace data keys.  Also do this before
@@ -1684,4 +1688,12 @@ gdb_init (char *argv0)
      deprecated_init_ui_hook.  */
   if (deprecated_init_ui_hook)
     deprecated_init_ui_hook (argv0);
+
+#ifdef HAVE_PYTHON
+  /* Python initialization can require various commands to be installed.
+     For example "info pretty-printer" needs the "info" prefix to be
+     installed.  Keep things simple and just do final python initialization
+     here.  */
+  finish_python_initialization ();
+#endif
 }