summaryrefslogtreecommitdiffstats
path: root/contrib/python/cffi/py3
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python/cffi/py3')
-rw-r--r--contrib/python/cffi/py3/.dist-info/METADATA15
-rw-r--r--contrib/python/cffi/py3/.dist-info/entry_points.txt3
-rw-r--r--contrib/python/cffi/py3/README.md2
-rw-r--r--contrib/python/cffi/py3/c/_cffi_backend.c498
-rw-r--r--contrib/python/cffi/py3/c/call_python.c17
-rw-r--r--contrib/python/cffi/py3/c/cdlopen.c13
-rw-r--r--contrib/python/cffi/py3/c/cffi1_module.c8
-rw-r--r--contrib/python/cffi/py3/c/cglob.c2
-rw-r--r--contrib/python/cffi/py3/c/commontypes.c2
-rw-r--r--contrib/python/cffi/py3/c/ffi_obj.c38
-rw-r--r--contrib/python/cffi/py3/c/file_emulator.h2
-rw-r--r--contrib/python/cffi/py3/c/lib_obj.c26
-rw-r--r--contrib/python/cffi/py3/c/minibuffer.h62
-rw-r--r--contrib/python/cffi/py3/c/misc_thread_common.h10
-rw-r--r--contrib/python/cffi/py3/c/misc_win32.h73
-rw-r--r--contrib/python/cffi/py3/c/realize_c_type.c9
-rw-r--r--contrib/python/cffi/py3/cffi/__init__.py4
-rw-r--r--contrib/python/cffi/py3/cffi/_cffi_errors.h14
-rw-r--r--contrib/python/cffi/py3/cffi/_cffi_gen_src.py216
-rw-r--r--contrib/python/cffi/py3/cffi/_cffi_include.h26
-rw-r--r--contrib/python/cffi/py3/cffi/_embedding.h40
-rw-r--r--contrib/python/cffi/py3/cffi/api.py13
-rw-r--r--contrib/python/cffi/py3/cffi/backend_ctypes.py25
-rw-r--r--contrib/python/cffi/py3/cffi/cffi_opcode.py2
-rw-r--r--contrib/python/cffi/py3/cffi/cparser.py11
-rw-r--r--contrib/python/cffi/py3/cffi/gen_src.py5
-rw-r--r--contrib/python/cffi/py3/cffi/model.py7
-rw-r--r--contrib/python/cffi/py3/cffi/pkgconfig.py2
-rw-r--r--contrib/python/cffi/py3/cffi/recompiler.py52
-rw-r--r--contrib/python/cffi/py3/cffi/setuptools_ext.py10
-rw-r--r--contrib/python/cffi/py3/cffi/vengine_cpy.py43
-rw-r--r--contrib/python/cffi/py3/cffi/vengine_gen.py2
-rw-r--r--contrib/python/cffi/py3/cffi/verifier.py6
-rw-r--r--contrib/python/cffi/py3/patches/01-arcadia.patch14
-rw-r--r--contrib/python/cffi/py3/ya.make4
35 files changed, 484 insertions, 792 deletions
diff --git a/contrib/python/cffi/py3/.dist-info/METADATA b/contrib/python/cffi/py3/.dist-info/METADATA
index 67508e56a53..6f3e2a45b7a 100644
--- a/contrib/python/cffi/py3/.dist-info/METADATA
+++ b/contrib/python/cffi/py3/.dist-info/METADATA
@@ -1,30 +1,29 @@
Metadata-Version: 2.4
Name: cffi
-Version: 2.0.0
+Version: 2.1.0
Summary: Foreign Function Interface for Python calling C code.
Author: Armin Rigo, Maciej Fijalkowski
-Maintainer: Matt Davis, Matt Clay, Matti Picus
-License-Expression: MIT
+Maintainer: Matt Davis, Matt Clay
+License-Expression: MIT-0
Project-URL: Documentation, https://cffi.readthedocs.io/
Project-URL: Changelog, https://cffi.readthedocs.io/en/latest/whatsnew.html
-Project-URL: Downloads, https://github.com/python-cffi/cffi/releases
+Project-URL: Download, https://github.com/python-cffi/cffi/releases
Project-URL: Contact, https://groups.google.com/forum/#!forum/python-cffi
Project-URL: Source Code, https://github.com/python-cffi/cffi
Project-URL: Issue Tracker, https://github.com/python-cffi/cffi/issues
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
+Classifier: Programming Language :: Python :: 3.15
Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
Classifier: Programming Language :: Python :: Implementation :: CPython
-Requires-Python: >=3.9
+Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
-License-File: AUTHORS
Requires-Dist: pycparser; implementation_name != "PyPy"
Dynamic: license-file
@@ -59,7 +58,7 @@ Contact
Testing/development tips
------------------------
-After `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. we call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`:
+After `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. We call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`:
pip install pytest
pip install -e . # editable install of CFFI for local development
diff --git a/contrib/python/cffi/py3/.dist-info/entry_points.txt b/contrib/python/cffi/py3/.dist-info/entry_points.txt
index 4b0274f2333..46bb21b8418 100644
--- a/contrib/python/cffi/py3/.dist-info/entry_points.txt
+++ b/contrib/python/cffi/py3/.dist-info/entry_points.txt
@@ -1,2 +1,5 @@
+[console_scripts]
+cffi-gen-src = cffi._cffi_gen_src:run
+
[distutils.setup_keywords]
cffi_modules = cffi.setuptools_ext:cffi_modules
diff --git a/contrib/python/cffi/py3/README.md b/contrib/python/cffi/py3/README.md
index 723624d743d..fc7a235dc12 100644
--- a/contrib/python/cffi/py3/README.md
+++ b/contrib/python/cffi/py3/README.md
@@ -29,7 +29,7 @@ Contact
Testing/development tips
------------------------
-After `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. we call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`:
+After `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. We call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`:
pip install pytest
pip install -e . # editable install of CFFI for local development
diff --git a/contrib/python/cffi/py3/c/_cffi_backend.c b/contrib/python/cffi/py3/c/_cffi_backend.c
index 2aaccede0d1..74176b5746c 100644
--- a/contrib/python/cffi/py3/c/_cffi_backend.c
+++ b/contrib/python/cffi/py3/c/_cffi_backend.c
@@ -2,7 +2,7 @@
#include <Python.h>
#include "structmember.h"
#include "misc_thread_common.h"
-#define CFFI_VERSION "2.0.0"
+#define CFFI_VERSION "2.1.0"
#ifdef MS_WIN32
#include <windows.h>
@@ -142,69 +142,10 @@
#include "malloc_closure.h"
-#if PY_MAJOR_VERSION >= 3
-# define STR_OR_BYTES "bytes"
-# define PyText_Type PyUnicode_Type
-# define PyText_Check PyUnicode_Check
-# define PyTextAny_Check PyUnicode_Check
-# define PyText_FromFormat PyUnicode_FromFormat
-# define PyText_AsUTF8 PyUnicode_AsUTF8
-# define PyText_AS_UTF8 PyUnicode_AsUTF8
-# if PY_VERSION_HEX >= 0x03030000
-# define PyText_GetSize PyUnicode_GetLength
-# else
-# define PyText_GetSize PyUnicode_GetSize
-# endif
-# define PyText_FromString PyUnicode_FromString
-# define PyText_FromStringAndSize PyUnicode_FromStringAndSize
-# define PyText_InternInPlace PyUnicode_InternInPlace
-# define PyText_InternFromString PyUnicode_InternFromString
-# define PyIntOrLong_Check PyLong_Check
-#else
-# define STR_OR_BYTES "str"
-# define PyText_Type PyString_Type
-# define PyText_Check PyString_Check
-# define PyTextAny_Check(op) (PyString_Check(op) || PyUnicode_Check(op))
-# define PyText_FromFormat PyString_FromFormat
-# define PyText_AsUTF8 PyString_AsString
-# define PyText_AS_UTF8 PyString_AS_STRING
-# define PyText_GetSize PyString_Size
-# define PyText_FromString PyString_FromString
-# define PyText_FromStringAndSize PyString_FromStringAndSize
-# define PyText_InternInPlace PyString_InternInPlace
-# define PyText_InternFromString PyString_InternFromString
-# define PyIntOrLong_Check(op) (PyInt_Check(op) || PyLong_Check(op))
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-# define PyInt_FromSsize_t PyLong_FromSsize_t
-# define PyInt_AsSsize_t PyLong_AsSsize_t
-# define PyInt_AsLong PyLong_AsLong
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-/* This is the default on Python3 and constant has been removed. */
-# define Py_TPFLAGS_CHECKTYPES 0
-#endif
-
-#if PY_MAJOR_VERSION < 3
-# undef PyCapsule_GetPointer
-# undef PyCapsule_New
-# define PyCapsule_GetPointer(capsule, name) \
- (PyCObject_AsVoidPtr(capsule))
-# define PyCapsule_New(pointer, name, destructor) \
- (PyCObject_FromVoidPtr(pointer, destructor))
-#endif
-
#if PY_VERSION_HEX < 0x030900a4
# define Py_SET_REFCNT(obj, val) (Py_REFCNT(obj) = (val))
#endif
-#if PY_VERSION_HEX >= 0x03080000
-# define USE_WRITEUNRAISABLEMSG
-#endif
-
#if PY_VERSION_HEX <= 0x030d00a1
static int PyDict_GetItemRef(PyObject *mp, PyObject *key, PyObject **result)
{
@@ -435,10 +376,7 @@ typedef struct {
#endif
#include "minibuffer.h"
-
-#if PY_MAJOR_VERSION >= 3
-# include "file_emulator.h"
-#endif
+#include "file_emulator.h"
#ifdef PyUnicode_KIND /* Python >= 3.3 */
# include "wchar_helper_3.h"
@@ -512,7 +450,7 @@ ctypedescr_new_on_top(CTypeDescrObject *ct_base, const char *extra_text,
static PyObject *
ctypedescr_repr(CTypeDescrObject *ct)
{
- return PyText_FromFormat("<ctype '%s'>", ct->ct_name);
+ return PyUnicode_FromFormat("<ctype '%s'>", ct->ct_name);
}
static void remove_dead_unique_reference(PyObject *unique_key);
@@ -588,12 +526,12 @@ static PyObject *ctypeget_kind(CTypeDescrObject *ct, void *context)
else
result = "?";
- return PyText_FromString(result);
+ return PyUnicode_FromString(result);
}
static PyObject *ctypeget_cname(CTypeDescrObject *ct, void *context)
{
- return PyText_FromString(ct->ct_name);
+ return PyUnicode_FromString(ct->ct_name);
}
static PyObject *ctypeget_item(CTypeDescrObject *ct, void *context)
@@ -609,7 +547,7 @@ static PyObject *ctypeget_length(CTypeDescrObject *ct, void *context)
{
if (ct->ct_flags & CT_ARRAY) {
if (ct->ct_length >= 0) {
- return PyInt_FromSsize_t(ct->ct_length);
+ return PyLong_FromSsize_t(ct->ct_length);
}
else {
Py_INCREF(Py_None);
@@ -763,7 +701,7 @@ ctypedescr_dir(PyObject *ct, PyObject *noarg)
}
else {
Py_DECREF(x);
- x = PyText_FromString(gsdef->name);
+ x = PyUnicode_FromString(gsdef->name);
err = (x != NULL) ? PyList_Append(res, x) : -1;
Py_XDECREF(x);
if (err < 0) {
@@ -897,12 +835,6 @@ _my_PyLong_AsLongLong(PyObject *ob)
Like PyLong_AsLongLong(), this version accepts a Python int too, and
does conversions from other types of objects. The difference is that
this version refuses floats. */
-#if PY_MAJOR_VERSION < 3
- if (PyInt_Check(ob)) {
- return PyInt_AS_LONG(ob);
- }
- else
-#endif
if (PyLong_Check(ob)) {
return PyLong_AsLongLong(ob);
}
@@ -920,7 +852,7 @@ _my_PyLong_AsLongLong(PyObject *ob)
if (io == NULL)
return -1;
- if (PyIntOrLong_Check(io)) {
+ if (PyLong_Check(io)) {
res = _my_PyLong_AsLongLong(io);
}
else {
@@ -940,15 +872,6 @@ _my_PyLong_AsUnsignedLongLong(PyObject *ob, int strict)
does conversions from other types of objects. If 'strict', complains
with OverflowError and refuses floats. If '!strict', rounds floats
and masks the result. */
-#if PY_MAJOR_VERSION < 3
- if (PyInt_Check(ob)) {
- long value1 = PyInt_AS_LONG(ob);
- if (strict && value1 < 0)
- goto negative;
- return (unsigned PY_LONG_LONG)(PY_LONG_LONG)value1;
- }
- else
-#endif
if (PyLong_Check(ob)) {
if (strict) {
if (_PyLong_Sign(ob) < 0)
@@ -973,7 +896,7 @@ _my_PyLong_AsUnsignedLongLong(PyObject *ob, int strict)
if (io == NULL)
return (unsigned PY_LONG_LONG)-1;
- if (PyIntOrLong_Check(io)) {
+ if (PyLong_Check(io)) {
res = _my_PyLong_AsUnsignedLongLong(io, strict);
}
else {
@@ -1192,7 +1115,7 @@ convert_to_object(char *data, CTypeDescrObject *ct)
/*READ(data, ct->ct_size)*/
value = read_raw_signed_data(data, ct->ct_size);
if (ct->ct_flags & CT_PRIMITIVE_FITS_LONG)
- return PyInt_FromLong((long)value);
+ return PyLong_FromLong((long)value);
else
return PyLong_FromLongLong(value);
}
@@ -1216,7 +1139,7 @@ convert_to_object(char *data, CTypeDescrObject *ct)
Py_INCREF(x);
return x;
}
- return PyInt_FromLong((long)value);
+ return PyLong_FromLong((long)value);
}
else
return PyLong_FromUnsignedLongLong(value);
@@ -1273,7 +1196,7 @@ convert_to_object_bitfield(char *data, CFieldObject *cf)
result = ((PY_LONG_LONG)value) - (PY_LONG_LONG)shiftforsign;
if (ct->ct_flags & CT_PRIMITIVE_FITS_LONG)
- return PyInt_FromLong((long)result);
+ return PyLong_FromLong((long)result);
else
return PyLong_FromLongLong(result);
}
@@ -1285,7 +1208,7 @@ convert_to_object_bitfield(char *data, CFieldObject *cf)
value = (value >> cf->cf_bitshift) & valuemask;
if (ct->ct_flags & CT_PRIMITIVE_FITS_LONG)
- return PyInt_FromLong((long)value);
+ return PyLong_FromLong((long)value);
else
return PyLong_FromUnsignedLongLong(value);
}
@@ -1300,7 +1223,7 @@ static int _convert_overflow(PyObject *init, const char *ct_name)
if (s == NULL)
return -1;
PyErr_Format(PyExc_OverflowError, "integer %s does not fit '%s'",
- PyText_AS_UTF8(s), ct_name);
+ PyUnicode_AsUTF8(s), ct_name);
Py_DECREF(s);
return -1;
}
@@ -1318,7 +1241,7 @@ static int _convert_to_char(PyObject *init)
return *(unsigned char *)data;
}
PyErr_Format(PyExc_TypeError,
- "initializer for ctype 'char' must be a "STR_OR_BYTES
+ "initializer for ctype 'char' must be a bytes"
" of length 1, not %.200s", Py_TYPE(init)->tp_name);
return -1;
}
@@ -1582,13 +1505,13 @@ convert_array_from_object(char *data, CTypeDescrObject *ct, PyObject *init)
char *srcdata;
Py_ssize_t n;
if (!PyBytes_Check(init)) {
- expected = STR_OR_BYTES" or list or tuple";
+ expected = "bytes or list or tuple";
goto cannot_convert;
}
n = PyBytes_GET_SIZE(init);
if (ct->ct_length >= 0 && n > ct->ct_length) {
PyErr_Format(PyExc_IndexError,
- "initializer "STR_OR_BYTES" is too long for '%s' "
+ "initializer bytes is too long for '%s' "
"(got %zd characters)", ct->ct_name, n);
return -1;
}
@@ -1923,9 +1846,9 @@ convert_from_object_bitfield(char *data, CFieldObject *cf, PyObject *init)
PyErr_Format(PyExc_OverflowError,
"value %s outside the range allowed by the "
"bit field width: %s <= x <= %s",
- PyText_AS_UTF8(svalue),
- PyText_AS_UTF8(sfmin),
- PyText_AS_UTF8(sfmax));
+ PyUnicode_AsUTF8(svalue),
+ PyUnicode_AsUTF8(sfmin),
+ PyUnicode_AsUTF8(sfmax));
skip:
Py_XDECREF(svalue);
Py_XDECREF(sfmin);
@@ -2181,9 +2104,9 @@ static PyObject *convert_cdata_to_enum_string(CDataObject *cd, int both)
if (o == NULL)
d_value = NULL;
else {
- d_value = PyText_FromFormat("%s: %s",
- PyText_AS_UTF8(o),
- PyText_AS_UTF8(d_value));
+ d_value = PyUnicode_FromFormat("%s: %s",
+ PyUnicode_AsUTF8(o),
+ PyUnicode_AsUTF8(d_value));
Py_DECREF(o);
}
}
@@ -2211,7 +2134,7 @@ static PyObject *cdata_repr(CDataObject *cd)
/*READ(cd->c_data, sizeof(long double)*/
lvalue = read_raw_longdouble_data(cd->c_data);
sprintf(buffer, "%LE", lvalue);
- s = PyText_FromString(buffer);
+ s = PyUnicode_FromString(buffer);
}
else {
PyObject *o = convert_to_object(cd->c_data, cd->c_type);
@@ -2222,14 +2145,14 @@ static PyObject *cdata_repr(CDataObject *cd)
}
}
else if ((cd->c_type->ct_flags & CT_ARRAY) && cd->c_type->ct_length < 0) {
- s = PyText_FromFormat("sliced length %zd", get_array_length(cd));
+ s = PyUnicode_FromFormat("sliced length %zd", get_array_length(cd));
}
else {
if (cd->c_data != NULL) {
- s = PyText_FromFormat("%p", cd->c_data);
+ s = PyUnicode_FromFormat("%p", cd->c_data);
}
else
- s = PyText_FromString("NULL");
+ s = PyUnicode_FromString("NULL");
}
if (s == NULL)
return NULL;
@@ -2240,9 +2163,9 @@ static PyObject *cdata_repr(CDataObject *cd)
extra = " &";
else
extra = "";
- result = PyText_FromFormat("<cdata '%s%s' %s>",
+ result = PyUnicode_FromFormat("<cdata '%s%s' %s>",
cd->c_type->ct_name, extra,
- PyText_AsUTF8(s));
+ PyUnicode_AsUTF8(s));
Py_DECREF(s);
return result;
}
@@ -2252,8 +2175,8 @@ static PyObject *_cdata_repr2(CDataObject *cd, char *text, PyObject *x)
PyObject *res, *s = PyObject_Repr(x);
if (s == NULL)
return NULL;
- res = PyText_FromFormat("<cdata '%s' %s %s>",
- cd->c_type->ct_name, text, PyText_AsUTF8(s));
+ res = PyUnicode_FromFormat("<cdata '%s' %s %s>",
+ cd->c_type->ct_name, text, PyUnicode_AsUTF8(s));
Py_DECREF(s);
return res;
}
@@ -2280,7 +2203,7 @@ static PyObject *_frombuf_repr(CDataObject *cd, const char *cd_type_name)
Py_buffer *view = ((CDataObject_frombuf *)cd)->bufferview;
const char *obj_tp_name;
if (view->obj == NULL) {
- return PyText_FromFormat(
+ return PyUnicode_FromFormat(
"<cdata '%s' buffer RELEASED>",
cd_type_name);
}
@@ -2289,7 +2212,7 @@ static PyObject *_frombuf_repr(CDataObject *cd, const char *cd_type_name)
if (cd->c_type->ct_flags & CT_ARRAY)
{
Py_ssize_t buflen = get_array_length(cd);
- return PyText_FromFormat(
+ return PyUnicode_FromFormat(
"<cdata '%s' buffer len %zd from '%.200s' object>",
cd_type_name,
buflen,
@@ -2297,7 +2220,7 @@ static PyObject *_frombuf_repr(CDataObject *cd, const char *cd_type_name)
}
else
{
- return PyText_FromFormat(
+ return PyUnicode_FromFormat(
"<cdata '%s' buffer from '%.200s' object>",
cd_type_name,
obj_tp_name);
@@ -2321,7 +2244,7 @@ static Py_ssize_t cdataowning_size_bytes(CDataObject *cd)
static PyObject *cdataowning_repr(CDataObject *cd)
{
Py_ssize_t size = cdataowning_size_bytes(cd);
- return PyText_FromFormat("<cdata '%s' owning %zd bytes>",
+ return PyUnicode_FromFormat("<cdata '%s' owning %zd bytes>",
cd->c_type->ct_name, size);
}
@@ -2378,37 +2301,33 @@ static PyObject *cdata_int(CDataObject *cd)
long value;
/*READ(cd->c_data, cd->c_type->ct_size)*/
value = (long)read_raw_signed_data(cd->c_data, cd->c_type->ct_size);
- return PyInt_FromLong(value);
+ return PyLong_FromLong(value);
}
if (cd->c_type->ct_flags & (CT_PRIMITIVE_SIGNED|CT_PRIMITIVE_UNSIGNED)) {
PyObject *result = convert_to_object(cd->c_data, cd->c_type);
if (result != NULL && PyBool_Check(result))
- result = PyInt_FromLong(PyInt_AsLong(result));
+ result = PyLong_FromLong(PyLong_AsLong(result));
return result;
}
else if (cd->c_type->ct_flags & CT_PRIMITIVE_CHAR) {
/*READ(cd->c_data, cd->c_type->ct_size)*/
switch (cd->c_type->ct_size) {
case sizeof(char):
- return PyInt_FromLong((unsigned char)cd->c_data[0]);
+ return PyLong_FromLong((unsigned char)cd->c_data[0]);
case 2:
- return PyInt_FromLong((long)*(cffi_char16_t *)cd->c_data);
+ return PyLong_FromLong((long)*(cffi_char16_t *)cd->c_data);
case 4:
if (cd->c_type->ct_flags & CT_IS_SIGNED_WCHAR)
- return PyInt_FromLong((long)*(int32_t *)cd->c_data);
+ return PyLong_FromLong((long)*(int32_t *)cd->c_data);
else if (sizeof(long) > 4)
- return PyInt_FromLong(*(uint32_t *)cd->c_data);
+ return PyLong_FromLong(*(uint32_t *)cd->c_data);
else
return PyLong_FromUnsignedLong(*(uint32_t *)cd->c_data);
}
}
else if (cd->c_type->ct_flags & CT_PRIMITIVE_FLOAT) {
PyObject *o = cdata_float(cd);
-#if PY_MAJOR_VERSION < 3
- PyObject *r = o ? PyNumber_Int(o) : NULL;
-#else
PyObject *r = o ? PyNumber_Long(o) : NULL;
-#endif
Py_XDECREF(o);
return r;
}
@@ -2417,19 +2336,6 @@ static PyObject *cdata_int(CDataObject *cd)
return NULL;
}
-#if PY_MAJOR_VERSION < 3
-static PyObject *cdata_long(CDataObject *cd)
-{
- PyObject *res = cdata_int(cd);
- if (res != NULL && PyInt_CheckExact(res)) {
- PyObject *o = PyLong_FromLong(PyInt_AS_LONG(res));
- Py_DECREF(res);
- res = o;
- }
- return res;
-}
-#endif
-
static PyObject *cdata_float(CDataObject *cd)
{
if (cd->c_type->ct_flags & CT_PRIMITIVE_FLOAT) {
@@ -2526,10 +2432,6 @@ static PyObject *cdata_richcompare(PyObject *v, PyObject *w, int op)
return pyres;
}
-#if PY_MAJOR_VERSION < 3
-typedef long Py_hash_t;
-#endif
-
static Py_hash_t cdata_hash(PyObject *v)
{
if (((CDataObject *)v)->c_type->ct_flags & CT_PRIMITIVE_ANY) {
@@ -2618,13 +2520,13 @@ _cdata_getslicearg(CDataObject *cd, PySliceObject *slice, Py_ssize_t bounds[])
Py_ssize_t start, stop;
CTypeDescrObject *ct;
- start = PyInt_AsSsize_t(slice->start);
+ start = PyLong_AsSsize_t(slice->start);
if (start == -1 && PyErr_Occurred()) {
if (slice->start == Py_None)
PyErr_SetString(PyExc_IndexError, "slice start must be specified");
return NULL;
}
- stop = PyInt_AsSsize_t(slice->stop);
+ stop = PyLong_AsSsize_t(slice->stop);
if (stop == -1 && PyErr_Occurred()) {
if (slice->stop == Py_None)
PyErr_SetString(PyExc_IndexError, "slice stop must be specified");
@@ -2706,6 +2608,11 @@ cdata_ass_slice(CDataObject *cd, PySliceObject *slice, PyObject *v)
cdata = cd->c_data + itemsize * bounds[0];
length = bounds[1];
+ if (v == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "'del x[n]' not supported for cdata objects");
+ return -1;
+ }
if (CData_Check(v)) {
CTypeDescrObject *ctv = ((CDataObject *)v)->c_type;
if ((ctv->ct_flags & CT_ARRAY) && (ctv->ct_itemdescr == ct) &&
@@ -2926,11 +2833,7 @@ cdata_sub(PyObject *v, PyObject *w)
}
diff = diff / itemsize;
}
-#if PY_MAJOR_VERSION < 3
- return PyInt_FromSsize_t(diff);
-#else
return PyLong_FromSsize_t(diff);
-#endif
}
return _cdata_add_or_sub(v, w, -1);
@@ -2943,7 +2846,7 @@ _cdata_attr_errmsg(char *errmsg, CDataObject *cd, PyObject *attr)
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return;
PyErr_Clear();
- text = PyText_AsUTF8(attr);
+ text = PyUnicode_AsUTF8(attr);
if (text == NULL)
return;
PyErr_Format(PyExc_AttributeError, errmsg, cd->c_type->ct_name, text);
@@ -3233,11 +3136,7 @@ cdata_call(CDataObject *cd, PyObject *args, PyObject *kwds)
}
PyTuple_SET_ITEM(fvarargs, i, (PyObject *)ct);
}
-#if PY_MAJOR_VERSION < 3
- fabi = PyInt_AS_LONG(PyTuple_GET_ITEM(signature, 0));
-#else
fabi = PyLong_AS_LONG(PyTuple_GET_ITEM(signature, 0));
-#endif
cif_descr = fb_prepare_cif(fvarargs, fresult, nargs_declared, fabi);
if (cif_descr == NULL)
goto error;
@@ -3460,9 +3359,6 @@ static PyNumberMethods CData_as_number = {
(binaryfunc)cdata_add, /*nb_add*/
(binaryfunc)cdata_sub, /*nb_subtract*/
0, /*nb_multiply*/
-#if PY_MAJOR_VERSION < 3
- 0, /*nb_divide*/
-#endif
0, /*nb_remainder*/
0, /*nb_divmod*/
0, /*nb_power*/
@@ -3476,15 +3372,8 @@ static PyNumberMethods CData_as_number = {
0, /*nb_and*/
0, /*nb_xor*/
0, /*nb_or*/
-#if PY_MAJOR_VERSION < 3
- 0, /*nb_coerce*/
-#endif
(unaryfunc)cdata_int, /*nb_int*/
-#if PY_MAJOR_VERSION < 3
- (unaryfunc)cdata_long, /*nb_long*/
-#else
- 0,
-#endif
+ 0, /*nb_reserved*/
(unaryfunc)cdata_float, /*nb_float*/
0, /*nb_oct*/
0, /*nb_hex*/
@@ -3530,7 +3419,7 @@ static PyTypeObject CData_Type = {
(getattrofunc)cdata_getattro, /* tp_getattro */
(setattrofunc)cdata_setattro, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
"The internal base type for CData objects. Use FFI.CData to access "
"it. Always check with isinstance(): subtypes are sometimes returned "
"on CPython, for performance reasons.", /* tp_doc */
@@ -3574,7 +3463,7 @@ static PyTypeObject CDataOwning_Type = {
0, /* inherited */ /* tp_getattro */
0, /* inherited */ /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
"This is an internal subtype of _CDataBase for performance only on "
"CPython. Check with isinstance(x, ffi.CData).", /* tp_doc */
0, /* tp_traverse */
@@ -3617,8 +3506,7 @@ static PyTypeObject CDataOwningGC_Type = {
0, /* inherited */ /* tp_getattro */
0, /* inherited */ /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES /* tp_flags */
- | Py_TPFLAGS_HAVE_GC,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
"This is an internal subtype of _CDataBase for performance only on "
"CPython. Check with isinstance(x, ffi.CData).", /* tp_doc */
(traverseproc)cdataowninggc_traverse, /* tp_traverse */
@@ -3661,8 +3549,7 @@ static PyTypeObject CDataFromBuf_Type = {
0, /* inherited */ /* tp_getattro */
0, /* inherited */ /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES /* tp_flags */
- | Py_TPFLAGS_HAVE_GC,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
"This is an internal subtype of _CDataBase for performance only on "
"CPython. Check with isinstance(x, ffi.CData).", /* tp_doc */
(traverseproc)cdatafrombuf_traverse, /* tp_traverse */
@@ -3705,7 +3592,7 @@ static PyTypeObject CDataGCP_Type = {
0, /* inherited */ /* tp_getattro */
0, /* inherited */ /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES /* tp_flags */
+ Py_TPFLAGS_DEFAULT /* tp_flags */
#ifdef Py_TPFLAGS_HAVE_FINALIZE
| Py_TPFLAGS_HAVE_FINALIZE
#endif
@@ -4072,12 +3959,6 @@ _my_PyObject_AsBool(PyObject *ob)
PyNumberMethods *nb;
int res;
-#if PY_MAJOR_VERSION < 3
- if (PyInt_Check(ob)) {
- return PyInt_AS_LONG(ob) != 0;
- }
- else
-#endif
if (PyLong_Check(ob)) {
return _PyLong_Sign(ob) != 0;
}
@@ -4111,7 +3992,7 @@ _my_PyObject_AsBool(PyObject *ob)
if (io == NULL)
return -1;
- if (PyIntOrLong_Check(io) || PyFloat_Check(io)) {
+ if (PyLong_Check(io) || PyFloat_Check(io)) {
res = _my_PyObject_AsBool(io);
}
else {
@@ -4145,17 +4026,6 @@ static CDataObject *cast_to_integer_or_char(CTypeDescrObject *ct, PyObject *ob)
(CT_POINTER|CT_FUNCTIONPTR|CT_ARRAY)) {
value = (Py_intptr_t)((CDataObject *)ob)->c_data;
}
-#if PY_MAJOR_VERSION < 3
- else if (PyString_Check(ob)) {
- if (PyString_GET_SIZE(ob) != 1) {
- PyErr_Format(PyExc_TypeError,
- "cannot cast string of length %zd to ctype '%s'",
- PyString_GET_SIZE(ob), ct->ct_name);
- return NULL;
- }
- value = (unsigned char)PyString_AS_STRING(ob)[0];
- }
-#endif
else if (PyUnicode_Check(ob)) {
char err_buf[80];
cffi_char32_t ordinal;
@@ -4421,7 +4291,7 @@ static void dl_dealloc(DynLibObject *dlobj)
static PyObject *dl_repr(DynLibObject *dlobj)
{
- return PyText_FromFormat("<clibrary '%s'>", dlobj->dl_name);
+ return PyUnicode_FromFormat("<clibrary '%s'>", dlobj->dl_name);
}
static int dl_check_closed(DynLibObject *dlobj)
@@ -4616,8 +4486,8 @@ static void *b_do_dlopen(PyObject *args, const char **p_printable_filename,
PyErr_Format(PyExc_RuntimeError, "cannot call dlopen(NULL)");
return NULL;
}
- *p_temp = PyText_FromFormat("%p", handle);
- *p_printable_filename = PyText_AsUTF8(*p_temp);
+ *p_temp = PyUnicode_FromFormat("%p", handle);
+ *p_printable_filename = PyUnicode_AsUTF8(*p_temp);
*auto_close = 0;
return handle;
}
@@ -4630,17 +4500,11 @@ static void *b_do_dlopen(PyObject *args, const char **p_printable_filename,
{
Py_ssize_t sz1;
wchar_t *w1;
-#if PY_MAJOR_VERSION < 3
- s = PyUnicode_AsUTF8String(s);
- if (s == NULL)
- return NULL;
- *p_temp = s;
-#endif
- *p_printable_filename = PyText_AsUTF8(s);
+ *p_printable_filename = PyUnicode_AsUTF8(s);
if (*p_printable_filename == NULL)
return NULL;
- sz1 = PyText_GetSize(filename_unicode) + 1;
+ sz1 = PyUnicode_GetLength(filename_unicode) + 1;
sz1 *= 2; /* should not be needed, but you never know */
w1 = alloca(sizeof(wchar_t) * sz1);
sz1 = PyUnicode_AsWideChar(filename_unicode,
@@ -4656,18 +4520,7 @@ static void *b_do_dlopen(PyObject *args, const char **p_printable_filename,
if (!PyArg_ParseTuple(args, "et|i:load_library",
Py_FileSystemDefaultEncoding, &filename_or_null, &flags))
return NULL;
-#if PY_MAJOR_VERSION < 3
- if (PyUnicode_Check(s))
- {
- s = PyUnicode_AsUTF8String(s);
- if (s == NULL) {
- PyMem_Free(filename_or_null);
- return NULL;
- }
- *p_temp = s;
- }
-#endif
- *p_printable_filename = PyText_AsUTF8(s);
+ *p_printable_filename = PyUnicode_AsUTF8(s);
if (*p_printable_filename == NULL) {
PyMem_Free(filename_or_null);
return NULL;
@@ -5206,7 +5059,7 @@ _add_field(PyObject *interned_fields, PyObject *fname, CTypeDescrObject *ftype,
cf->cf_flags = flags;
Py_INCREF(fname);
- PyText_InternInPlace(&fname);
+ PyUnicode_InternInPlace(&fname);
prev_size = PyDict_Size(interned_fields);
err = PyDict_SetItem(interned_fields, fname, (PyObject *)cf);
Py_DECREF(fname);
@@ -5216,7 +5069,7 @@ _add_field(PyObject *interned_fields, PyObject *fname, CTypeDescrObject *ftype,
if (PyDict_Size(interned_fields) != prev_size + 1) {
PyErr_Format(PyExc_KeyError, "duplicate field name '%s'",
- PyText_AS_UTF8(fname));
+ PyUnicode_AsUTF8(fname));
return NULL;
}
return cf; /* borrowed reference */
@@ -5303,7 +5156,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
Py_ssize_t byteoffsetorg;
CFieldObject **previous;
int prev_bitfield_size, prev_bitfield_free;
- PyObject *interned_fields;
+ PyObject *interned_fields = NULL;
sflags = complete_sflags(sflags);
if (sflags & SF_PACKED)
@@ -5344,7 +5197,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
Py_ssize_t foffset = -1;
if (!PyArg_ParseTuple(PyList_GET_ITEM(fields, i), "O!O!|in:list item",
- &PyText_Type, &fname,
+ &PyUnicode_Type, &fname,
&CTypeDescr_Type, &ftype,
&fbitsize, &foffset))
goto finally;
@@ -5365,7 +5218,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
else {
PyErr_Format(PyExc_TypeError,
"field '%s.%s' has ctype '%s' of unknown size",
- ct->ct_name, PyText_AS_UTF8(fname),
+ ct->ct_name, PyUnicode_AsUTF8(fname),
ftype->ct_name);
goto finally;
}
@@ -5396,7 +5249,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
if (!(sflags & SF_GCC_ARM_BITFIELDS) && fbitsize >= 0) {
if (!(sflags & SF_MSVC_BITFIELDS)) {
/* GCC: anonymous bitfields (of any size) don't cause alignment */
- do_align = PyText_GetSize(fname) > 0;
+ do_align = PyUnicode_GetLength(fname) > 0;
}
else {
/* MSVC: zero-sized bitfields don't cause alignment */
@@ -5435,12 +5288,12 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
except to know if we must set CT_CUSTOM_FIELD_POS */
if (detect_custom_layout(ct, sflags, byteoffset, foffset,
"wrong offset for field '",
- PyText_AS_UTF8(fname), "'") < 0)
+ PyUnicode_AsUTF8(fname), "'") < 0)
goto finally;
byteoffset = foffset;
}
- if (PyText_GetSize(fname) == 0 &&
+ if (PyUnicode_GetLength(fname) == 0 &&
ftype->ct_flags & (CT_STRUCT|CT_UNION)) {
/* a nested anonymous struct or union */
CFieldObject *cfsrc = (CFieldObject *)ftype->ct_extra;
@@ -5482,7 +5335,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
PyErr_Format(PyExc_TypeError,
"field '%s.%s' is a bitfield, "
"but a fixed offset is specified",
- ct->ct_name, PyText_AS_UTF8(fname));
+ ct->ct_name, PyUnicode_AsUTF8(fname));
goto finally;
}
@@ -5491,7 +5344,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
CT_PRIMITIVE_CHAR))) {
PyErr_Format(PyExc_TypeError,
"field '%s.%s' declared as '%s' cannot be a bit field",
- ct->ct_name, PyText_AS_UTF8(fname),
+ ct->ct_name, PyUnicode_AsUTF8(fname),
ftype->ct_name);
goto finally;
}
@@ -5499,7 +5352,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
PyErr_Format(PyExc_TypeError,
"bit field '%s.%s' is declared '%s:%d', which "
"exceeds the width of the type",
- ct->ct_name, PyText_AS_UTF8(fname),
+ ct->ct_name, PyUnicode_AsUTF8(fname),
ftype->ct_name, fbitsize);
goto finally;
}
@@ -5511,10 +5364,10 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
field_offset_bytes &= ~(falign - 1);
if (fbitsize == 0) {
- if (PyText_GetSize(fname) > 0) {
+ if (PyUnicode_GetLength(fname) > 0) {
PyErr_Format(PyExc_TypeError,
"field '%s.%s' is declared with :0",
- ct->ct_name, PyText_AS_UTF8(fname));
+ ct->ct_name, PyUnicode_AsUTF8(fname));
goto finally;
}
if (!(sflags & SF_MSVC_BITFIELDS)) {
@@ -5554,7 +5407,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
PyErr_Format(PyExc_NotImplementedError,
"with 'packed', gcc would compile field "
"'%s.%s' to reuse some bits in the previous "
- "field", ct->ct_name, PyText_AS_UTF8(fname));
+ "field", ct->ct_name, PyUnicode_AsUTF8(fname));
goto finally;
}
field_offset_bytes += falign;
@@ -5600,7 +5453,7 @@ static PyObject *b_complete_struct_or_union_lock_held(CTypeDescrObject *ct,
if (sflags & SF_GCC_BIG_ENDIAN)
bitshift = 8 * ftype->ct_size - fbitsize - bitshift;
- if (PyText_GetSize(fname) > 0) {
+ if (PyUnicode_GetLength(fname) > 0) {
*previous = _add_field(interned_fields, fname, ftype,
field_offset_bytes, bitshift, fbitsize,
@@ -6173,7 +6026,7 @@ static PyObject *new_function_type(PyObject *fargs, /* tuple */
fct->ct_stuff = PyTuple_New(2 + funcbuilder.nargs);
if (fct->ct_stuff == NULL)
goto error;
- fabiobj = PyInt_FromLong(fabi);
+ fabiobj = PyLong_FromLong(fabi);
if (fabiobj == NULL)
goto error;
PyTuple_SET_ITEM(fct->ct_stuff, 0, fabiobj);
@@ -6284,7 +6137,6 @@ static void _my_PyErr_WriteUnraisable(PyObject *t, PyObject *v, PyObject *tb,
char *extra_error_line)
{
/* like PyErr_WriteUnraisable(), but write a full traceback */
-#ifdef USE_WRITEUNRAISABLEMSG
/* PyErr_WriteUnraisable actually writes the full traceback anyway
from Python 3.4, but we can't really get the formatting of the
@@ -6314,43 +6166,13 @@ static void _my_PyErr_WriteUnraisable(PyObject *t, PyObject *v, PyObject *tb,
#if PY_VERSION_HEX >= 0x030D0000
PyErr_FormatUnraisable("Exception ignored %S", s);
#else
- _PyErr_WriteUnraisableMsg(PyText_AS_UTF8(s), NULL);
+ _PyErr_WriteUnraisableMsg(PyUnicode_AsUTF8(s), NULL);
#endif
Py_DECREF(s);
}
else
PyErr_WriteUnraisable(obj); /* best effort */
PyErr_Clear();
-
-#else
-
- /* version for Python 2.7 and < 3.8 */
- PyObject *f;
-#if PY_MAJOR_VERSION >= 3
- /* jump through hoops to ensure the tb is attached to v, on Python 3 */
- PyErr_NormalizeException(&t, &v, &tb);
- if (tb == NULL) {
- tb = Py_None;
- Py_INCREF(tb);
- }
- PyException_SetTraceback(v, tb);
-#endif
- f = PySys_GetObject("stderr");
- if (f != NULL) {
- if (obj != NULL) {
- PyFile_WriteString(objdescr, f);
- PyFile_WriteObject(obj, f, 0);
- PyFile_WriteString(":\n", f);
- }
- if (extra_error_line != NULL)
- PyFile_WriteString(extra_error_line, f);
- PyErr_Display(t, v, tb);
- }
- Py_XDECREF(t);
- Py_XDECREF(v);
- Py_XDECREF(tb);
-
-#endif
}
static void general_invoke_callback(int decode_args_from_libffi,
@@ -6400,11 +6222,7 @@ static void general_invoke_callback(int decode_args_from_libffi,
goto error;
if (convert_from_object_fficallback(result, SIGNATURE(1), py_res,
decode_args_from_libffi) < 0) {
-#ifdef USE_WRITEUNRAISABLEMSG
extra_error_line = ", trying to convert the result back to C";
-#else
- extra_error_line = "Trying to convert the result back to C:\n";
-#endif
goto error;
}
done:
@@ -6456,16 +6274,9 @@ static void general_invoke_callback(int decode_args_from_libffi,
_my_PyErr_WriteUnraisable(exc1, val1, tb1,
"From cffi callback ", py_ob,
extra_error_line);
-#ifdef USE_WRITEUNRAISABLEMSG
_my_PyErr_WriteUnraisable(exc2, val2, tb2,
"during handling of the above exception by 'onerror'",
NULL, NULL);
-#else
- extra_error_line = ("\nDuring the call to 'onerror', "
- "another exception occurred:\n\n");
- _my_PyErr_WriteUnraisable(exc2, val2, tb2,
- NULL, NULL, extra_error_line);
-#endif
_cffi_stop_error_capture(ecap);
}
}
@@ -6533,14 +6344,6 @@ static PyObject *prepare_callback_info_tuple(CTypeDescrObject *ct,
infotuple = Py_BuildValue("OOOO", ct, ob, py_rawerr, onerror_ob);
Py_DECREF(py_rawerr);
-#if defined(WITH_THREAD) && PY_VERSION_HEX < 0x03070000
- /* We must setup the GIL here, in case the callback is invoked in
- some other non-Pythonic thread. This is the same as ctypes.
- But PyEval_InitThreads() is always a no-op from CPython 3.7
- (the call from ctypes was removed some time later I think). */
- PyEval_InitThreads();
-#endif
-
return infotuple;
}
@@ -6714,19 +6517,7 @@ static PyObject *b_new_enum_type(PyObject *self, PyObject *args)
PyObject *value = PyTuple_GET_ITEM(enumvalues, i);
tmpkey = PyTuple_GET_ITEM(enumerators, i);
Py_INCREF(tmpkey);
- if (!PyText_Check(tmpkey)) {
-#if PY_MAJOR_VERSION < 3
- if (PyUnicode_Check(tmpkey)) {
- const char *text = PyText_AsUTF8(tmpkey);
- if (text == NULL)
- goto error;
- Py_DECREF(tmpkey);
- tmpkey = PyString_FromString(text);
- if (tmpkey == NULL)
- goto error;
- }
- else
-#endif
+ if (!PyUnicode_Check(tmpkey)) {
{
PyErr_SetString(PyExc_TypeError,
"enumerators must be a list of strings");
@@ -6782,7 +6573,7 @@ static PyObject *b_alignof(PyObject *self, PyObject *arg)
align = get_alignment((CTypeDescrObject *)arg);
if (align < 0)
return NULL;
- return PyInt_FromLong(align);
+ return PyLong_FromLong(align);
}
static Py_ssize_t direct_sizeof_cdata(CDataObject *cd)
@@ -6820,7 +6611,7 @@ static PyObject *b_sizeof(PyObject *self, PyObject *arg)
"expected a 'cdata' or 'ctype' object");
return NULL;
}
- return PyInt_FromSsize_t(size);
+ return PyLong_FromSsize_t(size);
}
static PyObject *b_typeof(PyObject *self, PyObject *arg)
@@ -6844,7 +6635,7 @@ static CTypeDescrObject *direct_typeoffsetof(CTypeDescrObject *ct,
CTypeDescrObject *res;
CFieldObject *cf;
- if (PyTextAny_Check(fieldname)) {
+ if (PyUnicode_Check(fieldname)) {
if (!following && (ct->ct_flags & CT_POINTER))
ct = ct->ct_itemdescr;
if (!(ct->ct_flags & (CT_STRUCT|CT_UNION))) {
@@ -6871,7 +6662,7 @@ static CTypeDescrObject *direct_typeoffsetof(CTypeDescrObject *ct,
*offset = cf->cf_offset;
}
else {
- Py_ssize_t index = PyInt_AsSsize_t(fieldname);
+ Py_ssize_t index = PyLong_AsSsize_t(fieldname);
if (index < 0 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"field name or array index expected");
@@ -6961,7 +6752,7 @@ static PyObject *b_getcname(PyObject *self, PyObject *args)
memcpy(p, ct->ct_name + ct->ct_name_position,
namelen - ct->ct_name_position);
- return PyText_FromStringAndSize(s, namelen + replacelen);
+ return PyUnicode_FromStringAndSize(s, namelen + replacelen);
}
static PyObject *b_string(PyObject *self, PyObject *args, PyObject *kwds)
@@ -6985,7 +6776,7 @@ static PyObject *b_string(PyObject *self, PyObject *args, PyObject *kwds)
if (s != NULL) {
PyErr_Format(PyExc_RuntimeError,
"cannot use string() on %s",
- PyText_AS_UTF8(s));
+ PyUnicode_AsUTF8(s));
Py_DECREF(s);
}
return NULL;
@@ -7105,7 +6896,7 @@ static PyObject *b_unpack(PyObject *self, PyObject *args, PyObject *kwds)
if (s != NULL) {
PyErr_Format(PyExc_RuntimeError,
"cannot use unpack() on %s",
- PyText_AS_UTF8(s));
+ PyUnicode_AsUTF8(s));
Py_DECREF(s);
}
return NULL;
@@ -7193,13 +6984,13 @@ static PyObject *b_unpack(PyObject *self, PyObject *args, PyObject *kwds)
default: x = convert_to_object(src, ctitem); break;
/* special cases for performance only */
- case 0: x = PyInt_FromLong(*(signed char *)src); break;
- case 1: x = PyInt_FromLong(*(short *)src); break;
- case 2: x = PyInt_FromLong(*(int *)src); break;
- case 3: x = PyInt_FromLong(*(long *)src); break;
- case 4: x = PyInt_FromLong(*(unsigned char *)src); break;
- case 5: x = PyInt_FromLong(*(unsigned short *)src); break;
- case 6: x = PyInt_FromLong((long)*(unsigned int *)src); break;
+ case 0: x = PyLong_FromLong(*(signed char *)src); break;
+ case 1: x = PyLong_FromLong(*(short *)src); break;
+ case 2: x = PyLong_FromLong(*(int *)src); break;
+ case 3: x = PyLong_FromLong(*(long *)src); break;
+ case 4: x = PyLong_FromLong(*(unsigned char *)src); break;
+ case 5: x = PyLong_FromLong(*(unsigned short *)src); break;
+ case 6: x = PyLong_FromLong((long)*(unsigned int *)src); break;
case 7: x = PyLong_FromUnsignedLong(*(unsigned long *)src); break;
case 8: x = PyFloat_FromDouble(*(float *)src); break;
case 9: x = PyFloat_FromDouble(*(double *)src); break;
@@ -7283,12 +7074,12 @@ static PyObject *b_get_errno(PyObject *self, PyObject *noarg)
restore_errno_only();
err = errno;
errno = 0;
- return PyInt_FromLong(err);
+ return PyLong_FromLong(err);
}
static PyObject *b_set_errno(PyObject *self, PyObject *arg)
{
- long ival = PyInt_AsLong(arg);
+ long ival = PyLong_AsLong(arg);
if (ival == -1 && PyErr_Occurred())
return NULL;
else if (ival < INT_MIN || ival > INT_MAX) {
@@ -7370,46 +7161,6 @@ static PyObject *b_from_handle(PyObject *self, PyObject *arg)
static int _my_PyObject_GetContiguousBuffer(PyObject *x, Py_buffer *view,
int writable_only)
{
-#if PY_MAJOR_VERSION < 3
- /* Some objects only support the buffer interface and CPython doesn't
- translate it into the memoryview interface, mess. Hack a very
- minimal content for 'view'. Don't care if the other fields are
- uninitialized: we only call PyBuffer_Release(), which only reads
- 'view->obj'. */
- PyBufferProcs *pb = x->ob_type->tp_as_buffer;
- if (pb && !pb->bf_releasebuffer) {
- /* we used to try all three in some vaguely sensible order,
- i.e. first the write. But trying to call the write on a
- read-only buffer fails with TypeError. So we use a less-
- sensible order now. See test_from_buffer_more_cases.
-
- If 'writable_only', we only try bf_getwritebuffer.
- */
- readbufferproc proc = NULL;
- if (!writable_only) {
- proc = (readbufferproc)pb->bf_getreadbuffer;
- if (!proc)
- proc = (readbufferproc)pb->bf_getcharbuffer;
- }
- if (!proc)
- proc = (readbufferproc)pb->bf_getwritebuffer;
-
- if (proc && pb->bf_getsegcount) {
- if ((*pb->bf_getsegcount)(x, NULL) != 1) {
- PyErr_SetString(PyExc_TypeError,
- "expected a single-segment buffer object");
- return -1;
- }
- view->len = (*proc)(x, 0, &view->buf);
- if (view->len < 0)
- return -1;
- view->obj = x;
- Py_INCREF(x);
- return 0;
- }
- }
-#endif
-
if (PyObject_GetBuffer(x, view, writable_only ? PyBUF_WRITABLE
: PyBUF_SIMPLE) < 0)
return -1;
@@ -7857,30 +7608,6 @@ static PyObject *b__testfunc(PyObject *self, PyObject *args)
return PyLong_FromVoidPtr(f);
}
-#if PY_MAJOR_VERSION < 3
-static Py_ssize_t _test_segcountproc(PyObject *o, Py_ssize_t *ignored)
-{
- return 1;
-}
-static Py_ssize_t _test_getreadbuf(PyObject *o, Py_ssize_t i, void **r)
-{
- static char buf[] = "RDB";
- *r = buf;
- return 3;
-}
-static Py_ssize_t _test_getwritebuf(PyObject *o, Py_ssize_t i, void **r)
-{
- static char buf[] = "WRB";
- *r = buf;
- return 3;
-}
-static Py_ssize_t _test_getcharbuf(PyObject *o, Py_ssize_t i, char **r)
-{
- static char buf[] = "CHB";
- *r = buf;
- return 3;
-}
-#endif
static int _test_getbuf(PyObject *self, Py_buffer *view, int flags)
{
static char buf[] = "GTB";
@@ -7903,14 +7630,6 @@ static PyObject *b__testbuff(PyObject *self, PyObject *args)
assert(obj->tp_as_buffer != NULL);
-#if PY_MAJOR_VERSION < 3
- obj->tp_as_buffer->bf_getsegcount = &_test_segcountproc;
- obj->tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER;
- obj->tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
- if (methods & 1) obj->tp_as_buffer->bf_getreadbuffer = &_test_getreadbuf;
- if (methods & 2) obj->tp_as_buffer->bf_getwritebuffer = &_test_getwritebuf;
- if (methods & 4) obj->tp_as_buffer->bf_getcharbuffer = &_test_getcharbuf;
-#endif
if (methods & 8) obj->tp_as_buffer->bf_getbuffer = &_test_getbuf;
if (methods & 16) obj->tp_as_buffer->bf_getbuffer = &_test_getbuf_ro;
@@ -8052,7 +7771,7 @@ static PyObject *_cffi_get_struct_layout(Py_ssize_t nums[])
return NULL;
while (--count >= 0) {
- PyObject *o = PyInt_FromSsize_t(nums[count]);
+ PyObject *o = PyLong_FromSsize_t(nums[count]);
if (o == NULL) {
Py_DECREF(result);
return NULL;
@@ -8173,7 +7892,6 @@ static struct { const char *name; int value; } all_dlopen_flags[] = {
/************************************************************/
-#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef FFIBackendModuleDef = {
PyModuleDef_HEAD_INIT,
"_cffi_backend",
@@ -8186,12 +7904,6 @@ static struct PyModuleDef FFIBackendModuleDef = {
PyMODINIT_FUNC
PyInit__cffi_backend(void)
-#else
-#define INITERROR return
-
-PyMODINIT_FUNC
-init_cffi_backend(void)
-#endif
{
PyObject *m, *v;
int i;
@@ -8214,19 +7926,15 @@ init_cffi_backend(void)
};
v = PySys_GetObject("version");
- if (v == NULL || !PyText_Check(v) ||
- strncmp(PyText_AS_UTF8(v), PY_VERSION, 3) != 0) {
+ if (v == NULL || !PyUnicode_Check(v) ||
+ strncmp(PyUnicode_AsUTF8(v), PY_VERSION, 3) != 0) {
PyErr_Format(PyExc_ImportError,
"this module was compiled for Python %c%c%c",
PY_VERSION[0], PY_VERSION[1], PY_VERSION[2]);
INITERROR;
}
-#if PY_MAJOR_VERSION >= 3
m = PyModule_Create(&FFIBackendModuleDef);
-#else
- m = Py_InitModule("_cffi_backend", FFIBackendMethods);
-#endif
if (m == NULL)
INITERROR;
@@ -8259,11 +7967,11 @@ init_cffi_backend(void)
}
if (!init_done) {
- v = PyText_FromString("_cffi_backend");
+ v = PyUnicode_FromString("_cffi_backend");
if (v == NULL || PyDict_SetItemString(CData_Type.tp_dict,
"__module__", v) < 0)
INITERROR;
- v = PyText_FromString("<cdata>");
+ v = PyUnicode_FromString("<cdata>");
if (v == NULL || PyDict_SetItemString(CData_Type.tp_dict,
"__name__", v) < 0)
INITERROR;
@@ -8275,7 +7983,7 @@ init_cffi_backend(void)
if (v == NULL || PyModule_AddObject(m, "_C_API", v) < 0)
INITERROR;
- v = PyText_FromString(CFFI_VERSION);
+ v = PyUnicode_FromString(CFFI_VERSION);
if (v == NULL || PyModule_AddObject(m, "__version__", v) < 0)
INITERROR;
@@ -8312,9 +8020,7 @@ init_cffi_backend(void)
if (init_ffi_lib(m) < 0)
INITERROR;
-#if PY_MAJOR_VERSION >= 3
if (init_file_emulator() < 0)
INITERROR;
return m;
-#endif
}
diff --git a/contrib/python/cffi/py3/c/call_python.c b/contrib/python/cffi/py3/c/call_python.c
index 8c6703cc26b..57e5f31402f 100644
--- a/contrib/python/cffi/py3/c/call_python.c
+++ b/contrib/python/cffi/py3/c/call_python.c
@@ -1,16 +1,7 @@
-#if PY_VERSION_HEX >= 0x03080000
-# define HAVE_PYINTERPSTATE_GETDICT
-#endif
-
-
static PyObject *_current_interp_key(void)
{
PyInterpreterState *interp = PyThreadState_GET()->interp;
-#ifdef HAVE_PYINTERPSTATE_GETDICT
return PyInterpreterState_GetDict(interp); /* shared reference */
-#else
- return interp->modules;
-#endif
}
static PyObject *_get_interpstate_dict(void)
@@ -33,11 +24,7 @@ static PyObject *_get_interpstate_dict(void)
}
interp = tstate->interp;
-#ifdef HAVE_PYINTERPSTATE_GETDICT
interpdict = PyInterpreterState_GetDict(interp); /* shared reference */
-#else
- interpdict = interp->builtins;
-#endif
if (interpdict == NULL) {
/* subinterpreter was cleared already, or is being cleared right now,
to a point that is too much for us to continue */
@@ -47,7 +34,7 @@ static PyObject *_get_interpstate_dict(void)
/* from there on, we know the (sub-)interpreter is still valid */
if (attr_name == NULL) {
- attr_name = PyText_InternFromString("__cffi_backend_extern_py");
+ attr_name = PyUnicode_InternFromString("__cffi_backend_extern_py");
if (attr_name == NULL)
goto error;
}
@@ -90,7 +77,7 @@ static PyObject *_ffi_def_extern_decorator(PyObject *outer_args, PyObject *fn)
name = PyObject_GetAttrString(fn, "__name__");
if (name == NULL)
return NULL;
- s = PyText_AsUTF8(name);
+ s = PyUnicode_AsUTF8(name);
if (s == NULL) {
Py_DECREF(name);
return NULL;
diff --git a/contrib/python/cffi/py3/c/cdlopen.c b/contrib/python/cffi/py3/c/cdlopen.c
index 7db7ae280fb..d07fcd25ae6 100644
--- a/contrib/python/cffi/py3/c/cdlopen.c
+++ b/contrib/python/cffi/py3/c/cdlopen.c
@@ -7,7 +7,7 @@ static void *cdlopen_fetch(PyObject *libname, void *libhandle,
if (libhandle == NULL) {
PyErr_Format(FFIError, "library '%s' has been closed",
- PyText_AS_UTF8(libname));
+ PyUnicode_AsUTF8(libname));
return NULL;
}
@@ -16,7 +16,7 @@ static void *cdlopen_fetch(PyObject *libname, void *libhandle,
if (address == NULL) {
const char *error = dlerror();
PyErr_Format(FFIError, "symbol '%s' not found in library '%s': %s",
- symbol, PyText_AS_UTF8(libname), error);
+ symbol, PyUnicode_AsUTF8(libname), error);
}
return address;
}
@@ -32,7 +32,7 @@ static int cdlopen_close(PyObject *libname, void *libhandle)
if (libhandle != NULL && dlclose(libhandle) != 0) {
const char *error = dlerror();
PyErr_Format(FFIError, "closing library '%s': %s",
- PyText_AS_UTF8(libname), error);
+ PyUnicode_AsUTF8(libname), error);
return -1;
}
return 0;
@@ -195,13 +195,6 @@ static int ffiobj_init(PyObject *self, PyObject *args, PyObject *kwds)
_CFFI_GETOP(nglobs[i].type_op) == _CFFI_OP_ENUM) {
PyObject *o = PyTuple_GET_ITEM(globals, i * 2 + 1);
nglobs[i].address = &_cdl_realize_global_int;
-#if PY_MAJOR_VERSION < 3
- if (PyInt_Check(o)) {
- nintconsts[i].neg = PyInt_AS_LONG(o) <= 0;
- nintconsts[i].value = (long long)PyInt_AS_LONG(o);
- }
- else
-#endif
{
nintconsts[i].neg = PyObject_RichCompareBool(o, Py_False,
Py_LE);
diff --git a/contrib/python/cffi/py3/c/cffi1_module.c b/contrib/python/cffi/py3/c/cffi1_module.c
index 70d9ee8e0fe..7c16b2b7073 100644
--- a/contrib/python/cffi/py3/c/cffi1_module.c
+++ b/contrib/python/cffi/py3/c/cffi1_module.c
@@ -46,7 +46,7 @@ static int init_ffi_lib(PyObject *m)
return -1;
for (i = 0; all_dlopen_flags[i].name != NULL; i++) {
- x = PyInt_FromLong(all_dlopen_flags[i].value);
+ x = PyLong_FromLong(all_dlopen_flags[i].value);
if (x == NULL)
return -1;
res = PyDict_SetItemString(FFI_Type.tp_dict,
@@ -116,7 +116,6 @@ static int make_included_tuples(char *module_name,
static PyObject *_my_Py_InitModule(char *module_name)
{
-#if PY_MAJOR_VERSION >= 3
struct PyModuleDef *module_def, local_module_def = {
PyModuleDef_HEAD_INIT,
module_name,
@@ -137,9 +136,6 @@ static PyObject *_my_Py_InitModule(char *module_name)
}
# endif
return m;
-#else
- return Py_InitModule(module_name, NULL);
-#endif
}
static PyObject *b_init_cffi_1_0_external_module(PyObject *self, PyObject *arg)
@@ -211,12 +207,10 @@ static PyObject *b_init_cffi_1_0_external_module(PyObject *self, PyObject *arg)
(PyObject *)lib) < 0)
return NULL;
-#if PY_MAJOR_VERSION >= 3
/* add manually 'module_name' in sys.modules: it seems that
Py_InitModule() is not enough to do that */
if (PyDict_SetItemString(modules_dict, module_name, m) < 0)
return NULL;
-#endif
return m;
}
diff --git a/contrib/python/cffi/py3/c/cglob.c b/contrib/python/cffi/py3/c/cglob.c
index e97767c9d75..6c6fd4bae2e 100644
--- a/contrib/python/cffi/py3/c/cglob.c
+++ b/contrib/python/cffi/py3/c/cglob.c
@@ -74,7 +74,7 @@ static void *fetch_global_var_addr(GlobSupportObject *gs)
}
if (data == NULL) {
PyErr_Format(FFIError, "global variable '%s' is at address NULL",
- PyText_AS_UTF8(gs->gs_name));
+ PyUnicode_AsUTF8(gs->gs_name));
return NULL;
}
return data;
diff --git a/contrib/python/cffi/py3/c/commontypes.c b/contrib/python/cffi/py3/c/commontypes.c
index 2337bf99447..a15c3ae87b2 100644
--- a/contrib/python/cffi/py3/c/commontypes.c
+++ b/contrib/python/cffi/py3/c/commontypes.c
@@ -205,7 +205,7 @@ static PyObject *b__get_common_types(PyObject *self, PyObject *arg)
size_t i;
for (i = 0; i < num_common_simple_types; i++) {
const char *s = common_simple_types[i];
- PyObject *o = PyText_FromString(s + strlen(s) + 1);
+ PyObject *o = PyUnicode_FromString(s + strlen(s) + 1);
if (o == NULL)
return NULL;
err = PyDict_SetItemString(arg, s, o);
diff --git a/contrib/python/cffi/py3/c/ffi_obj.c b/contrib/python/cffi/py3/c/ffi_obj.c
index 0c4933eeff6..fbba28941ce 100644
--- a/contrib/python/cffi/py3/c/ffi_obj.c
+++ b/contrib/python/cffi/py3/c/ffi_obj.c
@@ -185,13 +185,13 @@ static CTypeDescrObject *_ffi_type(FFIObject *ffi, PyObject *arg,
/* Returns the CTypeDescrObject from the user-supplied 'arg'.
Does not return a new reference!
*/
- if ((accept & ACCEPT_STRING) && PyText_Check(arg)) {
+ if ((accept & ACCEPT_STRING) && PyUnicode_Check(arg)) {
PyObject *types_dict = ffi->types_builder.types_dict;
/* The types_dict keeps the reference alive. Items are never removed */
PyObject *x = PyDict_GetItem(types_dict, arg);
if (x == NULL) {
- const char *input_text = PyText_AS_UTF8(arg);
+ const char *input_text = PyUnicode_AsUTF8(arg);
struct _cffi_parse_info_s info;
info.ctx = &ffi->types_builder.ctx;
info.output_size = FFI_COMPLEXITY_OUTPUT;
@@ -241,17 +241,6 @@ static CTypeDescrObject *_ffi_type(FFIObject *ffi, PyObject *arg,
else if ((accept & ACCEPT_CDATA) && CData_Check(arg)) {
return ((CDataObject *)arg)->c_type;
}
-#if PY_MAJOR_VERSION < 3
- else if (PyUnicode_Check(arg)) {
- CTypeDescrObject *result;
- arg = PyUnicode_AsASCIIString(arg);
- if (arg == NULL)
- return NULL;
- result = _ffi_type(ffi, arg, accept);
- Py_DECREF(arg);
- return result;
- }
-#endif
else {
const char *m1 = (accept & ACCEPT_STRING) ? "string" : "";
const char *m2 = (accept & ACCEPT_CTYPE) ? "ctype object" : "";
@@ -291,7 +280,7 @@ static PyObject *ffi_sizeof(FFIObject *self, PyObject *arg)
return NULL;
}
}
- return PyInt_FromSsize_t(size);
+ return PyLong_FromSsize_t(size);
}
PyDoc_STRVAR(ffi_alignof_doc,
@@ -308,7 +297,7 @@ static PyObject *ffi_alignof(FFIObject *self, PyObject *arg)
align = get_alignment(ct);
if (align < 0)
return NULL;
- return PyInt_FromLong(align);
+ return PyLong_FromLong(align);
}
PyDoc_STRVAR(ffi_typeof_doc,
@@ -526,7 +515,7 @@ static PyObject *ffi_offsetof(FFIObject *self, PyObject *args)
return NULL;
offset += ofs1;
}
- return PyInt_FromSsize_t(offset);
+ return PyLong_FromSsize_t(offset);
}
PyDoc_STRVAR(ffi_addressof_doc,
@@ -639,9 +628,7 @@ static PyObject *ffi_getctype(FFIObject *self, PyObject *args, PyObject *kwds)
CTypeDescrObject *ct;
size_t replace_with_len;
static char *keywords[] = {"cdecl", "replace_with", NULL};
-#if PY_MAJOR_VERSION >= 3
PyObject *u;
-#endif
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:getctype", keywords,
&c_decl, &replace_with))
@@ -675,14 +662,12 @@ static PyObject *ffi_getctype(FFIObject *self, PyObject *args, PyObject *kwds)
if (add_paren)
p[replace_with_len] = ')';
-#if PY_MAJOR_VERSION >= 3
/* bytes -> unicode string */
u = PyUnicode_DecodeLatin1(PyBytes_AS_STRING(res),
PyBytes_GET_SIZE(res),
NULL);
Py_DECREF(res);
res = u;
-#endif
return res;
}
@@ -931,7 +916,7 @@ static PyObject *ffi_list_types(FFIObject *self, PyObject *noargs)
goto error;
for (i = 0; i < n1; i++) {
- o = PyText_FromString(self->types_builder.ctx.typenames[i].name);
+ o = PyUnicode_FromString(self->types_builder.ctx.typenames[i].name);
if (o == NULL)
goto error;
PyList_SET_ITEM(lst[0], i, o);
@@ -945,7 +930,7 @@ static PyObject *ffi_list_types(FFIObject *self, PyObject *noargs)
if (s->name[0] == '$')
continue;
- o = PyText_FromString(s->name);
+ o = PyUnicode_FromString(s->name);
if (o == NULL)
goto error;
index = (s->flags & _CFFI_F_UNION) ? 2 : 1;
@@ -990,14 +975,6 @@ PyDoc_STRVAR(ffi_init_once_doc,
"of function() is done. If function() raises an exception, it is\n"
"propagated and nothing is cached.");
-#if PY_MAJOR_VERSION < 3
-/* PyCapsule_New is redefined to be PyCObject_FromVoidPtr in _cffi_backend,
- which gives 2.6 compatibility; but the destructor signature is different */
-static void _free_init_once_lock(void *lock)
-{
- PyThread_free_lock((PyThread_type_lock)lock);
-}
-#else
static void _free_init_once_lock(PyObject *capsule)
{
PyThread_type_lock lock;
@@ -1005,7 +982,6 @@ static void _free_init_once_lock(PyObject *capsule)
if (lock != NULL)
PyThread_free_lock(lock);
}
-#endif
static PyObject *ffi_init_once(FFIObject *self, PyObject *args, PyObject *kwds)
{
diff --git a/contrib/python/cffi/py3/c/file_emulator.h b/contrib/python/cffi/py3/c/file_emulator.h
index 82a34c0c72f..bfdcdeceac2 100644
--- a/contrib/python/cffi/py3/c/file_emulator.h
+++ b/contrib/python/cffi/py3/c/file_emulator.h
@@ -51,7 +51,7 @@ static FILE *PyFile_AsFile(PyObject *ob_file)
ob_mode = PyObject_GetAttrString(ob_file, "mode");
if (ob_mode == NULL)
goto fail;
- mode = PyText_AsUTF8(ob_mode);
+ mode = PyUnicode_AsUTF8(ob_mode);
if (mode == NULL)
goto fail;
diff --git a/contrib/python/cffi/py3/c/lib_obj.c b/contrib/python/cffi/py3/c/lib_obj.c
index 446b225cb5d..946db3b39dd 100644
--- a/contrib/python/cffi/py3/c/lib_obj.c
+++ b/contrib/python/cffi/py3/c/lib_obj.c
@@ -123,8 +123,8 @@ static int lib_traverse(LibObject *lib, visitproc visit, void *arg)
static PyObject *lib_repr(LibObject *lib)
{
- return PyText_FromFormat("<Lib object for '%.200s'>",
- PyText_AS_UTF8(lib->l_libname));
+ return PyUnicode_FromFormat("<Lib object for '%.200s'>",
+ PyUnicode_AsUTF8(lib->l_libname));
}
static PyObject *lib_build_cpython_func(LibObject *lib,
@@ -143,7 +143,7 @@ static PyObject *lib_build_cpython_func(LibObject *lib,
int i, type_index = _CFFI_GETARG(g->type_op);
_cffi_opcode_t *opcodes = lib->l_types_builder->ctx.types;
static const char *const format = ";\n\nCFFI C function from %s.lib";
- const char *libname = PyText_AS_UTF8(lib->l_libname);
+ const char *libname = PyUnicode_AsUTF8(lib->l_libname);
struct funcbuilder_s funcbuilder;
/* return type: */
@@ -226,7 +226,7 @@ static PyObject *lib_build_and_cache_attr(LibObject *lib, PyObject *name,
const struct _cffi_global_s *g;
CTypeDescrObject *ct;
builder_c_t *types_builder = lib->l_types_builder;
- const char *s = PyText_AsUTF8(name);
+ const char *s = PyUnicode_AsUTF8(name);
if (s == NULL)
return NULL;
@@ -281,7 +281,7 @@ static PyObject *lib_build_and_cache_attr(LibObject *lib, PyObject *name,
PyErr_Format(PyExc_AttributeError,
"cffi library '%.200s' has no function, constant "
"or global variable named '%.200s'",
- PyText_AS_UTF8(lib->l_libname), s);
+ PyUnicode_AsUTF8(lib->l_libname), s);
return NULL;
}
@@ -478,7 +478,7 @@ static PyObject *_lib_dir1(LibObject *lib, int ignore_global_vars)
if (op == _CFFI_OP_GLOBAL_VAR || op == _CFFI_OP_GLOBAL_VAR_F)
continue;
}
- s = PyText_FromString(g[i].name);
+ s = PyUnicode_FromString(g[i].name);
if (s == NULL)
goto error;
PyList_SET_ITEM(lst, count, s);
@@ -502,7 +502,7 @@ static PyObject *_lib_dict(LibObject *lib)
return NULL;
for (i = 0; i < total; i++) {
- name = PyText_FromString(g[i].name);
+ name = PyUnicode_FromString(g[i].name);
if (name == NULL)
goto error;
@@ -534,7 +534,7 @@ static PyObject *lib_getattr(LibObject *lib, PyObject *name)
missing:
/*** ATTRIBUTEERROR IS SET HERE ***/
- p = PyText_AsUTF8(name);
+ p = PyUnicode_AsUTF8(name);
if (p == NULL)
return NULL;
if (strcmp(p, "__all__") == 0) {
@@ -558,16 +558,14 @@ static PyObject *lib_getattr(LibObject *lib, PyObject *name)
module-like behavior */
if (strcmp(p, "__name__") == 0) {
PyErr_Clear();
- return PyText_FromFormat("%s.lib", PyText_AS_UTF8(lib->l_libname));
+ return PyUnicode_FromFormat("%s.lib", PyUnicode_AsUTF8(lib->l_libname));
}
-#if PY_MAJOR_VERSION >= 3
if (strcmp(p, "__loader__") == 0 || strcmp(p, "__spec__") == 0) {
/* some more module-like behavior hacks */
PyErr_Clear();
Py_INCREF(Py_None);
return Py_None;
}
-#endif
return NULL;
}
@@ -587,7 +585,7 @@ static int lib_setattr(LibObject *lib, PyObject *name, PyObject *val)
PyErr_Format(PyExc_AttributeError,
"cannot write to function or constant '%.200s'",
- PyText_Check(name) ? PyText_AS_UTF8(name) : "?");
+ PyUnicode_Check(name) ? PyUnicode_AsUTF8(name) : "?");
return -1;
}
@@ -645,7 +643,7 @@ static LibObject *lib_internal_new(FFIObject *ffi, const char *module_name,
LibObject *lib;
PyObject *libname, *dict;
- libname = PyText_FromString(module_name);
+ libname = PyUnicode_FromString(module_name);
if (libname == NULL)
goto err1;
@@ -712,7 +710,7 @@ static PyObject *address_of_global_var(PyObject *args)
/* rebuild a string from 'varname', to do typechecks and to force
a unicode back to a plain string (on python 2) */
- o_varname = PyText_FromString(varname);
+ o_varname = PyUnicode_FromString(varname);
if (o_varname == NULL)
return NULL;
diff --git a/contrib/python/cffi/py3/c/minibuffer.h b/contrib/python/cffi/py3/c/minibuffer.h
index d92da317ade..89e400fa069 100644
--- a/contrib/python/cffi/py3/c/minibuffer.h
+++ b/contrib/python/cffi/py3/c/minibuffer.h
@@ -50,7 +50,7 @@ static int mb_ass_item(MiniBufferObj *self, Py_ssize_t idx, PyObject *other)
}
else {
PyErr_Format(PyExc_TypeError,
- "must assign a "STR_OR_BYTES
+ "must assign a bytes"
" of length 1, not %.200s", Py_TYPE(other)->tp_name);
return -1;
}
@@ -85,29 +85,6 @@ static int mb_ass_slice(MiniBufferObj *self,
return 0;
}
-#if PY_MAJOR_VERSION < 3
-static Py_ssize_t mb_getdata(MiniBufferObj *self, Py_ssize_t idx, void **pp)
-{
- *pp = self->mb_data;
- return self->mb_size;
-}
-
-static Py_ssize_t mb_getsegcount(MiniBufferObj *self, Py_ssize_t *lenp)
-{
- if (lenp)
- *lenp = self->mb_size;
- return 1;
-}
-
-static PyObject *mb_str(MiniBufferObj *self)
-{
- /* Python 2: we want str(buffer) to behave like buffer[:], because
- that's what bytes(buffer) does on Python 3 and there is no way
- we can prevent this. */
- return PyString_FromStringAndSize(self->mb_data, self->mb_size);
-}
-#endif
-
static int mb_getbuf(MiniBufferObj *self, Py_buffer *view, int flags)
{
return PyBuffer_FillInfo(view, (PyObject *)self,
@@ -126,12 +103,6 @@ static PySequenceMethods mb_as_sequence = {
};
static PyBufferProcs mb_as_buffer = {
-#if PY_MAJOR_VERSION < 3
- (readbufferproc)mb_getdata,
- (writebufferproc)mb_getdata,
- (segcountproc)mb_getsegcount,
- (charbufferproc)mb_getdata,
-#endif
(getbufferproc)mb_getbuf,
(releasebufferproc)0,
};
@@ -234,16 +205,8 @@ mb_richcompare(PyObject *self, PyObject *other, int op)
return res;
}
-#if PY_MAJOR_VERSION >= 3
/* pfffffffffffff pages of copy-paste from listobject.c */
-/* pfffffffffffff#2: the PySlice_GetIndicesEx() *macro* should not
- be called, because C extension modules compiled with it differ
- on ABI between 3.6.0, 3.6.1 and 3.6.2. */
-#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) && !defined(PYPY_VERSION)
-#undef PySlice_GetIndicesEx
-#endif
-
static PyObject *mb_subscript(MiniBufferObj *self, PyObject *item)
{
if (PyIndex_Check(item)) {
@@ -280,6 +243,11 @@ static PyObject *mb_subscript(MiniBufferObj *self, PyObject *item)
static int
mb_ass_subscript(MiniBufferObj* self, PyObject* item, PyObject* value)
{
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "'del x[n]' not supported for buffer objects");
+ return -1;
+ }
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
@@ -317,13 +285,6 @@ static PyMappingMethods mb_as_mapping = {
(binaryfunc)mb_subscript, /*mp_subscript*/
(objobjargproc)mb_ass_subscript, /*mp_ass_subscript*/
};
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-# define MINIBUF_TPFLAGS 0
-#else
-# define MINIBUF_TPFLAGS (Py_TPFLAGS_HAVE_GETCHARBUFFER | Py_TPFLAGS_HAVE_NEWBUFFER)
-#endif
PyDoc_STRVAR(ffi_buffer_doc,
"ffi.buffer(cdata[, byte_size]):\n"
@@ -354,23 +315,14 @@ static PyTypeObject MiniBuffer_Type = {
0, /* tp_repr */
0, /* tp_as_number */
&mb_as_sequence, /* tp_as_sequence */
-#if PY_MAJOR_VERSION < 3
- 0, /* tp_as_mapping */
-#else
&mb_as_mapping, /* tp_as_mapping */
-#endif
0, /* tp_hash */
0, /* tp_call */
-#if PY_MAJOR_VERSION < 3
- (reprfunc)mb_str, /* tp_str */
-#else
0, /* tp_str */
-#endif
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
&mb_as_buffer, /* tp_as_buffer */
- (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
- MINIBUF_TPFLAGS), /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
ffi_buffer_doc, /* tp_doc */
(traverseproc)mb_traverse, /* tp_traverse */
(inquiry)mb_clear, /* tp_clear */
diff --git a/contrib/python/cffi/py3/c/misc_thread_common.h b/contrib/python/cffi/py3/c/misc_thread_common.h
index b0710acceec..766dcb2ad7d 100644
--- a/contrib/python/cffi/py3/c/misc_thread_common.h
+++ b/contrib/python/cffi/py3/c/misc_thread_common.h
@@ -328,20 +328,12 @@ static void restore_errno_only(void)
It was added in 3.5.2 but should never be used in 3.5.x
because it is not available in 3.5.0 or 3.5.1.
*/
-#if PY_VERSION_HEX >= 0x03050100 && PY_VERSION_HEX < 0x03060000
-PyAPI_DATA(void *volatile) _PyThreadState_Current;
-#endif
-
static PyThreadState *get_current_ts(void)
{
#if PY_VERSION_HEX >= 0x030D0000
return PyThreadState_GetUnchecked();
-#elif PY_VERSION_HEX >= 0x03060000
- return _PyThreadState_UncheckedGet();
-#elif defined(_Py_atomic_load_relaxed)
- return (PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current);
#else
- return (PyThreadState*)_PyThreadState_Current; /* assume atomic read */
+ return _PyThreadState_UncheckedGet();
#endif
}
diff --git a/contrib/python/cffi/py3/c/misc_win32.h b/contrib/python/cffi/py3/c/misc_win32.h
index 90c63adc68c..4fe723a727d 100644
--- a/contrib/python/cffi/py3/c/misc_win32.h
+++ b/contrib/python/cffi/py3/c/misc_win32.h
@@ -64,7 +64,6 @@ static void restore_errno(void)
/************************************************************/
-#if PY_MAJOR_VERSION >= 3
static PyObject *b_getwinerror(PyObject *self, PyObject *args, PyObject *kwds)
{
int err = -1;
@@ -113,54 +112,6 @@ static PyObject *b_getwinerror(PyObject *self, PyObject *args, PyObject *kwds)
LocalFree(s_buf);
return v;
}
-#else
-static PyObject *b_getwinerror(PyObject *self, PyObject *args, PyObject *kwds)
-{
- int err = -1;
- int len;
- char *s;
- char *s_buf = NULL; /* Free via LocalFree */
- char s_small_buf[40]; /* Room for "Windows Error 0xFFFFFFFFFFFFFFFF" */
- PyObject *v;
- static char *keywords[] = {"code", NULL};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i", keywords, &err))
- return NULL;
-
- if (err == -1) {
- struct cffi_tls_s *p = get_cffi_tls();
- if (p == NULL)
- return PyErr_NoMemory();
- err = p->saved_lasterror;
- }
-
- len = FormatMessage(
- /* Error API error */
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, /* no message source */
- err,
- MAKELANGID(LANG_NEUTRAL,
- SUBLANG_DEFAULT), /* Default language */
- (LPTSTR) &s_buf,
- 0, /* size not used */
- NULL); /* no args */
- if (len==0) {
- /* Only seen this in out of mem situations */
- sprintf(s_small_buf, "Windows Error 0x%X", err);
- s = s_small_buf;
- } else {
- s = s_buf;
- /* remove trailing cr/lf and dots */
- while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
- s[--len] = '\0';
- }
- v = Py_BuildValue("(is)", err, s);
- LocalFree(s_buf);
- return v;
-}
-#endif
/************************************************************/
@@ -251,7 +202,9 @@ static int cffi_atomic_compare_exchange(void **ptr, void **expected,
static void *cffi_atomic_load(void **ptr)
{
-#if defined(_M_X64) || defined(_M_IX86)
+#if defined(__GNUC__) || defined(__clang__)
+ return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile void **)ptr;
#elif defined(_M_ARM64)
return (void *)__ldar64((volatile unsigned __int64 *)ptr);
@@ -262,7 +215,9 @@ static void *cffi_atomic_load(void **ptr)
static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)
{
-#if defined(_M_X64) || defined(_M_IX86)
+#if defined(__GNUC__) || defined(__clang__)
+ return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile uint8_t *)ptr;
#elif defined(_M_ARM64)
return (uint8_t)__ldar8((volatile uint8_t *)ptr);
@@ -273,7 +228,9 @@ static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)
static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)
{
-#if defined(_M_X64) || defined(_M_IX86)
+#if defined(__GNUC__) || defined(__clang__)
+ return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile Py_ssize_t *)ptr;
#elif defined(_M_ARM64)
return (Py_ssize_t)__ldar64((volatile unsigned __int64 *)ptr);
@@ -284,17 +241,29 @@ static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)
static void cffi_atomic_store_ssize(Py_ssize_t *ptr, Py_ssize_t value)
{
+#if defined(__GNUC__) || defined(__clang__)
+ __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
+#else
_InterlockedExchangePointer(ptr, value);
+#endif
}
static void cffi_atomic_store(void **ptr, void *value)
{
+#if defined(__GNUC__) || defined(__clang__)
+ __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
+#else
_InterlockedExchangePointer(ptr, value);
+#endif
}
static void cffi_atomic_store_uint8(uint8_t *ptr, uint8_t value)
{
+#if defined(__GNUC__) || defined(__clang__)
+ __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
+#else
_InterlockedExchange8(ptr, value);
+#endif
}
#endif /* CFFI_MISC_WIN32_H */
diff --git a/contrib/python/cffi/py3/c/realize_c_type.c b/contrib/python/cffi/py3/c/realize_c_type.c
index fbfa68ca748..993a07d122f 100644
--- a/contrib/python/cffi/py3/c/realize_c_type.c
+++ b/contrib/python/cffi/py3/c/realize_c_type.c
@@ -29,7 +29,6 @@ static PyObject *build_primitive_type(int num); /* forward */
static int init_global_types_dict(PyObject *ffi_type_dict)
{
int err;
- Py_ssize_t i;
PyObject *ct_void, *ct_char, *ct2, *pnull;
/* XXX some leaks in case these functions fail, but well,
MemoryErrors during importing an extension module are kind
@@ -78,7 +77,7 @@ static int init_global_types_dict(PyObject *ffi_type_dict)
#ifdef Py_GIL_DISABLED
// Ensure that all primitive types are initialised to avoid race conditions
// on the first access.
- for (i = 0; i < _CFFI__NUM_PRIM; i++) {
+ for (Py_ssize_t i = 0; i < _CFFI__NUM_PRIM; i++) {
ct2 = get_primitive_type(i);
if (ct2 == NULL)
return -1;
@@ -247,13 +246,13 @@ static PyObject *realize_global_int(builder_c_t *builder, int gindex)
case 0:
if (value <= (unsigned long long)LONG_MAX)
- return PyInt_FromLong((long)value);
+ return PyLong_FromLong((long)value);
else
return PyLong_FromUnsignedLongLong(value);
case 1:
if ((long long)value >= (long long)LONG_MIN)
- return PyInt_FromLong((long)value);
+ return PyLong_FromLong((long)value);
else
return PyLong_FromLongLong((long long)value);
@@ -551,7 +550,7 @@ realize_c_type_or_func_now(builder_c_t *builder, _cffi_opcode_t op,
j = 0;
while (p[j] != ',' && p[j] != '\0')
j++;
- tmp = PyText_FromStringAndSize(p, j);
+ tmp = PyUnicode_FromStringAndSize(p, j);
if (tmp == NULL)
break;
PyTuple_SET_ITEM(enumerators, i, tmp);
diff --git a/contrib/python/cffi/py3/cffi/__init__.py b/contrib/python/cffi/py3/cffi/__init__.py
index c99ec3d4817..da1875cc253 100644
--- a/contrib/python/cffi/py3/cffi/__init__.py
+++ b/contrib/python/cffi/py3/cffi/__init__.py
@@ -5,8 +5,8 @@ from .api import FFI
from .error import CDefError, FFIError, VerificationError, VerificationMissing
from .error import PkgConfigError
-__version__ = "2.0.0"
-__version_info__ = (2, 0, 0)
+__version__ = "2.1.0"
+__version_info__ = (2, 1, 0)
# The verifier module file names are based on the CRC32 of a string that
# contains the following version number. It may be older than __version__
diff --git a/contrib/python/cffi/py3/cffi/_cffi_errors.h b/contrib/python/cffi/py3/cffi/_cffi_errors.h
index 158e0590346..0931379ccd2 100644
--- a/contrib/python/cffi/py3/cffi/_cffi_errors.h
+++ b/contrib/python/cffi/py3/cffi/_cffi_errors.h
@@ -36,11 +36,7 @@ static PyObject *_cffi_start_error_capture(void)
if (result == NULL)
goto error;
-#if PY_MAJOR_VERSION >= 3
bi = PyImport_ImportModule("builtins");
-#else
- bi = PyImport_ImportModule("__builtin__");
-#endif
if (bi == NULL)
goto error;
PyDict_SetItemString(result, "__builtins__", bi);
@@ -81,15 +77,9 @@ static PyObject *_cffi_start_error_capture(void)
static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored)
{
Sleep(666); /* may be interrupted if the whole process is closing */
-#if PY_MAJOR_VERSION >= 3
MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text,
L"Python-CFFI error",
MB_OK | MB_ICONERROR);
-#else
- MessageBoxA(NULL, (char *)_cffi_bootstrap_text,
- "Python-CFFI error",
- MB_OK | MB_ICONERROR);
-#endif
_cffi_bootstrap_text = NULL;
return 0;
}
@@ -111,11 +101,7 @@ static void _cffi_stop_error_capture(PyObject *ecap)
/* Show a dialog box, but in a background thread, and
never show multiple dialog boxes at once. */
-#if PY_MAJOR_VERSION >= 3
text = PyUnicode_AsWideCharString(s, NULL);
-#else
- text = PyString_AsString(s);
-#endif
_cffi_bootstrap_text = text;
diff --git a/contrib/python/cffi/py3/cffi/_cffi_gen_src.py b/contrib/python/cffi/py3/cffi/_cffi_gen_src.py
new file mode 100644
index 00000000000..3d4fb7e3d9c
--- /dev/null
+++ b/contrib/python/cffi/py3/cffi/_cffi_gen_src.py
@@ -0,0 +1,216 @@
+# Integrated from the cffi-buildtool project by Rose Davidson
+# (https://github.com/inklesspen/cffi-buildtool), under the following
+# license:
+#
+# MIT License
+#
+# Copyright (c) 2024, Rose Davidson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice (including the
+# next paragraph) shall be included in all copies or substantial portions
+# of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+"""Implementation of the ``cffi-gen-src`` command-line tool.
+
+This module is private; the command line is the only supported
+interface. Two subcommands:
+
+``exec-python``
+ Execute a Python script that constructs a :class:`cffi.FFI`
+ (the same kind of script that the CFFI docs' "Main mode of usage"
+ describes) and emit the generated C source.
+
+``read-sources``
+ Create the :class:`cffi.FFI` from a separate ``cdef`` file and C
+ source prelude, then emit the generated C source.
+"""
+
+import argparse
+import io
+import os
+import sys
+
+from .api import FFI
+
+
+def _execfile(pysrc, filename, globs):
+ compiled = compile(source=pysrc, filename=filename, mode='exec')
+ exec(compiled, globs, globs)
+
+
+def find_ffi_in_python_script(pysrc, filename, ffivar):
+ """Execute ``pysrc`` and return the :class:`FFI` object it defines.
+
+ The script is executed with ``__name__`` set to ``"cffi.gen_src"``,
+ so a trailing ``if __name__ == "__main__": ffibuilder.compile()``
+ block in the script is skipped.
+
+ ``ffivar`` is the name bound by the script to the :class:`FFI`
+ object, or to a callable that returns one.
+
+ Raises :class:`NameError` if the name is not bound by the script,
+ or :class:`TypeError` if the name does not resolve to an
+ :class:`FFI` instance.
+ """
+ filename = os.path.abspath(filename)
+ globs = {'__name__': 'cffi.gen_src', '__file__': filename}
+ old_path = sys.path[:]
+ sys.path.insert(0, os.path.dirname(filename))
+ try:
+ _execfile(pysrc, filename, globs)
+ if ffivar not in globs:
+ raise NameError(
+ "Expected to find the FFI object with the name %r, "
+ "but it was not found." % (ffivar,)
+ )
+ ffi = globs[ffivar]
+ if not isinstance(ffi, FFI) and callable(ffi):
+ # Maybe it's a callable that returns a FFI
+ ffi = ffi()
+ if not isinstance(ffi, FFI):
+ raise TypeError(
+ "Found an object with the name %r but it was not an "
+ "instance of cffi.api.FFI" % (ffivar,)
+ )
+ return ffi
+ finally:
+ sys.path[:] = old_path
+
+
+def make_ffi_from_sources(modulename, cdef, csrc):
+ """Create an :class:`FFI` from ``cdef`` text and a C source prelude."""
+ ffibuilder = FFI()
+ ffibuilder.cdef(cdef)
+ ffibuilder.set_source(modulename, csrc)
+ return ffibuilder
+
+
+def generate_c_source(ffi):
+ """Return the C source that :meth:`FFI.emit_c_code` would write."""
+ output = io.StringIO()
+ ffi.emit_c_code(output)
+ return output.getvalue()
+
+
+def write_c_source(output, generated):
+ if output == '-':
+ sys.stdout.write(generated)
+ return
+ with open(output, 'w', encoding='utf-8') as f:
+ f.write(generated)
+
+
+def same_input_file(file1, file2):
+ if file1 is file2:
+ return True
+ try:
+ return os.path.samefile(file1.name, file2.name)
+ except OSError:
+ return False
+
+
+def exec_python(*, output, pyfile, ffi_var):
+ with pyfile:
+ ffi = find_ffi_in_python_script(pyfile.read(), pyfile.name, ffi_var)
+ generated = generate_c_source(ffi)
+ write_c_source(output, generated)
+
+
+def read_sources(*, output, module_name, cdef_input, csrc_input):
+ with csrc_input, cdef_input:
+ csrc = csrc_input.read()
+ cdef = cdef_input.read()
+ ffi = make_ffi_from_sources(module_name, cdef, csrc)
+ generated = generate_c_source(ffi)
+ write_c_source(output, generated)
+
+
+def _prog():
+ # The same parser serves both documented invocations; make --help
+ # and usage messages show the one that was actually used.
+ argv0 = os.path.basename(sys.argv[0]) if sys.argv else ''
+ if argv0.startswith('cffi-gen-src'):
+ return 'cffi-gen-src'
+ return 'python -m cffi.gen_src'
+
+
+parser = argparse.ArgumentParser(
+ prog=_prog(),
+ description='Generate CFFI C source for extension modules.',
+)
+subparsers = parser.add_subparsers(dest='mode')
+
+exec_python_parser = subparsers.add_parser(
+ 'exec-python',
+ help='Execute a Python script that defines an FFI object',
+)
+exec_python_parser.add_argument(
+ '--ffi-var',
+ default='ffibuilder',
+ help="Name of the FFI object in the Python script; defaults to 'ffibuilder'.",
+)
+exec_python_parser.add_argument(
+ 'pyfile',
+ type=argparse.FileType('r', encoding='utf-8'),
+ help='Path to the Python script',
+)
+exec_python_parser.add_argument(
+ 'output',
+ help='Output path for the C source',
+)
+
+read_sources_parser = subparsers.add_parser(
+ 'read-sources',
+ help='Read cdef and C source prelude files that define an FFI object',
+)
+read_sources_parser.add_argument(
+ 'module_name',
+ help='Full name of the generated module, including packages',
+)
+read_sources_parser.add_argument(
+ 'cdef',
+ type=argparse.FileType('r', encoding='utf-8'),
+ help='File containing C definitions',
+)
+read_sources_parser.add_argument(
+ 'csrc',
+ type=argparse.FileType('r', encoding='utf-8'),
+ help='File containing C source prelude',
+)
+read_sources_parser.add_argument(
+ 'output',
+ help='Output path for the C source',
+)
+
+
+def run(args=None):
+ args = parser.parse_args(args=args)
+ if args.mode == 'exec-python':
+ exec_python(output=args.output, pyfile=args.pyfile, ffi_var=args.ffi_var)
+ elif args.mode == 'read-sources':
+ if same_input_file(args.cdef, args.csrc):
+ parser.error('cdef and csrc are the same file and should not be')
+ read_sources(
+ output=args.output,
+ module_name=args.module_name,
+ cdef_input=args.cdef,
+ csrc_input=args.csrc,
+ )
+ else:
+ parser.error('a subcommand is required: exec-python or read-sources')
+ parser.exit(0)
diff --git a/contrib/python/cffi/py3/cffi/_cffi_include.h b/contrib/python/cffi/py3/cffi/_cffi_include.h
index 908a1d7343f..c8c6d343bcc 100644
--- a/contrib/python/cffi/py3/cffi/_cffi_include.h
+++ b/contrib/python/cffi/py3/cffi/_cffi_include.h
@@ -28,8 +28,13 @@
#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API)
# ifdef _MSC_VER
# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
+# if !defined(Py_GIL_DISABLED)
+# define Py_LIMITED_API
+# else
+# define Py_LIMITED_API 0x030f0000
+# endif
# endif
+
# include <pyconfig.h>
/* sanity-check: Py_LIMITED_API will cause crashes if any of these
are also defined. Normally, the Python file PC/pyconfig.h does not
@@ -49,7 +54,11 @@
# else
# include <pyconfig.h>
# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
+# if !defined(Py_GIL_DISABLED)
+# define Py_LIMITED_API
+# else
+# define Py_LIMITED_API 0x030f0000
+# endif
# endif
# endif
#endif
@@ -59,6 +68,9 @@
extern "C" {
#endif
#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "parse_c_type.h"
/* this block of #ifs should be kept exactly identical between
@@ -128,13 +140,9 @@ extern "C" {
#ifndef PYPY_VERSION
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
#define _cffi_from_c_double PyFloat_FromDouble
#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
+#define _cffi_from_c_long PyLong_FromLong
#define _cffi_from_c_ulong PyLong_FromUnsignedLong
#define _cffi_from_c_longlong PyLong_FromLongLong
#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
@@ -146,12 +154,12 @@ extern "C" {
#define _cffi_from_c_int(x, type) \
(((type)-1) > 0 ? /* unsigned */ \
(sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
+ PyLong_FromLong((long)x) : \
sizeof(type) == sizeof(long) ? \
PyLong_FromUnsignedLong((unsigned long)x) : \
PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
(sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
+ PyLong_FromLong((long)x) : \
PyLong_FromLongLong((long long)x)))
#define _cffi_to_c_int(o, type) \
diff --git a/contrib/python/cffi/py3/cffi/_embedding.h b/contrib/python/cffi/py3/cffi/_embedding.h
index 64c04f67cac..12ff017fb83 100644
--- a/contrib/python/cffi/py3/cffi/_embedding.h
+++ b/contrib/python/cffi/py3/cffi/_embedding.h
@@ -177,9 +177,6 @@ static int _cffi_initialize_python(void)
if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0)
goto error;
x = PyEval_EvalCode(
-#if PY_MAJOR_VERSION < 3
- (PyCodeObject *)
-#endif
pycode, global_dict, global_dict);
if (x == NULL)
goto error;
@@ -225,7 +222,7 @@ static int _cffi_initialize_python(void)
if (f != NULL && f != Py_None) {
PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
- "\ncompiled with cffi version: 2.0.0"
+ "\ncompiled with cffi version: 2.1.0"
"\n_cffi_backend module: ", f);
modules = PyImport_GetModuleDict();
mod = PyDict_GetItemString(modules, "_cffi_backend");
@@ -247,10 +244,6 @@ static int _cffi_initialize_python(void)
goto done;
}
-#if PY_VERSION_HEX < 0x03080000
-PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */
-#endif
-
static int _cffi_carefully_make_gil(void)
{
/* This does the basic initialization of Python. It can be called
@@ -295,27 +288,6 @@ static int _cffi_carefully_make_gil(void)
*/
#ifdef WITH_THREAD
-# if PY_VERSION_HEX < 0x03080000
- char *volatile *lock = (char *volatile *)_PyParser_TokenNames;
- char *old_value, *locked_value;
-
- while (1) { /* spin loop */
- old_value = *lock;
- locked_value = old_value + 1;
- if (old_value[0] == 'E') {
- assert(old_value[1] == 'N');
- if (cffi_compare_and_swap(lock, old_value, locked_value))
- break;
- }
- else {
- assert(old_value[0] == 'N');
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: PyEval_InitThreads() should be very fast, and
- this is only run at start-up anyway. */
- }
- }
-# else
# if PY_VERSION_HEX < 0x030C0000
int volatile *lock = (int volatile *)&PyCapsule_Type.tp_version_tag;
int old_value, locked_value = -42;
@@ -348,26 +320,16 @@ static int _cffi_carefully_make_gil(void)
this is only run at start-up anyway. */
}
}
-# endif
#endif
/* call Py_InitializeEx() */
if (!Py_IsInitialized()) {
_cffi_py_initialize();
-#if PY_VERSION_HEX < 0x03070000
- PyEval_InitThreads();
-#endif
PyEval_SaveThread(); /* release the GIL */
/* the returned tstate must be the one that has been stored into the
autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */
}
else {
-#if PY_VERSION_HEX < 0x03070000
- /* PyEval_InitThreads() is always a no-op from CPython 3.7 */
- PyGILState_STATE state = PyGILState_Ensure();
- PyEval_InitThreads();
- PyGILState_Release(state);
-#endif
}
#ifdef WITH_THREAD
diff --git a/contrib/python/cffi/py3/cffi/api.py b/contrib/python/cffi/py3/cffi/api.py
index 5a474f3da92..ec8ee7dfd2b 100644
--- a/contrib/python/cffi/py3/cffi/api.py
+++ b/contrib/python/cffi/py3/cffi/api.py
@@ -4,13 +4,6 @@ from .error import CDefError
from . import model
try:
- callable
-except NameError:
- # Python 3.1
- from collections import Callable
- callable = lambda x: isinstance(x, Callable)
-
-try:
basestring
except NameError:
# Python 3.x
@@ -20,7 +13,7 @@ _unspecified = object()
-class FFI(object):
+class FFI:
r'''
The main top-level class that you instantiate once, or once per module.
@@ -414,7 +407,7 @@ class FFI(object):
if (replace_with.startswith('*')
and '&[' in self._backend.getcname(cdecl, '&')):
replace_with = '(%s)' % replace_with
- elif replace_with and not replace_with[0] in '[(':
+ elif replace_with and replace_with[0] not in '[(':
replace_with = ' ' + replace_with
return self._backend.getcname(cdecl, replace_with)
@@ -909,7 +902,7 @@ def _make_ffi_library(ffi, libname, flags):
raise AttributeError(name)
accessors[name](name)
#
- class FFILibrary(object):
+ class FFILibrary:
def __getattr__(self, name):
make_accessor(name)
return getattr(self, name)
diff --git a/contrib/python/cffi/py3/cffi/backend_ctypes.py b/contrib/python/cffi/py3/cffi/backend_ctypes.py
index e7956a79cfb..12cd16259db 100644
--- a/contrib/python/cffi/py3/cffi/backend_ctypes.py
+++ b/contrib/python/cffi/py3/cffi/backend_ctypes.py
@@ -12,7 +12,7 @@ else:
class CTypesType(type):
pass
-class CTypesData(object):
+class CTypesData:
__metaclass__ = CTypesType
__slots__ = ['__weakref__']
__name__ = '<cdata>'
@@ -270,7 +270,7 @@ class CTypesBaseStructOrUnion(CTypesData):
return CTypesData.__repr__(self, c_name or self._get_c_name(' &'))
-class CTypesBackend(object):
+class CTypesBackend:
PRIMITIVE_TYPES = {
'char': ctypes.c_char,
@@ -336,7 +336,6 @@ class CTypesBackend(object):
if novalue is not None:
raise TypeError("None expected, got %s object" %
(type(novalue).__name__,))
- return None
CTypesVoid._fix_class()
return CTypesVoid
@@ -387,7 +386,7 @@ class CTypesBackend(object):
return ctype()
return ctype(CTypesPrimitive._to_ctypes(init))
- if kind == 'int' or kind == 'byte':
+ if kind in {'int', 'byte'}:
@classmethod
def _cast_from(cls, source):
source = _cast_source_to_int(source)
@@ -435,7 +434,7 @@ class CTypesBackend(object):
_cast_to_integer = __int__
- if kind == 'int' or kind == 'byte' or kind == 'bool':
+ if kind in {'int', 'byte', 'bool'}:
@staticmethod
def _to_ctypes(x):
if not isinstance(x, (int, long)):
@@ -558,15 +557,15 @@ class CTypesBackend(object):
def __setitem__(self, index, value):
self._as_ctype_ptr[index] = BItem._to_ctypes(value)
- if kind == 'charp' or kind == 'voidp':
+ if kind in {'charp', 'voidp'}:
@classmethod
def _arg_to_ctypes(cls, *value):
if value and isinstance(value[0], bytes):
return ctypes.c_char_p(value[0])
else:
- return super(CTypesPtr, cls)._arg_to_ctypes(*value)
+ return super()._arg_to_ctypes(*value)
- if kind == 'charp' or kind == 'bytep':
+ if kind in {'charp', 'bytep'}:
def _to_string(self, maxlen):
if maxlen < 0:
maxlen = sys.maxsize
@@ -581,7 +580,7 @@ class CTypesBackend(object):
if getattr(self, '_own', False):
return 'owning %d bytes' % (
ctypes.sizeof(self._as_ctype_ptr.contents),)
- return super(CTypesPtr, self)._get_own_repr()
+ return super()._get_own_repr()
#
if (BItem is self.ffi._get_cached_btype(model.void_type) or
BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))):
@@ -663,7 +662,7 @@ class CTypesBackend(object):
raise IndexError
self._blob[index] = BItem._to_ctypes(value)
- if kind == 'char' or kind == 'byte':
+ if kind in {'char', 'byte'}:
def _to_string(self, maxlen):
if maxlen < 0:
maxlen = len(self._blob)
@@ -677,7 +676,7 @@ class CTypesBackend(object):
def _get_own_repr(self):
if getattr(self, '_own', False):
return 'owning %d bytes' % (ctypes.sizeof(self._blob),)
- return super(CTypesArray, self)._get_own_repr()
+ return super()._get_own_repr()
def _convert_to_address(self, BClass):
if BClass in (CTypesPtr, None) or BClass._automatic_casts:
@@ -917,7 +916,7 @@ class CTypesBackend(object):
def _get_own_repr(self):
if getattr(self, '_own_callback', None) is not None:
return 'calling %r' % (self._own_callback,)
- return super(CTypesFunctionPtr, self)._get_own_repr()
+ return super()._get_own_repr()
def __call__(self, *args):
if has_varargs:
@@ -1094,7 +1093,7 @@ class CTypesBackend(object):
return BTypePtr._from_ctypes(ptr)
-class CTypesLibrary(object):
+class CTypesLibrary:
def __init__(self, backend, cdll):
self.backend = backend
diff --git a/contrib/python/cffi/py3/cffi/cffi_opcode.py b/contrib/python/cffi/py3/cffi/cffi_opcode.py
index 6421df62134..c964ba13e69 100644
--- a/contrib/python/cffi/py3/cffi/cffi_opcode.py
+++ b/contrib/python/cffi/py3/cffi/cffi_opcode.py
@@ -1,6 +1,6 @@
from .error import VerificationError
-class CffiOp(object):
+class CffiOp:
def __init__(self, op, arg):
self.op = op
self.arg = arg
diff --git a/contrib/python/cffi/py3/cffi/cparser.py b/contrib/python/cffi/py3/cffi/cparser.py
index dd590d8743d..1896b7ef5dc 100644
--- a/contrib/python/cffi/py3/cffi/cparser.py
+++ b/contrib/python/cffi/py3/cffi/cparser.py
@@ -292,7 +292,7 @@ def _common_type_names(csource):
return words_used
-class Parser(object):
+class Parser:
def __init__(self):
self._declarations = {}
@@ -804,11 +804,10 @@ class Parser(object):
raise AssertionError("kind = %r" % (kind,))
if name is not None:
self._declare(key, tp)
- else:
- if kind == 'enum' and type.values is not None:
- raise NotImplementedError(
- "enum %s: the '{}' declaration should appear on the first "
- "time the enum is mentioned, not later" % explicit_name)
+ elif kind == 'enum' and type.values is not None:
+ raise NotImplementedError(
+ "enum %s: the '{}' declaration should appear on the first "
+ "time the enum is mentioned, not later" % explicit_name)
if not tp.forcename:
tp.force_the_name(force_name)
if tp.forcename and '$' in tp.name:
diff --git a/contrib/python/cffi/py3/cffi/gen_src.py b/contrib/python/cffi/py3/cffi/gen_src.py
new file mode 100644
index 00000000000..8eb57b16952
--- /dev/null
+++ b/contrib/python/cffi/py3/cffi/gen_src.py
@@ -0,0 +1,5 @@
+"""Entry point so ``python -m cffi.gen_src`` works."""
+
+if __name__ == '__main__':
+ from cffi._cffi_gen_src import run
+ run()
diff --git a/contrib/python/cffi/py3/cffi/model.py b/contrib/python/cffi/py3/cffi/model.py
index e5f4cae3e84..8bade1d6dca 100644
--- a/contrib/python/cffi/py3/cffi/model.py
+++ b/contrib/python/cffi/py3/cffi/model.py
@@ -22,7 +22,7 @@ def qualify(quals, replace_with):
return replace_with
-class BaseTypeByIdentity(object):
+class BaseTypeByIdentity:
is_array_type = False
is_raw_function = False
@@ -34,7 +34,7 @@ class BaseTypeByIdentity(object):
if replace_with:
if replace_with.startswith('*') and '&[' in result:
replace_with = '(%s)' % replace_with
- elif not replace_with[0] in '[(':
+ elif replace_with[0] not in '[(':
replace_with = ' ' + replace_with
replace_with = qualify(quals, replace_with)
result = result.replace('&', replace_with)
@@ -371,8 +371,7 @@ class StructOrUnion(StructOrUnionOrEnum):
if (name == '' and isinstance(type, StructOrUnion)
and expand_anonymous_struct_union):
# nested anonymous struct/union
- for result in type.enumfields():
- yield result
+ yield from type.enumfields()
else:
yield (name, type, bitsize, quals)
diff --git a/contrib/python/cffi/py3/cffi/pkgconfig.py b/contrib/python/cffi/py3/cffi/pkgconfig.py
index 5c93f15a60e..e1034ad68a6 100644
--- a/contrib/python/cffi/py3/cffi/pkgconfig.py
+++ b/contrib/python/cffi/py3/cffi/pkgconfig.py
@@ -31,7 +31,7 @@ def call(libname, flag, encoding=sys.getfilesystemencoding()):
a.append(libname)
try:
pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- except EnvironmentError as e:
+ except OSError as e:
raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),))
bout, berr = pc.communicate()
diff --git a/contrib/python/cffi/py3/cffi/recompiler.py b/contrib/python/cffi/py3/cffi/recompiler.py
index 25bf9e91d9e..fbafc011c97 100644
--- a/contrib/python/cffi/py3/cffi/recompiler.py
+++ b/contrib/python/cffi/py3/cffi/recompiler.py
@@ -7,9 +7,11 @@ VERSION_BASE = 0x2601
VERSION_EMBEDDED = 0x2701
VERSION_CHAR16CHAR32 = 0x2801
+FREE_THREADED_BUILD = sysconfig.get_config_var("Py_GIL_DISABLED")
USE_LIMITED_API = ((sys.platform != 'win32' or sys.version_info < (3, 0) or
sys.version_info >= (3, 5)) and
- not sysconfig.get_config_var("Py_GIL_DISABLED")) # free-threaded doesn't yet support limited API
+ # free-threaded build doesn't support the stable ABI until Python 3.15
+ (not FREE_THREADED_BUILD or sys.version_info >= (3, 15)))
class GlobalExpr:
def __init__(self, name, address, type_op, size=0, check_value=0):
@@ -93,9 +95,18 @@ class EnumExpr:
self.allenums = allenums
def as_c_expr(self):
- return (' { "%s", %d, _cffi_prim_int(%s, %s),\n'
- ' "%s" },' % (self.name, self.type_index,
- self.size, self.signed, self.allenums))
+ lines = [' { "%s", %d, _cffi_prim_int(%s, %s),' % (self.name, self.type_index,
+ self.size, self.signed,)]
+ pending = 0
+ while len(self.allenums) > pending + 110:
+ j = self.allenums.find(',', pending + 100)
+ if j < 0:
+ break
+ j += 1
+ lines.append(' "%s"' % (self.allenums[pending:j],))
+ pending = j
+ lines.append(' "%s" },' % (self.allenums[pending:],))
+ return '\n'.join(lines)
def as_python_expr(self):
prim_index = {
@@ -315,11 +326,8 @@ class Recompiler:
prnt('#ifdef PYPY_VERSION')
prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % (
base_module_name,))
- prnt('#elif PY_MAJOR_VERSION >= 3')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % (
- base_module_name,))
prnt('#else')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % (
+ prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % (
base_module_name,))
prnt('#endif')
lines = self._rel_readlines('_embedding.h')
@@ -427,35 +435,22 @@ class Recompiler:
prnt(' }')
prnt(' p[0] = (const void *)0x%x;' % self._version)
prnt(' p[1] = &_cffi_type_context;')
- prnt('#if PY_MAJOR_VERSION >= 3')
prnt(' return NULL;')
- prnt('#endif')
prnt('}')
# on Windows, distutils insists on putting init_cffi_xyz in
# 'export_symbols', so instead of fighting it, just give up and
# give it one
prnt('# ifdef _MSC_VER')
prnt(' PyMODINIT_FUNC')
- prnt('# if PY_MAJOR_VERSION >= 3')
prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,))
- prnt('# else')
- prnt(' init%s(void) { }' % (base_module_name,))
prnt('# endif')
- prnt('# endif')
- prnt('#elif PY_MAJOR_VERSION >= 3')
+ prnt('#else')
prnt('PyMODINIT_FUNC')
prnt('PyInit_%s(void)' % (base_module_name,))
prnt('{')
prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
self.module_name, self._version))
prnt('}')
- prnt('#else')
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % (base_module_name,))
- prnt('{')
- prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
- self.module_name, self._version))
- prnt('}')
prnt('#endif')
prnt()
prnt('#ifdef __GNUC__')
@@ -552,8 +547,7 @@ class Recompiler:
tovar, errcode)
return
#
- elif (isinstance(tp, model.StructOrUnionOrEnum) or
- isinstance(tp, model.BasePrimitiveType)):
+ elif (isinstance(tp, (model.StructOrUnionOrEnum, model.BasePrimitiveType))):
# a struct (not a struct pointer) as a function argument;
# or, a complex (the same code works)
self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)'
@@ -1313,10 +1307,6 @@ class Recompiler:
s = s.encode('utf-8') # -> bytes
else:
s.decode('utf-8') # got bytes, check for valid utf-8
- try:
- s.decode('ascii')
- except UnicodeDecodeError:
- s = b'# -*- encoding: utf8 -*-\n' + s
for line in s.splitlines(True):
comment = line
if type('//') is bytes: # python2
@@ -1415,7 +1405,7 @@ else:
def write(self, s):
if isinstance(s, unicode):
s = s.encode('ascii')
- super(NativeIO, self).write(s)
+ super().write(s)
def _is_file_like(maybefile):
# compare to xml.etree.ElementTree._get_writer
@@ -1437,11 +1427,11 @@ def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose):
try:
with open(target_file, 'r') as f1:
if f1.read(len(output) + 1) != output:
- raise IOError
+ raise OSError
if verbose:
print("(already up-to-date)")
return False # already up-to-date
- except IOError:
+ except OSError:
tmp_file = '%s.~%d' % (target_file, os.getpid())
with open(tmp_file, 'w') as f1:
f1.write(output)
diff --git a/contrib/python/cffi/py3/cffi/setuptools_ext.py b/contrib/python/cffi/py3/cffi/setuptools_ext.py
index 5cdd246fb4d..946afb45a6b 100644
--- a/contrib/python/cffi/py3/cffi/setuptools_ext.py
+++ b/contrib/python/cffi/py3/cffi/setuptools_ext.py
@@ -105,10 +105,12 @@ def _set_py_limited_api(Extension, kwds):
kwds['py_limited_api'] = True
if sysconfig.get_config_var("Py_GIL_DISABLED"):
- if kwds.get('py_limited_api'):
- log.info("Ignoring py_limited_api=True for free-threaded build.")
-
- kwds['py_limited_api'] = False
+ if sys.version_info < (3, 15):
+ if kwds.get('py_limited_api'):
+ log.info("Ignoring py_limited_api=True for free-threaded build.")
+ kwds['py_limited_api'] = False
+ else:
+ kwds.setdefault("define_macros", []).append(("Py_TARGET_ABI3T", "0x030f0000"))
if kwds.get('py_limited_api') is False:
# avoid setting Py_LIMITED_API if py_limited_api=False
diff --git a/contrib/python/cffi/py3/cffi/vengine_cpy.py b/contrib/python/cffi/py3/cffi/vengine_cpy.py
index 02e6a471d04..4d2ea43e5d9 100644
--- a/contrib/python/cffi/py3/cffi/vengine_cpy.py
+++ b/contrib/python/cffi/py3/cffi/vengine_cpy.py
@@ -7,7 +7,7 @@ from .error import VerificationError
from . import _imp_emulation as imp
-class VCPythonEngine(object):
+class VCPythonEngine:
_class_key = 'x'
_gen_python_module = True
@@ -102,8 +102,6 @@ class VCPythonEngine(object):
# standard init.
modname = self.verifier.get_module_name()
constants = self._chained_list_constants[False]
- prnt('#if PY_MAJOR_VERSION >= 3')
- prnt()
prnt('static struct PyModuleDef _cffi_module_def = {')
prnt(' PyModuleDef_HEAD_INIT,')
prnt(' "%s",' % modname)
@@ -130,21 +128,6 @@ class VCPythonEngine(object):
prnt(' return lib;')
prnt('}')
prnt()
- prnt('#else')
- prnt()
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % modname)
- prnt('{')
- prnt(' PyObject *lib;')
- prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname)
- prnt(' if (lib == NULL)')
- prnt(' return;')
- prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,))
- prnt(' return;')
- prnt(' return;')
- prnt('}')
- prnt()
- prnt('#endif')
def load_library(self, flags=None):
# XXX review all usages of 'self' here!
@@ -183,7 +166,7 @@ class VCPythonEngine(object):
# it will invoke the chained list of functions that will really
# build (notably) the constant objects, as <cdata> if they are
# pointers, and store them as attributes on the 'library' object.
- class FFILibrary(object):
+ class FFILibrary:
_cffi_python_module = module
_cffi_ffi = self.ffi
_cffi_dir = []
@@ -873,21 +856,9 @@ cffimod_header = r'''
# define _cffi_double_complex_t double _Complex
#endif
-#if PY_MAJOR_VERSION < 3
-# undef PyCapsule_CheckExact
-# undef PyCapsule_GetPointer
-# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule))
-# define PyCapsule_GetPointer(capsule, name) \
- (PyCObject_AsVoidPtr(capsule))
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
#define _cffi_from_c_double PyFloat_FromDouble
#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
+#define _cffi_from_c_long PyLong_FromLong
#define _cffi_from_c_ulong PyLong_FromUnsignedLong
#define _cffi_from_c_longlong PyLong_FromLongLong
#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
@@ -899,21 +870,21 @@ cffimod_header = r'''
#define _cffi_from_c_int_const(x) \
(((x) > 0) ? \
((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \
- PyInt_FromLong((long)(x)) : \
+ PyLong_FromLong((long)(x)) : \
PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \
((long long)(x) >= (long long)LONG_MIN) ? \
- PyInt_FromLong((long)(x)) : \
+ PyLong_FromLong((long)(x)) : \
PyLong_FromLongLong((long long)(x)))
#define _cffi_from_c_int(x, type) \
(((type)-1) > 0 ? /* unsigned */ \
(sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
+ PyLong_FromLong((long)x) : \
sizeof(type) == sizeof(long) ? \
PyLong_FromUnsignedLong((unsigned long)x) : \
PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
(sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
+ PyLong_FromLong((long)x) : \
PyLong_FromLongLong((long long)x)))
#define _cffi_to_c_int(o, type) \
diff --git a/contrib/python/cffi/py3/cffi/vengine_gen.py b/contrib/python/cffi/py3/cffi/vengine_gen.py
index bffc82122c3..0209c794ac7 100644
--- a/contrib/python/cffi/py3/cffi/vengine_gen.py
+++ b/contrib/python/cffi/py3/cffi/vengine_gen.py
@@ -8,7 +8,7 @@ from . import model
from .error import VerificationError
-class VGenericEngine(object):
+class VGenericEngine:
_class_key = 'g'
_gen_python_module = False
diff --git a/contrib/python/cffi/py3/cffi/verifier.py b/contrib/python/cffi/py3/cffi/verifier.py
index e392a2b7fda..96baadb6f76 100644
--- a/contrib/python/cffi/py3/cffi/verifier.py
+++ b/contrib/python/cffi/py3/cffi/verifier.py
@@ -24,10 +24,10 @@ else:
def write(self, s):
if isinstance(s, unicode):
s = s.encode('ascii')
- super(NativeIO, self).write(s)
+ super().write(s)
-class Verifier(object):
+class Verifier:
def __init__(self, ffi, preamble, tmpdir=None, modulename=None,
ext_package=None, tag='', force_generic_engine=False,
@@ -182,7 +182,7 @@ class Verifier(object):
# Determine if this matches the current file
if os.path.exists(self.sourcefilename):
with open(self.sourcefilename, "r") as fp:
- needs_written = not (fp.read() == source_data)
+ needs_written = fp.read() != source_data
else:
needs_written = True
diff --git a/contrib/python/cffi/py3/patches/01-arcadia.patch b/contrib/python/cffi/py3/patches/01-arcadia.patch
index 23331873652..8ab50be29d7 100644
--- a/contrib/python/cffi/py3/patches/01-arcadia.patch
+++ b/contrib/python/cffi/py3/patches/01-arcadia.patch
@@ -92,16 +92,8 @@
if (*w > 0xFFFF) {
--- contrib/python/cffi/py3/cffi/recompiler.py (index)
+++ contrib/python/cffi/py3/cffi/recompiler.py (working tree)
-@@ -287,10 +287,8 @@ class Recompiler:
- self.write_c_source_to_f(f, preamble)
-
- def _rel_readlines(self, filename):
-- g = open(os.path.join(os.path.dirname(__file__), filename), 'r')
-- lines = g.readlines()
-- g.close()
-- return lines
+@@ -287,2 +287,2 @@ class Recompiler:
+- with open(os.path.join(os.path.dirname(__file__), filename), 'r') as g:
+- return g.readlines()
+ import pkgutil
+ return pkgutil.get_data('cffi', filename).decode('utf-8').splitlines(True)
-
- def write_c_source_to_f(self, f, preamble):
- self._f = f
diff --git a/contrib/python/cffi/py3/ya.make b/contrib/python/cffi/py3/ya.make
index d2eb8e11ad8..a526c12160c 100644
--- a/contrib/python/cffi/py3/ya.make
+++ b/contrib/python/cffi/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(2.0.0)
+VERSION(2.1.0)
LICENSE(MIT)
@@ -31,6 +31,7 @@ PY_REGISTER(
PY_SRCS(
TOP_LEVEL
cffi/__init__.py
+ cffi/_cffi_gen_src.py
cffi/_imp_emulation.py
cffi/_shimmed_dist_utils.py
cffi/api.py
@@ -40,6 +41,7 @@ PY_SRCS(
cffi/cparser.py
cffi/error.py
cffi/ffiplatform.py
+ cffi/gen_src.py
cffi/lock.py
cffi/model.py
cffi/pkgconfig.py