]> granicus.if.org Git - python/commit
Issue #29300: Convert _struct module to Argument Clinic
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 2 Feb 2017 11:09:30 +0000 (12:09 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 2 Feb 2017 11:09:30 +0000 (12:09 +0100)
commit3f2d10132d9835b1ebda3283643fbbfdb0851b91
treec510112913f972aac1520a60a487445895fe158f
parentfd6d0d2a18bb487ec06dbbeb1a53d0ac13384cfe
Issue #29300: Convert _struct module to Argument Clinic

* The struct module now requires contiguous buffers.
* Convert most functions and methods of the _struct module to Argument Clinic
* Use "Py_buffer" type for the "buffer" argument. Argument Clinic is
  responsible to create and release the Py_buffer object.
* Use "PyStructObject *" type for self to avoid explicit conversions.
* Add an unit test on the _struct.Struct.unpack_from() method to test passing
  arguments as keywords.
* Rephrase docstrings.
* Rename "fmt" argument to "format" in docstrings and the documentation.

As a side effect, functions and methods which used METH_VARARGS calling
convention like struct.pack() now use the METH_FASTCALL calling convention
which avoids the creation of temporary tuple to pass positional arguments and
so is faster. For example, struct.pack("i", 1) becomes 1.56x faster (-36%)::

    $ ./python -m perf timeit \
        -s 'import struct; pack=struct.pack' 'pack("i", 1)' \
        --compare-to=../default-ref/python
    Median +- std dev: 119 ns +- 1 ns -> 76.8 ns +- 0.4 ns: 1.56x faster (-36%)
    Significant (t=295.91)

Patch co-written with Serhiy Storchaka.
Doc/library/struct.rst
Lib/test/test_struct.py
Modules/_struct.c
Modules/clinic/_struct.c.h [new file with mode: 0644]