/* Gdb/Python header for private use by Python module.
- Copyright (C) 2008-2018 Free Software Foundation, Inc.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#ifndef GDB_PYTHON_INTERNAL_H
-#define GDB_PYTHON_INTERNAL_H
+#ifndef PYTHON_PYTHON_INTERNAL_H
+#define PYTHON_PYTHON_INTERNAL_H
#include "extension.h"
#include "extension-priv.h"
#define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
#endif
-/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t
- needed by pyport.h. */
/* /usr/include/features.h on linux systems will define _POSIX_C_SOURCE
if it sees _GNU_SOURCE (which config.h will define).
pyconfig.h defines _POSIX_C_SOURCE to a different value than
#define PyString_Check PyUnicode_Check
#endif
-#if HAVE_LIBPYTHON2_4
-/* Py_ssize_t is not defined until 2.5.
- Logical type for Py_ssize_t is Py_intptr_t, but that fails in 64-bit
- compilation due to several apparent mistakes in python2.4 API, so we
- use 'int' instead. */
-typedef int Py_ssize_t;
-#endif
-
-#ifndef PyVarObject_HEAD_INIT
-/* Python 2.4 does not define PyVarObject_HEAD_INIT. */
-#define PyVarObject_HEAD_INIT(type, size) \
- PyObject_HEAD_INIT(type) size,
-
-#endif
-
-#ifndef Py_TYPE
-/* Python 2.4 does not define Py_TYPE. */
-#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
-#endif
-
/* If Python.h does not define WITH_THREAD, then the various
GIL-related functions will not be defined. However,
PyGILState_STATE will be. */
static inline void
gdb_Py_DECREF (void *op) /* ARI: editCase function */
{
- /* ... and Python 2.4 didn't cast OP to PyObject pointer on the
- '(op)->ob_refcnt' references within the macro. Cast it ourselves
- too. */
- Py_DECREF ((PyObject *) op);
+ Py_DECREF (op);
}
#undef Py_DECREF
#define Py_DECREF(op) gdb_Py_DECREF (op)
-/* The second argument to PyObject_GetAttrString was missing the 'const'
- qualifier in Python-2.4. Hence, we wrap it in a function to avoid errors
- when compiled with -Werror. */
-
-static inline PyObject *
-gdb_PyObject_GetAttrString (PyObject *obj,
- const char *attr) /* ARI: editCase function */
-{
- return PyObject_GetAttrString (obj, (char *) attr);
-}
-
-#define PyObject_GetAttrString(obj, attr) gdb_PyObject_GetAttrString (obj, attr)
-
-/* The second argument to PyObject_HasAttrString was also missing the 'const'
- qualifier in Python-2.4. Hence, we wrap it also in a function to avoid
- errors when compiled with -Werror. */
-
-static inline int
-gdb_PyObject_HasAttrString (PyObject *obj,
- const char *attr) /* ARI: editCase function */
-{
- return PyObject_HasAttrString (obj, (char *) attr);
-}
-
-#define PyObject_HasAttrString(obj, attr) gdb_PyObject_HasAttrString (obj, attr)
-
/* PyObject_CallMethod's 'method' and 'format' parameters were missing
the 'const' qualifier before Python 3.4. Hence, we wrap the
function in our own version to avoid errors with string literals.
PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw);
PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args,
PyObject *kw);
+PyObject *gdbpy_lookup_static_symbol (PyObject *self, PyObject *args,
+ PyObject *kw);
+PyObject *gdbpy_lookup_static_symbols (PyObject *self, PyObject *args,
+ PyObject *kw);
PyObject *gdbpy_start_recording (PyObject *self, PyObject *args);
PyObject *gdbpy_current_recording (PyObject *self, PyObject *args);
PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args);
PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch);
-thread_object *create_thread_object (struct thread_info *tp);
+gdbpy_ref<thread_object> create_thread_object (struct thread_info *tp);
gdbpy_ref<> thread_to_thread_object (thread_info *thr);;
-inferior_object *inferior_to_inferior_object (inferior *inf);
+gdbpy_ref<inferior_object> inferior_to_inferior_object (inferior *inf);
const struct block *block_object_to_block (PyObject *obj);
struct symbol *symbol_object_to_symbol (PyObject *obj);
int gdbpy_initialize_unwind (void)
CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
+/* A wrapper for PyErr_Fetch that handles reference counting for the
+ caller. */
+class gdbpy_err_fetch
+{
+public:
+
+ gdbpy_err_fetch ()
+ {
+ PyErr_Fetch (&m_error_type, &m_error_value, &m_error_traceback);
+ }
+
+ ~gdbpy_err_fetch ()
+ {
+ Py_XDECREF (m_error_type);
+ Py_XDECREF (m_error_value);
+ Py_XDECREF (m_error_traceback);
+ }
+
+ /* Call PyErr_Restore using the values stashed in this object.
+ After this call, this object is invalid and neither the to_string
+ nor restore methods may be used again. */
+
+ void restore ()
+ {
+ PyErr_Restore (m_error_type, m_error_value, m_error_traceback);
+ m_error_type = nullptr;
+ m_error_value = nullptr;
+ m_error_traceback = nullptr;
+ }
+
+ /* Return the string representation of the exception represented by
+ this object. If the result is NULL a python error occurred, the
+ caller must clear it. */
+
+ gdb::unique_xmalloc_ptr<char> to_string () const;
+
+ /* Return the string representation of the type of the exception
+ represented by this object. If the result is NULL a python error
+ occurred, the caller must clear it. */
+
+ gdb::unique_xmalloc_ptr<char> type_to_string () const;
+
+ /* Return true if the stored type matches TYPE, false otherwise. */
+
+ bool type_matches (PyObject *type) const
+ {
+ return PyErr_GivenExceptionMatches (m_error_type, type);
+ }
+
+private:
+
+ PyObject *m_error_type, *m_error_value, *m_error_traceback;
+};
+
/* Called before entering the Python interpreter to install the
current language and architecture to be used for Python values.
Also set the active extension language for GDB so that SIGINT's
PyGILState_STATE m_state;
struct gdbarch *m_gdbarch;
const struct language_defn *m_language;
- PyObject *m_error_type, *m_error_value, *m_error_traceback;
+
+ /* An optional is used here because we don't want to call
+ PyErr_Fetch too early. */
+ gdb::optional<gdbpy_err_fetch> m_error;
};
/* Like gdbpy_enter, but takes a varobj. This is a subclass just to
};
+/* The opposite of gdb_enter: this releases the GIL around a region,
+ allowing other Python threads to run. No Python APIs may be used
+ while this is active. */
+class gdbpy_allow_threads
+{
+public:
+
+ gdbpy_allow_threads ()
+ : m_save (PyEval_SaveThread ())
+ {
+ gdb_assert (m_save != nullptr);
+ }
+
+ ~gdbpy_allow_threads ()
+ {
+ PyEval_RestoreThread (m_save);
+ }
+
+ DISABLE_COPY_AND_ASSIGN (gdbpy_allow_threads);
+
+private:
+
+ PyThreadState *m_save;
+};
+
extern struct gdbarch *python_gdbarch;
extern const struct language_defn *python_language;
gdbpy_ref<> host_string_to_python_string (const char *str);
int gdbpy_is_string (PyObject *obj);
gdb::unique_xmalloc_ptr<char> gdbpy_obj_to_string (PyObject *obj);
-gdb::unique_xmalloc_ptr<char> gdbpy_exception_to_string (PyObject *ptype,
- PyObject *pvalue);
int gdbpy_is_lazy_string (PyObject *result);
void gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
extern PyObject *gdbpy_gdb_memory_error;
extern PyObject *gdbpy_gdberror_exc;
-extern void gdbpy_convert_exception (struct gdb_exception)
+extern void gdbpy_convert_exception (const struct gdb_exception &)
CPYCHECKER_SETS_EXCEPTION;
int get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
struct varobj_iter *py_varobj_get_iterator (struct varobj *var,
PyObject *printer);
-#endif /* GDB_PYTHON_INTERNAL_H */
+/* Deleter for Py_buffer unique_ptr specialization. */
+
+struct Py_buffer_deleter
+{
+ void operator() (Py_buffer *b) const
+ {
+ PyBuffer_Release (b);
+ }
+};
+
+/* A unique_ptr specialization for Py_buffer. */
+typedef std::unique_ptr<Py_buffer, Py_buffer_deleter> Py_buffer_up;
+
+#endif /* PYTHON_PYTHON_INTERNAL_H */