Index: gdb/python/python-internal.h |
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h |
index bae61c28da821c7541d9ccbab9d977719c320bdd..125670eb97ad6cf6bdcaf8eb49c4998f05fcec2c 100644 |
--- a/gdb/python/python-internal.h |
+++ b/gdb/python/python-internal.h |
@@ -1,6 +1,6 @@ |
/* Gdb/Python header for private use by Python module. |
- Copyright (C) 2008-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2008-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -20,6 +20,46 @@ |
#ifndef GDB_PYTHON_INTERNAL_H |
#define GDB_PYTHON_INTERNAL_H |
+/* These WITH_* macros are defined by the CPython API checker that |
+ comes with the Python plugin for GCC. See: |
+ https://gcc-python-plugin.readthedocs.org/en/latest/cpychecker.html |
+ The checker defines a WITH_ macro for each attribute it |
+ exposes. */ |
+ |
+#ifdef WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE |
+#define CPYCHECKER_RETURNS_BORROWED_REF \ |
+ __attribute__ ((cpychecker_returns_borrowed_ref)) |
+#else |
+#define CPYCHECKER_RETURNS_BORROWED_REF |
+#endif |
+ |
+#ifdef WITH_CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF_ATTRIBUTE |
+#define CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF(ARG) \ |
+ __attribute__ ((cpychecker_type_object_for_typedef (ARG))) |
+#else |
+#define CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF(ARG) |
+#endif |
+ |
+#ifdef WITH_CPYCHECKER_STEALS_REFERENCE_TO_ARG_ATTRIBUTE |
+#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) \ |
+ __attribute__ ((cpychecker_steals_reference_to_arg (n))) |
+#else |
+#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) |
+#endif |
+ |
+#ifdef WITH_CPYCHECKER_SETS_EXCEPTION_ATTRIBUTE |
+#define CPYCHECKER_SETS_EXCEPTION __attribute__ ((cpychecker_sets_exception)) |
+#else |
+#define CPYCHECKER_SETS_EXCEPTION |
+#endif |
+ |
+#ifdef WITH_CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION_ATTRIBUTE |
+#define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION \ |
+ __attribute__ ((cpychecker_negative_result_sets_exception)) |
+#else |
+#define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION |
+#endif |
+ |
#include <stdio.h> |
/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t |
@@ -41,6 +81,11 @@ |
around technique as above. */ |
#undef _FILE_OFFSET_BITS |
+/* A kludge to avoid redefinition of snprintf on Windows by pyerrors.h. */ |
+#if defined(_WIN32) && defined(HAVE_DECL_SNPRINTF) |
+#define HAVE_SNPRINTF 1 |
+#endif |
+ |
/* Request clean size types from Python. */ |
#define PY_SSIZE_T_CLEAN |
@@ -49,6 +94,25 @@ |
from including our python/python.h header file. */ |
#include <Python.h> |
#include <frameobject.h> |
+ |
+#if PY_MAJOR_VERSION >= 3 |
+#define IS_PY3K 1 |
+#endif |
+ |
+#ifdef IS_PY3K |
+#define Py_TPFLAGS_HAVE_ITER 0 |
+#define Py_TPFLAGS_CHECKTYPES 0 |
+ |
+#define PyInt_Check PyLong_Check |
+#define PyInt_FromLong PyLong_FromLong |
+#define PyInt_AsLong PyLong_AsLong |
+ |
+#define PyString_FromString PyUnicode_FromString |
+#define PyString_Decode PyUnicode_Decode |
+#define PyString_FromFormat PyUnicode_FromFormat |
+#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 |
@@ -57,6 +121,18 @@ |
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. */ |
@@ -93,8 +169,23 @@ typedef unsigned long gdb_py_ulongest; |
#endif /* HAVE_LONG_LONG */ |
+/* Python 2.6 did not wrap Py_DECREF in 'do {...} while (0)', leading |
+ to 'suggest explicit braces to avoid ambiguous ‘else’' gcc errors. |
+ Wrap it ourselves, so that callers don't need to care. */ |
+ |
+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); |
+} |
+ |
+#undef Py_DECREF |
+#define Py_DECREF(op) gdb_Py_DECREF (op) |
-/* In order to be able to parse symtab_and_line_to_sal_object function |
+/* In order to be able to parse symtab_and_line_to_sal_object function |
a real symtab_and_line structure is needed. */ |
#include "symtab.h" |
@@ -113,17 +204,26 @@ struct program_space; |
struct bpstats; |
struct inferior; |
+extern int gdb_python_initialized; |
+ |
extern PyObject *gdb_module; |
-extern PyTypeObject value_object_type; |
-extern PyTypeObject block_object_type; |
-extern PyTypeObject symbol_object_type; |
-extern PyTypeObject event_object_type; |
-extern PyTypeObject events_object_type; |
-extern PyTypeObject stop_event_object_type; |
-extern PyTypeObject breakpoint_object_type; |
-extern PyTypeObject frame_object_type; |
- |
-typedef struct breakpoint_object |
+extern PyObject *gdb_python_module; |
+extern PyTypeObject value_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("value_object"); |
+extern PyTypeObject block_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("block_object"); |
+extern PyTypeObject symbol_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symbol_object"); |
+extern PyTypeObject event_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); |
+extern PyTypeObject stop_event_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); |
+extern PyTypeObject breakpoint_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("breakpoint_object"); |
+extern PyTypeObject frame_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("frame_object"); |
+ |
+typedef struct gdbpy_breakpoint_object |
{ |
PyObject_HEAD |
@@ -136,7 +236,7 @@ typedef struct breakpoint_object |
/* 1 is this is a FinishBreakpoint object, 0 otherwise. */ |
int is_finish_bp; |
-} breakpoint_object; |
+} gdbpy_breakpoint_object; |
/* Require that BREAKPOINT be a valid breakpoint ID; throw a Python |
exception if it is invalid. */ |
@@ -163,7 +263,7 @@ typedef struct breakpoint_object |
/* Variables used to pass information between the Breakpoint |
constructor and the breakpoint-created hook function. */ |
-extern breakpoint_object *bppy_pending_object; |
+extern gdbpy_breakpoint_object *bppy_pending_object; |
typedef struct |
@@ -211,15 +311,22 @@ PyObject *block_to_block_object (const struct block *block, |
PyObject *value_to_value_object (struct value *v); |
PyObject *type_to_type_object (struct type *); |
PyObject *frame_info_to_frame_object (struct frame_info *frame); |
- |
-PyObject *pspace_to_pspace_object (struct program_space *); |
+PyObject *symtab_to_linetable_object (PyObject *symtab); |
+PyObject *pspace_to_pspace_object (struct program_space *) |
+ CPYCHECKER_RETURNS_BORROWED_REF; |
PyObject *pspy_get_printers (PyObject *, void *); |
+PyObject *pspy_get_frame_filters (PyObject *, void *); |
-PyObject *objfile_to_objfile_object (struct objfile *); |
+PyObject *objfile_to_objfile_object (struct objfile *) |
+ CPYCHECKER_RETURNS_BORROWED_REF; |
PyObject *objfpy_get_printers (PyObject *, void *); |
+PyObject *objfpy_get_frame_filters (PyObject *, void *); |
+ |
+PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch); |
thread_object *create_thread_object (struct thread_info *tp); |
-thread_object *find_thread_object (ptid_t ptid); |
+thread_object *find_thread_object (ptid_t ptid) |
+ CPYCHECKER_RETURNS_BORROWED_REF; |
PyObject *find_inferior_object (int pid); |
PyObject *inferior_to_inferior_object (struct inferior *inferior); |
@@ -231,37 +338,72 @@ struct type *type_object_to_type (PyObject *obj); |
struct symtab *symtab_object_to_symtab (PyObject *obj); |
struct symtab_and_line *sal_object_to_symtab_and_line (PyObject *obj); |
struct frame_info *frame_object_to_frame_info (PyObject *frame_obj); |
- |
-void gdbpy_initialize_auto_load (void); |
-void gdbpy_initialize_values (void); |
-void gdbpy_initialize_frames (void); |
-void gdbpy_initialize_symtabs (void); |
-void gdbpy_initialize_commands (void); |
-void gdbpy_initialize_symbols (void); |
-void gdbpy_initialize_symtabs (void); |
-void gdbpy_initialize_blocks (void); |
-void gdbpy_initialize_types (void); |
-void gdbpy_initialize_functions (void); |
-void gdbpy_initialize_pspace (void); |
-void gdbpy_initialize_objfile (void); |
-void gdbpy_initialize_breakpoints (void); |
-void gdbpy_initialize_finishbreakpoints (void); |
-void gdbpy_initialize_lazy_string (void); |
-void gdbpy_initialize_parameters (void); |
-void gdbpy_initialize_thread (void); |
-void gdbpy_initialize_inferior (void); |
-void gdbpy_initialize_eventregistry (void); |
-void gdbpy_initialize_event (void); |
-void gdbpy_initialize_py_events (void); |
-void gdbpy_initialize_stop_event (void); |
-void gdbpy_initialize_signal_event (void); |
-void gdbpy_initialize_breakpoint_event (void); |
-void gdbpy_initialize_continue_event (void); |
-void gdbpy_initialize_exited_event (void); |
-void gdbpy_initialize_thread_event (void); |
-void gdbpy_initialize_new_objfile_event (void); |
+struct gdbarch *arch_object_to_gdbarch (PyObject *obj); |
+ |
+void gdbpy_initialize_gdb_readline (void); |
+int gdbpy_initialize_auto_load (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_values (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_frames (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_symtabs (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_commands (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_symbols (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_symtabs (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_blocks (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_types (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_functions (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_pspace (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_objfile (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_breakpoints (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_finishbreakpoints (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_lazy_string (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_linetable (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_parameters (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_thread (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_inferior (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_eventregistry (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_py_events (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_stop_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_signal_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_breakpoint_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_continue_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_exited_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_thread_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_new_objfile_event (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+int gdbpy_initialize_arch (void) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
struct cleanup *make_cleanup_py_decref (PyObject *py); |
+struct cleanup *make_cleanup_py_xdecref (PyObject *py); |
struct cleanup *ensure_python_env (struct gdbarch *gdbarch, |
const struct language_defn *language); |
@@ -271,11 +413,14 @@ extern const struct language_defn *python_language; |
/* Use this after a TRY_EXCEPT to throw the appropriate Python |
exception. */ |
-#define GDB_PY_HANDLE_EXCEPTION(Exception) \ |
- do { \ |
- if (Exception.reason < 0) \ |
- return gdbpy_convert_exception (Exception); \ |
- } while (0) |
+#define GDB_PY_HANDLE_EXCEPTION(Exception) \ |
+ do { \ |
+ if (Exception.reason < 0) \ |
+ { \ |
+ gdbpy_convert_exception (Exception); \ |
+ return NULL; \ |
+ } \ |
+ } while (0) |
/* Use this after a TRY_EXCEPT to throw the appropriate Python |
exception. This macro is for use inside setter functions. */ |
@@ -298,14 +443,13 @@ char *unicode_to_target_string (PyObject *unicode_str); |
char *python_string_to_target_string (PyObject *obj); |
PyObject *python_string_to_target_python_string (PyObject *obj); |
char *python_string_to_host_string (PyObject *obj); |
-PyObject *target_string_to_unicode (const gdb_byte *str, int length); |
int gdbpy_is_string (PyObject *obj); |
char *gdbpy_obj_to_string (PyObject *obj); |
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, |
- struct type **str_type, |
+ struct type **str_type, |
long *length, char **encoding); |
int gdbpy_is_value_object (PyObject *obj); |
@@ -319,8 +463,8 @@ PyObject *gdbpy_get_varobj_pretty_printer (struct value *value); |
char *gdbpy_get_display_hint (PyObject *printer); |
PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); |
-void bpfinishpy_pre_stop_hook (struct breakpoint_object *bp_obj); |
-void bpfinishpy_post_stop_hook (struct breakpoint_object *bp_obj); |
+void bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj); |
+void bpfinishpy_post_stop_hook (struct gdbpy_breakpoint_object *bp_obj); |
extern PyObject *gdbpy_doc_cst; |
extern PyObject *gdbpy_children_cst; |
@@ -334,9 +478,11 @@ extern PyObject *gdbpy_gdb_error; |
extern PyObject *gdbpy_gdb_memory_error; |
extern PyObject *gdbpy_gdberror_exc; |
-extern PyObject *gdbpy_convert_exception (struct gdb_exception); |
+extern void gdbpy_convert_exception (struct gdb_exception) |
+ CPYCHECKER_SETS_EXCEPTION; |
-int get_addr_from_python (PyObject *obj, CORE_ADDR *addr); |
+int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
PyObject *gdb_py_object_from_longest (LONGEST l); |
PyObject *gdb_py_object_from_ulongest (ULONGEST l); |
@@ -344,4 +490,8 @@ int gdb_py_int_as_long (PyObject *, long *); |
PyObject *gdb_py_generic_dict (PyObject *self, void *closure); |
+int gdb_pymodule_addobject (PyObject *module, const char *name, |
+ PyObject *object) |
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; |
+ |
#endif /* GDB_PYTHON_INTERNAL_H */ |