Cython 3.2.3__py3-none-any.whl → 3.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Cython/Compiler/Code.py CHANGED
@@ -2422,7 +2422,17 @@ class GlobalState:
2422
2422
  writer.putln(f"PyObject **table = {array_cname};")
2423
2423
  writer.putln(f"for (Py_ssize_t i=0; i<{constant_count}; ++i) {{")
2424
2424
  writer.putln("#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING")
2425
+ # We don't want to set the refcount on shared constants (e.g. cached integers)
2426
+ # because setting the refcount isn't thread-safe. The chances are that most of the constants
2427
+ # that this applies to are already immortal though so that isn't a great loss.
2428
+ writer.putln("#if PY_VERSION_HEX < 0x030E0000")
2429
+ writer.putln("if (_Py_IsOwnedByCurrentThread(table[i]) && Py_REFCNT(table[i]) == 1)")
2430
+ writer.putln("#else")
2431
+ writer.putln("if (PyUnstable_Object_IsUniquelyReferenced(table[i]))")
2432
+ writer.putln("#endif")
2433
+ writer.putln("{")
2425
2434
  writer.putln("Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);")
2435
+ writer.putln("}")
2426
2436
  writer.putln("#else")
2427
2437
  writer.putln("Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);")
2428
2438
  writer.putln("#endif")
@@ -10491,8 +10491,8 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
10491
10491
  defaults = '__Pyx_CyFunction_Defaults(struct %s, %s)' % (
10492
10492
  self.defaults_entry.type.objstruct_cname, self.result())
10493
10493
  for arg, entry in self.defaults:
10494
- arg.generate_assignment_code(code, target='%s->%s' % (
10495
- defaults, entry.cname))
10494
+ if arg.is_dynamic:
10495
+ arg.generate_assignment_code(code, cyfunc_struct_target=f'{defaults}->{entry.cname}')
10496
10496
 
10497
10497
  if self.defaults_tuple:
10498
10498
  code.putln('__Pyx_CyFunction_SetDefaultsTuple(%s, %s);' % (
@@ -337,7 +337,8 @@ class NameAssignment:
337
337
  self.is_arg = False
338
338
  self.is_deletion = False
339
339
  self.inferred_type = None
340
- # For generator expression targets, the rhs can have a different scope than the lhs.
340
+ # For generator expression targets in comprehensions (and possibly other things),
341
+ # the rhs can have a different scope than the lhs.
341
342
  self.rhs_scope = rhs_scope
342
343
 
343
344
  def __repr__(self):
@@ -804,7 +805,7 @@ class ControlFlowAnalysis(CythonTransform):
804
805
  entry = self.env.lookup(lhs.name)
805
806
  if entry is None: # TODO: This shouldn't happen...
806
807
  return
807
- self.flow.mark_assignment(lhs, rhs, entry, rhs_scope=rhs_scope)
808
+ self.flow.mark_assignment(lhs, rhs, entry, rhs_scope=(rhs_scope or self.env))
808
809
  elif lhs.is_sequence_constructor:
809
810
  for i, arg in enumerate(lhs.args):
810
811
  if arg.is_starred:
Cython/Compiler/Nodes.py CHANGED
@@ -1078,12 +1078,14 @@ class CArgDeclNode(Node):
1078
1078
  if self.default:
1079
1079
  self.default.annotate(code)
1080
1080
 
1081
- def generate_assignment_code(self, code, target=None, overloaded_assignment=False):
1081
+ def generate_assignment_code(self, code, overloaded_assignment=False,
1082
+ cyfunc_struct_target=None):
1082
1083
  default = self.default
1083
- if default is None or default.is_literal:
1084
+ if default is None or (default.is_literal and cyfunc_struct_target is None):
1084
1085
  return
1085
- if target is None:
1086
- target = self.calculate_default_value_code(code)
1086
+ # Note that even if self.is_dynamic, default may be a literal if it's been
1087
+ # optimized into a literal after analyse_expressions
1088
+ target = cyfunc_struct_target or self.calculate_default_value_code(code)
1087
1089
  default.generate_evaluation_code(code)
1088
1090
  default.make_owned_reference(code)
1089
1091
  result = default.result() if overloaded_assignment else default.result_as(self.type)
@@ -357,7 +357,7 @@ directive_types = {
357
357
  'auto_pickle': bool,
358
358
  'locals': dict,
359
359
  'final' : bool, # final cdef classes and methods
360
- 'collection_type': one_of('sequence'),
360
+ 'collection_type': one_of('sequence', 'mapping'),
361
361
  'nogil' : DEFER_ANALYSIS_OF_ARGUMENTS,
362
362
  'gil' : DEFER_ANALYSIS_OF_ARGUMENTS,
363
363
  'critical_section' : DEFER_ANALYSIS_OF_ARGUMENTS,
@@ -1397,6 +1397,8 @@ class InterpretCompilerDirectives(CythonTransform):
1397
1397
  elif isinstance(old_value, list):
1398
1398
  old_value.extend(value)
1399
1399
  else:
1400
+ if name == "collection_type" and value != optdict[name]:
1401
+ error(node.pos, "Multiple values of collection_type are not supported")
1400
1402
  optdict[name] = value
1401
1403
  else:
1402
1404
  optdict[name] = value
@@ -2323,7 +2325,7 @@ if VALUE is not None:
2323
2325
 
2324
2326
  members = ', '.join(f'self.{v}' for v in all_members_names) + (',' if len(all_members_names) == 1 else '')
2325
2327
  # Even better, we could check PyType_IS_GC.
2326
- any_notnone_members = ' or '.join([f'self.{e.name} is not None' for e in all_members if e.type.is_pyobject] or ['False']),
2328
+ any_notnone_members = ' or '.join([f'self.{e.name} is not None' for e in all_members if e.type.is_pyobject] or ['False'])
2327
2329
 
2328
2330
  pickle_code = f"""
2329
2331
  def __reduce_cython__(self):
@@ -550,7 +550,7 @@ def p_trailer(s: PyrexScanner, node1):
550
550
  # star_expr )
551
551
 
552
552
  @cython.cfunc
553
- def p_call_parse_args(s: PyrexScanner, allow_genexp: cython.bint = True):
553
+ def p_call_parse_args(s: PyrexScanner, allow_genexp: cython.bint = True) -> tuple:
554
554
  # s.sy == '('
555
555
  s.next()
556
556
  positional_args = []
@@ -699,7 +699,7 @@ def p_subscript_list(s: PyrexScanner) -> tuple:
699
699
  #subscript: '.' '.' '.' | test | [test] ':' [test] [':' [test]]
700
700
 
701
701
  @cython.cfunc
702
- def p_subscript(s: PyrexScanner):
702
+ def p_subscript(s: PyrexScanner) -> list:
703
703
  # Parse a subscript and return a list of
704
704
  # 1, 2 or 3 ExprNodes, depending on how
705
705
  # many slice elements were encountered.
@@ -731,7 +731,7 @@ def expect_ellipsis(s: PyrexScanner):
731
731
 
732
732
 
733
733
  @cython.cfunc
734
- def make_slice_nodes(pos, subscripts):
734
+ def make_slice_nodes(pos, subscripts) -> list:
735
735
  # Convert a list of subscripts as returned
736
736
  # by p_subscript_list into a list of ExprNodes,
737
737
  # creating SliceNodes for elements with 2 or
@@ -1041,7 +1041,7 @@ def p_string_literal_shared_read(
1041
1041
  return result
1042
1042
 
1043
1043
  @cython.cfunc
1044
- def _validate_kind_string(pos, systring: str):
1044
+ def _validate_kind_string(pos, systring: str) -> str:
1045
1045
  kind_string = systring.rstrip('"\'').lower()
1046
1046
  if len(kind_string) <= 1 or (len(kind_string) == 2 and kind_string in "rbrurfrtr"):
1047
1047
  return kind_string
@@ -1137,7 +1137,7 @@ def p_string_literal(s: PyrexScanner, kind_override=None) -> tuple:
1137
1137
 
1138
1138
 
1139
1139
  @cython.cfunc
1140
- def p_read_ft_string_expression(s: PyrexScanner):
1140
+ def p_read_ft_string_expression(s: PyrexScanner) -> str:
1141
1141
  strings = []
1142
1142
  while True:
1143
1143
  s.next()
@@ -1154,7 +1154,7 @@ def p_read_ft_string_expression(s: PyrexScanner):
1154
1154
  @cython.cfunc
1155
1155
  def p_ft_string_replacement_field(s: PyrexScanner,
1156
1156
  is_raw: cython.bint, is_single_quoted: cython.bint,
1157
- tf_string_kind: cython.Py_UCS4):
1157
+ tf_string_kind: cython.Py_UCS4) -> list:
1158
1158
  result = []
1159
1159
  conversion_char = format_spec = expr = None
1160
1160
  t_string_expression = None
@@ -1264,7 +1264,7 @@ def p_ft_string_replacement_field(s: PyrexScanner,
1264
1264
  def p_ft_string_middles(s: PyrexScanner,
1265
1265
  is_raw: cython.bint, is_single_quoted: cython.bint,
1266
1266
  is_format_string: cython.bint,
1267
- tf_string_kind: cython.Py_UCS4):
1267
+ tf_string_kind: cython.Py_UCS4) -> list:
1268
1268
  middles: list = []
1269
1269
  builder = StringEncoding.UnicodeLiteralBuilder()
1270
1270
  pos = s.position()
@@ -1302,7 +1302,7 @@ def p_ft_string_middles(s: PyrexScanner,
1302
1302
  return middles
1303
1303
 
1304
1304
  @cython.cfunc
1305
- def p_ft_string_literal(s: PyrexScanner):
1305
+ def p_ft_string_literal(s: PyrexScanner) -> tuple:
1306
1306
  # s.sy == BEGIN_FT_STRING
1307
1307
  kind_string = _validate_kind_string(s.position(), s.systring)
1308
1308
  tf_string_kind: cython.Py_UCS4 = 't' if 't' in kind_string else 'f'
@@ -1988,7 +1988,7 @@ def p_from_import_statement(s: PyrexScanner, first_statement: cython.bint = 0):
1988
1988
 
1989
1989
 
1990
1990
  @cython.cfunc
1991
- def p_imported_name(s: PyrexScanner):
1991
+ def p_imported_name(s: PyrexScanner) -> tuple:
1992
1992
  pos = s.position()
1993
1993
  name = p_ident(s)
1994
1994
  as_name = p_as_name(s)
@@ -2684,7 +2684,7 @@ def p_suite_with_docstring(s: PyrexScanner, ctx, with_doc_only: cython.bint = Fa
2684
2684
 
2685
2685
 
2686
2686
  @cython.cfunc
2687
- def p_positional_and_keyword_args(s: PyrexScanner, end_sy_set, templates = None):
2687
+ def p_positional_and_keyword_args(s: PyrexScanner, end_sy_set, templates = None) -> tuple:
2688
2688
  """
2689
2689
  Parses positional and keyword arguments. end_sy_set
2690
2690
  should contain any s.sy that terminate the argument list.
@@ -4713,7 +4713,7 @@ def p_class_pattern(s: PyrexScanner):
4713
4713
 
4714
4714
 
4715
4715
  @cython.cfunc
4716
- def p_keyword_pattern(s: PyrexScanner):
4716
+ def p_keyword_pattern(s: PyrexScanner) -> tuple:
4717
4717
  if s.sy != "IDENT":
4718
4718
  s.error("Expected identifier")
4719
4719
  arg = p_name(s, s.systring)
Cython/Compiler/Symtab.py CHANGED
@@ -1901,12 +1901,6 @@ class ModuleScope(Scope):
1901
1901
  if self.directives.get('final'):
1902
1902
  entry.type.is_final_type = True
1903
1903
  collection_type = self.directives.get('collection_type')
1904
- if collection_type:
1905
- from .UtilityCode import NonManglingModuleScope
1906
- if not isinstance(self, NonManglingModuleScope):
1907
- # TODO - DW would like to make it public, but I'm making it internal-only
1908
- # for now to avoid adding new features without consensus
1909
- error(pos, "'collection_type' is not a public cython directive")
1910
1904
  if collection_type == 'sequence':
1911
1905
  entry.type.has_sequence_flag = True
1912
1906
 
@@ -6,7 +6,47 @@ cdef extern from "<exception>" namespace "std" nogil:
6
6
 
7
7
  exception_ptr make_exception_ptr[E](E e) noexcept
8
8
  void rethrow_exception(exception_ptr) except +
9
- # current_exception skipped because it'll be almost impossible to use from Cython
9
+ exception_ptr current_exception() noexcept
10
+
11
+ cdef cppclass exception:
12
+ const char* what() noexcept
13
+
14
+ cdef extern from "<stdexcept>" namespace "std" nogil:
15
+ # Omitting the constructors of derived exception classes for now.
16
+ # They can't be stack-allocated easily in Cython because they don't have
17
+ # a nullary constructor. They also can't be thrown in Cython.
18
+ # So they're most useful just as class names when implementing
19
+ # exception handlers.
20
+ cdef cppclass logic_error(exception):
21
+ pass
22
+ cdef cppclass invalid_argument(logic_error):
23
+ pass
24
+ cdef cppclass domain_error(logic_error):
25
+ pass
26
+ cdef cppclass length_error(logic_error):
27
+ pass
28
+ cdef cppclass out_of_range(logic_error):
29
+ pass
30
+
31
+ cdef cppclass runtime_error(exception):
32
+ pass
33
+ cdef cppclass range_error(runtime_error):
34
+ pass
35
+ cdef cppclass overflow_error(runtime_error):
36
+ pass
37
+
38
+ cdef cppclass bad_typeid(exception):
39
+ pass
40
+
41
+ cdef cppclass bad_cast(exception):
42
+ pass
43
+
44
+ cdef cppclass bad_alloc(exception):
45
+ pass
46
+
47
+ cdef cppclass bad_exception(exception):
48
+ pass
49
+
10
50
 
11
51
  cdef extern from *:
12
52
  """
Cython/Shadow.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # cython.* namespace for pure mode.
2
2
 
3
3
  # Possible version formats: "3.1.0", "3.1.0a1", "3.1.0a1.dev0"
4
- __version__ = "3.2.3"
4
+ __version__ = "3.2.4"
5
5
 
6
6
 
7
7
  # BEGIN shameless copy from Cython/minivect/minitypes.py
@@ -103,7 +103,7 @@ class _Optimization:
103
103
  cclass = ccall = cfunc = _EmptyDecoratorAndManager()
104
104
 
105
105
  annotation_typing = returns = wraparound = boundscheck = initializedcheck = \
106
- nonecheck = embedsignature = cdivision = cdivision_warnings = \
106
+ nonecheck = embedsignature = cdivision = cdivision_warnings = collection_type = \
107
107
  always_allow_keywords = profile = linetrace = infer_types = \
108
108
  unraisable_tracebacks = freelist = auto_pickle = cpow = trashcan = \
109
109
  auto_cpdef = c_api_binop_methods = \
@@ -8,9 +8,7 @@ class TestShadow(unittest.TestCase):
8
8
  missing_directives = []
9
9
  extra_directives = []
10
10
  for full_directive in Options.directive_types.keys():
11
- # Python 2 doesn't support "directive, *rest = full_directive.split('.')"
12
- split_directive = full_directive.split('.')
13
- directive, rest = split_directive[0], split_directive[1:]
11
+ directive, *rest = full_directive.split('.')
14
12
 
15
13
  scope = Options.directive_scopes.get(full_directive)
16
14
  if scope and len(scope) == 1 and scope[0] == "module":
@@ -18,10 +16,6 @@ class TestShadow(unittest.TestCase):
18
16
  if hasattr(Shadow, directive):
19
17
  extra_directives.append(full_directive)
20
18
  continue
21
- if full_directive == "collection_type":
22
- # collection_type is current restricted to utility code only
23
- # so doesn't need to be in Shadow
24
- continue
25
19
  if full_directive == "staticmethod":
26
20
  # staticmethod is a weird special-case and not really intended to be
27
21
  # used from the cython module
Cython/Utility/Builtins.c CHANGED
@@ -631,13 +631,13 @@ static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *ke
631
631
 
632
632
  static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value) {
633
633
  PyObject* value;
634
- #if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX >= 0x030C0000
634
+ #if __PYX_LIMITED_VERSION_HEX >= 0x030F0000 || (!CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4)
635
+ PyDict_SetDefaultRef(d, key, default_value, &value);
636
+ #elif CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX >= 0x030C0000
635
637
  PyObject *args[] = {d, key, default_value};
636
638
  value = PyObject_VectorcallMethod(PYIDENT("setdefault"), args, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
637
639
  #elif CYTHON_COMPILING_IN_LIMITED_API
638
640
  value = PyObject_CallMethodObjArgs(d, PYIDENT("setdefault"), key, default_value, NULL);
639
- #elif PY_VERSION_HEX >= 0x030d0000
640
- PyDict_SetDefaultRef(d, key, default_value, &value);
641
641
  #else
642
642
  value = PyDict_SetDefault(d, key, default_value);
643
643
  if (unlikely(!value)) return NULL;
@@ -59,7 +59,7 @@ static PyObject *__Pyx_DecompressString(const char *s, Py_ssize_t length, int al
59
59
  //@requires: TypeConversion.c::GCCDiagnostics
60
60
 
61
61
  static PyObject *__Pyx_DecompressString(const char *s, Py_ssize_t length, int algo) {
62
- PyObject *module, *decompress, *compressed_bytes, *decompressed;
62
+ PyObject *module = NULL, *decompress, *compressed_bytes, *decompressed;
63
63
 
64
64
  const char* module_name = algo == 3 ? "compression.zstd" : algo == 2 ? "bz2" : "zlib";
65
65
 
@@ -69,7 +69,7 @@ static PyObject *__Pyx_DecompressString(const char *s, Py_ssize_t length, int al
69
69
  #if __PYX_LIMITED_VERSION_HEX >= 0x030e0000
70
70
  if (algo == 3) {
71
71
  PyObject *fromlist = Py_BuildValue("[O]", methodname);
72
- if (unlikely(!fromlist)) return NULL;
72
+ if (unlikely(!fromlist)) goto bad;
73
73
  module = PyImport_ImportModuleLevel("compression.zstd", NULL, NULL, fromlist, 0);
74
74
  Py_DECREF(fromlist);
75
75
  } else
@@ -0,0 +1,158 @@
1
+ Metadata-Version: 2.1
2
+ Name: Cython
3
+ Version: 3.2.4
4
+ Summary: The Cython compiler for writing C extensions in the Python language.
5
+ Home-page: https://cython.org/
6
+ Author: Robert Bradshaw, Stefan Behnel, David Woods, Greg Ewing, et al.
7
+ Author-email: cython-devel@python.org
8
+ License: Apache-2.0
9
+ Project-URL: Documentation, https://cython.readthedocs.io/
10
+ Project-URL: Donate, https://cython.readthedocs.io/en/latest/src/donating.html
11
+ Project-URL: Source Code, https://github.com/cython/cython
12
+ Project-URL: Bug Tracker, https://github.com/cython/cython/issues/
13
+ Project-URL: User Group, https://groups.google.com/g/cython-users
14
+ Classifier: Development Status :: 5 - Production/Stable
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: Implementation :: CPython
28
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
29
+ Classifier: Programming Language :: Python :: Implementation :: Stackless
30
+ Classifier: Programming Language :: C
31
+ Classifier: Programming Language :: C++
32
+ Classifier: Programming Language :: Cython
33
+ Classifier: Topic :: Software Development :: Code Generators
34
+ Classifier: Topic :: Software Development :: Compilers
35
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
36
+ Classifier: Typing :: Typed
37
+ Requires-Python: >=3.8
38
+ Description-Content-Type: text/x-rst
39
+
40
+ The Cython language makes writing C extensions for the Python language as
41
+ easy as Python itself. Cython is a source code translator based on Pyrex_,
42
+ but supports more cutting edge functionality and optimizations.
43
+
44
+ The Cython language is a superset of the Python language (almost all Python
45
+ code is also valid Cython code), but Cython additionally supports optional
46
+ static typing to natively call C functions, operate with C++ classes and
47
+ declare fast C types on variables and class attributes. This allows the
48
+ compiler to generate very efficient C code from Cython code.
49
+
50
+ This makes Cython the ideal language for writing glue code for external
51
+ C/C++ libraries, and for fast C modules that speed up the execution of
52
+ Python code.
53
+
54
+ The newest Cython release can always be downloaded from https://cython.org/.
55
+ Unpack the tarball or zip file, enter the directory, and then run::
56
+
57
+ pip install .
58
+
59
+ Note that for one-time builds, e.g. for CI/testing, on platforms that are not
60
+ covered by one of the wheel packages provided on PyPI *and* the pure Python wheel
61
+ that we provide is not used, it is substantially faster than a full source build
62
+ to install an uncompiled (slower) version of Cython with::
63
+
64
+ NO_CYTHON_COMPILE=true pip install .
65
+
66
+ .. _Pyrex: https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
67
+
68
+ 3.2.4 (2026-01-04)
69
+ ==================
70
+
71
+ Features added
72
+ --------------
73
+
74
+ * In preparation of Cython 3.3, a new decorator ``@collection_type(tname)`` can be used
75
+ to advertise an extension type as being a ``'sequence'`` or ``'mapping'``. This currently
76
+ only has the effect of setting the ``Py_TPFLAGS_SEQUENCE`` flag on the type or not, but
77
+ is provided for convenience to allow using the new decorator already in Cython 3.2 code.
78
+
79
+ * Several C++ exception declarations were added to ``libcpp.exceptions``.
80
+ (Github issue https://github.com/cython/cython/issues/7389)
81
+
82
+ Bugs fixed
83
+ ----------
84
+
85
+ * Pseudo-literal default values of function arguments like ``arg=str()`` could generate
86
+ invalid C code when internally converted into a real literal.
87
+ (Github issue https://github.com/cython/cython/issues/6192)
88
+
89
+ * The pickle serialisation of extension types using the ``auto_pickle`` feature was
90
+ larger than necessary since 3.2.0 for types without Python object attributes.
91
+ It is now back to the state before 3.2.0 again.
92
+ (Github issue https://github.com/cython/cython/issues/7443)
93
+
94
+ * Constants are now only made immortal on freethreading Python if they are not shared.
95
+ (Github issue https://github.com/cython/cython/issues/7439)
96
+
97
+ * ``PyDict_SetDefaultRef()`` is now used when available to avoid temporary borrowed references.
98
+ (Github issue https://github.com/cython/cython/issues/7347)
99
+
100
+ * Includes all fixes as of Cython 3.1.8.
101
+
102
+ 3.1.8 (2026-01-03):
103
+
104
+ * Assignment expressions used in comprehensions could look at the wrong scope,
105
+ thus using different variables and different data.
106
+ (Github issue https://github.com/cython/cython/issues/6547)
107
+
108
+ * Some internal C symbols were not declared as ``static``, preventing static linking
109
+ of multiple modules.
110
+ Patch by Yury Popov. (Github issue https://github.com/cython/cython/issues/7310)
111
+
112
+ * Accidentally using ``except +`` in C mode did not raise a compile error but generated
113
+ invalid C code leading to obscure error messages.
114
+ Patch by user202729. (Github issue https://github.com/cython/cython/issues/6560)
115
+
116
+ 3.1.7 (2025-11-12):
117
+
118
+ * Unicode characters formatted from C integers with padding, as in ``f"{value:XXc}"``,
119
+ could result in invalid Python string objects since Cython 3.1.0.
120
+ Also, lone surrogates failed to format in this way.
121
+ (Github issue https://github.com/cython/cython/issues/7298)
122
+
123
+ * Assigning nested structs from a list of structs (item by item) could crash Cython.
124
+ (Github issue https://github.com/cython/cython/issues/7308)
125
+
126
+ * Cython incorrectly called ``PyList_GetItemRef()`` in PyPy and GraalPython before Py3.13.
127
+ (Github issue https://github.com/cython/cython/issues/7269)
128
+
129
+ * Trying to instantiate internal types used by Cython is now prohibited.
130
+ (Github issue https://github.com/cython/cython/issues/7263)
131
+
132
+ 3.1.6 (2025-10-23):
133
+
134
+ * Unicode characters formatted from C integers with ``f"{value:c}"`` could result in
135
+ invalid Python string objects since Cython 3.1.0.
136
+ (Github issue https://github.com/cython/cython/issues/7240)
137
+
138
+ * ``cythonize`` (program and function) now uses ``concurrent.futures.ProcessPoolExecutor``
139
+ instead of ``multiprocessing.Pool`` to fix a hang on build failures in parallel builds.
140
+ A possible work-around is to disable parallel builds.
141
+ Patch by Sviatoslav Sydorenko. (Github issue https://github.com/cython/cython/issues/7183)
142
+
143
+ 3.1.5 (2025-10-20):
144
+
145
+ * Conversion from C++ strings longer than ``PY_SSIZE_T_MAX`` did not validate the length.
146
+
147
+ * Some non-Limited API code was incorrectly used in generated header files.
148
+ (Github issue https://github.com/cython/cython/issues/7157)
149
+
150
+ * Optimised unpacking of Python integers in expressions uses a slightly safer scheme.
151
+ (Github issue https://github.com/cython/cython/issues/7134)
152
+
153
+ * Empty return statements were not always reported when tracing.
154
+ (Github issue https://github.com/cython/cython/issues/7022)
155
+
156
+ * Value conversion errors when tracing C return statements no longer fail the trace
157
+ but fall back to reporting ``None`` returns instead.
158
+ (Github issue https://github.com/cython/cython/issues/6503)
@@ -2,7 +2,7 @@ cython.py,sha256=OTJCP0F_fecQWMsGOPJDuFU7brM1ScJAATH6ek98ho4,632
2
2
  Cython/CodeWriter.py,sha256=k1SAPvsjXum7dhX9IjZ3wXuDUOzzFKYEbNZSxMKEwos,24276
3
3
  Cython/Coverage.py,sha256=WGY5BW1nBcJ86f4Lrs6ZZIuFKCdngsEizs4Kor0iRsc,18783
4
4
  Cython/Debugging.py,sha256=vFtJhn7QstMf5gnYru2qHIz5ZjPg1KSlZVGHr-pBCwM,552
5
- Cython/Shadow.py,sha256=0K9vhws2gEekhrPAMzDGYmZK0Dp6oMu6hDUoY-if268,19632
5
+ Cython/Shadow.py,sha256=jz6jdcQf_U0c1hhGe-uyvG2MXY-uw_01IXPr6pGac64,19650
6
6
  Cython/Shadow.pyi,sha256=BaaRtWtFlBVM14LOD9ql-9Uw1UDZV3AOT2AWULk1WUw,18597
7
7
  Cython/StringIOTree.py,sha256=8u4R5jhUzqYvSX1w5_RrvxbgUvaMqW8jhQgXcCNKIkE,5570
8
8
  Cython/TestUtils.py,sha256=rph07UD41dNbdOjqQx_vNu2c0b3Ib1UeMxNYao_vxJU,15584
@@ -34,15 +34,15 @@ Cython/Compiler/Buffer.py,sha256=NMqvFYIofuS93840lWrNcvDXlBhuXgKLoEuMs0PffLk,269
34
34
  Cython/Compiler/Builtin.py,sha256=sfW7MGgRm39TG2QoTF0GPhIVVy_8gW-eylGFaLRiy8I,42433
35
35
  Cython/Compiler/CmdLine.py,sha256=6u--_tFCXMEjDQaqYXbH4AXed5jXcOhBWGefngFB_Aw,13339
36
36
  Cython/Compiler/Code.pxd,sha256=-bYyHehjGEiFoe8bqT-2djaHann3jnU86gVgymoIpL0,3918
37
- Cython/Compiler/Code.py,sha256=dBNNyklkMCzaIYIGvjp7yPi48xS87JwRDHT7fHyGTbs,144440
37
+ Cython/Compiler/Code.py,sha256=YzRbI3MUjNHLDep1KB3ib1AA-EOuenOnQJ7QJqkKwvU,145056
38
38
  Cython/Compiler/CodeGeneration.py,sha256=aEW8IwXvwEOsde0-RxvAi_cb8_qdaDGxH_nS_VFwKWc,1068
39
39
  Cython/Compiler/CythonScope.py,sha256=b_RU0YKr4UYzfrhAJE9xNdYAHi1H44hczsbBA9tiq6E,7325
40
40
  Cython/Compiler/Dataclass.py,sha256=NhP7E63rJzLpE98ZVrYCbNt-W0aYLh9r29e6yT0KnCQ,36595
41
41
  Cython/Compiler/DebugFlags.py,sha256=-ht7qWQyoJO6H5o0XJgwVjj5gWayuol-H2HoLqiCXsE,713
42
42
  Cython/Compiler/Errors.py,sha256=_qycMnE9-dH-uh--Wv20jFXlXkRl8UGIAsAdlIig9xM,9160
43
- Cython/Compiler/ExprNodes.py,sha256=jVQYixwSu_fx5tP7RKiu4RY3WOJzFpkccGvd2VZFT_8,635396
43
+ Cython/Compiler/ExprNodes.py,sha256=-GxXrFDaf_oX_GWAUE9AUkd_7Pilulb3YfeVOx7BthU,635422
44
44
  Cython/Compiler/FlowControl.pxd,sha256=0wDFfkjWddMSOjs76KQSePJBMS1CQk5RjESRHXRkYww,2499
45
- Cython/Compiler/FlowControl.py,sha256=P4L87MdPre8loo2U2-ruXFz3Pz7jkUJEpg10db76_Vg,50821
45
+ Cython/Compiler/FlowControl.py,sha256=MInme8kZXFVISMeKxmKHblHCNvHyzjwH5QL_jztFWmM,50891
46
46
  Cython/Compiler/FusedNode.py,sha256=gXGXpM6XPZtVT7fGr5g19Id0flqQf4OrcR5_zn1VP4Y,41407
47
47
  Cython/Compiler/Future.py,sha256=NFtSWCJYqPlEqWZ5Ob_bv_pDfW6iS7pPYWeGH1OGA5g,629
48
48
  Cython/Compiler/Interpreter.py,sha256=2C-tJZkVM_8PM48PF1QGJHy_ohTjkWKTc-xdaRTG6RQ,1831
@@ -53,20 +53,20 @@ Cython/Compiler/MatchCaseNodes.py,sha256=yVGVAsc1yrda1jHTAI7mZ2-SL67tNdcfOn-ugdC
53
53
  Cython/Compiler/MemoryView.py,sha256=pyy1oidHhmYAprfxjhX7fweDXzrxMkEbSICKFm2vd4o,31485
54
54
  Cython/Compiler/ModuleNode.py,sha256=KfHvXpp8G8S1i_1-xMwqzflqnDWMJRRSuvu0pZhGNWY,195154
55
55
  Cython/Compiler/Naming.py,sha256=xneFFCsB68xZhghXAxA2GnRrooWMumxss20B1I0avqk,11159
56
- Cython/Compiler/Nodes.py,sha256=SPMs4eHpOSsUakYl2NtNErXUZ_OwI5DRHcoWz12gRrg,454893
56
+ Cython/Compiler/Nodes.py,sha256=cQLsyXcyrwme2B9KrX-kPO6gJgvLz2lnxkMO79HLUGI,455112
57
57
  Cython/Compiler/Optimize.py,sha256=CX-UEAmTqAc4JsMxpRsKPx_7yaaEzwewcxHc7c2Roq0,228209
58
- Cython/Compiler/Options.py,sha256=DegABgz_JQbPN_hHfOTxDd3zKHXvqoYedB9jgco4fnk,32062
58
+ Cython/Compiler/Options.py,sha256=GkzO1lGVqwgHE0PzPEERwmsTUv5UYCxyJMK3iHJv8SQ,32073
59
59
  Cython/Compiler/ParseTreeTransforms.pxd,sha256=mkdSaFvc5we32bs0RNFwbODQMsTHIU0jIlpZuFtHnaU,2268
60
- Cython/Compiler/ParseTreeTransforms.py,sha256=nL6TdknzbWsFTThUaMJeKcDakIYf7cDFk6vsaWeTFg4,186705
60
+ Cython/Compiler/ParseTreeTransforms.py,sha256=_iOgpLJF_cQ42FkTrkPHeORwSmBgxYujelB8eVqWA9o,186877
61
61
  Cython/Compiler/Parsing.pxd,sha256=A5Ckd1TecRLV_NDx4IzhquYdMsM0BGcDWh7LyXOjKIg,351
62
- Cython/Compiler/Parsing.py,sha256=RsV7WGd7OxK7tEthCOqF2m9z_hSbUn662d-m0z1MCws,156894
62
+ Cython/Compiler/Parsing.py,sha256=6uZTj0cQLobkVyb-91mO_tUlqxytq-4M4x-6utZAJiw,156985
63
63
  Cython/Compiler/Pipeline.py,sha256=JyYMnRekoKRBe9yOvAuW39Gy-pTitJm5jD_qfO9BAeU,16230
64
64
  Cython/Compiler/PyrexTypes.py,sha256=2qtM3pHiMwMdL6yR6iG6xwqR2JA3tL5S7JWmvORIEpY,222972
65
65
  Cython/Compiler/Pythran.py,sha256=wiRE1buAxQ0NFbxg7DHyyd03I6qgLp-KP_fokAvSii4,7888
66
66
  Cython/Compiler/Scanning.pxd,sha256=vcNaZoZdifzj5H_cbFa1eACNNCKko9iwWaOHuWQDfWs,1358
67
67
  Cython/Compiler/Scanning.py,sha256=kZI5h8k3ZoLA_nqCAx3nY2QZljuFi3QwpjZ9N9d6GGc,25212
68
68
  Cython/Compiler/StringEncoding.py,sha256=0o6B-tFxKhUdQ79eJfHZhdLun69qdkVUeznffpBAxtI,8487
69
- Cython/Compiler/Symtab.py,sha256=C18rR7_afF4id7vLEqKI4JNyV4G33d5RYWLlEB1LoCg,137775
69
+ Cython/Compiler/Symtab.py,sha256=gGJU2_0b_kDiWDT5W7ml-3VeLK4oLbtTciLRwiAnHz8,137382
70
70
  Cython/Compiler/TreeFragment.py,sha256=1AscujwN_mCFeO137PGy1ghCnJ17L9uYoJfqc-7h9VY,9514
71
71
  Cython/Compiler/TreePath.py,sha256=Vht_mzZpptXKJw2t_TM-PBYHtZIXXvZFWxjNkhPr9yg,7960
72
72
  Cython/Compiler/TypeInference.py,sha256=fmetS6rcT_ELhkCWMOukgOF5QarS-z0EyhvGudwvZuM,22446
@@ -189,7 +189,7 @@ Cython/Includes/libcpp/cmath.pxd,sha256=-_jnjIWY47jybkNnGrMk8ewZeGaWU0ezMWAZm9UC
189
189
  Cython/Includes/libcpp/complex.pxd,sha256=JtuQuknvS6GQ0FfyJGQ914DXvzNEaF1-z9D0jST6gXM,2995
190
190
  Cython/Includes/libcpp/condition_variable.pxd,sha256=G3i6e6j4KQtO-dOUWUVc7-BcYT1HRKQCCn9zUp4B3mA,18168
191
191
  Cython/Includes/libcpp/deque.pxd,sha256=SwgYrnqq6OMQMSOEFTZpnpRsii7pIAT-06bLxMS5w7M,6718
192
- Cython/Includes/libcpp/exception.pxd,sha256=AMIC8ZeCT0_rVcsy85rna4OBdOOELAriVXBKoI4zdUo,3175
192
+ Cython/Includes/libcpp/exception.pxd,sha256=n8o8qSyrquGmkoW4JrCzyW0X1IcurW5YNLbvtlpi3vA,4254
193
193
  Cython/Includes/libcpp/execution.pxd,sha256=I2KizUy9DGm_0edrd2BFdHPwyeip2ZcDxqdwb0t7taI,515
194
194
  Cython/Includes/libcpp/forward_list.pxd,sha256=o2ThwKyJWZrNT4ZMB1aYmf-2wqYiqSCDdfVswpo8S8I,2429
195
195
  Cython/Includes/libcpp/functional.pxd,sha256=kMul7WB1J0X2-611AMtXq6sP9jYYk3YO8zZoDKFaeDU,722
@@ -261,7 +261,7 @@ Cython/Tempita/_tempita.py,sha256=lj6mlSNyuJ3hHIsODq7lWbzLyL5Gak6ZVr0tc2vA2qI,37
261
261
  Cython/Tests/TestCodeWriter.py,sha256=_LonlPtsfkTLZBEQXMk8rOyJVvq417uzf01ha5alwGE,3783
262
262
  Cython/Tests/TestCythonUtils.py,sha256=VnOT9GxbE3uxEOVYms8UKFRy2w0IUEinQay8BZ6VQ8k,6691
263
263
  Cython/Tests/TestJediTyper.py,sha256=hroG-mBTs3HzIXCnZTDJuXDSUbVGrorIQGShONTqpxU,6780
264
- Cython/Tests/TestShadow.py,sha256=ZLFhltcbcfc2olENzz1ARHOcGX9D4p9Y9nbwPM-C0BA,5107
264
+ Cython/Tests/TestShadow.py,sha256=EF4kC4iC0Ng_2DUj2H9p5oDd5DQa9RVXY-d9iHYPSMk,4748
265
265
  Cython/Tests/TestStringIOTree.py,sha256=vTuu3z32WTcmJaf0fBq62NMghYtaPL2rRnfdl2WM--4,1946
266
266
  Cython/Tests/TestTestUtils.py,sha256=w4SVcZ8G9Brr_2XGkoQl1EkWR8_sI9LPDAw2cCRQ13U,2901
267
267
  Cython/Tests/__init__.py,sha256=jOqtmPLCvMCq0xVMwGekuLpBmVgq0xtPFmUePySdOjs,13
@@ -269,7 +269,7 @@ Cython/Tests/xmlrunner.py,sha256=1X79TBIYWOcZIzoylOSu9zULxVIR4xvq-RZ7f8Fn600,146
269
269
  Cython/Utility/AsyncGen.c,sha256=MG4LN14ozyq3JruA1Ad8I9ZnjlASxO2kwfvHTcAHXuU,33376
270
270
  Cython/Utility/Buffer.c,sha256=TcJ4eSxi1NxD51NH2GEK-dXgXdmVFIQcHSq22azfB2U,28258
271
271
  Cython/Utility/BufferFormatFromTypeInfo.pxd,sha256=KoGGKw7rW8Utav9xrwVZpsLX-vlpFe3Xv0hmp45PimM,97
272
- Cython/Utility/Builtins.c,sha256=76n9lDGzDe37cskDojBYSXozaPTvy9AS_TFdm_Fj56U,26733
272
+ Cython/Utility/Builtins.c,sha256=Ctej-HIvVSiZqTNPvh1hEEojRcGDP6LwzVJOOiPrgXA,26814
273
273
  Cython/Utility/CConvert.pyx,sha256=UFlPDRT9anal0RpY03hXsejEcwp-RXJSnLy6LbbnmPQ,4471
274
274
  Cython/Utility/CMath.c,sha256=rP6O5u23EybDGimRCHfy8WTpyxhPu5G1F6ksEmrgKnQ,3044
275
275
  Cython/Utility/CommonStructures.c,sha256=cXOrFQv0DP8QX2CF4u_2O2lFW41WC3nTNwSKRVt3B7M,7926
@@ -296,7 +296,7 @@ Cython/Utility/Optimize.c,sha256=AHaZlr8XCp6E2QOBNlUAEIhRUolKp0UyRJxh6jilqjk,599
296
296
  Cython/Utility/Overflow.c,sha256=9C-WIzd4k4uSD7IrLVIJz8fEMK1jFt9UR4WRjDlarYk,15689
297
297
  Cython/Utility/Printing.c,sha256=h3F9eyCXSs284Y8DZRivKtoAOcx5jIYPeNFOSD59foc,2898
298
298
  Cython/Utility/Profile.c,sha256=JPglBHCdnTtyGj0JKzPtfN0djAIe6P5FVAqBQt43RZo,41218
299
- Cython/Utility/StringTools.c,sha256=WQpQTBWSVYpNPUsVj2cXP_RgwcfyQ_NH-T70e65N59U,50848
299
+ Cython/Utility/StringTools.c,sha256=N7tFfz0pGcQdYhMAoUR41gSwX-BcfpQiDJrBCS-I1wM,50852
300
300
  Cython/Utility/Synchronization.c,sha256=B3sJpm2UwNGkjWIeMDF8AqCgtttASNIPRXHvA7kXLKE,18675
301
301
  Cython/Utility/TString.c,sha256=8cAAcx70pSeYH9Xw98OPmYBUV1LtgwmIFr54Swvuqa0,14001
302
302
  Cython/Utility/TestCyUtilityLoader.pyx,sha256=91lWWJub7l_6xNn3ncrvQZZ94RpkQzEx2NtAaFpvrxY,152
@@ -310,8 +310,8 @@ Cython/Utility/arrayarray.h,sha256=hjXya3s-GoN4mKZTKUlyqPfT3tzf0GiansnSkUcWhk0,4
310
310
  pyximport/__init__.py,sha256=9hOyKolFtOerPiVEyktKrT1VtzbGexq9UmORzo52iHI,79
311
311
  pyximport/pyxbuild.py,sha256=AsL1tyLxG61Mj7Ah-DxtDBuaXF94W2Tb6KTos7r0w8I,5702
312
312
  pyximport/pyximport.py,sha256=BnXVwq1cwo1EYRjPU0J-RUDcwzGjUlzKWZOOMDNcu-s,18510
313
- cython-3.2.3.dist-info/METADATA,sha256=8EoMsr6l320ZMH_ZMxMZUUzPLxRYB-B8v1zy8ZyDSiU,4285
314
- cython-3.2.3.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
315
- cython-3.2.3.dist-info/entry_points.txt,sha256=VU8NX8gnQyFbyqiWMzfh9BHvYMuoQRS3Nbm3kKcKQeY,139
316
- cython-3.2.3.dist-info/top_level.txt,sha256=jLV8tZV98iCbIfiJR4DVzTX5Ru1Y_pYMZ59wkMCe6SY,24
317
- cython-3.2.3.dist-info/RECORD,,
313
+ cython-3.2.4.dist-info/METADATA,sha256=4cWxoE3O1NfAYxd-LZo-g_v1WPg5NfLGpXm53cs5v9Y,7282
314
+ cython-3.2.4.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
315
+ cython-3.2.4.dist-info/entry_points.txt,sha256=VU8NX8gnQyFbyqiWMzfh9BHvYMuoQRS3Nbm3kKcKQeY,139
316
+ cython-3.2.4.dist-info/top_level.txt,sha256=jLV8tZV98iCbIfiJR4DVzTX5Ru1Y_pYMZ59wkMCe6SY,24
317
+ cython-3.2.4.dist-info/RECORD,,
@@ -1,96 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: Cython
3
- Version: 3.2.3
4
- Summary: The Cython compiler for writing C extensions in the Python language.
5
- Home-page: https://cython.org/
6
- Author: Robert Bradshaw, Stefan Behnel, David Woods, Greg Ewing, et al.
7
- Author-email: cython-devel@python.org
8
- License: Apache-2.0
9
- Project-URL: Documentation, https://cython.readthedocs.io/
10
- Project-URL: Donate, https://cython.readthedocs.io/en/latest/src/donating.html
11
- Project-URL: Source Code, https://github.com/cython/cython
12
- Project-URL: Bug Tracker, https://github.com/cython/cython/issues/
13
- Project-URL: User Group, https://groups.google.com/g/cython-users
14
- Classifier: Development Status :: 5 - Production/Stable
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: Apache Software License
17
- Classifier: Operating System :: OS Independent
18
- Classifier: Programming Language :: Python
19
- Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.8
21
- Classifier: Programming Language :: Python :: 3.9
22
- Classifier: Programming Language :: Python :: 3.10
23
- Classifier: Programming Language :: Python :: 3.11
24
- Classifier: Programming Language :: Python :: 3.12
25
- Classifier: Programming Language :: Python :: 3.13
26
- Classifier: Programming Language :: Python :: 3.14
27
- Classifier: Programming Language :: Python :: Implementation :: CPython
28
- Classifier: Programming Language :: Python :: Implementation :: PyPy
29
- Classifier: Programming Language :: Python :: Implementation :: Stackless
30
- Classifier: Programming Language :: C
31
- Classifier: Programming Language :: C++
32
- Classifier: Programming Language :: Cython
33
- Classifier: Topic :: Software Development :: Code Generators
34
- Classifier: Topic :: Software Development :: Compilers
35
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
36
- Classifier: Typing :: Typed
37
- Requires-Python: >=3.8
38
- Description-Content-Type: text/x-rst
39
-
40
- The Cython language makes writing C extensions for the Python language as
41
- easy as Python itself. Cython is a source code translator based on Pyrex_,
42
- but supports more cutting edge functionality and optimizations.
43
-
44
- The Cython language is a superset of the Python language (almost all Python
45
- code is also valid Cython code), but Cython additionally supports optional
46
- static typing to natively call C functions, operate with C++ classes and
47
- declare fast C types on variables and class attributes. This allows the
48
- compiler to generate very efficient C code from Cython code.
49
-
50
- This makes Cython the ideal language for writing glue code for external
51
- C/C++ libraries, and for fast C modules that speed up the execution of
52
- Python code.
53
-
54
- The newest Cython release can always be downloaded from https://cython.org/.
55
- Unpack the tarball or zip file, enter the directory, and then run::
56
-
57
- pip install .
58
-
59
- Note that for one-time builds, e.g. for CI/testing, on platforms that are not
60
- covered by one of the wheel packages provided on PyPI *and* the pure Python wheel
61
- that we provide is not used, it is substantially faster than a full source build
62
- to install an uncompiled (slower) version of Cython with::
63
-
64
- NO_CYTHON_COMPILE=true pip install .
65
-
66
- .. _Pyrex: https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
67
-
68
- 3.2.3 (2025-12-14)
69
- ==================
70
-
71
- Features added
72
- --------------
73
-
74
- * The C-API declarations were updated to include the new ``PyList_*()`` functions.
75
- (Github issue https://github.com/cython/cython/issues/7291)
76
-
77
- * The ``Py_mod_gil`` module setting can now be changed with a C macro, overriding
78
- the ``freethreading_compatible`` directive setting.
79
- (Github issue https://github.com/cython/cython/issues/7404)
80
-
81
- Bugs fixed
82
- ----------
83
-
84
- * t-strings lost the last element when compiled for the Limited API.
85
- (Github issue https://github.com/cython/cython/issues/7381)
86
-
87
- * The ``array.data`` property of the ``cpython.array`` declarations generated a
88
- useless exception check that degraded its use in ``nogil`` code.
89
- (Github issue https://github.com/cython/cython/issues/7408)
90
-
91
- * Parallel builds with the ``cythonize`` command could request more processes
92
- than allowed by the platform, thus failing the build.
93
- (Github issue https://github.com/cython/cython/issues/7384)
94
-
95
- * A minor thread sanitizer issue was resolved.
96
- (Github issue https://github.com/cython/cython/issues/7383)
File without changes