Author: Armin Rigo <[email protected]>
Branch:
Changeset: r2824:b6adad5f4ea3
Date: 2016-12-05 10:41 +0100
http://bitbucket.org/cffi/cffi/changeset/b6adad5f4ea3/
Log: Issue #295: use calloc() directly instead of
PyObject_Malloc()+memset() to handle ffi.new() with a default
allocator.
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -1605,6 +1605,13 @@
#endif
}
+static PyObject *
+cdataowning_no_generic_alloc(PyTypeObject *type, Py_ssize_t nitems)
+{
+ PyErr_SetString(PyExc_SystemError, "cdataowning: no generic alloc");
+ return NULL;
+}
+
static void cdataowning_dealloc(CDataObject *cd)
{
assert(!(cd->c_type->ct_flags & (CT_IS_VOID_PTR | CT_FUNCTIONPTR)));
@@ -2867,6 +2874,17 @@
(getiterfunc)cdata_iter, /* tp_iter */
0, /* tp_iternext */
cdata_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+ PyObject_Del, /* tp_free */
};
static PyTypeObject CDataOwning_Type = {
@@ -2901,6 +2919,14 @@
0, /* tp_members */
0, /* tp_getset */
&CData_Type, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ cdataowning_no_generic_alloc, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+ free, /* tp_free */
};
static PyTypeObject CDataOwningGC_Type = {
@@ -2936,6 +2962,14 @@
0, /* tp_members */
0, /* tp_getset */
&CDataOwning_Type, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+ PyObject_GC_Del, /* tp_free */
};
static PyTypeObject CDataGCP_Type = {
@@ -3079,10 +3113,14 @@
/************************************************************/
static CDataObject *allocate_owning_object(Py_ssize_t size,
- CTypeDescrObject *ct)
+ CTypeDescrObject *ct,
+ int dont_clear)
{
CDataObject *cd;
- cd = (CDataObject *)PyObject_Malloc(size);
+ if (dont_clear)
+ cd = malloc(size);
+ else
+ cd = calloc(size, 1);
if (PyObject_Init((PyObject *)cd, &CDataOwning_Type) == NULL)
return NULL;
@@ -3109,7 +3147,7 @@
PyErr_SetString(PyExc_TypeError,
"return type is a struct/union with a varsize array member");
}
- cd = allocate_owning_object(dataoffset + datasize, ct);
+ cd = allocate_owning_object(dataoffset + datasize, ct, /*dont_clear=*/1);
if (cd == NULL)
return NULL;
cd->c_data = ((char *)cd) + dataoffset;
@@ -3147,7 +3185,8 @@
CDataObject *cd;
if (allocator->ca_alloc == NULL) {
- cd = allocate_owning_object(basesize + datasize, ct);
+ cd = allocate_owning_object(basesize + datasize, ct,
+ allocator->ca_dont_clear);
if (cd == NULL)
return NULL;
cd->c_data = ((char *)cd) + basesize;
@@ -3180,9 +3219,9 @@
cd = allocate_gcp_object(cd, ct, allocator->ca_free);
Py_DECREF(res);
- }
- if (!allocator->ca_dont_clear)
- memset(cd->c_data, 0, datasize);
+ if (!allocator->ca_dont_clear)
+ memset(cd->c_data, 0, datasize);
+ }
return cd;
}
@@ -3262,7 +3301,8 @@
if (cds == NULL)
return NULL;
- cd = allocate_owning_object(sizeof(CDataObject_own_structptr), ct);
+ cd = allocate_owning_object(sizeof(CDataObject_own_structptr), ct,
+ /*dont_clear=*/1);
if (cd == NULL) {
Py_DECREF(cds);
return NULL;
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit