PEP 205, Weak References -- initial checkin.
diff --git a/Include/classobject.h b/Include/classobject.h
index 8fde040..06c178f 100644
--- a/Include/classobject.h
+++ b/Include/classobject.h
@@ -24,6 +24,7 @@
     PyObject_HEAD
     PyClassObject *in_class;	/* The class object */
     PyObject	  *in_dict;	/* A dictionary */
+    PyObject	  *in_weakreflist; /* List of weak references */
 } PyInstanceObject;
 
 typedef struct {
diff --git a/Include/object.h b/Include/object.h
index de67505..1eaa900 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -246,8 +246,8 @@
 	/* rich comparisons */
 	richcmpfunc tp_richcompare;
 
-	/* More spares */
-	long tp_xxx8;
+	/* weak reference enabler */
+	long tp_weaklistoffset;
 
 #ifdef COUNT_ALLOCS
 	/* these must be last */
@@ -284,6 +284,8 @@
 extern DL_IMPORT(int) PyNumber_Coerce(PyObject **, PyObject **);
 extern DL_IMPORT(int) PyNumber_CoerceEx(PyObject **, PyObject **);
 
+extern DL_IMPORT(int) (*PyObject_ClearWeakRefs)(PyObject *);
+
 /* Helpers for printing recursive container types */
 extern DL_IMPORT(int) Py_ReprEnter(PyObject *);
 extern DL_IMPORT(void) Py_ReprLeave(PyObject *);
@@ -418,7 +420,7 @@
 
 #define Py_INCREF(op) (_Py_RefTotal++, (op)->ob_refcnt++)
 #define Py_DECREF(op) \
-	if (--_Py_RefTotal, --(op)->ob_refcnt != 0) \
+	if (--_Py_RefTotal, (--((op)->ob_refcnt) != 0)) \
 		; \
 	else \
 		_Py_Dealloc((PyObject *)(op))
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 4909517..93c5b23 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -160,7 +160,11 @@
 /* Macros trading binary compatibility for speed. See also pymem.h.
    Note that these macros expect non-NULL object pointers.*/
 #define PyObject_INIT(op, typeobj) \
-	( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) )
+	((op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), \
+	 (PyType_SUPPORTS_WEAKREFS((typeobj)) \
+	      ? *(PyObject_GET_WEAKREFS_LISTPTR(op)) = NULL \
+              : NULL), \
+         (op))
 #define PyObject_INIT_VAR(op, typeobj, size) \
 	( (op)->ob_size = (size), PyObject_INIT((op), (typeobj)) )
 
@@ -266,6 +270,12 @@
 
 #endif /* WITH_CYCLE_GC */
 
+/* Test if a type supports weak references */
+#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0)
+
+#define PyObject_GET_WEAKREFS_LISTPTR(o) \
+	((PyObject **) (((char *) (o)) + (o)->ob_type->tp_weaklistoffset))
+
 #ifdef __cplusplus
 }
 #endif