123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- #####################################################################
- #
- # These are the Cython pxd files for (most of) the Python/C API.
- #
- # REFERENCE COUNTING:
- #
- # JUST TO SCARE YOU:
- # If you are going to use any of the Python/C API in your Cython
- # program, you might be responsible for doing reference counting.
- # Read http://docs.python.org/api/refcounts.html which is so
- # important I've copied it below.
- #
- # For all the declaration below, whenever the Py_ function returns
- # a *new reference* to a PyObject*, the return type is "object".
- # When the function returns a borrowed reference, the return
- # type is PyObject*. When Cython sees "object" as a return type
- # it doesn't increment the reference count. When it sees PyObject*
- # in order to use the result you must explicitly cast to <object>,
- # and when you do that Cython increments the reference count whether
- # you want it to or not, forcing you to an explicit DECREF (or leak memory).
- # To avoid this we make the above convention. Note, you can
- # always locally override this convention by putting something like
- #
- # cdef extern from "Python.h":
- # PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)
- #
- # in your .pyx file or into a cimported .pxd file. You just have to
- # use the one from the right (pxd-)namespace then.
- #
- # Cython automatically takes care of reference counting for anything
- # of type object.
- #
- ## More precisely, I think the correct convention for
- ## using the Python/C API from Cython is as follows.
- ##
- ## (1) Declare all input arguments as type "object". This way no explicit
- ## <PyObject*> casting is needed, and moreover Cython doesn't generate
- ## any funny reference counting.
- ## (2) Declare output as object if a new reference is returned.
- ## (3) Declare output as PyObject* if a borrowed reference is returned.
- ##
- ## This way when you call objects, no cast is needed, and if the api
- ## calls returns a new reference (which is about 95% of them), then
- ## you can just assign to a variable of type object. With borrowed
- ## references if you do an explicit typecast to <object>, Cython generates an
- ## INCREF and DECREF so you have to be careful. However, you got a
- ## borrowed reference in this case, so there's got to be another reference
- ## to your object, so you're OK, as long as you relealize this
- ## and use the result of an explicit cast to <object> as a borrowed
- ## reference (and you can call Py_INCREF if you want to turn it
- ## into another reference for some reason).
- #
- # "The reference count is important because today's computers have
- # a finite (and often severely limited) memory size; it counts how
- # many different places there are that have a reference to an
- # object. Such a place could be another object, or a global (or
- # static) C variable, or a local variable in some C function. When
- # an object's reference count becomes zero, the object is
- # deallocated. If it contains references to other objects, their
- # reference count is decremented. Those other objects may be
- # deallocated in turn, if this decrement makes their reference
- # count become zero, and so on. (There's an obvious problem with
- # objects that reference each other here; for now, the solution is
- # ``don't do that.'')
- #
- # Reference counts are always manipulated explicitly. The normal
- # way is to use the macro Py_INCREF() to increment an object's
- # reference count by one, and Py_DECREF() to decrement it by
- # one. The Py_DECREF() macro is considerably more complex than the
- # incref one, since it must check whether the reference count
- # becomes zero and then cause the object's deallocator to be
- # called. The deallocator is a function pointer contained in the
- # object's type structure. The type-specific deallocator takes
- # care of decrementing the reference counts for other objects
- # contained in the object if this is a compound object type, such
- # as a list, as well as performing any additional finalization
- # that's needed. There's no chance that the reference count can
- # overflow; at least as many bits are used to hold the reference
- # count as there are distinct memory locations in virtual memory
- # (assuming sizeof(long) >= sizeof(char*)). Thus, the reference
- # count increment is a simple operation.
- #
- # It is not necessary to increment an object's reference count for
- # every local variable that contains a pointer to an object. In
- # theory, the object's reference count goes up by one when the
- # variable is made to point to it and it goes down by one when the
- # variable goes out of scope. However, these two cancel each other
- # out, so at the end the reference count hasn't changed. The only
- # real reason to use the reference count is to prevent the object
- # from being deallocated as long as our variable is pointing to
- # it. If we know that there is at least one other reference to the
- # object that lives at least as long as our variable, there is no
- # need to increment the reference count temporarily. An important
- # situation where this arises is in objects that are passed as
- # arguments to C functions in an extension module that are called
- # from Python; the call mechanism guarantees to hold a reference
- # to every argument for the duration of the call.
- #
- # However, a common pitfall is to extract an object from a list
- # and hold on to it for a while without incrementing its reference
- # count. Some other operation might conceivably remove the object
- # from the list, decrementing its reference count and possible
- # deallocating it. The real danger is that innocent-looking
- # operations may invoke arbitrary Python code which could do this;
- # there is a code path which allows control to flow back to the
- # user from a Py_DECREF(), so almost any operation is potentially
- # dangerous.
- #
- # A safe approach is to always use the generic operations
- # (functions whose name begins with "PyObject_", "PyNumber_",
- # "PySequence_" or "PyMapping_"). These operations always
- # increment the reference count of the object they return. This
- # leaves the caller with the responsibility to call Py_DECREF()
- # when they are done with the result; this soon becomes second
- # nature.
- #
- # Now you should read http://docs.python.org/api/refcountDetails.html
- # just to be sure you understand what is going on.
- #
- #################################################################
- #################################################################
- # BIG FAT DEPRECATION WARNING
- #################################################################
- # Do NOT cimport any names directly from the cpython package,
- # despite of the star-imports below. They will be removed at
- # some point.
- # Instead, use the correct sub-module to draw your cimports from.
- #
- # A direct cimport from the package will make your code depend on
- # all of the existing declarations. This may have side-effects
- # and reduces the portability of your code.
- #################################################################
- # START OF DEPRECATED SECTION
- #################################################################
- from cpython.version cimport *
- from cpython.ref cimport *
- from cpython.exc cimport *
- from cpython.module cimport *
- from cpython.mem cimport *
- from cpython.tuple cimport *
- from cpython.list cimport *
- from cpython.object cimport *
- from cpython.sequence cimport *
- from cpython.mapping cimport *
- from cpython.iterator cimport *
- from cpython.type cimport *
- from cpython.number cimport *
- from cpython.int cimport *
- from cpython.bool cimport *
- from cpython.long cimport *
- from cpython.float cimport *
- from cpython.complex cimport *
- from cpython.string cimport *
- from cpython.unicode cimport *
- from cpython.dict cimport *
- from cpython.instance cimport *
- from cpython.function cimport *
- from cpython.method cimport *
- from cpython.weakref cimport *
- from cpython.getargs cimport *
- from cpython.pythread cimport *
- from cpython.pystate cimport *
- # Python <= 2.x
- from cpython.cobject cimport *
- from cpython.oldbuffer cimport *
- # Python >= 2.4
- from cpython.set cimport *
- # Python >= 2.6
- from cpython.buffer cimport *
- from cpython.bytes cimport *
- # Python >= 3.0
- from cpython.pycapsule cimport *
- #################################################################
- # END OF DEPRECATED SECTION
- #################################################################
|