Python 2's various object structs use macros to implement common fields at the top of each
struct.
Python 3's objects instead embed a PyObject struct as the first member within the more refined
object structs.
Use the Py_TYPE() macro when accessing ob_type in order to encapsulate this difference.
static void hdr_dealloc(hdrObject * s)
{
if (s->h) headerFree(s->h);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static PyObject * hdr_iternext(hdrObject *s)
rpmTag tagN = rpmdsTagN(s->ds);
rpmsenseFlags Flags = rpmdsFlags(s->ds);
- result = rpmds_Wrap(s->ob_type, rpmdsSingle(tagN, N, EVR, Flags) );
+ result = rpmds_Wrap(Py_TYPE(s), rpmdsSingle(tagN, N, EVR, Flags) );
} else
s->active = 0;
rpmds_dealloc(rpmdsObject * s)
{
s->ds = rpmdsFree(s->ds);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static Py_ssize_t rpmds_length(rpmdsObject * s)
{
PyObject *res = do_close(s);
Py_XDECREF(res);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static PyObject *rpmfd_fileno(rpmfdObject *s)
rpmfi_dealloc(rpmfiObject * s)
{
s->fi = rpmfiFree(s->fi);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static int
static void rpmPubkey_dealloc(rpmPubkeyObject * s)
{
s->pubkey = rpmPubkeyFree(s->pubkey);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static PyObject *rpmPubkey_new(PyTypeObject *subtype,
static void rpmKeyring_dealloc(rpmKeyringObject * s)
{
rpmKeyringFree(s->keyring);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static PyObject *rpmKeyring_new(PyTypeObject *subtype,
{
s->mi = rpmdbFreeIterator(s->mi);
Py_DECREF(s->ref);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static Py_ssize_t rpmmi_length(rpmmiObject * s)
rpmps_dealloc(rpmpsObject * s)
{
s->ps = rpmpsFree(s->ps);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static int
static void rpmtd_dealloc(rpmtdObject * s)
{
rpmtdFreeData(&(s->td));
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static int rpmtd_length(rpmtdObject *s)
s->ts = rpmtsFree(s->ts);
Py_XDECREF(s->scriptFd);
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
static PyObject * rpmts_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
if (s->spec) {
s->spec=freeSpec(s->spec);
}
- s->ob_type->tp_free((PyObject *)s);
+ Py_TYPE(s)->tp_free((PyObject *)s);
}
/* XXX TODO return something sensible if spec exists but component (eg %clean)