[pypy-commit] cffi default: Kill b_gc().

arigo noreply at buildbot.pypy.org
Sat Jun 23 09:59:38 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r489:6bfd0c5b275f
Date: 2012-06-23 09:13 +0200
http://bitbucket.org/cffi/cffi/changeset/6bfd0c5b275f/

Log:	Kill b_gc().

diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -113,12 +113,6 @@
 } CDataObject_with_length;
 
 typedef struct {
-    CDataObject head;
-    CDataObject *original_object;
-    PyObject *destructor_callback;
-} CDataObject_with_destructor;
-
-typedef struct {
     ffi_cif cif;
     /* the following information is used when doing the call:
        - a buffer of size 'exchange_size' is malloced
@@ -995,27 +989,6 @@
     cdata_dealloc(cd);
 }
 
-static void cdatagc_dealloc(CDataObject_with_destructor *cdd)
-{
-    PyObject *error_type, *error_value, *error_traceback, *res;
-
-    /* Save the current exception, if any. */
-    PyErr_Fetch(&error_type, &error_value, &error_traceback);
-    /* Execute the destructor. */
-    res = PyObject_CallFunctionObjArgs(cdd->destructor_callback,
-                                       cdd->original_object, NULL);
-    if (res == NULL)
-        PyErr_WriteUnraisable(cdd->destructor_callback);
-    else
-        Py_DECREF(res);
-    /* Restore the saved exception. */
-    PyErr_Restore(error_type, error_value, error_traceback);
-
-    Py_DECREF(cdd->destructor_callback);
-    Py_DECREF(cdd->original_object);
-    cdata_dealloc((CDataObject *)cdd);
-}
-
 static int cdata_traverse(CDataObject *cd, visitproc visit, void *arg)
 {
     Py_VISIT(cd->c_type);
@@ -1087,12 +1060,6 @@
     }
 }
 
-static PyObject *cdatagc_repr(CDataObject_with_destructor *cdd)
-{
-    return PyString_FromFormat("<cdata '%s' with destructor>",
-                               cdd->head.c_type->ct_name);
-}
-
 static int cdata_nonzero(CDataObject *cd)
 {
     return cd->c_data != NULL;
@@ -1654,40 +1621,6 @@
     &CData_Type,                                /* tp_base */
 };
 
-static PyTypeObject CDataWithDestructor_Type = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "_ffi_backend.CDataGC",
-    sizeof(CDataObject_with_destructor),
-    0,
-    (destructor)cdatagc_dealloc,                /* tp_dealloc */
-    0,                                          /* tp_print */
-    0,                                          /* tp_getattr */
-    0,                                          /* tp_setattr */
-    0,                                          /* tp_compare */
-    (reprfunc)cdatagc_repr,                     /* tp_repr */
-    0,                                          /* tp_as_number */
-    0,                                          /* tp_as_sequence */
-    0,                                          /* tp_as_mapping */
-    0,                                          /* tp_hash */
-    0,                                          /* tp_call */
-    0,                                          /* tp_str */
-    0,                                          /* tp_getattro */
-    0,                                          /* tp_setattro */
-    0,                                          /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
-    0,                                          /* tp_doc */
-    0,                                          /* tp_traverse */
-    0,                                          /* tp_clear */
-    0,                                          /* tp_richcompare */
-    0,                                          /* tp_weaklistoffset */
-    0,                                          /* tp_iter */
-    0,                                          /* tp_iternext */
-    0,                                          /* tp_methods */
-    0,                                          /* tp_members */
-    0,                                          /* tp_getset */
-    &CData_Type,                                /* tp_base */
-};
-
 /************************************************************/
 
 typedef struct {
@@ -3341,35 +3274,6 @@
     return Py_None;
 }
 
-static PyObject *b_gc(PyObject *self, PyObject *args)
-{
-    CDataObject *cd;
-    PyObject *destructor;
-    CDataObject_with_destructor *cdd;
-
-    if (!PyArg_ParseTuple(args, "O!O:gc", &CData_Type, &cd, &destructor))
-        return NULL;
-    if (!PyCallable_Check(destructor)) {
-        PyErr_Format(PyExc_TypeError,
-                     "arg 2 must be a callable object, not %.200s",
-                     Py_TYPE(destructor)->tp_name);
-        return NULL;
-    }
-
-    cdd = PyObject_New(CDataObject_with_destructor, &CDataWithDestructor_Type);
-    if (cdd == NULL)
-        return NULL;
-
-    cdd->head.c_data = cd->c_data;
-    Py_INCREF(cd->c_type);
-    cdd->head.c_type = cd->c_type;
-    Py_INCREF(destructor);
-    cdd->destructor_callback = destructor;
-    Py_INCREF(cd);
-    cdd->original_object = cd;
-    return (PyObject *)cdd;
-}
-
 /************************************************************/
 
 static char _testfunc0(char a, char b)
@@ -3470,7 +3374,6 @@
     {"buffer", b_buffer, METH_VARARGS},
     {"get_errno", b_get_errno, METH_NOARGS},
     {"set_errno", b_set_errno, METH_VARARGS},
-    {"gc", b_gc, METH_VARARGS},
     {"_testfunc", b__testfunc, METH_VARARGS},
     {NULL,     NULL}	/* Sentinel */
 };
@@ -3624,8 +3527,6 @@
         return;
     if (PyType_Ready(&CDataOwning_Type) < 0)
         return;
-    if (PyType_Ready(&CDataWithDestructor_Type) < 0)
-        return;
     if (PyType_Ready(&CDataIter_Type) < 0)
         return;
 
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -770,16 +770,3 @@
     BStruct = new_struct_type("foo")
     complete_struct_or_union(BStruct, [('a1', BInt, 1)])
     py.test.raises(NotImplementedError, newp, new_pointer_type(BStruct), [-1])
-
-def test_gc():
-    from gc import collect
-    BInt = new_primitive_type("int")
-    n = cast(BInt, 123)
-    py.test.raises(TypeError, gc, n, 5)
-    destroyed = []
-    m = gc(n, destroyed.append)
-    assert repr(m) == "<cdata 'int' with destructor>"
-    assert destroyed == []
-    del m; collect()
-    assert len(destroyed) == 1
-    assert int(destroyed[0]) == 123


More information about the pypy-commit mailing list