[pypy-commit] cffi default: Write down a typical ffi.new_handle() usage example
arigo
pypy.commits at gmail.com
Mon Jun 6 08:52:39 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r2712:e2f143d0e9b4
Date: 2016-06-06 14:53 +0200
http://bitbucket.org/cffi/cffi/changeset/e2f143d0e9b4/
Log: Write down a typical ffi.new_handle() usage example
diff --git a/doc/source/ref.rst b/doc/source/ref.rst
--- a/doc/source/ref.rst
+++ b/doc/source/ref.rst
@@ -359,6 +359,8 @@
*Calling ffi.from_handle(p) is invalid and will likely crash if
the cdata object returned by new_handle() is not kept alive!*
+See a `typical usage example`_ below.
+
(In case you are wondering, this ``void *`` is not the ``PyObject *``
pointer. This wouldn't make sense on PyPy anyway.)
@@ -391,6 +393,33 @@
``global_set.discard(p)``, with ``p`` any cdata object whose ``void *``
value compares equal.
+.. _`typical usage example`:
+
+Usage example: suppose you have a C library where you must call a
+``lib.process_document()`` function which invokes some callback. The
+``process_document()`` function receives a pointer to a callback and a
+``void *`` argument. The callback is then invoked with the ``void
+*data`` argument that is equal to the provided value. In this typical
+case, you can implement it like this (out-of-line API mode)::
+
+ class MyDocument:
+ ...
+
+ def process(self):
+ lib.process_document(lib.my_callback, # the callback
+ ffi.new_handle(self), # 'void *data'
+ args...)
+ # 'self' stay alive at least until here, which means that
+ # the ffi.from_handle() done in my_callback() are safe
+
+ def callback(self, arg1, arg2):
+ ...
+
+ # the actual callback is this one-liner global function:
+ @ffi.def_extern
+ def my_callback(arg1, arg2, data):
+ return ffi.from_handle(data).callback(arg1, arg2)
+
.. _ffi-dlopen:
.. _ffi-dlclose:
More information about the pypy-commit
mailing list