[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pythoncapi/cpython/pythoncapi/TODO.rst [Back]  [Original]

TODO list for new Python C API
==============================

* Write a tool to automate migration from the old C API to the new C API
* capi_tests: check for reference leaks
* Modify PyObject_INIT(op, type) macro to return op again? use an inlined
  function?
* Do we need ``PySequence_Fast_GetItemRef()``?
* Enhance documentation to document reference counting

Replace Py_TYPE()
=================o

Dealloc::

    Py_TYPE(self)->tp_free((PyObject *)self);

becomes::

    PyTypeObject *type = Py_GetType(self);
    type->tp_free((PyObject *)self);
    Py_DECREF(type);

Size::

    res = _PyObject_SIZE(Py_TYPE(self)) + self->allocated * self->ob_descr->itemsize;

becomes::

    PyTypeObject *type = Py_GetType(self);
    res = _PyObject_SIZE(type) + self->allocated * self->ob_descr->itemsize;
    Py_DECREF(type);

Error::

     PyErr_Format(PyExc_TypeError,
         "first argument must be a type object, not %.200s",
         Py_TYPE(arraytype)->tp_name);

becomes::

     PyErr_Format(PyExc_TypeError,
                  "first argument must be a type object, not %T",
                  arraytype);

Py_BuildValue::

     result = Py_BuildValue(
         "N(CO)O", Py_GetType(self), typecode, list, dict);

becomes::

     result = Py_BuildValue(
         "N(CO)O", Py_GetType(self), typecode, list, dict);


Remove Py_TYPE()?
=================

Error::

     PyErr_Format(PyExc_TypeError,
                  "Struct() argument 1 must be a str or bytes object, "
                  "not %.200s",
                  Py_TYPE(format)->tp_name);

Dealloc::

   static void
   s_dealloc(PyStructObject *s)
   {
       ...
       Py_TYPE(s)->tp_free((PyObject *)s);
   }

Object size::

    Py_ssize_t size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);

Check type::

   #define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType)

Issues
======

Following code becomes invalid::

        (void)PyObject_INIT(im, &PyMethod_Type);
        Py_SIZE(obj) = size;   /* must use _Py_SET_SIZE(obj, size); */
        Py_TYPE(obj) = type;   /* must use _Py_SET_TYPE(obj, type); */

Web Proxy Viewer  |  New URL  |  Original Page