[Python-Dev] GC head alignment issue
Paul Svensson
paul@svensson.org
Thu, 11 Oct 2001 19:07:08 -0400 (EDT)
On Thu, 11 Oct 2001, Tim Peters wrote:
>[Tim]
>> My head hurts, so I'm not sure this is strictly legit C
>> (drop-in replacement for the current PyGC_Head declaration):
>>
>> /* GC information is stored BEFORE the object structure */
>> typedef union _gc_head {
>> struct {
>> union _gc_head *gc_next; /* not NULL if object is tracked */
>> union _gc_head *gc_prev;
>> int gc_refs;
>> };
>> double dummy; /* force worst-case alignment */
>> } PyGC_Head;
>
>[Guido]
>> Alas, gcc gives me warnings about this:
>>
>> ../Include/objimpl.h:274: warning: unnamed struct/union that
>> defines no instances
>>
>> and references to the fields fail with errors:
>>
>> ../Objects/cellobject.c: In function `PyCell_New':
>> ../Objects/cellobject.c:14: union has no member named `gc_next'
>> [and many more]
>
>Then:
>
> If that's not legit, we could make it legit by naming the struct
> member and interpolating the name into all existing references.
>
>This is straightforward, if a bit tedious ... OK, I did that. Requires
>changes to the track and untrack macros, plus a ton of edits inside
>gcmodule.c. But that's it, and they're all straightforward changes (i.e.,
>low chance of breakage). Should I check it in?
The usual thing to do in this situation would be:
typedef union _gc_head {
struct {
union _gc_head *internal_gc_next;
union _gc_head *internal_gc_prev;
int internal_gc_refs;
} gc_internals;
double dummy; /* force worst-case alignment */
} PyGC_Head;
#define gc_next gc_internals.internal_gc_head
#define gc_next gc_internals.internal_gc_head
#define gc_refs gc_internals.internal_gc_refs
No need to change any other code.
/Paul