* python/py-arch.c (archpy_disassemble): Update.
[deliverable/binutils-gdb.git] / gdb / python / python-internal.h
index ea97226f473395c344dff8117f7a145e6c160e0a..2b4244c01b5553d62e9e071c6da1f7d0eb9b383f 100644 (file)
 #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
+
 #include <stdio.h>
 
 /* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t
@@ -151,14 +184,20 @@ struct inferior;
 
 extern PyObject *gdb_module;
 extern PyObject *gdb_python_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;
+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 breakpoint_object
 {
@@ -249,16 +288,21 @@ 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 *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);
 
@@ -304,6 +348,7 @@ void gdbpy_initialize_new_objfile_event (void);
 void gdbpy_initialize_arch (void);
 
 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);
@@ -313,11 +358,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.  */
@@ -375,7 +423,8 @@ 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);
 
This page took 0.025304 seconds and 4 git commands to generate.