Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r2202:2763b22591f2
Date: 2015-07-04 18:19 +0200
http://bitbucket.org/cffi/cffi/changeset/2763b22591f2/

Log:    Issue #115: document the assignments where we store a list or a
        dict.

diff --git a/doc/source/using.rst b/doc/source/using.rst
--- a/doc/source/using.rst
+++ b/doc/source/using.rst
@@ -200,6 +200,25 @@
     p = ffi.new("foo_t *", [5, 3])         # length 3 with 0 in the array
     p = ffi.new("foo_t *", {'y': 3})       # length 3 with 0 everywhere
 
+Finally, note that any Python object used as initializer can also be
+used directly without ``ffi.new()`` in assignments to array items or
+struct fields.  In fact, ``p = ffi.new("T*", initializer)`` is
+equivalent to ``p = ffi.new("T*"); p[0] = initializer``.  Examples:
+
+.. code-block:: python
+
+    # if 'p' is a <cdata 'int[5][5]'>
+    p[2] = [10, 20]             # writes to p[2][0] and p[2][1]
+
+    # if 'p' is a <cdata 'foo_t *'>, and foo_t has fields x, y and z
+    p[0] = {'x': 10, 'z': 20}   # writes to p.x and p.z; p.y unmodified
+
+    # if, on the other hand, foo_t has a field 'char a[5]':
+    p.a = "abc"                 # writes 'a', 'b', 'c' and '\0'; p.a[4] 
unmodified
+
+In function calls, when passing arguments, these rules can be used too;
+see `Function calls`_.
+
 
 Python 3 support
 ----------------
@@ -297,8 +316,8 @@
 You can also pass unicode strings as ``wchar_t *`` arguments.  Note that
 in general, there is no difference between C argument declarations that
 use ``type *`` or ``type[]``.  For example, ``int *`` is fully
-equivalent to ``int[]`` or ``int[5]``.  So you can pass an ``int *`` as
-a list of integers:
+equivalent to ``int[]`` (or even ``int[5]``; the 5 is ignored).  So you
+can pass an ``int *`` as a list of integers:
 
 .. code-block:: python
 
@@ -306,6 +325,10 @@
 
     lib.do_something_with_array([1, 2, 3, 4, 5])
 
+See `Reference: conversions`_ for a similar way to pass ``struct foo_s
+*`` arguments---but in general, it is clearer to simply pass
+``ffi.new('struct foo_s *', initializer)``.
+
 CFFI supports passing and returning structs to functions and callbacks.
 Example:
 
@@ -862,6 +885,8 @@
    function with a ``char *`` argument to which you pass a Python
    string will not actually modify the array of characters passed in,
    and so passes directly a pointer inside the Python string object.
+   (PyPy might in the future do the same, but it is harder because a
+   string object can move in memory when the GC runs.)
 
 `(**)` C function calls are done with the GIL released.
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to