diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-10-11 18:31:31 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-10-11 18:31:31 (GMT) |
commit | 9e4ca10ce439845c939a9fa4264146a4cfa87fee (patch) | |
tree | 177a1b1f5fac5e873c72fdd2206b839c3947bab8 /Include | |
parent | f3623f310e92ddb499e020635fe4977aae38a719 (diff) | |
download | cpython-9e4ca10ce439845c939a9fa4264146a4cfa87fee.zip cpython-9e4ca10ce439845c939a9fa4264146a4cfa87fee.tar.gz cpython-9e4ca10ce439845c939a9fa4264146a4cfa87fee.tar.bz2 |
SF bug [#467145] Python 2.2a4 build problem on HPUX 11.0.
The platform requires 8-byte alignment for doubles, but the GC header
was 12 bytes and that threw off the natural alignment of the double
members of a subtype of complex. The fix puts the GC header into a
union with a double as the other member, to force no-looser-than
double alignment of GC headers. On boxes that require 8-byte alignment
for doubles, this may add pad bytes to the GC header accordingly; ditto
for platforms that *prefer* 8-byte alignment for doubles. On platforms
that don't care, it shouldn't change the memory layout (because the
size of the old GC header is certainly greater than the size of a double
on all platforms, so unioning with a double shouldn't change size or
alignment on such boxes).
Diffstat (limited to 'Include')
-rw-r--r-- | Include/objimpl.h | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/Include/objimpl.h b/Include/objimpl.h index db4cb6d..e8aad54 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -266,10 +266,13 @@ extern DL_IMPORT(void) _PyObject_GC_UnTrack(PyObject *); #ifdef WITH_CYCLE_GC /* GC information is stored BEFORE the object structure */ -typedef struct _gc_head { - struct _gc_head *gc_next; /* not NULL if object is tracked */ - struct _gc_head *gc_prev; - int gc_refs; +typedef union _gc_head { + struct { + union _gc_head *gc_next; /* not NULL if object is tracked */ + union _gc_head *gc_prev; + int gc_refs; + } gc; + double dummy; /* force worst-case alignment */ } PyGC_Head; extern PyGC_Head _PyGC_generation0; @@ -278,20 +281,20 @@ extern PyGC_Head _PyGC_generation0; * collector it must be safe to call the ob_traverse method. */ #define _PyObject_GC_TRACK(o) do { \ PyGC_Head *g = (PyGC_Head *)(o)-1; \ - if (g->gc_next != NULL) \ + if (g->gc.gc_next != NULL) \ Py_FatalError("GC object already in linked list"); \ - g->gc_next = &_PyGC_generation0; \ - g->gc_prev = _PyGC_generation0.gc_prev; \ - g->gc_prev->gc_next = g; \ - _PyGC_generation0.gc_prev = g; \ + g->gc.gc_next = &_PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0.gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0.gc.gc_prev = g; \ } while (0); /* Tell the GC to stop tracking this object. */ #define _PyObject_GC_UNTRACK(o) do { \ PyGC_Head *g = (PyGC_Head *)(o)-1; \ - g->gc_prev->gc_next = g->gc_next; \ - g->gc_next->gc_prev = g->gc_prev; \ - g->gc_next = NULL; \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ } while (0); #define PyObject_GC_Track(op) _PyObject_GC_Track((PyObject *)op) |