X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/08feed99cbcc75ecdd111f7a10c163b6f99c428f..82fc57fd6b0aff85d86c47b5892f91c04fd58f0f:/gdb/python/python.c diff --git a/gdb/python/python.c b/gdb/python/python.c index d65cca403b..bf3abdbbbe 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -106,10 +106,6 @@ int gdb_python_initialized; extern PyMethodDef python_GdbMethods[]; -#ifdef IS_PY3K -extern struct PyModuleDef python_GdbModuleDef; -#endif - PyObject *gdb_module; PyObject *gdb_python_module; @@ -238,6 +234,30 @@ gdbpy_enter::~gdbpy_enter () PyGILState_Release (m_state); } +/* A helper class to save and restore the GIL, but without touching + the other globals that are handled by gdbpy_enter. */ + +class gdbpy_gil +{ +public: + + gdbpy_gil () + : m_state (PyGILState_Ensure ()) + { + } + + ~gdbpy_gil () + { + PyGILState_Release (m_state); + } + + DISABLE_COPY_AND_ASSIGN (gdbpy_gil); + +private: + + PyGILState_STATE m_state; +}; + /* Set the quit flag. */ static void @@ -251,6 +271,10 @@ gdbpy_set_quit_flag (const struct extension_language_defn *extlang) static int gdbpy_check_quit_flag (const struct extension_language_defn *extlang) { + if (!gdb_python_initialized) + return 0; + + gdbpy_gil gil; return PyOS_InterruptOccurred (); } @@ -352,7 +376,7 @@ python_run_simple_file (FILE *file, const char *filename) if (return_value == nullptr) { /* Use PyErr_PrintEx instead of gdbpy_print_stack to better match the - behavior of the non-Windows codepath. */ + behavior of the non-Windows codepath. */ PyErr_PrintEx(0); } @@ -468,7 +492,7 @@ gdbpy_parameter_value (enum var_types type, void *var) /* Fall through. */ case var_zinteger: case var_zuinteger_unlimited: - return PyLong_FromLong (* (int *) var); + return gdb_py_object_from_longest (* (int *) var).release (); case var_uinteger: { @@ -476,13 +500,13 @@ gdbpy_parameter_value (enum var_types type, void *var) if (val == UINT_MAX) Py_RETURN_NONE; - return PyLong_FromUnsignedLong (val); + return gdb_py_object_from_ulongest (val).release (); } case var_zuinteger: { unsigned int val = * (unsigned int *) var; - return PyLong_FromUnsignedLong (val); + return gdb_py_object_from_ulongest (val).release (); } } @@ -943,30 +967,6 @@ gdbpy_source_script (const struct extension_language_defn *extlang, /* Posting and handling events. */ -/* A helper class to save and restore the GIL, but without touching - the other globals that are handled by gdbpy_enter. */ - -class gdbpy_gil -{ -public: - - gdbpy_gil () - : m_state (PyGILState_Ensure ()) - { - } - - ~gdbpy_gil () - { - PyGILState_Release (m_state); - } - - DISABLE_COPY_AND_ASSIGN (gdbpy_gil); - -private: - - PyGILState_STATE m_state; -}; - /* A single event. */ struct gdbpy_event { @@ -975,7 +975,7 @@ struct gdbpy_event { } - gdbpy_event (gdbpy_event &&other) + gdbpy_event (gdbpy_event &&other) noexcept : m_func (other.m_func) { other.m_func = nullptr; @@ -1204,20 +1204,20 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw) try { switch (stream_type) - { - case 1: - { + { + case 1: + { fprintf_filtered (gdb_stderr, "%s", arg); break; - } - case 2: - { + } + case 2: + { fprintf_filtered (gdb_stdlog, "%s", arg); break; - } - default: - fprintf_filtered (gdb_stdout, "%s", arg); - } + } + default: + fprintf_filtered (gdb_stdout, "%s", arg); + } } catch (const gdb_exception &except) { @@ -1350,19 +1350,17 @@ gdbpy_print_stack_or_quit () static PyObject * gdbpy_progspaces (PyObject *unused1, PyObject *unused2) { - struct program_space *ps; - gdbpy_ref<> list (PyList_New (0)); if (list == NULL) return NULL; - ALL_PSPACES (ps) - { - gdbpy_ref<> item = pspace_to_pspace_object (ps); + for (struct program_space *ps : program_spaces) + { + gdbpy_ref<> item = pspace_to_pspace_object (ps); - if (item == NULL || PyList_Append (list.get (), item.get ()) == -1) - return NULL; - } + if (item == NULL || PyList_Append (list.get (), item.get ()) == -1) + return NULL; + } return list.release (); } @@ -1618,10 +1616,24 @@ finalize_python (void *ignore) Py_Finalize (); + gdb_python_initialized = false; restore_active_ext_lang (previous_active); } #ifdef IS_PY3K +static struct PyModuleDef python_GdbModuleDef = +{ + PyModuleDef_HEAD_INIT, + "_gdb", + NULL, + -1, + python_GdbMethods, + NULL, + NULL, + NULL, + NULL +}; + /* This is called via the PyImport_AppendInittab mechanism called during initialization, to make the built-in _gdb module known to Python. */ @@ -1636,18 +1648,6 @@ init__gdb_module (void) static bool do_start_initialization () { -#ifdef IS_PY3K - size_t progsize, count; - /* Python documentation indicates that the memory given - to Py_SetProgramName cannot be freed. However, it seems that - at least Python 3.7.4 Py_SetProgramName takes a copy of the - given program_name. Making progname_copy static and not release - the memory avoids a leak report for Python versions that duplicate - program_name, and respect the requirement of Py_SetProgramName - for Python versions that do not duplicate program_name. */ - static wchar_t *progname_copy; -#endif - #ifdef WITH_PYTHON_PATH /* Work around problem where python gets confused about where it is, and then can't find its libraries, etc. @@ -1659,11 +1659,20 @@ do_start_initialization () (concat (ldirname (python_libdir.c_str ()).c_str (), SLASH_STRING, "bin", SLASH_STRING, "python", (char *) NULL)); #ifdef IS_PY3K + /* Python documentation indicates that the memory given + to Py_SetProgramName cannot be freed. However, it seems that + at least Python 3.7.4 Py_SetProgramName takes a copy of the + given program_name. Making progname_copy static and not release + the memory avoids a leak report for Python versions that duplicate + program_name, and respect the requirement of Py_SetProgramName + for Python versions that do not duplicate program_name. */ + static wchar_t *progname_copy; + std::string oldloc = setlocale (LC_ALL, NULL); setlocale (LC_ALL, ""); - progsize = strlen (progname.get ()); + size_t progsize = strlen (progname.get ()); progname_copy = XNEWVEC (wchar_t, progsize + 1); - count = mbstowcs (progname_copy, progname.get (), progsize + 1); + size_t count = mbstowcs (progname_copy, progname.get (), progsize + 1); if (count == (size_t) -1) { fprintf (stderr, "Could not convert python path to string\n"); @@ -1756,6 +1765,7 @@ do_start_initialization () || gdbpy_initialize_py_events () < 0 || gdbpy_initialize_event () < 0 || gdbpy_initialize_arch () < 0 + || gdbpy_initialize_registers () < 0 || gdbpy_initialize_xmethods () < 0 || gdbpy_initialize_unwind () < 0 || gdbpy_initialize_tui () < 0) @@ -1787,8 +1797,7 @@ do_start_initialization () return false; /* Release the GIL while gdb runs. */ - PyThreadState_Swap (NULL); - PyEval_ReleaseLock (); + PyEval_SaveThread (); make_final_cleanup (finalize_python, NULL); @@ -1973,12 +1982,6 @@ gdbpy_initialized (const struct extension_language_defn *extlang) return gdb_python_initialized; } -#endif /* HAVE_PYTHON */ - - - -#ifdef HAVE_PYTHON - PyMethodDef python_GdbMethods[] = { { "history", gdbpy_history, METH_VARARGS, @@ -2121,25 +2124,10 @@ Register a TUI window constructor." }, {NULL, NULL, 0, NULL} }; -#ifdef IS_PY3K -struct PyModuleDef python_GdbModuleDef = -{ - PyModuleDef_HEAD_INIT, - "_gdb", - NULL, - -1, - python_GdbMethods, - NULL, - NULL, - NULL, - NULL -}; -#endif - /* Define all the event objects. */ #define GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base) \ PyTypeObject name##_event_object_type \ - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object") \ + CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object") \ = { \ PyVarObject_HEAD_INIT (NULL, 0) \ "gdb." py_name, /* tp_name */ \