if (PyType_IS_GC(type)) {
_PyObject_GC_Link(obj);
}
- memset(obj, '\0', size);
+ // Zero out the object after the PyObject header. The header fields are
+ // initialized by _PyObject_Init[Var]().
+ memset((char *)obj + sizeof(PyObject), 0, size - sizeof(PyObject));
if (type->tp_itemsize == 0) {
_PyObject_Init(obj, type);
PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *tp, size_t extra_size)
{
size_t presize = _PyType_PreHeaderSize(tp);
- PyObject *op = gc_alloc(tp, _PyObject_SIZE(tp) + extra_size, presize);
+ size_t size = _PyObject_SIZE(tp) + extra_size;
+ PyObject *op = gc_alloc(tp, size, presize);
if (op == NULL) {
return NULL;
}
- memset(op, 0, _PyObject_SIZE(tp) + extra_size);
+ memset((char *)op + sizeof(PyObject), 0, size - sizeof(PyObject));
_PyObject_Init(op, tp);
return op;
}
PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *tp, size_t extra_size)
{
size_t presize = _PyType_PreHeaderSize(tp);
- PyObject *op = gc_alloc(tp, _PyObject_SIZE(tp) + extra_size, presize);
+ size_t size = _PyObject_SIZE(tp) + extra_size;
+ PyObject *op = gc_alloc(tp, size, presize);
if (op == NULL) {
return NULL;
}
- memset(op, 0, _PyObject_SIZE(tp) + extra_size);
+ memset((char *)op + sizeof(PyObject), 0, size - sizeof(PyObject));
_PyObject_Init(op, tp);
return op;
}