This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA/Python] Fix procfs.c build failure on 32bit solaris (_FILE_OFFSET_BITS)
On Tuesday 23 November 2010 15:21:41, Tom Tromey wrote:
> >>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:
> Pedro> Given that we only need to hold a pointer to this, thus the PyObject
> Pedro> need not be complete at this point, can we forward declare PyObject
> Pedro> instead somehow?
>
> Python defines it as a typedef for "struct _object *". Yuck -- I'd
> rather not copy that into our code.
I see that PyObject is an abstract base class, and that this particular
concrete class is struct breakpoint_object ...
> Pedro> If not, can we perhaps come up with a wrapper type that itself
> Pedro> can be forward declared? Or fallback to void* if nothing else
> Pedro> cleaner is possible?
>
> Either of these works for me.
... so we already have a wrapper type we can forward declare.
Here's a patch. We can move the PyObject fallback typedef from defs.h
to varobj.c again. I haven't looked to see if the PyObject pointers
in struct varobj have some other concrete type we could forward
declare instead. Or why don't we #ifdef out those fields if building
without python.
Tested by building gdb with and without --with-python=no.
--
Pedro Alves
2010-11-23 Pedro Alves <pedro@codesourcery.com>
gdb/
* breakpoint.h: No longer include python.h or python-internal.h.
(struct breakpoint_object): Forward declare.
* defs.h (PyObject) [!HAVE_PYTHON]: Don't define.
* varobj.c (PyObject) [!HAVE_PYTHON]: Define.
* python/py-breakpoint.c (build_bp_list): Cast py_bp_object to
PyObject pointer.
(gdbpy_breakpoint_created): Remove casts around py_bp_object
accesses.
---
gdb/breakpoint.h | 8 ++------
gdb/defs.h | 4 ----
gdb/python/py-breakpoint.c | 6 +++---
gdb/varobj.c | 2 ++
4 files changed, 7 insertions(+), 13 deletions(-)
Index: src/gdb/breakpoint.h
===================================================================
--- src.orig/gdb/breakpoint.h 2010-11-11 14:46:24.000000000 +0000
+++ src/gdb/breakpoint.h 2010-11-23 16:07:20.000000000 +0000
@@ -24,13 +24,9 @@
#include "value.h"
#include "vec.h"
-#if HAVE_PYTHON
-#include "python/python.h"
-#include "python/python-internal.h"
-#endif
-
struct value;
struct block;
+struct breakpoint_object;
/* This is the maximum number of bytes a breakpoint instruction can take.
Feel free to increase it. It's just used in a few places to size
@@ -568,7 +564,7 @@ struct breakpoint
This is always NULL for a GDB that is not script enabled. It
can sometimes be NULL for enabled GDBs as not all breakpoint
types are tracked by the Python scripting API. */
- PyObject *py_bp_object;
+ struct breakpoint_object *py_bp_object;
};
typedef struct breakpoint *breakpoint_p;
Index: src/gdb/defs.h
===================================================================
--- src.orig/gdb/defs.h 2010-11-11 14:46:24.000000000 +0000
+++ src/gdb/defs.h 2010-11-23 16:05:28.000000000 +0000
@@ -1240,8 +1240,4 @@ void dummy_obstack_deallocate (void *obj
extern void initialize_progspace (void);
extern void initialize_inferiors (void);
-#ifndef HAVE_PYTHON
-typedef int PyObject;
-#endif
-
#endif /* #ifndef DEFS_H */
Index: src/gdb/python/py-breakpoint.c
===================================================================
--- src.orig/gdb/python/py-breakpoint.c 2010-11-11 14:46:26.000000000 +0000
+++ src/gdb/python/py-breakpoint.c 2010-11-23 16:11:24.000000000 +0000
@@ -636,7 +636,7 @@ static int
build_bp_list (struct breakpoint *b, void *arg)
{
PyObject *list = arg;
- PyObject *bp = b->py_bp_object;
+ PyObject *bp = (PyObject *) b->py_bp_object;
int iserr = 0;
/* Not all breakpoints will have a companion Python object.
@@ -718,7 +718,7 @@ gdbpy_breakpoint_created (int num)
{
newbp->number = num;
newbp->bp = bp;
- newbp->bp->py_bp_object = (PyObject *) newbp;
+ newbp->bp->py_bp_object = newbp;
Py_INCREF (newbp);
++bppy_live;
}
@@ -746,7 +746,7 @@ gdbpy_breakpoint_deleted (int num)
if (! bp)
return;
- bp_obj = ((breakpoint_object *) bp->py_bp_object);
+ bp_obj = bp->py_bp_object;
if (bp_obj)
{
bp_obj->bp = NULL;
Index: src/gdb/varobj.c
===================================================================
--- src.orig/gdb/varobj.c 2010-11-19 16:49:24.000000000 +0000
+++ src/gdb/varobj.c 2010-11-23 16:23:17.000000000 +0000
@@ -39,6 +39,8 @@
#if HAVE_PYTHON
#include "python/python.h"
#include "python/python-internal.h"
+#else
+typedef int PyObject;
#endif
/* Non-zero if we want to see trace of varobj level stuff. */