Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 85cee9f

Browse filesBrowse files
authored
Merge branch 'main' into pack-warn
2 parents 516d563 + 4912b29 commit 85cee9f
Copy full SHA for 85cee9f

File tree

102 files changed

+4240
-1499
lines changed
Filter options

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner

102 files changed

+4240
-1499
lines changed

‎.github/workflows/jit.yml

Copy file name to clipboardExpand all lines: .github/workflows/jit.yml
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ jobs:
113113
find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete
114114
brew install llvm@${{ matrix.llvm }}
115115
export SDKROOT="$(xcrun --show-sdk-path)"
116-
./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '' }}
116+
./configure --enable-experimental-jit --enable-universalsdk --with-universal-archs=universal2 ${{ matrix.debug && '--with-pydebug' || '' }}
117117
make all --jobs 4
118118
./python.exe -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3
119119

‎.github/workflows/reusable-docs.yml

Copy file name to clipboardExpand all lines: .github/workflows/reusable-docs.yml
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666
run: |
6767
set -Eeuo pipefail
6868
# Build docs with the nit-picky option; write warnings to file
69-
make -C Doc/ PYTHON=../python SPHINXOPTS="--quiet --nitpicky --fail-on-warning --keep-going --warning-file sphinx-warnings.txt" html
69+
make -C Doc/ PYTHON=../python SPHINXOPTS="--quiet --nitpicky --fail-on-warning --warning-file sphinx-warnings.txt" html
7070
- name: 'Check warnings'
7171
if: github.event_name == 'pull_request'
7272
run: |
@@ -101,4 +101,4 @@ jobs:
101101
run: make -C Doc/ PYTHON=../python venv
102102
# Use "xvfb-run" since some doctest tests open GUI windows
103103
- name: 'Run documentation doctest'
104-
run: xvfb-run make -C Doc/ PYTHON=../python SPHINXERRORHANDLING="--fail-on-warning --keep-going" doctest
104+
run: xvfb-run make -C Doc/ PYTHON=../python SPHINXERRORHANDLING="--fail-on-warning" doctest

‎.gitignore

Copy file name to clipboardExpand all lines: .gitignore
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ Tools/unicode/data/
138138
# hendrikmuhs/ccache-action@v1
139139
/.ccache
140140
/cross-build/
141-
/jit_stencils.h
141+
/jit_stencils*.h
142142
/platform
143143
/profile-clean-stamp
144144
/profile-run-stamp

‎.ruff.toml

Copy file name to clipboard
+12Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Default settings for Ruff in CPython
2+
3+
# PYTHON_FOR_REGEN
4+
target-version = "py310"
5+
6+
# PEP 8
7+
line-length = 79
8+
9+
# Enable automatic fixes by default.
10+
# To override this, use ``fix = false`` in a subdirectory's config file
11+
# or ``--no-fix`` on the command line.
12+
fix = true

‎Android/README.md

Copy file name to clipboardExpand all lines: Android/README.md
+5-3Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ it:
2525
`android-sdk/cmdline-tools/latest`.
2626
* `export ANDROID_HOME=/path/to/android-sdk`
2727

28-
The `android.py` script also requires the following commands to be on the `PATH`:
28+
The `android.py` script will automatically use the SDK's `sdkmanager` to install
29+
any packages it needs.
30+
31+
The script also requires the following commands to be on the `PATH`:
2932

3033
* `curl`
3134
* `java` (or set the `JAVA_HOME` environment variable)
32-
* `tar`
3335

3436

3537
## Building
@@ -97,7 +99,7 @@ similar to the `Android` directory of the CPython source tree.
9799
The Python test suite can be run on Linux, macOS, or Windows:
98100

99101
* On Linux, the emulator needs access to the KVM virtualization interface, and
100-
a DISPLAY environment variable pointing at an X server.
102+
a DISPLAY environment variable pointing at an X server. Xvfb is acceptable.
101103

102104
The test suite can usually be run on a device with 2 GB of RAM, but this is
103105
borderline, so you may need to increase it to 4 GB. As of Android

‎Android/android.py

Copy file name to clipboardExpand all lines: Android/android.py
+9-11Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,19 +138,19 @@ def make_build_python(context):
138138
run(["make", "-j", str(os.cpu_count())])
139139

140140

141-
def unpack_deps(host):
141+
def unpack_deps(host, prefix_dir):
142142
deps_url = "https://github.com/beeware/cpython-android-source-deps/releases/download"
143143
for name_ver in ["bzip2-1.0.8-2", "libffi-3.4.4-3", "openssl-3.0.15-4",
144144
"sqlite-3.49.1-0", "xz-5.4.6-1"]:
145145
filename = f"{name_ver}-{host}.tar.gz"
146146
download(f"{deps_url}/{name_ver}/{filename}")
147-
run(["tar", "-xf", filename])
147+
shutil.unpack_archive(filename, prefix_dir)
148148
os.remove(filename)
149149

150150

151151
def download(url, target_dir="."):
152152
out_path = f"{target_dir}/{basename(url)}"
153-
run(["curl", "-Lf", "-o", out_path, url])
153+
run(["curl", "-Lf", "--retry", "5", "--retry-all-errors", "-o", out_path, url])
154154
return out_path
155155

156156

@@ -162,8 +162,7 @@ def configure_host_python(context):
162162
prefix_dir = host_dir / "prefix"
163163
if not prefix_dir.exists():
164164
prefix_dir.mkdir()
165-
os.chdir(prefix_dir)
166-
unpack_deps(context.host)
165+
unpack_deps(context.host, prefix_dir)
167166

168167
os.chdir(host_dir)
169168
command = [
@@ -241,16 +240,15 @@ def setup_sdk():
241240
# the Gradle wrapper is not included in the CPython repository. Instead, we
242241
# extract it from the Gradle GitHub repository.
243242
def setup_testbed():
244-
# The Gradle version used for the build is specified in
245-
# testbed/gradle/wrapper/gradle-wrapper.properties. This wrapper version
246-
# doesn't need to match, as any version of the wrapper can download any
247-
# version of Gradle.
248-
version = "8.9.0"
249243
paths = ["gradlew", "gradlew.bat", "gradle/wrapper/gradle-wrapper.jar"]
250-
251244
if all((TESTBED_DIR / path).exists() for path in paths):
252245
return
253246

247+
# The wrapper version isn't important, as any version of the wrapper can
248+
# download any version of Gradle. The Gradle version actually used for the
249+
# build is specified in testbed/gradle/wrapper/gradle-wrapper.properties.
250+
version = "8.9.0"
251+
254252
for path in paths:
255253
out_path = TESTBED_DIR / path
256254
out_path.parent.mkdir(exist_ok=True)

‎Doc/.ruff.toml

Copy file name to clipboardExpand all lines: Doc/.ruff.toml
+2-3Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
extend = "../.ruff.toml" # Inherit the project-wide settings
2+
13
target-version = "py312" # Align with the version in oldest_supported_sphinx
2-
fix = true
3-
output-format = "full"
4-
line-length = 79
54
extend-exclude = [
65
"includes/*",
76
# Temporary exclusions:

‎Doc/c-api/float.rst

Copy file name to clipboardExpand all lines: Doc/c-api/float.rst
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ NaNs (if such things exist on the platform) isn't handled correctly, and
9696
attempting to unpack a bytes string containing an IEEE INF or NaN will raise an
9797
exception.
9898
99+
Note that NaNs type may not be preserved on IEEE platforms (silent NaN become
100+
quiet), for example on x86 systems in 32-bit mode.
101+
99102
On non-IEEE platforms with more precision, or larger dynamic range, than IEEE
100103
754 supports, not all values can be packed; on non-IEEE platforms with less
101104
precision, or smaller dynamic range, not all values can be unpacked. What

‎Doc/deprecations/index.rst

Copy file name to clipboardExpand all lines: Doc/deprecations/index.rst
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Deprecations
55

66
.. include:: pending-removal-in-3.16.rst
77

8+
.. include:: pending-removal-in-3.17.rst
9+
810
.. include:: pending-removal-in-3.19.rst
911

1012
.. include:: pending-removal-in-future.rst
@@ -14,4 +16,6 @@ C API deprecations
1416

1517
.. include:: c-api-pending-removal-in-3.15.rst
1618

19+
.. include:: c-api-pending-removal-in-3.18.rst
20+
1721
.. include:: c-api-pending-removal-in-future.rst

‎Doc/deprecations/pending-removal-in-3.16.rst

Copy file name to clipboardExpand all lines: Doc/deprecations/pending-removal-in-3.16.rst
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ Pending removal in Python 3.16
6161
* Calling the Python implementation of :func:`functools.reduce` with *function*
6262
or *sequence* as keyword arguments has been deprecated since Python 3.14.
6363

64+
* :mod:`logging`:
65+
66+
Support for custom logging handlers with the *strm* argument is deprecated
67+
and scheduled for removal in Python 3.16. Define handlers with the *stream*
68+
argument instead. (Contributed by Mariusz Felisiak in :gh:`115032`.)
69+
6470
* :mod:`mimetypes`:
6571

6672
* Valid extensions start with a '.' or are empty for
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Pending removal in Python 3.17
2+
------------------------------
3+
4+
* :mod:`typing`:
5+
6+
- Before Python 3.14, old-style unions were implemented using the private class
7+
``typing._UnionGenericAlias``. This class is no longer needed for the implementation,
8+
but it has been retained for backward compatibility, with removal scheduled for Python
9+
3.17. Users should use documented introspection helpers like :func:`typing.get_origin`
10+
and :func:`typing.get_args` instead of relying on private implementation details.

‎Doc/library/string.rst

Copy file name to clipboardExpand all lines: Doc/library/string.rst
+9-7Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,16 +131,18 @@ implementation as the built-in :meth:`~str.format` method.
131131
(which can happen if two replacement fields occur consecutively), then
132132
*literal_text* will be a zero-length string. If there is no replacement
133133
field, then the values of *field_name*, *format_spec* and *conversion*
134-
will be ``None``.
134+
will be ``None``. The value of *field_name* is unmodified and
135+
auto-numbering of non-numbered positional fields is done by :meth:`vformat`.
135136

136137
.. method:: get_field(field_name, args, kwargs)
137138

138-
Given *field_name* as returned by :meth:`parse` (see above), convert it to
139-
an object to be formatted. Returns a tuple (obj, used_key). The default
140-
version takes strings of the form defined in :pep:`3101`, such as
141-
"0[name]" or "label.title". *args* and *kwargs* are as passed in to
142-
:meth:`vformat`. The return value *used_key* has the same meaning as the
143-
*key* parameter to :meth:`get_value`.
139+
Given *field_name*, convert it to an object to be formatted.
140+
Auto-numbering of *field_name* returned from :meth:`parse` is done by
141+
:meth:`vformat` before calling this method. Returns a tuple (obj, used_key).
142+
The default version takes strings of the form defined in :pep:`3101`,
143+
such as "0[name]" or "label.title". *args* and *kwargs* are as passed in to
144+
:meth:`vformat`. The return value *used_key* has the same meaning
145+
as the *key* parameter to :meth:`get_value`.
144146

145147
.. method:: get_value(key, args, kwargs)
146148

‎Doc/library/typing.rst

Copy file name to clipboardExpand all lines: Doc/library/typing.rst
+5-5Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,7 @@ through a simple assignment::
665665
User-defined generics for parameter expressions are also supported via parameter
666666
specification variables in the form ``[**P]``. The behavior is consistent
667667
with type variables' described above as parameter specification variables are
668-
treated by the typing module as a specialized type variable. The one exception
668+
treated by the :mod:`!typing` module as a specialized type variable. The one exception
669669
to this is that a list of types can be used to substitute a :class:`ParamSpec`::
670670

671671
>>> class Z[T, **P]: ... # T is a TypeVar; P is a ParamSpec
@@ -706,7 +706,7 @@ are intended primarily for static type checking.
706706

707707
A user-defined generic class can have ABCs as base classes without a metaclass
708708
conflict. Generic metaclasses are not supported. The outcome of parameterizing
709-
generics is cached, and most types in the typing module are :term:`hashable` and
709+
generics is cached, and most types in the :mod:`!typing` module are :term:`hashable` and
710710
comparable for equality.
711711

712712

@@ -2787,7 +2787,7 @@ types.
27872787
Protocols
27882788
---------
27892789

2790-
The following protocols are provided by the typing module. All are decorated
2790+
The following protocols are provided by the :mod:`!typing` module. All are decorated
27912791
with :func:`@runtime_checkable <runtime_checkable>`.
27922792

27932793
.. class:: SupportsAbs
@@ -3531,7 +3531,7 @@ Deprecated aliases
35313531
------------------
35323532

35333533
This module defines several deprecated aliases to pre-existing
3534-
standard library classes. These were originally included in the typing
3534+
standard library classes. These were originally included in the :mod:`!typing`
35353535
module in order to support parameterizing these generic classes using ``[]``.
35363536
However, the aliases became redundant in Python 3.9 when the
35373537
corresponding pre-existing classes were enhanced to support ``[]`` (see
@@ -3544,7 +3544,7 @@ interpreter for these aliases.
35443544

35453545
If at some point it is decided to remove these deprecated aliases, a
35463546
deprecation warning will be issued by the interpreter for at least two releases
3547-
prior to removal. The aliases are guaranteed to remain in the typing module
3547+
prior to removal. The aliases are guaranteed to remain in the :mod:`!typing` module
35483548
without deprecation warnings until at least Python 3.14.
35493549

35503550
Type checkers are encouraged to flag uses of the deprecated types if the

‎Doc/whatsnew/3.12.rst

Copy file name to clipboardExpand all lines: Doc/whatsnew/3.12.rst
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,8 @@ Deprecated
13471347

13481348
.. include:: ../deprecations/pending-removal-in-3.16.rst
13491349

1350+
.. include:: ../deprecations/pending-removal-in-3.17.rst
1351+
13501352
.. include:: ../deprecations/pending-removal-in-future.rst
13511353

13521354
.. _whatsnew312-removed:

‎Doc/whatsnew/3.13.rst

Copy file name to clipboardExpand all lines: Doc/whatsnew/3.13.rst
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,6 +2009,8 @@ New Deprecations
20092009

20102010
.. include:: ../deprecations/pending-removal-in-3.16.rst
20112011

2012+
.. include:: ../deprecations/pending-removal-in-3.17.rst
2013+
20122014
.. include:: ../deprecations/pending-removal-in-future.rst
20132015

20142016
CPython Bytecode Changes
@@ -2529,6 +2531,8 @@ Deprecated C APIs
25292531

25302532
.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst
25312533

2534+
.. include:: ../deprecations/c-api-pending-removal-in-3.18.rst
2535+
25322536
.. include:: ../deprecations/c-api-pending-removal-in-future.rst
25332537

25342538
.. _pythoncapi-compat project: https://github.com/python/pythoncapi-compat/

‎Doc/whatsnew/3.14.rst

Copy file name to clipboardExpand all lines: Doc/whatsnew/3.14.rst
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,6 +1743,8 @@ Deprecated
17431743

17441744
.. include:: ../deprecations/pending-removal-in-3.16.rst
17451745

1746+
.. include:: ../deprecations/pending-removal-in-3.17.rst
1747+
17461748
.. include:: ../deprecations/pending-removal-in-3.19.rst
17471749

17481750
.. include:: ../deprecations/pending-removal-in-future.rst

‎Grammar/python.gram

Copy file name to clipboardExpand all lines: Grammar/python.gram
+22-7Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -233,15 +233,17 @@ import_from_targets[asdl_alias_seq*]:
233233
import_from_as_names[asdl_alias_seq*]:
234234
| a[asdl_alias_seq*]=','.import_from_as_name+ { a }
235235
import_from_as_name[alias_ty]:
236-
| a=NAME b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id,
237-
(b) ? ((expr_ty) b)->v.Name.id : NULL,
238-
EXTRA) }
236+
| invalid_import_from_as_name
237+
| a=NAME b=['as' z=NAME { z }] { _PyAST_alias(
238+
a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) }
239+
239240
dotted_as_names[asdl_alias_seq*]:
240241
| a[asdl_alias_seq*]=','.dotted_as_name+ { a }
241242
dotted_as_name[alias_ty]:
242-
| a=dotted_name b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id,
243-
(b) ? ((expr_ty) b)->v.Name.id : NULL,
244-
EXTRA) }
243+
| invalid_dotted_as_name
244+
| a=dotted_name b=['as' z=NAME { z }] { _PyAST_alias(
245+
a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) }
246+
245247
dotted_name[expr_ty]:
246248
| a=dotted_name '.' b=NAME { _PyPegen_join_names_with_dot(p, a, b) }
247249
| NAME
@@ -971,7 +973,12 @@ tstring_middle[expr_ty]:
971973
| tstring_replacement_field
972974
| t=TSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) }
973975
tstring[expr_ty] (memo):
974-
| a=TSTRING_START b=tstring_middle* c=TSTRING_END { _PyPegen_template_str(p, a, (asdl_expr_seq*)b, c) }
976+
| a=TSTRING_START b=tstring_middle* c=TSTRING_END {
977+
CHECK_VERSION(
978+
expr_ty,
979+
14,
980+
"t-strings are",
981+
_PyPegen_template_str(p, a, (asdl_expr_seq*)b, c)) }
975982

976983
string[expr_ty]: s[Token*]=STRING { _PyPegen_constant_from_string(p, s) }
977984
strings[expr_ty] (memo): a[asdl_expr_seq*]=(fstring|string|tstring)+ { _PyPegen_concatenate_strings(p, a, EXTRA) }
@@ -1370,6 +1377,14 @@ invalid_import:
13701377
RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") }
13711378
| 'import' token=NEWLINE {
13721379
RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }
1380+
invalid_dotted_as_name:
1381+
| dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) a=expression {
1382+
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
1383+
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
1384+
invalid_import_from_as_name:
1385+
| NAME 'as' !(NAME (',' | ')' | NEWLINE)) a=expression {
1386+
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
1387+
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
13731388

13741389
invalid_import_from_targets:
13751390
| import_from_as_names ',' NEWLINE {

‎Include/cpython/pystats.h

Copy file name to clipboardExpand all lines: Include/cpython/pystats.h
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
# error "this header file must not be included directly"
3030
#endif
3131

32-
#define PYSTATS_MAX_UOP_ID 512
32+
#define PYSTATS_MAX_UOP_ID 1024
3333

34-
#define SPECIALIZATION_FAILURE_KINDS 50
34+
#define SPECIALIZATION_FAILURE_KINDS 60
3535

3636
/* Stats for determining who is calling PyEval_EvalFrame */
3737
#define EVAL_CALL_TOTAL 0

‎Include/internal/pycore_crossinterp.h

Copy file name to clipboardExpand all lines: Include/internal/pycore_crossinterp.h
+7Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,13 @@ PyAPI_FUNC(_PyBytes_data_t *) _PyBytes_GetXIDataWrapped(
171171
xid_newobjfunc,
172172
_PyXIData_t *);
173173

174+
// _PyObject_GetXIData() for pickle
175+
PyAPI_DATA(PyObject *) _PyPickle_LoadFromXIData(_PyXIData_t *);
176+
PyAPI_FUNC(int) _PyPickle_GetXIData(
177+
PyThreadState *,
178+
PyObject *,
179+
_PyXIData_t *);
180+
174181
// _PyObject_GetXIData() for marshal
175182
PyAPI_FUNC(PyObject *) _PyMarshal_ReadObjectFromXIData(_PyXIData_t *);
176183
PyAPI_FUNC(int) _PyMarshal_GetXIData(

‎Include/internal/pycore_debug_offsets.h

Copy file name to clipboardExpand all lines: Include/internal/pycore_debug_offsets.h
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ extern "C" {
5959

6060

6161
typedef struct _Py_DebugOffsets {
62-
char cookie[8];
62+
char cookie[8] _Py_NONSTRING;
6363
uint64_t version;
6464
uint64_t free_threaded;
6565
// Runtime state offset;

‎Include/internal/pycore_list.h

Copy file name to clipboardExpand all lines: Include/internal/pycore_list.h
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ extern "C" {
1313
#endif
1414

1515
PyAPI_FUNC(PyObject*) _PyList_Extend(PyListObject *, PyObject *);
16+
PyAPI_FUNC(PyObject) *_PyList_SliceSubscript(PyObject*, PyObject*);
1617
extern void _PyList_DebugMallocStats(FILE *out);
1718
// _PyList_GetItemRef should be used only when the object is known as a list
1819
// because it doesn't raise TypeError when the object is not a list, whereas PyList_GetItemRef does.
1920
extern PyObject* _PyList_GetItemRef(PyListObject *, Py_ssize_t i);
21+
22+
2023
#ifdef Py_GIL_DISABLED
2124
// Returns -1 in case of races with other threads.
2225
extern int _PyList_GetItemRefNoLock(PyListObject *, Py_ssize_t, _PyStackRef *);

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.