For clarity, change _longobject to build directly from PyObject_VAR_HEAD
instead of faking it by hand.  It *is* a var object, and nothing but
hysterical raisins to pretend it's an oddball.
diff --git a/Include/longintrepr.h b/Include/longintrepr.h
index 89ba586..abf8640 100644
--- a/Include/longintrepr.h
+++ b/Include/longintrepr.h
@@ -36,11 +36,14 @@
    digit) is never zero.  Also, in all cases, for all valid i,
    	0 <= ob_digit[i] <= MASK.
    The allocation function takes care of allocating extra memory
-   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. */
+   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
+
+   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
+   aware that longs abuse  ob_size's sign bit.
+*/
 
 struct _longobject {
-	PyObject_HEAD
-	int ob_size;
+	PyObject_VAR_HEAD
 	digit ob_digit[1];
 };