summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2022-11-15 12:38:09 (GMT)
committerThomas Wouters <thomas@python.org>2022-11-15 12:38:09 (GMT)
commit73943cbc4c5e97f71b76150c549d07e8ed00066b (patch)
tree748ea6203fa3d36112565a67065e3a1bdc550b40
parentbd58b89654a98cbfb92a6e054ac285bd32cdf58f (diff)
parentf13f466474ed53529acd3f209070431fbae14323 (diff)
downloadcpython-73943cbc4c5e97f71b76150c549d07e8ed00066b.zip
cpython-73943cbc4c5e97f71b76150c549d07e8ed00066b.tar.gz
cpython-73943cbc4c5e97f71b76150c549d07e8ed00066b.tar.bz2
Merge the 3.12.0a2 release into main.
-rw-r--r--Doc/includes/custom2.c10
-rw-r--r--Doc/includes/custom3.c22
-rw-r--r--Doc/includes/custom4.c16
-rw-r--r--Doc/library/asyncio-runner.rst14
-rw-r--r--Doc/using/configure.rst7
-rw-r--r--Doc/whatsnew/3.12.rst11
-rw-r--r--Include/cpython/pystate.h3
-rw-r--r--Include/internal/pycore_compile.h7
-rw-r--r--Include/internal/pycore_global_objects.h12
-rw-r--r--Include/internal/pycore_global_objects_fini_generated.h1
-rw-r--r--Include/internal/pycore_global_strings.h1
-rw-r--r--Include/internal/pycore_import.h11
-rw-r--r--Include/internal/pycore_interp.h3
-rw-r--r--Include/internal/pycore_runtime.h8
-rw-r--r--Include/internal/pycore_runtime_init.h15
-rw-r--r--Include/internal/pycore_runtime_init_generated.h1
-rw-r--r--Include/internal/pycore_typeobject.h9
-rw-r--r--Include/internal/pycore_unicodeobject_generated.h2
-rw-r--r--Lib/asyncio/runners.py4
-rw-r--r--Lib/test/audit-tests.py11
-rw-r--r--Lib/test/support/bytecode_helper.py93
-rw-r--r--Lib/test/test_asyncio/test_runners.py10
-rw-r--r--Lib/test/test_asyncio/test_subprocess.py2
-rw-r--r--Lib/test/test_audit.py5
-rw-r--r--Lib/test/test_capi/test_unicode.py515
-rw-r--r--Lib/test/test_compiler_codegen.py50
-rw-r--r--Lib/test/test_getpath.py33
-rw-r--r--Lib/test/test_peepholer.py2
-rw-r--r--Lib/test/test_unicode.py502
-rw-r--r--Lib/test/test_venv.py72
-rw-r--r--Makefile.pre.in27
-rw-r--r--Misc/NEWS.d/next/Build/2022-11-09-14-42-48.gh-issue-99289.X7wFE1.rst4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-11-12-01-39-57.gh-issue-99370._cu32j.rst2
-rw-r--r--Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst2
-rw-r--r--Misc/NEWS.d/next/Security/2022-11-11-12-50-28.gh-issue-87604.OtwH5L.rst2
-rw-r--r--Modules/Setup.stdlib.in2
-rw-r--r--Modules/_abc.c18
-rw-r--r--Modules/_collectionsmodule.c60
-rw-r--r--Modules/_csv.c9
-rw-r--r--Modules/_ctypes/callproc.c24
-rw-r--r--Modules/_curses_panel.c27
-rw-r--r--Modules/_cursesmodule.c3
-rw-r--r--Modules/_datetimemodule.c101
-rw-r--r--Modules/_dbmmodule.c6
-rw-r--r--Modules/_decimal/_decimal.c107
-rw-r--r--Modules/_functoolsmodule.c69
-rw-r--r--Modules/_gdbmmodule.c12
-rw-r--r--Modules/_heapqmodule.c15
-rw-r--r--Modules/_io/_iomodule.c9
-rw-r--r--Modules/_io/bufferedio.c9
-rw-r--r--Modules/_io/bytesio.c18
-rw-r--r--Modules/_io/iobase.c6
-rw-r--r--Modules/_io/stringio.c12
-rw-r--r--Modules/_io/textio.c35
-rw-r--r--Modules/_json.c22
-rw-r--r--Modules/_lsprof.c12
-rw-r--r--Modules/_operator.c21
-rw-r--r--Modules/_pickle.c75
-rw-r--r--Modules/_sre/sre.c79
-rw-r--r--Modules/_ssl.c56
-rw-r--r--Modules/_ssl/debughelpers.c12
-rw-r--r--Modules/_struct.c6
-rw-r--r--Modules/_testcapi/datetime.c453
-rw-r--r--Modules/_testcapi/getargs.c920
-rw-r--r--Modules/_testcapi/parts.h3
-rw-r--r--Modules/_testcapi/pytime.c274
-rw-r--r--Modules/_testcapimodule.c1517
-rw-r--r--Modules/_testinternalcapi.c23
-rw-r--r--Modules/_tkinter.c48
-rw-r--r--Modules/_tracemalloc.c10
-rw-r--r--Modules/_typingmodule.c3
-rw-r--r--Modules/_winapi.c3
-rw-r--r--Modules/_xxsubinterpretersmodule.c11
-rw-r--r--Modules/_zoneinfo.c46
-rw-r--r--Modules/arraymodule.c37
-rw-r--r--Modules/cjkcodecs/multibytecodec.c21
-rw-r--r--Modules/clinic/_testinternalcapi.c.h65
-rw-r--r--Modules/gcmodule.c3
-rw-r--r--Modules/getpath.c29
-rw-r--r--Modules/getpath.py3
-rw-r--r--Modules/mathmodule.c6
-rw-r--r--Modules/ossaudiodev.c9
-rw-r--r--Modules/overlapped.c12
-rw-r--r--Modules/posixmodule.c60
-rw-r--r--Modules/pyexpat.c22
-rw-r--r--Modules/readline.c12
-rw-r--r--Modules/socketmodule.c26
-rw-r--r--Modules/symtablemodule.c3
-rw-r--r--Modules/unicodedata.c30
-rw-r--r--Modules/xxlimited.c12
-rw-r--r--Modules/xxlimited_35.c12
-rw-r--r--Modules/xxmodule.c15
-rw-r--r--Modules/xxsubtype.c21
-rw-r--r--Modules/zlibmodule.c58
-rw-r--r--Objects/typeobject.c45
-rw-r--r--PC/_msi.c3
-rw-r--r--PC/winreg.c6
-rw-r--r--PCbuild/_testcapi.vcxproj3
-rw-r--r--PCbuild/_testcapi.vcxproj.filters9
-rwxr-xr-xParser/asdl_c.py13
-rw-r--r--Python/Python-ast.c217
-rw-r--r--Python/ast_unparse.c2
-rw-r--r--Python/compile.c173
-rw-r--r--Python/import.c15
-rw-r--r--Python/pystate.c16
-rw-r--r--Python/sysmodule.c2
-rw-r--r--Tools/c-analyzer/cpython/globals-to-fix.tsv37
-rw-r--r--Tools/c-analyzer/cpython/ignored.tsv3
108 files changed, 3338 insertions, 3287 deletions
diff --git a/Doc/includes/custom2.c b/Doc/includes/custom2.c
index 2a3c59f..aee9e1b 100644
--- a/Doc/includes/custom2.c
+++ b/Doc/includes/custom2.c
@@ -51,14 +51,12 @@ Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)
if (first) {
tmp = self->first;
- Py_INCREF(first);
- self->first = first;
+ self->first = Py_NewRef(first);
Py_XDECREF(tmp);
}
if (last) {
tmp = self->last;
- Py_INCREF(last);
- self->last = last;
+ self->last = Py_NewRef(last);
Py_XDECREF(tmp);
}
return 0;
@@ -127,9 +125,7 @@ PyInit_custom2(void)
if (m == NULL)
return NULL;
- Py_INCREF(&CustomType);
- if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) {
- Py_DECREF(&CustomType);
+ if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) {
Py_DECREF(m);
return NULL;
}
diff --git a/Doc/includes/custom3.c b/Doc/includes/custom3.c
index 5a47530..8d88bc2 100644
--- a/Doc/includes/custom3.c
+++ b/Doc/includes/custom3.c
@@ -51,14 +51,12 @@ Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)
if (first) {
tmp = self->first;
- Py_INCREF(first);
- self->first = first;
+ self->first = Py_NewRef(first);
Py_DECREF(tmp);
}
if (last) {
tmp = self->last;
- Py_INCREF(last);
- self->last = last;
+ self->last = Py_NewRef(last);
Py_DECREF(tmp);
}
return 0;
@@ -73,8 +71,7 @@ static PyMemberDef Custom_members[] = {
static PyObject *
Custom_getfirst(CustomObject *self, void *closure)
{
- Py_INCREF(self->first);
- return self->first;
+ return Py_NewRef(self->first);
}
static int
@@ -91,8 +88,7 @@ Custom_setfirst(CustomObject *self, PyObject *value, void *closure)
return -1;
}
tmp = self->first;
- Py_INCREF(value);
- self->first = value;
+ self->first = Py_NewRef(value);
Py_DECREF(tmp);
return 0;
}
@@ -100,8 +96,7 @@ Custom_setfirst(CustomObject *self, PyObject *value, void *closure)
static PyObject *
Custom_getlast(CustomObject *self, void *closure)
{
- Py_INCREF(self->last);
- return self->last;
+ return Py_NewRef(self->last);
}
static int
@@ -118,8 +113,7 @@ Custom_setlast(CustomObject *self, PyObject *value, void *closure)
return -1;
}
tmp = self->last;
- Py_INCREF(value);
- self->last = value;
+ self->last = Py_NewRef(value);
Py_DECREF(tmp);
return 0;
}
@@ -178,9 +172,7 @@ PyInit_custom3(void)
if (m == NULL)
return NULL;
- Py_INCREF(&CustomType);
- if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) {
- Py_DECREF(&CustomType);
+ if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) {
Py_DECREF(m);
return NULL;
}
diff --git a/Doc/includes/custom4.c b/Doc/includes/custom4.c
index c7ee555..ad240ae 100644
--- a/Doc/includes/custom4.c
+++ b/Doc/includes/custom4.c
@@ -67,14 +67,12 @@ Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)
if (first) {
tmp = self->first;
- Py_INCREF(first);
- self->first = first;
+ self->first = Py_NewRef(first);
Py_DECREF(tmp);
}
if (last) {
tmp = self->last;
- Py_INCREF(last);
- self->last = last;
+ self->last = Py_NewRef(last);
Py_DECREF(tmp);
}
return 0;
@@ -89,8 +87,7 @@ static PyMemberDef Custom_members[] = {
static PyObject *
Custom_getfirst(CustomObject *self, void *closure)
{
- Py_INCREF(self->first);
- return self->first;
+ return Py_NewRef(self->first);
}
static int
@@ -114,8 +111,7 @@ Custom_setfirst(CustomObject *self, PyObject *value, void *closure)
static PyObject *
Custom_getlast(CustomObject *self, void *closure)
{
- Py_INCREF(self->last);
- return self->last;
+ return Py_NewRef(self->last);
}
static int
@@ -192,9 +188,7 @@ PyInit_custom4(void)
if (m == NULL)
return NULL;
- Py_INCREF(&CustomType);
- if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) {
- Py_DECREF(&CustomType);
+ if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) {
Py_DECREF(m);
return NULL;
}
diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst
index c43d664..b68b257 100644
--- a/Doc/library/asyncio-runner.rst
+++ b/Doc/library/asyncio-runner.rst
@@ -22,7 +22,7 @@ to simplify async code usage for common wide-spread scenarios.
Running an asyncio Program
==========================
-.. function:: run(coro, *, debug=None)
+.. function:: run(coro, *, debug=None, loop_factory=None)
Execute the :term:`coroutine` *coro* and return the result.
@@ -37,9 +37,11 @@ Running an asyncio Program
debug mode explicitly. ``None`` is used to respect the global
:ref:`asyncio-debug-mode` settings.
- This function always creates a new event loop and closes it at
- the end. It should be used as a main entry point for asyncio
- programs, and should ideally only be called once.
+ If *loop_factory* is not ``None``, it is used to create a new event loop;
+ otherwise :func:`asyncio.new_event_loop` is used. The loop is closed at the end.
+ This function should be used as a main entry point for asyncio programs,
+ and should ideally only be called once. It is recommended to use
+ *loop_factory* to configure the event loop instead of policies.
The executor is given a timeout duration of 5 minutes to shutdown.
If the executor hasn't finished within that duration, a warning is
@@ -62,6 +64,10 @@ Running an asyncio Program
*debug* is ``None`` by default to respect the global debug mode settings.
+ .. versionchanged:: 3.12
+
+ Added *loop_factory* parameter.
+
Runner context manager
======================
diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
index 860378c..0922972 100644
--- a/Doc/using/configure.rst
+++ b/Doc/using/configure.rst
@@ -767,6 +767,13 @@ Compiler flags
.. versionadded:: 3.5
+.. envvar:: COMPILEALL_OPTS
+
+ Options passed to the :mod:`compileall` command line when building PYC files
+ in ``make install``. Default: ``-j0``.
+
+ .. versionadded:: 3.12
+
.. envvar:: EXTRA_CFLAGS
Extra C compiler flags.
diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index e5782ad..bb08e44 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -217,6 +217,11 @@ asyncio
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in :gh:`94597`.)
+* Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying
+ a custom event loop factory.
+ (Contributed by Kumar Aditya in :gh:`99388`.)
+
+
pathlib
-------
@@ -675,6 +680,12 @@ Build Changes
if the Clang compiler accepts the flag.
(Contributed by Dong-hee Na in :gh:`89536`.)
+* Add ``COMPILEALL_OPTS`` variable in Makefile to override :mod:`compileall`
+ options (default: ``-j0``) in ``make install``. Also merged the 3
+ ``compileall`` commands into a single command to build .pyc files for all
+ optimization levels (0, 1, 2) at once.
+ (Contributed by Victor Stinner in :gh:`99289`.)
+
C API Changes
=============
diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h
index 70c2342..c51542b 100644
--- a/Include/cpython/pystate.h
+++ b/Include/cpython/pystate.h
@@ -120,9 +120,6 @@ struct _ts {
after allocation. */
int _initialized;
- /* Was this thread state statically allocated? */
- int _static;
-
int py_recursion_remaining;
int py_recursion_limit;
diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h
index cb490ab..967fe92 100644
--- a/Include/internal/pycore_compile.h
+++ b/Include/internal/pycore_compile.h
@@ -40,6 +40,13 @@ extern int _PyAST_Optimize(
_PyASTOptimizeState *state);
/* Access compiler internals for unit testing */
+
+PyAPI_FUNC(PyObject*) _PyCompile_CodeGen(
+ PyObject *ast,
+ PyObject *filename,
+ PyCompilerFlags *flags,
+ int optimize);
+
PyAPI_FUNC(PyObject*) _PyCompile_OptimizeCfg(
PyObject *instructions,
PyObject *consts);
diff --git a/Include/internal/pycore_global_objects.h b/Include/internal/pycore_global_objects.h
index 3561f68..5ad1f7d 100644
--- a/Include/internal/pycore_global_objects.h
+++ b/Include/internal/pycore_global_objects.h
@@ -10,6 +10,7 @@ extern "C" {
#include "pycore_gc.h" // PyGC_Head
#include "pycore_global_strings.h" // struct _Py_global_strings
+#include "pycore_typeobject.h" // pytype_slotdef
// These would be in pycore_long.h if it weren't for an include cycle.
@@ -20,6 +21,13 @@ extern "C" {
// Only immutable objects should be considered runtime-global.
// All others must be per-interpreter.
+#define _Py_CACHED_OBJECT(NAME) \
+ _PyRuntime.cached_objects.NAME
+
+struct _Py_cached_objects {
+ PyObject *str_replace_inf;
+};
+
#define _Py_GLOBAL_OBJECT(NAME) \
_PyRuntime.global_objects.NAME
#define _Py_SINGLETON(NAME) \
@@ -54,6 +62,10 @@ struct _Py_global_objects {
struct _Py_interp_cached_objects {
int _not_set;
+ /* object.__reduce__ */
+ PyObject *objreduce;
+ PyObject *type_slots_pname;
+ pytype_slotdef *type_slots_ptrs[MAX_EQUIV];
};
#define _Py_INTERP_STATIC_OBJECT(interp, NAME) \
diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h
index 8883bbb..0b5833c 100644
--- a/Include/internal/pycore_global_objects_fini_generated.h
+++ b/Include/internal/pycore_global_objects_fini_generated.h
@@ -781,6 +781,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) {
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(arguments));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(argv));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(as_integer_ratio));
+ _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ast));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(attribute));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(authorizer_callback));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(autocommit));
diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h
index 1227142..5bfd4be 100644
--- a/Include/internal/pycore_global_strings.h
+++ b/Include/internal/pycore_global_strings.h
@@ -267,6 +267,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(arguments)
STRUCT_FOR_ID(argv)
STRUCT_FOR_ID(as_integer_ratio)
+ STRUCT_FOR_ID(ast)
STRUCT_FOR_ID(attribute)
STRUCT_FOR_ID(authorizer_callback)
STRUCT_FOR_ID(autocommit)
diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h
index 7e8d73b..8ba9666 100644
--- a/Include/internal/pycore_import.h
+++ b/Include/internal/pycore_import.h
@@ -21,6 +21,17 @@ struct _import_runtime_state {
This is initialized lazily in _PyImport_FixupExtensionObject().
Modules are added there and looked up in _imp.find_extension(). */
PyObject *extensions;
+ /* The global import lock. */
+ struct {
+ PyThread_type_lock mutex;
+ unsigned long thread;
+ int level;
+ } lock;
+ struct {
+ int import_level;
+ _PyTime_t accumulated;
+ int header;
+ } find_and_load;
};
diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h
index 976e16a..7c998ac 100644
--- a/Include/internal/pycore_interp.h
+++ b/Include/internal/pycore_interp.h
@@ -116,9 +116,6 @@ struct _is {
int _initialized;
int finalizing;
- /* Was this interpreter statically allocated? */
- bool _static;
-
struct _ceval_state ceval;
struct _gc_runtime_state gc;
diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h
index a549068..6bcb35b 100644
--- a/Include/internal/pycore_runtime.h
+++ b/Include/internal/pycore_runtime.h
@@ -136,7 +136,15 @@ typedef struct pyruntimestate {
struct _Py_unicode_runtime_ids unicode_ids;
+ struct {
+ /* Used to set PyTypeObject.tp_version_tag */
+ // bpo-42745: next_version_tag remains shared by all interpreters
+ // because of static types.
+ unsigned int next_version_tag;
+ } types;
+
/* All the objects that are shared by the runtime's interpreters. */
+ struct _Py_cached_objects cached_objects;
struct _Py_global_objects global_objects;
/* The following fields are here to avoid allocation during init.
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index 38c1747..62d5063 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -36,6 +36,19 @@ extern "C" {
until _PyInterpreterState_Enable() is called. */ \
.next_id = -1, \
}, \
+ .types = { \
+ .next_version_tag = 1, \
+ }, \
+ .imports = { \
+ .lock = { \
+ .mutex = NULL, \
+ .thread = PYTHREAD_INVALID_THREAD_ID, \
+ .level = 0, \
+ }, \
+ .find_and_load = { \
+ .header = 1, \
+ }, \
+ }, \
.global_objects = { \
.singletons = { \
.small_ints = _Py_small_ints_INIT, \
@@ -70,7 +83,6 @@ extern "C" {
#define _PyInterpreterState_INIT \
{ \
- ._static = 1, \
.id_refcount = -1, \
DLOPENFLAGS_INIT \
.ceval = { \
@@ -95,7 +107,6 @@ extern "C" {
#define _PyThreadState_INIT \
{ \
- ._static = 1, \
.py_recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \
.context_ver = 1, \
}
diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h
index e7fba8d..7228cb5 100644
--- a/Include/internal/pycore_runtime_init_generated.h
+++ b/Include/internal/pycore_runtime_init_generated.h
@@ -773,6 +773,7 @@ extern "C" {
INIT_ID(arguments), \
INIT_ID(argv), \
INIT_ID(as_integer_ratio), \
+ INIT_ID(ast), \
INIT_ID(attribute), \
INIT_ID(authorizer_callback), \
INIT_ID(autocommit), \
diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h
index 5e7aca1..71f3068 100644
--- a/Include/internal/pycore_typeobject.h
+++ b/Include/internal/pycore_typeobject.h
@@ -18,6 +18,15 @@ extern void _PyTypes_Fini(PyInterpreterState *);
/* other API */
+/* Length of array of slotdef pointers used to store slots with the
+ same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
+ the same __name__, for any __name__. Since that's a static property, it is
+ appropriate to declare fixed-size arrays for this. */
+#define MAX_EQUIV 10
+
+typedef struct wrapperbase pytype_slotdef;
+
+
// Type attribute lookup cache: speed up attribute and method lookups,
// see _PyType_Lookup().
struct type_cache_entry {
diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h
index ada0485..208a1e1 100644
--- a/Include/internal/pycore_unicodeobject_generated.h
+++ b/Include/internal/pycore_unicodeobject_generated.h
@@ -440,6 +440,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string);
string = &_Py_ID(as_integer_ratio);
PyUnicode_InternInPlace(&string);
+ string = &_Py_ID(ast);
+ PyUnicode_InternInPlace(&string);
string = &_Py_ID(attribute);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(authorizer_callback);
diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py
index b1c4dbd..1b89236 100644
--- a/Lib/asyncio/runners.py
+++ b/Lib/asyncio/runners.py
@@ -157,7 +157,7 @@ class Runner:
raise KeyboardInterrupt()
-def run(main, *, debug=None):
+def run(main, *, debug=None, loop_factory=None):
"""Execute the coroutine and return the result.
This function runs the passed coroutine, taking care of
@@ -190,7 +190,7 @@ def run(main, *, debug=None):
raise RuntimeError(
"asyncio.run() cannot be called from a running event loop")
- with Runner(debug=debug) as runner:
+ with Runner(debug=debug, loop_factory=loop_factory) as runner:
return runner.run(main)
diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py
index 4abf33d..a411072 100644
--- a/Lib/test/audit-tests.py
+++ b/Lib/test/audit-tests.py
@@ -450,6 +450,17 @@ def test_syslog():
syslog.closelog()
+def test_not_in_gc():
+ import gc
+
+ hook = lambda *a: None
+ sys.addaudithook(hook)
+
+ for o in gc.get_objects():
+ if isinstance(o, list):
+ assert hook not in o
+
+
if __name__ == "__main__":
from test.support import suppress_msvcrt_asserts
diff --git a/Lib/test/support/bytecode_helper.py b/Lib/test/support/bytecode_helper.py
index eb4ae1a..65ae7a2 100644
--- a/Lib/test/support/bytecode_helper.py
+++ b/Lib/test/support/bytecode_helper.py
@@ -3,7 +3,7 @@
import unittest
import dis
import io
-from _testinternalcapi import optimize_cfg
+from _testinternalcapi import compiler_codegen, optimize_cfg
_UNSPECIFIED = object()
@@ -44,8 +44,7 @@ class BytecodeTestCase(unittest.TestCase):
msg = msg % (opname, argval, disassembly)
self.fail(msg)
-
-class CfgOptimizationTestCase(unittest.TestCase):
+class CompilationStepTestCase(unittest.TestCase):
HAS_ARG = set(dis.hasarg)
HAS_TARGET = set(dis.hasjrel + dis.hasjabs + dis.hasexc)
@@ -58,24 +57,35 @@ class CfgOptimizationTestCase(unittest.TestCase):
self.last_label += 1
return self.last_label
- def complete_insts_info(self, insts):
- # fill in omitted fields in location, and oparg 0 for ops with no arg.
- instructions = []
- for item in insts:
- if isinstance(item, int):
- instructions.append(item)
- else:
- assert isinstance(item, tuple)
- inst = list(reversed(item))
- opcode = dis.opmap[inst.pop()]
- oparg = inst.pop() if opcode in self.HAS_ARG_OR_TARGET else 0
- loc = inst + [-1] * (4 - len(inst))
- instructions.append((opcode, oparg, *loc))
- return instructions
+ def assertInstructionsMatch(self, actual_, expected_):
+ # get two lists where each entry is a label or
+ # an instruction tuple. Compare them, while mapping
+ # each actual label to a corresponding expected label
+ # based on their locations.
+
+ self.assertIsInstance(actual_, list)
+ self.assertIsInstance(expected_, list)
+
+ actual = self.normalize_insts(actual_)
+ expected = self.normalize_insts(expected_)
+ self.assertEqual(len(actual), len(expected))
+
+ # compare instructions
+ for act, exp in zip(actual, expected):
+ if isinstance(act, int):
+ self.assertEqual(exp, act)
+ continue
+ self.assertIsInstance(exp, tuple)
+ self.assertIsInstance(act, tuple)
+ # crop comparison to the provided expected values
+ if len(act) > len(exp):
+ act = act[:len(exp)]
+ self.assertEqual(exp, act)
def normalize_insts(self, insts):
""" Map labels to instruction index.
Remove labels which are not used as jump targets.
+ Map opcodes to opnames.
"""
labels_map = {}
targets = set()
@@ -107,31 +117,32 @@ class CfgOptimizationTestCase(unittest.TestCase):
res.append((opcode, arg, *loc))
return res
- def get_optimized(self, insts, consts):
- insts = self.complete_insts_info(insts)
- insts = optimize_cfg(insts, consts)
- return insts, consts
- def compareInstructions(self, actual_, expected_):
- # get two lists where each entry is a label or
- # an instruction tuple. Compare them, while mapping
- # each actual label to a corresponding expected label
- # based on their locations.
+class CodegenTestCase(CompilationStepTestCase):
- self.assertIsInstance(actual_, list)
- self.assertIsInstance(expected_, list)
+ def generate_code(self, ast):
+ insts = compiler_codegen(ast, "my_file.py", 0)
+ return insts
- actual = self.normalize_insts(actual_)
- expected = self.normalize_insts(expected_)
- self.assertEqual(len(actual), len(expected))
- # compare instructions
- for act, exp in zip(actual, expected):
- if isinstance(act, int):
- self.assertEqual(exp, act)
- continue
- self.assertIsInstance(exp, tuple)
- self.assertIsInstance(act, tuple)
- # pad exp with -1's (if location info is incomplete)
- exp += (-1,) * (len(act) - len(exp))
- self.assertEqual(exp, act)
+class CfgOptimizationTestCase(CompilationStepTestCase):
+
+ def complete_insts_info(self, insts):
+ # fill in omitted fields in location, and oparg 0 for ops with no arg.
+ instructions = []
+ for item in insts:
+ if isinstance(item, int):
+ instructions.append(item)
+ else:
+ assert isinstance(item, tuple)
+ inst = list(reversed(item))
+ opcode = dis.opmap[inst.pop()]
+ oparg = inst.pop() if opcode in self.HAS_ARG_OR_TARGET else 0
+ loc = inst + [-1] * (4 - len(inst))
+ instructions.append((opcode, oparg, *loc))
+ return instructions
+
+ def get_optimized(self, insts, consts):
+ insts = self.complete_insts_info(insts)
+ insts = optimize_cfg(insts, consts)
+ return insts, consts
diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py
index 1308b7e..811cf8b 100644
--- a/Lib/test/test_asyncio/test_runners.py
+++ b/Lib/test/test_asyncio/test_runners.py
@@ -257,6 +257,16 @@ class RunTests(BaseTest):
with self.assertRaises(asyncio.CancelledError):
asyncio.run(main())
+ def test_asyncio_run_loop_factory(self):
+ factory = mock.Mock()
+ loop = factory.return_value = self.new_loop()
+
+ async def main():
+ self.assertEqual(asyncio.get_running_loop(), loop)
+
+ asyncio.run(main(), loop_factory=factory)
+ factory.assert_called_once_with()
+
class RunnerTests(BaseTest):
diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py
index 20bca3e..7411f73 100644
--- a/Lib/test/test_asyncio/test_subprocess.py
+++ b/Lib/test/test_asyncio/test_subprocess.py
@@ -185,7 +185,7 @@ class SubprocessMixin:
def test_kill_issue43884(self):
if sys.platform == 'win32':
- blocking_shell_command = f'{sys.executable} -c "import time; time.sleep(100000000)"'
+ blocking_shell_command = f'{sys.executable} -c "import time; time.sleep(2)"'
else:
blocking_shell_command = 'sleep 1; sleep 1'
creationflags = 0
diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
index 50f78f2..e8d560a 100644
--- a/Lib/test/test_audit.py
+++ b/Lib/test/test_audit.py
@@ -222,6 +222,11 @@ class AuditTest(unittest.TestCase):
('syslog.closelog', '', '')]
)
+ def test_not_in_gc(self):
+ returncode, _, stderr = self.run_python("test_not_in_gc")
+ if returncode:
+ self.fail(stderr)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Lib/test/test_capi/test_unicode.py b/Lib/test/test_capi/test_unicode.py
new file mode 100644
index 0000000..07b77d3
--- /dev/null
+++ b/Lib/test/test_capi/test_unicode.py
@@ -0,0 +1,515 @@
+import unittest
+import sys
+from test import support
+from test.support import import_helper
+
+try:
+ import _testcapi
+except ImportError:
+ _testcapi = None
+
+
+class CAPITest(unittest.TestCase):
+
+ # Test PyUnicode_FromFormat()
+ def test_from_format(self):
+ import_helper.import_module('ctypes')
+ from ctypes import (
+ c_char_p,
+ pythonapi, py_object, sizeof,
+ c_int, c_long, c_longlong, c_ssize_t,
+ c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p)
+ name = "PyUnicode_FromFormat"
+ _PyUnicode_FromFormat = getattr(pythonapi, name)
+ _PyUnicode_FromFormat.argtypes = (c_char_p,)
+ _PyUnicode_FromFormat.restype = py_object
+
+ def PyUnicode_FromFormat(format, *args):
+ cargs = tuple(
+ py_object(arg) if isinstance(arg, str) else arg
+ for arg in args)
+ return _PyUnicode_FromFormat(format, *cargs)
+
+ def check_format(expected, format, *args):
+ text = PyUnicode_FromFormat(format, *args)
+ self.assertEqual(expected, text)
+
+ # ascii format, non-ascii argument
+ check_format('ascii\x7f=unicode\xe9',
+ b'ascii\x7f=%U', 'unicode\xe9')
+
+ # non-ascii format, ascii argument: ensure that PyUnicode_FromFormatV()
+ # raises an error
+ self.assertRaisesRegex(ValueError,
+ r'^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format '
+ 'string, got a non-ASCII byte: 0xe9$',
+ PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
+
+ # test "%c"
+ check_format('\uabcd',
+ b'%c', c_int(0xabcd))
+ check_format('\U0010ffff',
+ b'%c', c_int(0x10ffff))
+ with self.assertRaises(OverflowError):
+ PyUnicode_FromFormat(b'%c', c_int(0x110000))
+ # Issue #18183
+ check_format('\U00010000\U00100000',
+ b'%c%c', c_int(0x10000), c_int(0x100000))
+
+ # test "%"
+ check_format('%',
+ b'%%')
+ check_format('%s',
+ b'%%s')
+ check_format('[%]',
+ b'[%%]')
+ check_format('%abc',
+ b'%%%s', b'abc')
+
+ # truncated string
+ check_format('abc',
+ b'%.3s', b'abcdef')
+ check_format('abc[\ufffd',
+ b'%.5s', 'abc[\u20ac]'.encode('utf8'))
+ check_format("'\\u20acABC'",
+ b'%A', '\u20acABC')
+ check_format("'\\u20",
+ b'%.5A', '\u20acABCDEF')
+ check_format("'\u20acABC'",
+ b'%R', '\u20acABC')
+ check_format("'\u20acA",
+ b'%.3R', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3S', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3U', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3V', '\u20acABCDEF', None)
+ check_format('abc[\ufffd',
+ b'%.5V', None, 'abc[\u20ac]'.encode('utf8'))
+
+ # following tests comes from #7330
+ # test width modifier and precision modifier with %S
+ check_format("repr= abc",
+ b'repr=%5S', 'abc')
+ check_format("repr=ab",
+ b'repr=%.2S', 'abc')
+ check_format("repr= ab",
+ b'repr=%5.2S', 'abc')
+
+ # test width modifier and precision modifier with %R
+ check_format("repr= 'abc'",
+ b'repr=%8R', 'abc')
+ check_format("repr='ab",
+ b'repr=%.3R', 'abc')
+ check_format("repr= 'ab",
+ b'repr=%5.3R', 'abc')
+
+ # test width modifier and precision modifier with %A
+ check_format("repr= 'abc'",
+ b'repr=%8A', 'abc')
+ check_format("repr='ab",
+ b'repr=%.3A', 'abc')
+ check_format("repr= 'ab",
+ b'repr=%5.3A', 'abc')
+
+ # test width modifier and precision modifier with %s
+ check_format("repr= abc",
+ b'repr=%5s', b'abc')
+ check_format("repr=ab",
+ b'repr=%.2s', b'abc')
+ check_format("repr= ab",
+ b'repr=%5.2s', b'abc')
+
+ # test width modifier and precision modifier with %U
+ check_format("repr= abc",
+ b'repr=%5U', 'abc')
+ check_format("repr=ab",
+ b'repr=%.2U', 'abc')
+ check_format("repr= ab",
+ b'repr=%5.2U', 'abc')
+
+ # test width modifier and precision modifier with %V
+ check_format("repr= abc",
+ b'repr=%5V', 'abc', b'123')
+ check_format("repr=ab",
+ b'repr=%.2V', 'abc', b'123')
+ check_format("repr= ab",
+ b'repr=%5.2V', 'abc', b'123')
+ check_format("repr= 123",
+ b'repr=%5V', None, b'123')
+ check_format("repr=12",
+ b'repr=%.2V', None, b'123')
+ check_format("repr= 12",
+ b'repr=%5.2V', None, b'123')
+
+ # test integer formats (%i, %d, %u)
+ check_format('010',
+ b'%03i', c_int(10))
+ check_format('0010',
+ b'%0.4i', c_int(10))
+ check_format('-123',
+ b'%i', c_int(-123))
+ check_format('-123',
+ b'%li', c_long(-123))
+ check_format('-123',
+ b'%lli', c_longlong(-123))
+ check_format('-123',
+ b'%zi', c_ssize_t(-123))
+
+ check_format('-123',
+ b'%d', c_int(-123))
+ check_format('-123',
+ b'%ld', c_long(-123))
+ check_format('-123',
+ b'%lld', c_longlong(-123))
+ check_format('-123',
+ b'%zd', c_ssize_t(-123))
+
+ check_format('123',
+ b'%u', c_uint(123))
+ check_format('123',
+ b'%lu', c_ulong(123))
+ check_format('123',
+ b'%llu', c_ulonglong(123))
+ check_format('123',
+ b'%zu', c_size_t(123))
+
+ # test long output
+ min_longlong = -(2 ** (8 * sizeof(c_longlong) - 1))
+ max_longlong = -min_longlong - 1
+ check_format(str(min_longlong),
+ b'%lld', c_longlong(min_longlong))
+ check_format(str(max_longlong),
+ b'%lld', c_longlong(max_longlong))
+ max_ulonglong = 2 ** (8 * sizeof(c_ulonglong)) - 1
+ check_format(str(max_ulonglong),
+ b'%llu', c_ulonglong(max_ulonglong))
+ PyUnicode_FromFormat(b'%p', c_void_p(-1))
+
+ # test padding (width and/or precision)
+ check_format('123'.rjust(10, '0'),
+ b'%010i', c_int(123))
+ check_format('123'.rjust(100),
+ b'%100i', c_int(123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100i', c_int(123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80i', c_int(123))
+
+ check_format('123'.rjust(10, '0'),
+ b'%010u', c_uint(123))
+ check_format('123'.rjust(100),
+ b'%100u', c_uint(123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100u', c_uint(123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80u', c_uint(123))
+
+ check_format('123'.rjust(10, '0'),
+ b'%010x', c_int(0x123))
+ check_format('123'.rjust(100),
+ b'%100x', c_int(0x123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100x', c_int(0x123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80x', c_int(0x123))
+
+ # test %A
+ check_format(r"%A:'abc\xe9\uabcd\U0010ffff'",
+ b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
+
+ # test %V
+ check_format('repr=abc',
+ b'repr=%V', 'abc', b'xyz')
+
+ # test %p
+ # We cannot test the exact result,
+ # because it returns a hex representation of a C pointer,
+ # which is going to be different each time. But, we can test the format.
+ p_format_regex = r'^0x[a-zA-Z0-9]{3,}$'
+ p_format1 = PyUnicode_FromFormat(b'%p', 'abc')
+ self.assertIsInstance(p_format1, str)
+ self.assertRegex(p_format1, p_format_regex)
+
+ p_format2 = PyUnicode_FromFormat(b'%p %p', '123456', b'xyz')
+ self.assertIsInstance(p_format2, str)
+ self.assertRegex(p_format2,
+ r'0x[a-zA-Z0-9]{3,} 0x[a-zA-Z0-9]{3,}')
+
+ # Extra args are ignored:
+ p_format3 = PyUnicode_FromFormat(b'%p', '123456', None, b'xyz')
+ self.assertIsInstance(p_format3, str)
+ self.assertRegex(p_format3, p_format_regex)
+
+ # Test string decode from parameter of %s using utf-8.
+ # b'\xe4\xba\xba\xe6\xb0\x91' is utf-8 encoded byte sequence of
+ # '\u4eba\u6c11'
+ check_format('repr=\u4eba\u6c11',
+ b'repr=%V', None, b'\xe4\xba\xba\xe6\xb0\x91')
+
+ #Test replace error handler.
+ check_format('repr=abc\ufffd',
+ b'repr=%V', None, b'abc\xff')
+
+ # Issue #33817: empty strings
+ check_format('',
+ b'')
+ check_format('',
+ b'%s', b'')
+
+ # check for crashes
+ for fmt in (b'%', b'%0', b'%01', b'%.', b'%.1',
+ b'%0%s', b'%1%s', b'%.%s', b'%.1%s', b'%1abc',
+ b'%l', b'%ll', b'%z', b'%ls', b'%lls', b'%zs'):
+ with self.subTest(fmt=fmt):
+ self.assertRaisesRegex(SystemError, 'invalid format string',
+ PyUnicode_FromFormat, fmt, b'abc')
+ self.assertRaisesRegex(SystemError, 'invalid format string',
+ PyUnicode_FromFormat, b'%+i', c_int(10))
+
+ # Test PyUnicode_AsWideChar()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_aswidechar(self):
+ from _testcapi import unicode_aswidechar
+ import_helper.import_module('ctypes')
+ from ctypes import c_wchar, sizeof
+
+ wchar, size = unicode_aswidechar('abcdef', 2)
+ self.assertEqual(size, 2)
+ self.assertEqual(wchar, 'ab')
+
+ wchar, size = unicode_aswidechar('abc', 3)
+ self.assertEqual(size, 3)
+ self.assertEqual(wchar, 'abc')
+
+ wchar, size = unicode_aswidechar('abc', 4)
+ self.assertEqual(size, 3)
+ self.assertEqual(wchar, 'abc\0')
+
+ wchar, size = unicode_aswidechar('abc', 10)
+ self.assertEqual(size, 3)
+ self.assertEqual(wchar, 'abc\0')
+
+ wchar, size = unicode_aswidechar('abc\0def', 20)
+ self.assertEqual(size, 7)
+ self.assertEqual(wchar, 'abc\0def\0')
+
+ nonbmp = chr(0x10ffff)
+ if sizeof(c_wchar) == 2:
+ buflen = 3
+ nchar = 2
+ else: # sizeof(c_wchar) == 4
+ buflen = 2
+ nchar = 1
+ wchar, size = unicode_aswidechar(nonbmp, buflen)
+ self.assertEqual(size, nchar)
+ self.assertEqual(wchar, nonbmp + '\0')
+
+ # Test PyUnicode_AsWideCharString()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_aswidecharstring(self):
+ from _testcapi import unicode_aswidecharstring
+ import_helper.import_module('ctypes')
+ from ctypes import c_wchar, sizeof
+
+ wchar, size = unicode_aswidecharstring('abc')
+ self.assertEqual(size, 3)
+ self.assertEqual(wchar, 'abc\0')
+
+ wchar, size = unicode_aswidecharstring('abc\0def')
+ self.assertEqual(size, 7)
+ self.assertEqual(wchar, 'abc\0def\0')
+
+ nonbmp = chr(0x10ffff)
+ if sizeof(c_wchar) == 2:
+ nchar = 2
+ else: # sizeof(c_wchar) == 4
+ nchar = 1
+ wchar, size = unicode_aswidecharstring(nonbmp)
+ self.assertEqual(size, nchar)
+ self.assertEqual(wchar, nonbmp + '\0')
+
+ # Test PyUnicode_AsUCS4()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_asucs4(self):
+ from _testcapi import unicode_asucs4
+ for s in ['abc', '\xa1\xa2', '\u4f60\u597d', 'a\U0001f600',
+ 'a\ud800b\udfffc', '\ud834\udd1e']:
+ l = len(s)
+ self.assertEqual(unicode_asucs4(s, l, True), s+'\0')
+ self.assertEqual(unicode_asucs4(s, l, False), s+'\uffff')
+ self.assertEqual(unicode_asucs4(s, l+1, True), s+'\0\uffff')
+ self.assertEqual(unicode_asucs4(s, l+1, False), s+'\0\uffff')
+ self.assertRaises(SystemError, unicode_asucs4, s, l-1, True)
+ self.assertRaises(SystemError, unicode_asucs4, s, l-2, False)
+ s = '\0'.join([s, s])
+ self.assertEqual(unicode_asucs4(s, len(s), True), s+'\0')
+ self.assertEqual(unicode_asucs4(s, len(s), False), s+'\uffff')
+
+ # Test PyUnicode_AsUTF8()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_asutf8(self):
+ from _testcapi import unicode_asutf8
+
+ bmp = '\u0100'
+ bmp2 = '\uffff'
+ nonbmp = chr(0x10ffff)
+
+ self.assertEqual(unicode_asutf8(bmp), b'\xc4\x80')
+ self.assertEqual(unicode_asutf8(bmp2), b'\xef\xbf\xbf')
+ self.assertEqual(unicode_asutf8(nonbmp), b'\xf4\x8f\xbf\xbf')
+ self.assertRaises(UnicodeEncodeError, unicode_asutf8, 'a\ud800b\udfffc')
+
+ # Test PyUnicode_AsUTF8AndSize()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_asutf8andsize(self):
+ from _testcapi import unicode_asutf8andsize
+
+ bmp = '\u0100'
+ bmp2 = '\uffff'
+ nonbmp = chr(0x10ffff)
+
+ self.assertEqual(unicode_asutf8andsize(bmp), (b'\xc4\x80', 2))
+ self.assertEqual(unicode_asutf8andsize(bmp2), (b'\xef\xbf\xbf', 3))
+ self.assertEqual(unicode_asutf8andsize(nonbmp), (b'\xf4\x8f\xbf\xbf', 4))
+ self.assertRaises(UnicodeEncodeError, unicode_asutf8andsize, 'a\ud800b\udfffc')
+
+ # Test PyUnicode_Count()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_count(self):
+ from _testcapi import unicode_count
+
+ st = 'abcabd'
+ self.assertEqual(unicode_count(st, 'a', 0, len(st)), 2)
+ self.assertEqual(unicode_count(st, 'ab', 0, len(st)), 2)
+ self.assertEqual(unicode_count(st, 'abc', 0, len(st)), 1)
+ self.assertEqual(unicode_count(st, 'а', 0, len(st)), 0) # cyrillic "a"
+ # start < end
+ self.assertEqual(unicode_count(st, 'a', 3, len(st)), 1)
+ self.assertEqual(unicode_count(st, 'a', 4, len(st)), 0)
+ self.assertEqual(unicode_count(st, 'a', 0, sys.maxsize), 2)
+ # start >= end
+ self.assertEqual(unicode_count(st, 'abc', 0, 0), 0)
+ self.assertEqual(unicode_count(st, 'a', 3, 2), 0)
+ self.assertEqual(unicode_count(st, 'a', sys.maxsize, 5), 0)
+ # negative
+ self.assertEqual(unicode_count(st, 'ab', -len(st), -1), 2)
+ self.assertEqual(unicode_count(st, 'a', -len(st), -3), 1)
+ # wrong args
+ self.assertRaises(TypeError, unicode_count, 'a', 'a')
+ self.assertRaises(TypeError, unicode_count, 'a', 'a', 1)
+ self.assertRaises(TypeError, unicode_count, 1, 'a', 0, 1)
+ self.assertRaises(TypeError, unicode_count, 'a', 1, 0, 1)
+ # empty string
+ self.assertEqual(unicode_count('abc', '', 0, 3), 4)
+ self.assertEqual(unicode_count('abc', '', 1, 3), 3)
+ self.assertEqual(unicode_count('', '', 0, 1), 1)
+ self.assertEqual(unicode_count('', 'a', 0, 1), 0)
+ # different unicode kinds
+ for uni in "\xa1", "\u8000\u8080", "\ud800\udc02", "\U0001f100\U0001f1f1":
+ for ch in uni:
+ self.assertEqual(unicode_count(uni, ch, 0, len(uni)), 1)
+ self.assertEqual(unicode_count(st, ch, 0, len(st)), 0)
+
+ # subclasses should still work
+ class MyStr(str):
+ pass
+
+ self.assertEqual(unicode_count(MyStr('aab'), 'a', 0, 3), 2)
+
+ # Test PyUnicode_FindChar()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_findchar(self):
+ from _testcapi import unicode_findchar
+
+ for str in "\xa1", "\u8000\u8080", "\ud800\udc02", "\U0001f100\U0001f1f1":
+ for i, ch in enumerate(str):
+ self.assertEqual(unicode_findchar(str, ord(ch), 0, len(str), 1), i)
+ self.assertEqual(unicode_findchar(str, ord(ch), 0, len(str), -1), i)
+
+ str = "!>_<!"
+ self.assertEqual(unicode_findchar(str, 0x110000, 0, len(str), 1), -1)
+ self.assertEqual(unicode_findchar(str, 0x110000, 0, len(str), -1), -1)
+ # start < end
+ self.assertEqual(unicode_findchar(str, ord('!'), 1, len(str)+1, 1), 4)
+ self.assertEqual(unicode_findchar(str, ord('!'), 1, len(str)+1, -1), 4)
+ # start >= end
+ self.assertEqual(unicode_findchar(str, ord('!'), 0, 0, 1), -1)
+ self.assertEqual(unicode_findchar(str, ord('!'), len(str), 0, 1), -1)
+ # negative
+ self.assertEqual(unicode_findchar(str, ord('!'), -len(str), -1, 1), 0)
+ self.assertEqual(unicode_findchar(str, ord('!'), -len(str), -1, -1), 0)
+
+ # Test PyUnicode_CopyCharacters()
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_copycharacters(self):
+ from _testcapi import unicode_copycharacters
+
+ strings = [
+ 'abcde', '\xa1\xa2\xa3\xa4\xa5',
+ '\u4f60\u597d\u4e16\u754c\uff01',
+ '\U0001f600\U0001f601\U0001f602\U0001f603\U0001f604'
+ ]
+
+ for idx, from_ in enumerate(strings):
+ # wide -> narrow: exceed maxchar limitation
+ for to in strings[:idx]:
+ self.assertRaises(
+ SystemError,
+ unicode_copycharacters, to, 0, from_, 0, 5
+ )
+ # same kind
+ for from_start in range(5):
+ self.assertEqual(
+ unicode_copycharacters(from_, 0, from_, from_start, 5),
+ (from_[from_start:from_start+5].ljust(5, '\0'),
+ 5-from_start)
+ )
+ for to_start in range(5):
+ self.assertEqual(
+ unicode_copycharacters(from_, to_start, from_, to_start, 5),
+ (from_[to_start:to_start+5].rjust(5, '\0'),
+ 5-to_start)
+ )
+ # narrow -> wide
+ # Tests omitted since this creates invalid strings.
+
+ s = strings[0]
+ self.assertRaises(IndexError, unicode_copycharacters, s, 6, s, 0, 5)
+ self.assertRaises(IndexError, unicode_copycharacters, s, -1, s, 0, 5)
+ self.assertRaises(IndexError, unicode_copycharacters, s, 0, s, 6, 5)
+ self.assertRaises(IndexError, unicode_copycharacters, s, 0, s, -1, 5)
+ self.assertRaises(SystemError, unicode_copycharacters, s, 1, s, 0, 5)
+ self.assertRaises(SystemError, unicode_copycharacters, s, 0, s, 0, -1)
+ self.assertRaises(SystemError, unicode_copycharacters, s, 0, b'', 0, 0)
+
+ @support.cpython_only
+ @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ def test_pep393_utf8_caching_bug(self):
+ # Issue #25709: Problem with string concatenation and utf-8 cache
+ from _testcapi import getargs_s_hash
+ for k in 0x24, 0xa4, 0x20ac, 0x1f40d:
+ s = ''
+ for i in range(5):
+ # Due to CPython specific optimization the 's' string can be
+ # resized in-place.
+ s += chr(k)
+ # Parsing with the "s#" format code calls indirectly
+ # PyUnicode_AsUTF8AndSize() which creates the UTF-8
+ # encoded string cached in the Unicode object.
+ self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1))
+ # Check that the second call returns the same result
+ self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Lib/test/test_compiler_codegen.py b/Lib/test/test_compiler_codegen.py
new file mode 100644
index 0000000..f2e14c1
--- /dev/null
+++ b/Lib/test/test_compiler_codegen.py
@@ -0,0 +1,50 @@
+
+from test.support.bytecode_helper import CodegenTestCase
+
+# Tests for the code-generation stage of the compiler.
+# Examine the un-optimized code generated from the AST.
+
+class IsolatedCodeGenTests(CodegenTestCase):
+
+ def codegen_test(self, snippet, expected_insts):
+ import ast
+ a = ast.parse(snippet, "my_file.py", "exec");
+ insts = self.generate_code(a)
+ self.assertInstructionsMatch(insts, expected_insts)
+
+ def test_if_expression(self):
+ snippet = "42 if True else 24"
+ false_lbl = self.Label()
+ expected = [
+ ('RESUME', 0, 0),
+ ('LOAD_CONST', 0, 1),
+ ('POP_JUMP_IF_FALSE', false_lbl := self.Label(), 1),
+ ('LOAD_CONST', 1, 1),
+ ('JUMP', exit_lbl := self.Label()),
+ false_lbl,
+ ('LOAD_CONST', 2, 1),
+ exit_lbl,
+ ('POP_TOP', None),
+ ]
+ self.codegen_test(snippet, expected)
+
+ def test_for_loop(self):
+ snippet = "for x in l:\n\tprint(x)"
+ false_lbl = self.Label()
+ expected = [
+ ('RESUME', 0, 0),
+ ('LOAD_NAME', 0, 1),
+ ('GET_ITER', None, 1),
+ loop_lbl := self.Label(),
+ ('FOR_ITER', exit_lbl := self.Label(), 1),
+ ('STORE_NAME', None, 1),
+ ('PUSH_NULL', None, 2),
+ ('LOAD_NAME', None, 2),
+ ('LOAD_NAME', None, 2),
+ ('CALL', None, 2),
+ ('POP_TOP', None),
+ ('JUMP', loop_lbl),
+ exit_lbl,
+ ('END_FOR', None),
+ ]
+ self.codegen_test(snippet, expected)
diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
index 7a22a9a..bdcf4a3 100644
--- a/Lib/test/test_getpath.py
+++ b/Lib/test/test_getpath.py
@@ -382,6 +382,39 @@ class MockGetPathTests(unittest.TestCase):
actual = getpath(ns, expected)
self.assertEqual(expected, actual)
+ def test_venv_non_installed_zip_path_posix(self):
+ "Test a venv created from non-installed python has correct zip path."""
+ ns = MockPosixNamespace(
+ argv0="/venv/bin/python",
+ PREFIX="/usr",
+ ENV_PATH="/venv/bin:/usr/bin",
+ )
+ ns.add_known_xfile("/path/to/non-installed/bin/python")
+ ns.add_known_xfile("/venv/bin/python")
+ ns.add_known_link("/venv/bin/python",
+ "/path/to/non-installed/bin/python")
+ ns.add_known_file("/path/to/non-installed/lib/python9.8/os.py")
+ ns.add_known_dir("/path/to/non-installed/lib/python9.8/lib-dynload")
+ ns.add_known_file("/venv/pyvenv.cfg", [
+ r"home = /path/to/non-installed"
+ ])
+ expected = dict(
+ executable="/venv/bin/python",
+ prefix="/path/to/non-installed",
+ exec_prefix="/path/to/non-installed",
+ base_executable="/path/to/non-installed/bin/python",
+ base_prefix="/path/to/non-installed",
+ base_exec_prefix="/path/to/non-installed",
+ module_search_paths_set=1,
+ module_search_paths=[
+ "/path/to/non-installed/lib/python98.zip",
+ "/path/to/non-installed/lib/python9.8",
+ "/path/to/non-installed/lib/python9.8/lib-dynload",
+ ],
+ )
+ actual = getpath(ns, expected)
+ self.assertEqual(expected, actual)
+
def test_venv_changed_name_copy_posix(self):
"Test a venv --copies layout on *nix that lacks a distributed 'python'"
ns = MockPosixNamespace(
diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py
index 0d398fc..239c9d0 100644
--- a/Lib/test/test_peepholer.py
+++ b/Lib/test/test_peepholer.py
@@ -984,7 +984,7 @@ class DirectiCfgOptimizerTests(CfgOptimizationTestCase):
if expected_consts is None:
expected_consts = consts
opt_insts, opt_consts = self.get_optimized(insts, consts)
- self.compareInstructions(opt_insts, expected_insts)
+ self.assertInstructionsMatch(opt_insts, expected_insts)
self.assertEqual(opt_consts, expected_consts)
def test_conditional_jump_forward_non_const_condition(self):
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index db1b6e7..5465d35 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -16,7 +16,6 @@ import textwrap
import unicodedata
import unittest
import warnings
-from test.support import import_helper
from test.support import warnings_helper
from test import support, string_tests
from test.support.script_helper import assert_python_failure
@@ -2623,507 +2622,6 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual(proc.rc, 10, proc)
-class CAPITest(unittest.TestCase):
-
- # Test PyUnicode_FromFormat()
- def test_from_format(self):
- import_helper.import_module('ctypes')
- from ctypes import (
- c_char_p,
- pythonapi, py_object, sizeof,
- c_int, c_long, c_longlong, c_ssize_t,
- c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p)
- name = "PyUnicode_FromFormat"
- _PyUnicode_FromFormat = getattr(pythonapi, name)
- _PyUnicode_FromFormat.argtypes = (c_char_p,)
- _PyUnicode_FromFormat.restype = py_object
-
- def PyUnicode_FromFormat(format, *args):
- cargs = tuple(
- py_object(arg) if isinstance(arg, str) else arg
- for arg in args)
- return _PyUnicode_FromFormat(format, *cargs)
-
- def check_format(expected, format, *args):
- text = PyUnicode_FromFormat(format, *args)
- self.assertEqual(expected, text)
-
- # ascii format, non-ascii argument
- check_format('ascii\x7f=unicode\xe9',
- b'ascii\x7f=%U', 'unicode\xe9')
-
- # non-ascii format, ascii argument: ensure that PyUnicode_FromFormatV()
- # raises an error
- self.assertRaisesRegex(ValueError,
- r'^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format '
- 'string, got a non-ASCII byte: 0xe9$',
- PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
-
- # test "%c"
- check_format('\uabcd',
- b'%c', c_int(0xabcd))
- check_format('\U0010ffff',
- b'%c', c_int(0x10ffff))
- with self.assertRaises(OverflowError):
- PyUnicode_FromFormat(b'%c', c_int(0x110000))
- # Issue #18183
- check_format('\U00010000\U00100000',
- b'%c%c', c_int(0x10000), c_int(0x100000))
-
- # test "%"
- check_format('%',
- b'%%')
- check_format('%s',
- b'%%s')
- check_format('[%]',
- b'[%%]')
- check_format('%abc',
- b'%%%s', b'abc')
-
- # truncated string
- check_format('abc',
- b'%.3s', b'abcdef')
- check_format('abc[\ufffd',
- b'%.5s', 'abc[\u20ac]'.encode('utf8'))
- check_format("'\\u20acABC'",
- b'%A', '\u20acABC')
- check_format("'\\u20",
- b'%.5A', '\u20acABCDEF')
- check_format("'\u20acABC'",
- b'%R', '\u20acABC')
- check_format("'\u20acA",
- b'%.3R', '\u20acABCDEF')
- check_format('\u20acAB',
- b'%.3S', '\u20acABCDEF')
- check_format('\u20acAB',
- b'%.3U', '\u20acABCDEF')
- check_format('\u20acAB',
- b'%.3V', '\u20acABCDEF', None)
- check_format('abc[\ufffd',
- b'%.5V', None, 'abc[\u20ac]'.encode('utf8'))
-
- # following tests comes from #7330
- # test width modifier and precision modifier with %S
- check_format("repr= abc",
- b'repr=%5S', 'abc')
- check_format("repr=ab",
- b'repr=%.2S', 'abc')
- check_format("repr= ab",
- b'repr=%5.2S', 'abc')
-
- # test width modifier and precision modifier with %R
- check_format("repr= 'abc'",
- b'repr=%8R', 'abc')
- check_format("repr='ab",
- b'repr=%.3R', 'abc')
- check_format("repr= 'ab",
- b'repr=%5.3R', 'abc')
-
- # test width modifier and precision modifier with %A
- check_format("repr= 'abc'",
- b'repr=%8A', 'abc')
- check_format("repr='ab",
- b'repr=%.3A', 'abc')
- check_format("repr= 'ab",
- b'repr=%5.3A', 'abc')
-
- # test width modifier and precision modifier with %s
- check_format("repr= abc",
- b'repr=%5s', b'abc')
- check_format("repr=ab",
- b'repr=%.2s', b'abc')
- check_format("repr= ab",
- b'repr=%5.2s', b'abc')
-
- # test width modifier and precision modifier with %U
- check_format("repr= abc",
- b'repr=%5U', 'abc')
- check_format("repr=ab",
- b'repr=%.2U', 'abc')
- check_format("repr= ab",
- b'repr=%5.2U', 'abc')
-
- # test width modifier and precision modifier with %V
- check_format("repr= abc",
- b'repr=%5V', 'abc', b'123')
- check_format("repr=ab",
- b'repr=%.2V', 'abc', b'123')
- check_format("repr= ab",
- b'repr=%5.2V', 'abc', b'123')
- check_format("repr= 123",
- b'repr=%5V', None, b'123')
- check_format("repr=12",
- b'repr=%.2V', None, b'123')
- check_format("repr= 12",
- b'repr=%5.2V', None, b'123')
-
- # test integer formats (%i, %d, %u)
- check_format('010',
- b'%03i', c_int(10))
- check_format('0010',
- b'%0.4i', c_int(10))
- check_format('-123',
- b'%i', c_int(-123))
- check_format('-123',
- b'%li', c_long(-123))
- check_format('-123',
- b'%lli', c_longlong(-123))
- check_format('-123',
- b'%zi', c_ssize_t(-123))
-
- check_format('-123',
- b'%d', c_int(-123))
- check_format('-123',
- b'%ld', c_long(-123))
- check_format('-123',
- b'%lld', c_longlong(-123))
- check_format('-123',
- b'%zd', c_ssize_t(-123))
-
- check_format('123',
- b'%u', c_uint(123))
- check_format('123',
- b'%lu', c_ulong(123))
- check_format('123',
- b'%llu', c_ulonglong(123))
- check_format('123',
- b'%zu', c_size_t(123))
-
- # test long output
- min_longlong = -(2 ** (8 * sizeof(c_longlong) - 1))
- max_longlong = -min_longlong - 1
- check_format(str(min_longlong),
- b'%lld', c_longlong(min_longlong))
- check_format(str(max_longlong),
- b'%lld', c_longlong(max_longlong))
- max_ulonglong = 2 ** (8 * sizeof(c_ulonglong)) - 1
- check_format(str(max_ulonglong),
- b'%llu', c_ulonglong(max_ulonglong))
- PyUnicode_FromFormat(b'%p', c_void_p(-1))
-
- # test padding (width and/or precision)
- check_format('123'.rjust(10, '0'),
- b'%010i', c_int(123))
- check_format('123'.rjust(100),
- b'%100i', c_int(123))
- check_format('123'.rjust(100, '0'),
- b'%.100i', c_int(123))
- check_format('123'.rjust(80, '0').rjust(100),
- b'%100.80i', c_int(123))
-
- check_format('123'.rjust(10, '0'),
- b'%010u', c_uint(123))
- check_format('123'.rjust(100),
- b'%100u', c_uint(123))
- check_format('123'.rjust(100, '0'),
- b'%.100u', c_uint(123))
- check_format('123'.rjust(80, '0').rjust(100),
- b'%100.80u', c_uint(123))
-
- check_format('123'.rjust(10, '0'),
- b'%010x', c_int(0x123))
- check_format('123'.rjust(100),
- b'%100x', c_int(0x123))
- check_format('123'.rjust(100, '0'),
- b'%.100x', c_int(0x123))
- check_format('123'.rjust(80, '0').rjust(100),
- b'%100.80x', c_int(0x123))
-
- # test %A
- check_format(r"%A:'abc\xe9\uabcd\U0010ffff'",
- b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
-
- # test %V
- check_format('repr=abc',
- b'repr=%V', 'abc', b'xyz')
-
- # test %p
- # We cannot test the exact result,
- # because it returns a hex representation of a C pointer,
- # which is going to be different each time. But, we can test the format.
- p_format_regex = r'^0x[a-zA-Z0-9]{3,}$'
- p_format1 = PyUnicode_FromFormat(b'%p', 'abc')
- self.assertIsInstance(p_format1, str)
- self.assertRegex(p_format1, p_format_regex)
-
- p_format2 = PyUnicode_FromFormat(b'%p %p', '123456', b'xyz')
- self.assertIsInstance(p_format2, str)
- self.assertRegex(p_format2,
- r'0x[a-zA-Z0-9]{3,} 0x[a-zA-Z0-9]{3,}')
-
- # Extra args are ignored:
- p_format3 = PyUnicode_FromFormat(b'%p', '123456', None, b'xyz')
- self.assertIsInstance(p_format3, str)
- self.assertRegex(p_format3, p_format_regex)
-
- # Test string decode from parameter of %s using utf-8.
- # b'\xe4\xba\xba\xe6\xb0\x91' is utf-8 encoded byte sequence of
- # '\u4eba\u6c11'
- check_format('repr=\u4eba\u6c11',
- b'repr=%V', None, b'\xe4\xba\xba\xe6\xb0\x91')
-
- #Test replace error handler.
- check_format('repr=abc\ufffd',
- b'repr=%V', None, b'abc\xff')
-
- # Issue #33817: empty strings
- check_format('',
- b'')
- check_format('',
- b'%s', b'')
-
- # check for crashes
- for fmt in (b'%', b'%0', b'%01', b'%.', b'%.1',
- b'%0%s', b'%1%s', b'%.%s', b'%.1%s', b'%1abc',
- b'%l', b'%ll', b'%z', b'%ls', b'%lls', b'%zs'):
- with self.subTest(fmt=fmt):
- self.assertRaisesRegex(SystemError, 'invalid format string',
- PyUnicode_FromFormat, fmt, b'abc')
- self.assertRaisesRegex(SystemError, 'invalid format string',
- PyUnicode_FromFormat, b'%+i', c_int(10))
-
- # Test PyUnicode_AsWideChar()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_aswidechar(self):
- from _testcapi import unicode_aswidechar
- import_helper.import_module('ctypes')
- from ctypes import c_wchar, sizeof
-
- wchar, size = unicode_aswidechar('abcdef', 2)
- self.assertEqual(size, 2)
- self.assertEqual(wchar, 'ab')
-
- wchar, size = unicode_aswidechar('abc', 3)
- self.assertEqual(size, 3)
- self.assertEqual(wchar, 'abc')
-
- wchar, size = unicode_aswidechar('abc', 4)
- self.assertEqual(size, 3)
- self.assertEqual(wchar, 'abc\0')
-
- wchar, size = unicode_aswidechar('abc', 10)
- self.assertEqual(size, 3)
- self.assertEqual(wchar, 'abc\0')
-
- wchar, size = unicode_aswidechar('abc\0def', 20)
- self.assertEqual(size, 7)
- self.assertEqual(wchar, 'abc\0def\0')
-
- nonbmp = chr(0x10ffff)
- if sizeof(c_wchar) == 2:
- buflen = 3
- nchar = 2
- else: # sizeof(c_wchar) == 4
- buflen = 2
- nchar = 1
- wchar, size = unicode_aswidechar(nonbmp, buflen)
- self.assertEqual(size, nchar)
- self.assertEqual(wchar, nonbmp + '\0')
-
- # Test PyUnicode_AsWideCharString()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_aswidecharstring(self):
- from _testcapi import unicode_aswidecharstring
- import_helper.import_module('ctypes')
- from ctypes import c_wchar, sizeof
-
- wchar, size = unicode_aswidecharstring('abc')
- self.assertEqual(size, 3)
- self.assertEqual(wchar, 'abc\0')
-
- wchar, size = unicode_aswidecharstring('abc\0def')
- self.assertEqual(size, 7)
- self.assertEqual(wchar, 'abc\0def\0')
-
- nonbmp = chr(0x10ffff)
- if sizeof(c_wchar) == 2:
- nchar = 2
- else: # sizeof(c_wchar) == 4
- nchar = 1
- wchar, size = unicode_aswidecharstring(nonbmp)
- self.assertEqual(size, nchar)
- self.assertEqual(wchar, nonbmp + '\0')
-
- # Test PyUnicode_AsUCS4()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_asucs4(self):
- from _testcapi import unicode_asucs4
- for s in ['abc', '\xa1\xa2', '\u4f60\u597d', 'a\U0001f600',
- 'a\ud800b\udfffc', '\ud834\udd1e']:
- l = len(s)
- self.assertEqual(unicode_asucs4(s, l, True), s+'\0')
- self.assertEqual(unicode_asucs4(s, l, False), s+'\uffff')
- self.assertEqual(unicode_asucs4(s, l+1, True), s+'\0\uffff')
- self.assertEqual(unicode_asucs4(s, l+1, False), s+'\0\uffff')
- self.assertRaises(SystemError, unicode_asucs4, s, l-1, True)
- self.assertRaises(SystemError, unicode_asucs4, s, l-2, False)
- s = '\0'.join([s, s])
- self.assertEqual(unicode_asucs4(s, len(s), True), s+'\0')
- self.assertEqual(unicode_asucs4(s, len(s), False), s+'\uffff')
-
- # Test PyUnicode_AsUTF8()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_asutf8(self):
- from _testcapi import unicode_asutf8
-
- bmp = '\u0100'
- bmp2 = '\uffff'
- nonbmp = chr(0x10ffff)
-
- self.assertEqual(unicode_asutf8(bmp), b'\xc4\x80')
- self.assertEqual(unicode_asutf8(bmp2), b'\xef\xbf\xbf')
- self.assertEqual(unicode_asutf8(nonbmp), b'\xf4\x8f\xbf\xbf')
- self.assertRaises(UnicodeEncodeError, unicode_asutf8, 'a\ud800b\udfffc')
-
- # Test PyUnicode_AsUTF8AndSize()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_asutf8andsize(self):
- from _testcapi import unicode_asutf8andsize
-
- bmp = '\u0100'
- bmp2 = '\uffff'
- nonbmp = chr(0x10ffff)
-
- self.assertEqual(unicode_asutf8andsize(bmp), (b'\xc4\x80', 2))
- self.assertEqual(unicode_asutf8andsize(bmp2), (b'\xef\xbf\xbf', 3))
- self.assertEqual(unicode_asutf8andsize(nonbmp), (b'\xf4\x8f\xbf\xbf', 4))
- self.assertRaises(UnicodeEncodeError, unicode_asutf8andsize, 'a\ud800b\udfffc')
-
- # Test PyUnicode_Count()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_count(self):
- from _testcapi import unicode_count
-
- st = 'abcabd'
- self.assertEqual(unicode_count(st, 'a', 0, len(st)), 2)
- self.assertEqual(unicode_count(st, 'ab', 0, len(st)), 2)
- self.assertEqual(unicode_count(st, 'abc', 0, len(st)), 1)
- self.assertEqual(unicode_count(st, 'а', 0, len(st)), 0) # cyrillic "a"
- # start < end
- self.assertEqual(unicode_count(st, 'a', 3, len(st)), 1)
- self.assertEqual(unicode_count(st, 'a', 4, len(st)), 0)
- self.assertEqual(unicode_count(st, 'a', 0, sys.maxsize), 2)
- # start >= end
- self.assertEqual(unicode_count(st, 'abc', 0, 0), 0)
- self.assertEqual(unicode_count(st, 'a', 3, 2), 0)
- self.assertEqual(unicode_count(st, 'a', sys.maxsize, 5), 0)
- # negative
- self.assertEqual(unicode_count(st, 'ab', -len(st), -1), 2)
- self.assertEqual(unicode_count(st, 'a', -len(st), -3), 1)
- # wrong args
- self.assertRaises(TypeError, unicode_count, 'a', 'a')
- self.assertRaises(TypeError, unicode_count, 'a', 'a', 1)
- self.assertRaises(TypeError, unicode_count, 1, 'a', 0, 1)
- self.assertRaises(TypeError, unicode_count, 'a', 1, 0, 1)
- # empty string
- self.assertEqual(unicode_count('abc', '', 0, 3), 4)
- self.assertEqual(unicode_count('abc', '', 1, 3), 3)
- self.assertEqual(unicode_count('', '', 0, 1), 1)
- self.assertEqual(unicode_count('', 'a', 0, 1), 0)
- # different unicode kinds
- for uni in "\xa1", "\u8000\u8080", "\ud800\udc02", "\U0001f100\U0001f1f1":
- for ch in uni:
- self.assertEqual(unicode_count(uni, ch, 0, len(uni)), 1)
- self.assertEqual(unicode_count(st, ch, 0, len(st)), 0)
-
- # subclasses should still work
- class MyStr(str):
- pass
-
- self.assertEqual(unicode_count(MyStr('aab'), 'a', 0, 3), 2)
-
- # Test PyUnicode_FindChar()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_findchar(self):
- from _testcapi import unicode_findchar
-
- for str in "\xa1", "\u8000\u8080", "\ud800\udc02", "\U0001f100\U0001f1f1":
- for i, ch in enumerate(str):
- self.assertEqual(unicode_findchar(str, ord(ch), 0, len(str), 1), i)
- self.assertEqual(unicode_findchar(str, ord(ch), 0, len(str), -1), i)
-
- str = "!>_<!"
- self.assertEqual(unicode_findchar(str, 0x110000, 0, len(str), 1), -1)
- self.assertEqual(unicode_findchar(str, 0x110000, 0, len(str), -1), -1)
- # start < end
- self.assertEqual(unicode_findchar(str, ord('!'), 1, len(str)+1, 1), 4)
- self.assertEqual(unicode_findchar(str, ord('!'), 1, len(str)+1, -1), 4)
- # start >= end
- self.assertEqual(unicode_findchar(str, ord('!'), 0, 0, 1), -1)
- self.assertEqual(unicode_findchar(str, ord('!'), len(str), 0, 1), -1)
- # negative
- self.assertEqual(unicode_findchar(str, ord('!'), -len(str), -1, 1), 0)
- self.assertEqual(unicode_findchar(str, ord('!'), -len(str), -1, -1), 0)
-
- # Test PyUnicode_CopyCharacters()
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_copycharacters(self):
- from _testcapi import unicode_copycharacters
-
- strings = [
- 'abcde', '\xa1\xa2\xa3\xa4\xa5',
- '\u4f60\u597d\u4e16\u754c\uff01',
- '\U0001f600\U0001f601\U0001f602\U0001f603\U0001f604'
- ]
-
- for idx, from_ in enumerate(strings):
- # wide -> narrow: exceed maxchar limitation
- for to in strings[:idx]:
- self.assertRaises(
- SystemError,
- unicode_copycharacters, to, 0, from_, 0, 5
- )
- # same kind
- for from_start in range(5):
- self.assertEqual(
- unicode_copycharacters(from_, 0, from_, from_start, 5),
- (from_[from_start:from_start+5].ljust(5, '\0'),
- 5-from_start)
- )
- for to_start in range(5):
- self.assertEqual(
- unicode_copycharacters(from_, to_start, from_, to_start, 5),
- (from_[to_start:to_start+5].rjust(5, '\0'),
- 5-to_start)
- )
- # narrow -> wide
- # Tests omitted since this creates invalid strings.
-
- s = strings[0]
- self.assertRaises(IndexError, unicode_copycharacters, s, 6, s, 0, 5)
- self.assertRaises(IndexError, unicode_copycharacters, s, -1, s, 0, 5)
- self.assertRaises(IndexError, unicode_copycharacters, s, 0, s, 6, 5)
- self.assertRaises(IndexError, unicode_copycharacters, s, 0, s, -1, 5)
- self.assertRaises(SystemError, unicode_copycharacters, s, 1, s, 0, 5)
- self.assertRaises(SystemError, unicode_copycharacters, s, 0, s, 0, -1)
- self.assertRaises(SystemError, unicode_copycharacters, s, 0, b'', 0, 0)
-
- @support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
- def test_pep393_utf8_caching_bug(self):
- # Issue #25709: Problem with string concatenation and utf-8 cache
- from _testcapi import getargs_s_hash
- for k in 0x24, 0xa4, 0x20ac, 0x1f40d:
- s = ''
- for i in range(5):
- # Due to CPython specific optimization the 's' string can be
- # resized in-place.
- s += chr(k)
- # Parsing with the "s#" format code calls indirectly
- # PyUnicode_AsUTF8AndSize() which creates the UTF-8
- # encoded string cached in the Unicode object.
- self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1))
- # Check that the second call returns the same result
- self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1))
-
class StringModuleTest(unittest.TestCase):
def test_formatter_parser(self):
def parse(format):
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 5ce86cf..c685a65 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -537,6 +537,78 @@ class BasicTest(BaseTest):
self.assertRaises(ValueError, venv.create, bad_itempath)
self.assertRaises(ValueError, venv.create, pathlib.Path(bad_itempath))
+ @unittest.skipIf(os.name == 'nt', 'not relevant on Windows')
+ @requireVenvCreate
+ def test_zippath_from_non_installed_posix(self):
+ """
+ Test that when create venv from non-installed python, the zip path
+ value is as expected.
+ """
+ rmtree(self.env_dir)
+ # First try to create a non-installed python. It's not a real full
+ # functional non-installed python, but enough for this test.
+ platlibdir = sys.platlibdir
+ non_installed_dir = os.path.realpath(tempfile.mkdtemp())
+ self.addCleanup(rmtree, non_installed_dir)
+ bindir = os.path.join(non_installed_dir, self.bindir)
+ os.mkdir(bindir)
+ shutil.copy2(sys.executable, bindir)
+ libdir = os.path.join(non_installed_dir, platlibdir, self.lib[1])
+ os.makedirs(libdir)
+ landmark = os.path.join(libdir, "os.py")
+ stdlib_zip = "python%d%d.zip" % sys.version_info[:2]
+ zip_landmark = os.path.join(non_installed_dir,
+ platlibdir,
+ stdlib_zip)
+ additional_pythonpath_for_non_installed = []
+ # Copy stdlib files to the non-installed python so venv can
+ # correctly calculate the prefix.
+ for eachpath in sys.path:
+ if eachpath.endswith(".zip"):
+ if os.path.isfile(eachpath):
+ shutil.copyfile(
+ eachpath,
+ os.path.join(non_installed_dir, platlibdir))
+ elif os.path.isfile(os.path.join(eachpath, "os.py")):
+ for name in os.listdir(eachpath):
+ if name == "site-packages":
+ continue
+ fn = os.path.join(eachpath, name)
+ if os.path.isfile(fn):
+ shutil.copy(fn, libdir)
+ elif os.path.isdir(fn):
+ shutil.copytree(fn, os.path.join(libdir, name))
+ else:
+ additional_pythonpath_for_non_installed.append(
+ eachpath)
+ cmd = [os.path.join(non_installed_dir, self.bindir, self.exe),
+ "-m",
+ "venv",
+ "--without-pip",
+ self.env_dir]
+ # Our fake non-installed python is not fully functional because
+ # it cannot find the extensions. Set PYTHONPATH so it can run the
+ # venv module correctly.
+ pythonpath = os.pathsep.join(
+ additional_pythonpath_for_non_installed)
+ # For python built with shared enabled. We need to set
+ # LD_LIBRARY_PATH so the non-installed python can find and link
+ # libpython.so
+ ld_library_path = os.path.abspath(os.path.dirname(sys.executable))
+ if sys.platform == 'darwin':
+ ld_library_path_env = "DYLD_LIBRARY_PATH"
+ else:
+ ld_library_path_env = "LD_LIBRARY_PATH"
+ subprocess.check_call(cmd,
+ env={"PYTHONPATH": pythonpath,
+ ld_library_path_env: ld_library_path})
+ envpy = os.path.join(self.env_dir, self.bindir, self.exe)
+ # Now check the venv created from the non-installed python has
+ # correct zip path in pythonpath.
+ cmd = [envpy, '-S', '-c', 'import sys; print(sys.path)']
+ out, err = check_output(cmd)
+ self.assertTrue(zip_landmark.encode() in out)
+
@requireVenvCreate
class EnsurePipTest(BaseTest):
"""Test venv module installation of pip."""
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 252f6dc..90f5dd7 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -2056,6 +2056,8 @@ TESTSUBDIRS= idlelib/idle_test \
test/xmltestdata test/xmltestdata/c14n-20 \
test/ziptestdata
+COMPILEALL_OPTS=-j0
+
TEST_MODULES=@TEST_MODULES@
libinstall: all $(srcdir)/Modules/xxmodule.c
@for i in $(SCRIPTDIR) $(LIBDEST); \
@@ -2125,32 +2127,15 @@ libinstall: all $(srcdir)/Modules/xxmodule.c
$(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py \
$(DESTDIR)$(LIBDEST); \
$(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST) -f \
- -x 'bad_coding|badsyntax|site-packages|test/test_lib2to3/data' \
- $(DESTDIR)$(LIBDEST)
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST) -f \
- -x 'bad_coding|badsyntax|site-packages|test/test_lib2to3/data' \
- $(DESTDIR)$(LIBDEST)
+ @ # Build PYC files for the 3 optimization levels (0, 1, 2)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST) -f \
+ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST) -f \
-x 'bad_coding|badsyntax|site-packages|test/test_lib2to3/data' \
$(DESTDIR)$(LIBDEST)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST)/site-packages -f \
- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST)/site-packages -f \
- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST)/site-packages -f \
+ -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST)/site-packages -f \
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
diff --git a/Misc/NEWS.d/next/Build/2022-11-09-14-42-48.gh-issue-99289.X7wFE1.rst b/Misc/NEWS.d/next/Build/2022-11-09-14-42-48.gh-issue-99289.X7wFE1.rst
new file mode 100644
index 0000000..86ce4c7
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2022-11-09-14-42-48.gh-issue-99289.X7wFE1.rst
@@ -0,0 +1,4 @@
+Add a ``COMPILEALL_OPTS`` variable in Makefile to override :mod:`compileall`
+options (default: ``-j0``) in ``make install``. Also merged the ``compileall``
+commands into a single command building .pyc files for the all optimization levels
+(0, 1, 2) at once. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-11-12-01-39-57.gh-issue-99370._cu32j.rst b/Misc/NEWS.d/next/Core and Builtins/2022-11-12-01-39-57.gh-issue-99370._cu32j.rst
new file mode 100644
index 0000000..142f91c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-11-12-01-39-57.gh-issue-99370._cu32j.rst
@@ -0,0 +1,2 @@
+Fix zip path for venv created from a non-installed python on POSIX
+platforms.
diff --git a/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst b/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst
new file mode 100644
index 0000000..f35799d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst
@@ -0,0 +1,2 @@
+Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying a custom event loop factory.
+Patch by Kumar Aditya.
diff --git a/Misc/NEWS.d/next/Security/2022-11-11-12-50-28.gh-issue-87604.OtwH5L.rst b/Misc/NEWS.d/next/Security/2022-11-11-12-50-28.gh-issue-87604.OtwH5L.rst
new file mode 100644
index 0000000..c931409
--- /dev/null
+++ b/Misc/NEWS.d/next/Security/2022-11-11-12-50-28.gh-issue-87604.OtwH5L.rst
@@ -0,0 +1,2 @@
+Avoid publishing list of active per-interpreter audit hooks via the
+:mod:`gc` module
diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in
index 74d2222..e250f83 100644
--- a/Modules/Setup.stdlib.in
+++ b/Modules/Setup.stdlib.in
@@ -169,7 +169,7 @@
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
-@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c
+@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c
# Some testing modules MUST be built as shared libraries.
*shared*
diff --git a/Modules/_abc.c b/Modules/_abc.c
index b22daa8..e6e7242 100644
--- a/Modules/_abc.c
+++ b/Modules/_abc.c
@@ -524,8 +524,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
}
int result = PyObject_IsSubclass(subclass, self);
if (result > 0) {
- Py_INCREF(subclass);
- return subclass; /* Already a subclass. */
+ return Py_NewRef(subclass); /* Already a subclass. */
}
if (result < 0) {
return NULL;
@@ -561,8 +560,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
set_collection_flag_recursive((PyTypeObject *)subclass, collection_flag);
}
}
- Py_INCREF(subclass);
- return subclass;
+ return Py_NewRef(subclass);
}
@@ -598,8 +596,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
goto end;
}
if (incache > 0) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
goto end;
}
subtype = (PyObject *)Py_TYPE(instance);
@@ -610,8 +607,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
goto end;
}
if (incache > 0) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
goto end;
}
}
@@ -802,8 +798,7 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self,
end:
Py_DECREF(impl);
Py_XDECREF(subclasses);
- Py_XINCREF(result);
- return result;
+ return Py_XNewRef(result);
}
@@ -842,8 +837,7 @@ subclasscheck_check_registry(_abc_data *impl, PyObject *subclass,
Py_ssize_t i = 0;
while (_PySet_NextEntry(impl->_abc_registry, &pos, &key, &hash)) {
- Py_INCREF(key);
- copy[i++] = key;
+ copy[i++] = Py_NewRef(key);
}
assert(i == registry_size);
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 741cfbe..f1fd271 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -299,8 +299,7 @@ deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
static PyObject *
deque_append(dequeobject *deque, PyObject *item)
{
- Py_INCREF(item);
- if (deque_append_internal(deque, item, deque->maxlen) < 0)
+ if (deque_append_internal(deque, Py_NewRef(item), deque->maxlen) < 0)
return NULL;
Py_RETURN_NONE;
}
@@ -336,8 +335,7 @@ deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
static PyObject *
deque_appendleft(dequeobject *deque, PyObject *item)
{
- Py_INCREF(item);
- if (deque_appendleft_internal(deque, item, deque->maxlen) < 0)
+ if (deque_appendleft_internal(deque, Py_NewRef(item), deque->maxlen) < 0)
return NULL;
Py_RETURN_NONE;
}
@@ -655,14 +653,12 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
size = Py_SIZE(deque);
if (size == 0 || n == 1) {
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if (n <= 0) {
deque_clear(deque);
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if (size == 1) {
@@ -693,13 +689,11 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
i += m;
while (m--) {
deque->rightindex++;
- Py_INCREF(item);
- deque->rightblock->data[deque->rightindex] = item;
+ deque->rightblock->data[deque->rightindex] = Py_NewRef(item);
}
}
Py_SET_SIZE(deque, Py_SIZE(deque) + i);
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
@@ -972,8 +966,7 @@ deque_count(dequeobject *deque, PyObject *v)
while (--n >= 0) {
CHECK_NOT_END(b);
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Py_DECREF(item);
if (cmp < 0)
@@ -1011,8 +1004,7 @@ deque_contains(dequeobject *deque, PyObject *v)
while (--n >= 0) {
CHECK_NOT_END(b);
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Py_DECREF(item);
if (cmp) {
@@ -1201,8 +1193,7 @@ deque_item(dequeobject *deque, Py_ssize_t i)
}
}
item = b->data[i];
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static int
@@ -1231,8 +1222,7 @@ deque_remove(dequeobject *deque, PyObject *value)
int cmp, rv;
for (i = 0 ; i < n; i++) {
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Py_DECREF(item);
if (cmp < 0) {
@@ -1292,9 +1282,8 @@ deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
while (--n >= 0)
b = b->leftlink;
}
- Py_INCREF(v);
old_value = b->data[i];
- b->data[i] = v;
+ b->data[i] = Py_NewRef(v);
Py_DECREF(old_value);
return 0;
}
@@ -1686,8 +1675,7 @@ deque_iter(dequeobject *deque)
return NULL;
it->b = deque->leftblock;
it->index = deque->leftindex;
- Py_INCREF(deque);
- it->deque = deque;
+ it->deque = (dequeobject*)Py_NewRef(deque);
it->state = deque->state;
it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
@@ -1734,8 +1722,7 @@ dequeiter_next(dequeiterobject *it)
it->b = it->b->rightlink;
it->index = 0;
}
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static PyObject *
@@ -1844,8 +1831,7 @@ deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored))
return NULL;
it->b = deque->rightblock;
it->index = deque->rightindex;
- Py_INCREF(deque);
- it->deque = deque;
+ it->deque = (dequeobject*)Py_NewRef(deque);
it->state = deque->state;
it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
@@ -1876,8 +1862,7 @@ dequereviter_next(dequeiterobject *it)
it->b = it->b->leftlink;
it->index = BLOCKLEN - 1;
}
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static PyObject *
@@ -2203,8 +2188,7 @@ defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
}
if (newargs == NULL)
return -1;
- Py_XINCREF(newdefault);
- dd->default_factory = newdefault;
+ dd->default_factory = Py_XNewRef(newdefault);
result = PyDict_Type.tp_init(self, newargs, kwds);
Py_DECREF(newargs);
Py_XDECREF(olddefault);
@@ -2414,8 +2398,7 @@ tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
return NULL;
}
self->index = index;
- Py_INCREF(doc);
- self->doc = doc;
+ self->doc = Py_NewRef(doc);
return (PyObject *)self;
}
@@ -2426,13 +2409,11 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
PyObject *result;
if (obj == NULL) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
if (!PyTuple_Check(obj)) {
if (obj == Py_None) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
PyErr_Format(PyExc_TypeError,
"descriptor for index '%zd' for tuple subclasses "
@@ -2448,8 +2429,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
}
result = PyTuple_GET_ITEM(obj, index);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static int
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 25bf86f..bd33708 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -176,8 +176,7 @@ get_char_or_None(Py_UCS4 c)
static PyObject *
Dialect_get_lineterminator(DialectObj *self, void *Py_UNUSED(ignored))
{
- Py_XINCREF(self->lineterminator);
- return self->lineterminator;
+ return Py_XNewRef(self->lineterminator);
}
static PyObject *
@@ -316,8 +315,7 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
else {
if (PyUnicode_READY(src) == -1)
return -1;
- Py_INCREF(src);
- Py_XSETREF(*target, src);
+ Py_XSETREF(*target, Py_NewRef(src));
}
}
return 0;
@@ -514,8 +512,7 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
goto err;
}
- ret = (PyObject *)self;
- Py_INCREF(self);
+ ret = Py_NewRef(self);
err:
Py_CLEAR(self);
Py_CLEAR(dialect);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 520a0f9..a6c005b 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1880,7 +1880,6 @@ POINTER(PyObject *self, PyObject *cls)
PyObject *result;
PyTypeObject *typ;
PyObject *key;
- char *buf;
result = PyDict_GetItemWithError(_ctypes_ptrtype_cache, cls);
if (result) {
@@ -1890,18 +1889,11 @@ POINTER(PyObject *self, PyObject *cls)
return NULL;
}
if (PyUnicode_CheckExact(cls)) {
- const char *name = PyUnicode_AsUTF8(cls);
- if (name == NULL)
- return NULL;
- buf = PyMem_Malloc(strlen(name) + 3 + 1);
- if (buf == NULL)
- return PyErr_NoMemory();
- sprintf(buf, "LP_%s", name);
+ PyObject *name = PyUnicode_FromFormat("LP_%U", cls);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
- "s(O){}",
- buf,
+ "N(O){}",
+ name,
&PyCPointer_Type);
- PyMem_Free(buf);
if (result == NULL)
return result;
key = PyLong_FromVoidPtr(result);
@@ -1911,16 +1903,12 @@ POINTER(PyObject *self, PyObject *cls)
}
} else if (PyType_Check(cls)) {
typ = (PyTypeObject *)cls;
- buf = PyMem_Malloc(strlen(typ->tp_name) + 3 + 1);
- if (buf == NULL)
- return PyErr_NoMemory();
- sprintf(buf, "LP_%s", typ->tp_name);
+ PyObject *name = PyUnicode_FromFormat("LP_%s", typ->tp_name);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
- "s(O){sO}",
- buf,
+ "N(O){sO}",
+ name,
&PyCPointer_Type,
"_type_", cls);
- PyMem_Free(buf);
if (result == NULL)
return result;
key = Py_NewRef(cls);
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index 0b328f9..cd408d6 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -261,8 +261,7 @@ PyCursesPanel_New(_curses_panel_state *state, PANEL *pan,
Py_DECREF(po);
return NULL;
}
- po->wo = wo;
- Py_INCREF(wo);
+ po->wo = (PyCursesWindowObject*)Py_NewRef(wo);
return (PyObject *)po;
}
@@ -313,8 +312,7 @@ _curses_panel_panel_above_impl(PyCursesPanelObject *self)
"panel_above: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/* panel_below(NULL) returns the top panel in the stack. To get
@@ -344,8 +342,7 @@ _curses_panel_panel_below_impl(PyCursesPanelObject *self)
"panel_below: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -394,8 +391,7 @@ static PyObject *
_curses_panel_panel_window_impl(PyCursesPanelObject *self)
/*[clinic end generated code: output=5f05940d4106b4cb input=6067353d2c307901]*/
{
- Py_INCREF(self->wo);
- return (PyObject *)self->wo;
+ return Py_NewRef(self->wo);
}
/*[clinic input]
@@ -428,8 +424,7 @@ _curses_panel_panel_replace_impl(PyCursesPanelObject *self,
PyErr_SetString(state->PyCursesError, "replace_panel() returned ERR");
return NULL;
}
- Py_INCREF(win);
- Py_SETREF(po->wo, win);
+ Py_SETREF(po->wo, Py_NewRef(win));
Py_RETURN_NONE;
}
@@ -486,8 +481,7 @@ _curses_panel_panel_userptr_impl(PyCursesPanelObject *self,
return NULL;
}
- Py_INCREF(obj);
- return obj;
+ return Py_NewRef(obj);
}
@@ -555,8 +549,7 @@ _curses_panel_bottom_panel_impl(PyObject *module)
"panel_above: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -614,8 +607,7 @@ _curses_panel_top_panel_impl(PyObject *module)
"panel_below: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -670,8 +662,7 @@ _curses_panel_exec(PyObject *mod)
state->PyCursesError = PyErr_NewException(
"_curses_panel.error", NULL, NULL);
- Py_INCREF(state->PyCursesError);
- if (PyModule_AddObject(mod, "error", state->PyCursesError) < 0) {
+ if (PyModule_AddObject(mod, "error", Py_NewRef(state->PyCursesError)) < 0) {
Py_DECREF(state->PyCursesError);
return -1;
}
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 0ddd6dc..5146b40 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -389,8 +389,7 @@ PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
#endif
}
else if (PyBytes_Check(obj)) {
- Py_INCREF(obj);
- *bytes = obj;
+ *bytes = Py_NewRef(obj);
/* check for embedded null bytes */
if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
Py_DECREF(obj);
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 15170b3..20e8516 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -189,8 +189,7 @@ divide_nearest(PyObject *m, PyObject *n)
temp = _PyLong_DivmodNear(m, n);
if (temp == NULL)
return NULL;
- result = PyTuple_GET_ITEM(temp, 0);
- Py_INCREF(result);
+ result = Py_NewRef(PyTuple_GET_ITEM(temp, 0));
Py_DECREF(temp);
return result;
@@ -1005,8 +1004,7 @@ new_datetime_ex2(int year, int month, int day, int hour, int minute,
DATE_SET_SECOND(self, second);
DATE_SET_MICROSECOND(self, usecond);
if (aware) {
- Py_INCREF(tzinfo);
- self->tzinfo = tzinfo;
+ self->tzinfo = Py_NewRef(tzinfo);
}
DATE_SET_FOLD(self, fold);
}
@@ -1083,8 +1081,7 @@ new_time_ex2(int hour, int minute, int second, int usecond,
TIME_SET_SECOND(self, second);
TIME_SET_MICROSECOND(self, usecond);
if (aware) {
- Py_INCREF(tzinfo);
- self->tzinfo = tzinfo;
+ self->tzinfo = Py_NewRef(tzinfo);
}
TIME_SET_FOLD(self, fold);
}
@@ -1165,10 +1162,8 @@ create_timezone(PyObject *offset, PyObject *name)
if (self == NULL) {
return NULL;
}
- Py_INCREF(offset);
- self->offset = offset;
- Py_XINCREF(name);
- self->name = name;
+ self->offset = Py_NewRef(offset);
+ self->name = Py_XNewRef(name);
return (PyObject *)self;
}
@@ -1182,8 +1177,7 @@ new_timezone(PyObject *offset, PyObject *name)
assert(name == NULL || PyUnicode_Check(name));
if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) {
- Py_INCREF(PyDateTime_TimeZone_UTC);
- return PyDateTime_TimeZone_UTC;
+ return Py_NewRef(PyDateTime_TimeZone_UTC);
}
if ((GET_TD_DAYS(offset) == -1 &&
GET_TD_SECONDS(offset) == 0 &&
@@ -1397,8 +1391,7 @@ tzinfo_from_isoformat_results(int rv, int tzoffset, int tz_useconds)
if (rv == 1) {
// Create a timezone from offset in seconds (0 returns UTC)
if (tzoffset == 0) {
- Py_INCREF(PyDateTime_TimeZone_UTC);
- return PyDateTime_TimeZone_UTC;
+ return Py_NewRef(PyDateTime_TimeZone_UTC);
}
PyObject *delta = new_delta(0, tzoffset, tz_useconds, 1);
@@ -1409,8 +1402,7 @@ tzinfo_from_isoformat_results(int rv, int tzoffset, int tz_useconds)
Py_DECREF(delta);
}
else {
- tzinfo = Py_None;
- Py_INCREF(Py_None);
+ tzinfo = Py_NewRef(Py_None);
}
return tzinfo;
@@ -1943,8 +1935,7 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
goto BadDivmod;
}
- num = PyTuple_GET_ITEM(tuple, 0); /* leftover seconds */
- Py_INCREF(num);
+ num = Py_NewRef(PyTuple_GET_ITEM(tuple, 0)); /* leftover seconds */
Py_DECREF(tuple);
tuple = checked_divmod(num, seconds_per_day);
@@ -1962,8 +1953,7 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
goto BadDivmod;
}
- num = PyTuple_GET_ITEM(tuple, 0); /* leftover days */
- Py_INCREF(num);
+ num = Py_NewRef(PyTuple_GET_ITEM(tuple, 0)); /* leftover days */
d = _PyLong_AsInt(num);
if (d == -1 && PyErr_Occurred()) {
goto Done;
@@ -3346,8 +3336,7 @@ iso_calendar_date_year(PyDateTime_IsoCalendarDate *self, void *unused)
if (year == NULL) {
return NULL;
}
- Py_INCREF(year);
- return year;
+ return Py_NewRef(year);
}
static PyObject *
@@ -3357,8 +3346,7 @@ iso_calendar_date_week(PyDateTime_IsoCalendarDate *self, void *unused)
if (week == NULL) {
return NULL;
}
- Py_INCREF(week);
- return week;
+ return Py_NewRef(week);
}
static PyObject *
@@ -3368,8 +3356,7 @@ iso_calendar_date_weekday(PyDateTime_IsoCalendarDate *self, void *unused)
if (weekday == NULL) {
return NULL;
}
- Py_INCREF(weekday);
- return weekday;
+ return Py_NewRef(weekday);
}
static PyGetSetDef iso_calendar_date_getset[] = {
@@ -3980,8 +3967,7 @@ timezone_str(PyDateTime_TimeZone *self)
char sign;
if (self->name != NULL) {
- Py_INCREF(self->name);
- return self->name;
+ return Py_NewRef(self->name);
}
if ((PyObject *)self == PyDateTime_TimeZone_UTC ||
(GET_TD_DAYS(self->offset) == 0 &&
@@ -3997,8 +3983,7 @@ timezone_str(PyDateTime_TimeZone *self)
}
else {
sign = '+';
- offset = self->offset;
- Py_INCREF(offset);
+ offset = Py_NewRef(self->offset);
}
/* Offset is not negative here. */
microseconds = GET_TD_MICROSECONDS(offset);
@@ -4033,8 +4018,7 @@ timezone_utcoffset(PyDateTime_TimeZone *self, PyObject *dt)
if (_timezone_check_argument(dt, "utcoffset") == -1)
return NULL;
- Py_INCREF(self->offset);
- return self->offset;
+ return Py_NewRef(self->offset);
}
static PyObject *
@@ -4171,8 +4155,7 @@ static PyObject *
time_tzinfo(PyDateTime_Time *self, void *unused)
{
PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static PyObject *
@@ -4217,8 +4200,7 @@ time_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
me->hashcode = -1;
me->hastzinfo = aware;
if (aware) {
- Py_INCREF(tzinfo);
- me->tzinfo = tzinfo;
+ me->tzinfo = Py_NewRef(tzinfo);
}
if (pdata[0] & (1 << 7)) {
me->data[0] -= 128;
@@ -4514,12 +4496,10 @@ time_richcompare(PyObject *self, PyObject *other, int op)
result = diff_to_bool(diff, op);
}
else if (op == Py_EQ) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
}
else {
PyErr_SetString(PyExc_TypeError,
@@ -4548,8 +4528,7 @@ time_hash(PyDateTime_Time *self)
return -1;
}
else {
- self0 = (PyObject *)self;
- Py_INCREF(self0);
+ self0 = Py_NewRef(self);
}
offset = time_utcoffset(self0, NULL);
Py_DECREF(self0);
@@ -4846,8 +4825,7 @@ static PyObject *
datetime_tzinfo(PyDateTime_DateTime *self, void *unused)
{
PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static PyObject *
@@ -4894,8 +4872,7 @@ datetime_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
me->hashcode = -1;
me->hastzinfo = aware;
if (aware) {
- Py_INCREF(tzinfo);
- me->tzinfo = tzinfo;
+ me->tzinfo = Py_NewRef(tzinfo);
}
if (pdata[2] & (1 << 7)) {
me->data[2] -= 128;
@@ -5307,8 +5284,7 @@ _sanitize_isoformat_str(PyObject *dtstr)
}
if (surrogate_separator == 0) {
- Py_INCREF(dtstr);
- return dtstr;
+ return Py_NewRef(dtstr);
}
PyObject *str_out = _PyUnicode_Copy(dtstr);
@@ -5622,9 +5598,8 @@ datetime_subtract(PyObject *left, PyObject *right)
int delta_d, delta_s, delta_us;
if (GET_DT_TZINFO(left) == GET_DT_TZINFO(right)) {
- offset2 = offset1 = Py_None;
- Py_INCREF(offset1);
- Py_INCREF(offset2);
+ offset1 = Py_NewRef(Py_None);
+ offset2 = Py_NewRef(Py_None);
}
else {
offset1 = datetime_utcoffset(left, NULL);
@@ -5969,12 +5944,10 @@ datetime_richcompare(PyObject *self, PyObject *other, int op)
result = diff_to_bool(diff, op);
}
else if (op == Py_EQ) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
}
else {
PyErr_SetString(PyExc_TypeError,
@@ -6006,8 +5979,7 @@ datetime_hash(PyDateTime_DateTime *self)
return -1;
}
else {
- self0 = (PyObject *)self;
- Py_INCREF(self0);
+ self0 = Py_NewRef(self);
}
offset = datetime_utcoffset(self0, NULL);
Py_DECREF(self0);
@@ -6224,15 +6196,13 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
if (self_tzinfo == NULL)
return NULL;
} else {
- self_tzinfo = self->tzinfo;
- Py_INCREF(self_tzinfo);
+ self_tzinfo = Py_NewRef(self->tzinfo);
}
/* Conversion to self's own time zone is a NOP. */
if (self_tzinfo == tzinfo) {
Py_DECREF(self_tzinfo);
- Py_INCREF(self);
- return self;
+ return (PyDateTime_DateTime*)Py_NewRef(self);
}
/* Convert self to UTC. */
@@ -6278,8 +6248,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
else {
/* Result is already aware - just replace tzinfo. */
temp = result->tzinfo;
- result->tzinfo = PyDateTime_TimeZone_UTC;
- Py_INCREF(result->tzinfo);
+ result->tzinfo = Py_NewRef(PyDateTime_TimeZone_UTC);
Py_DECREF(temp);
}
@@ -6449,8 +6418,7 @@ datetime_utctimetuple(PyDateTime_DateTime *self, PyObject *Py_UNUSED(ignored))
tzinfo = GET_DT_TZINFO(self);
if (tzinfo == Py_None) {
- utcself = self;
- Py_INCREF(utcself);
+ utcself = (PyDateTime_DateTime*)Py_NewRef(self);
}
else {
PyObject *offset;
@@ -6459,8 +6427,7 @@ datetime_utctimetuple(PyDateTime_DateTime *self, PyObject *Py_UNUSED(ignored))
return NULL;
if (offset == Py_None) {
Py_DECREF(offset);
- utcself = self;
- Py_INCREF(utcself);
+ utcself = (PyDateTime_DateTime*)Py_NewRef(self);
}
else {
utcself = (PyDateTime_DateTime *)add_datetime_timedelta(self,
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 9c83e38..5437602 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -358,8 +358,7 @@ _dbm_dbm_get_impl(dbmobject *self, PyTypeObject *cls, const char *key,
return PyBytes_FromStringAndSize(val.dptr, val.dsize);
}
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
/*[clinic input]
@@ -419,8 +418,7 @@ _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key,
static PyObject *
dbm__enter__(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
index 548bd60..2d6e4e4 100644
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -116,15 +116,13 @@ static PyTypeObject PyDecContextManager_Type;
Py_LOCAL_INLINE(PyObject *)
incr_true(void)
{
- Py_INCREF(Py_True);
- return Py_True;
+ return Py_NewRef(Py_True);
}
Py_LOCAL_INLINE(PyObject *)
incr_false(void)
{
- Py_INCREF(Py_False);
- return Py_False;
+ return Py_NewRef(Py_False);
}
@@ -655,8 +653,7 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
}
}
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
static PyObject *
@@ -754,8 +751,7 @@ context_getround(PyObject *self, void *closure UNUSED)
{
int i = mpd_getround(CTX(self));
- Py_INCREF(round_map[i]);
- return round_map[i];
+ return Py_NewRef(round_map[i]);
}
static PyObject *
@@ -1122,13 +1118,11 @@ context_getattr(PyObject *self, PyObject *name)
if (PyUnicode_Check(name)) {
if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) {
retval = ((PyDecContextObject *)self)->traps;
- Py_INCREF(retval);
- return retval;
+ return Py_NewRef(retval);
}
if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) {
retval = ((PyDecContextObject *)self)->flags;
- Py_INCREF(retval);
- return retval;
+ return Py_NewRef(retval);
}
}
@@ -1602,8 +1596,7 @@ PyDec_GetCurrentContext(PyObject *self UNUSED, PyObject *args UNUSED)
return NULL;
}
- Py_INCREF(context);
- return context;
+ return Py_NewRef(context);
}
/* Set the thread local context to a new context, decrement old reference */
@@ -1778,8 +1771,7 @@ ctxmanager_new(PyTypeObject *type UNUSED, PyObject *args, PyObject *kwds)
Py_DECREF(self);
return NULL;
}
- self->global = global;
- Py_INCREF(self->global);
+ self->global = Py_NewRef(global);
int ret = context_setattrs(
self->local, prec, rounding,
@@ -1814,8 +1806,7 @@ ctxmanager_set_local(PyDecContextManagerObject *self, PyObject *args UNUSED)
}
Py_DECREF(ret);
- Py_INCREF(self->local);
- return self->local;
+ return Py_NewRef(self->local);
}
static PyObject *
@@ -2418,8 +2409,7 @@ PyDecType_FromDecimalExact(PyTypeObject *type, PyObject *v, PyObject *context)
uint32_t status = 0;
if (type == &PyDec_Type && PyDec_CheckExact(v)) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
dec = PyDecType_New(type);
@@ -2440,8 +2430,7 @@ static PyObject *
sequence_as_tuple(PyObject *v, PyObject *ex, const char *mesg)
{
if (PyTuple_Check(v)) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
if (PyList_Check(v)) {
return PyList_AsTuple(v);
@@ -2863,8 +2852,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
{
if (PyDec_Check(v)) {
- *conv = v;
- Py_INCREF(v);
+ *conv = Py_NewRef(v);
return 1;
}
if (PyLong_Check(v)) {
@@ -2881,8 +2869,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
Py_TYPE(v)->tp_name);
}
else {
- Py_INCREF(Py_NotImplemented);
- *conv = Py_NotImplemented;
+ *conv = Py_NewRef(Py_NotImplemented);
}
return 0;
}
@@ -3041,8 +3028,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
*vcmp = v;
if (PyDec_Check(w)) {
- Py_INCREF(w);
- *wcmp = w;
+ *wcmp = Py_NewRef(w);
}
else if (PyLong_Check(w)) {
*wcmp = PyDec_FromLongExact(w, context);
@@ -3074,8 +3060,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
}
}
else {
- Py_INCREF(Py_NotImplemented);
- *wcmp = Py_NotImplemented;
+ *wcmp = Py_NewRef(Py_NotImplemented);
}
}
else {
@@ -3093,8 +3078,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
}
}
else {
- Py_INCREF(Py_NotImplemented);
- *wcmp = Py_NotImplemented;
+ *wcmp = Py_NewRef(Py_NotImplemented);
}
}
@@ -4329,15 +4313,13 @@ dec_mpd_adjexp(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_canonical(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
dec_conjugate(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -4654,8 +4636,7 @@ dec_complex(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_copy(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
/* __floor__ */
@@ -4838,8 +4819,7 @@ dec_trunc(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_real(PyObject *self, void *closure UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -5384,8 +5364,7 @@ ctx_canonical(PyObject *context UNUSED, PyObject *v)
return NULL;
}
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
static PyObject *
@@ -5916,23 +5895,17 @@ PyInit__decimal(void)
/* Create the module */
ASSIGN_PTR(m, PyModule_Create(&_decimal_module));
-
/* Add types to the module */
- Py_INCREF(&PyDec_Type);
- CHECK_INT(PyModule_AddObject(m, "Decimal", (PyObject *)&PyDec_Type));
- Py_INCREF(&PyDecContext_Type);
+ CHECK_INT(PyModule_AddObject(m, "Decimal", Py_NewRef(&PyDec_Type)));
CHECK_INT(PyModule_AddObject(m, "Context",
- (PyObject *)&PyDecContext_Type));
- Py_INCREF(DecimalTuple);
- CHECK_INT(PyModule_AddObject(m, "DecimalTuple", (PyObject *)DecimalTuple));
-
+ Py_NewRef(&PyDecContext_Type)));
+ CHECK_INT(PyModule_AddObject(m, "DecimalTuple", Py_NewRef(DecimalTuple)));
/* Create top level exception */
ASSIGN_PTR(DecimalException, PyErr_NewException(
"decimal.DecimalException",
PyExc_ArithmeticError, NULL));
- Py_INCREF(DecimalException);
- CHECK_INT(PyModule_AddObject(m, "DecimalException", DecimalException));
+ CHECK_INT(PyModule_AddObject(m, "DecimalException", Py_NewRef(DecimalException)));
/* Create signal tuple */
ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));
@@ -5972,12 +5945,10 @@ PyInit__decimal(void)
Py_DECREF(base);
/* add to module */
- Py_INCREF(cm->ex);
- CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+ CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
/* add to signal tuple */
- Py_INCREF(cm->ex);
- PyTuple_SET_ITEM(SignalTuple, i, cm->ex);
+ PyTuple_SET_ITEM(SignalTuple, i, Py_NewRef(cm->ex));
}
/*
@@ -6003,45 +5974,38 @@ PyInit__decimal(void)
ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL));
Py_DECREF(base);
- Py_INCREF(cm->ex);
- CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+ CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
}
/* Init default context template first */
ASSIGN_PTR(default_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
- Py_INCREF(default_context_template);
CHECK_INT(PyModule_AddObject(m, "DefaultContext",
- default_context_template));
+ Py_NewRef(default_context_template)));
#ifndef WITH_DECIMAL_CONTEXTVAR
ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__"));
- Py_INCREF(Py_False);
- CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_False));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_False)));
#else
ASSIGN_PTR(current_context_var, PyContextVar_New("decimal_context", NULL));
- Py_INCREF(Py_True);
- CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_True));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_True)));
#endif
- Py_INCREF(Py_True);
- CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_True));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_NewRef(Py_True)));
/* Init basic context template */
ASSIGN_PTR(basic_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_basic_context(basic_context_template);
- Py_INCREF(basic_context_template);
CHECK_INT(PyModule_AddObject(m, "BasicContext",
- basic_context_template));
+ Py_NewRef(basic_context_template)));
/* Init extended context template */
ASSIGN_PTR(extended_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_extended_context(extended_context_template);
- Py_INCREF(extended_context_template);
CHECK_INT(PyModule_AddObject(m, "ExtendedContext",
- extended_context_template));
+ Py_NewRef(extended_context_template)));
/* Init mpd_ssize_t constants */
@@ -6060,8 +6024,7 @@ PyInit__decimal(void)
/* Init string constants */
for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) {
ASSIGN_PTR(round_map[i], PyUnicode_InternFromString(mpd_round_string[i]));
- Py_INCREF(round_map[i]);
- CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], round_map[i]));
+ CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], Py_NewRef(round_map[i])));
}
/* Add specification version number */
diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
index e4036e1..3aef296 100644
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -105,8 +105,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
if (pto == NULL)
return NULL;
- pto->fn = func;
- Py_INCREF(func);
+ pto->fn = Py_NewRef(func);
nargs = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX);
if (nargs == NULL) {
@@ -131,8 +130,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
pto->kw = PyDict_New();
}
else if (Py_REFCNT(kw) == 1) {
- Py_INCREF(kw);
- pto->kw = kw;
+ pto->kw = Py_NewRef(kw);
}
else {
pto->kw = PyDict_Copy(kw);
@@ -302,8 +300,7 @@ partial_call(partialobject *pto, PyObject *args, PyObject *kwargs)
PyObject *kwargs2;
if (PyDict_GET_SIZE(pto->kw) == 0) {
/* kwargs can be NULL */
- kwargs2 = kwargs;
- Py_XINCREF(kwargs2);
+ kwargs2 = Py_XNewRef(kwargs);
}
else {
/* bpo-27840, bpo-29318: dictionary of keyword parameters must be
@@ -463,8 +460,7 @@ partial_setstate(partialobject *pto, PyObject *state)
else
Py_INCREF(dict);
- Py_INCREF(fn);
- Py_SETREF(pto->fn, fn);
+ Py_SETREF(pto->fn, Py_NewRef(fn));
Py_SETREF(pto->args, fnargs);
Py_SETREF(pto->kw, kw);
Py_XSETREF(pto->dict, dict);
@@ -588,10 +584,8 @@ keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds)
if (result == NULL) {
return NULL;
}
- Py_INCREF(ko->cmp);
- result->cmp = ko->cmp;
- Py_INCREF(object);
- result->object = object;
+ result->cmp = Py_NewRef(ko->cmp);
+ result->object = Py_NewRef(object);
PyObject_GC_Track(result);
return (PyObject *)result;
}
@@ -654,8 +648,7 @@ _functools_cmp_to_key_impl(PyObject *module, PyObject *mycmp)
object = PyObject_GC_New(keyobject, state->keyobject_type);
if (!object)
return NULL;
- Py_INCREF(mycmp);
- object->cmp = mycmp;
+ object->cmp = Py_NewRef(mycmp);
object->object = NULL;
PyObject_GC_Track(object);
return (PyObject *)object;
@@ -837,12 +830,10 @@ lru_cache_make_key(PyObject *kwd_mark, PyObject *args,
if (PyUnicode_CheckExact(key) || PyLong_CheckExact(key)) {
/* For common scalar keys, save space by
dropping the enclosing args tuple */
- Py_INCREF(key);
- return key;
+ return Py_NewRef(key);
}
}
- Py_INCREF(args);
- return args;
+ return Py_NewRef(args);
}
key_size = PyTuple_GET_SIZE(args);
@@ -858,31 +849,25 @@ lru_cache_make_key(PyObject *kwd_mark, PyObject *args,
key_pos = 0;
for (pos = 0; pos < PyTuple_GET_SIZE(args); ++pos) {
PyObject *item = PyTuple_GET_ITEM(args, pos);
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
if (kwds_size) {
- Py_INCREF(kwd_mark);
- PyTuple_SET_ITEM(key, key_pos++, kwd_mark);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(kwd_mark));
for (pos = 0; PyDict_Next(kwds, &pos, &keyword, &value);) {
- Py_INCREF(keyword);
- PyTuple_SET_ITEM(key, key_pos++, keyword);
- Py_INCREF(value);
- PyTuple_SET_ITEM(key, key_pos++, value);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(keyword));
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(value));
}
assert(key_pos == PyTuple_GET_SIZE(args) + kwds_size * 2 + 1);
}
if (typed) {
for (pos = 0; pos < PyTuple_GET_SIZE(args); ++pos) {
PyObject *item = (PyObject *)Py_TYPE(PyTuple_GET_ITEM(args, pos));
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
if (kwds_size) {
for (pos = 0; PyDict_Next(kwds, &pos, &keyword, &value);) {
PyObject *item = (PyObject *)Py_TYPE(value);
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
}
}
@@ -1084,8 +1069,7 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds
return NULL;
}
lru_cache_append_link(self, link);
- Py_INCREF(result); /* for return */
- return result;
+ return Py_NewRef(result);
}
/* Since the cache is full, we need to evict an old key and add
a new key. Rather than free the old link and allocate a new
@@ -1230,16 +1214,12 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw)
obj->wrapper = wrapper;
obj->typed = typed;
obj->cache = cachedict;
- Py_INCREF(func);
- obj->func = func;
+ obj->func = Py_NewRef(func);
obj->misses = obj->hits = 0;
obj->maxsize = maxsize;
- Py_INCREF(state->kwd_mark);
- obj->kwd_mark = state->kwd_mark;
- Py_INCREF(state->lru_list_elem_type);
- obj->lru_list_elem_type = state->lru_list_elem_type;
- Py_INCREF(cache_info_type);
- obj->cache_info_type = cache_info_type;
+ obj->kwd_mark = Py_NewRef(state->kwd_mark);
+ obj->lru_list_elem_type = (PyTypeObject*)Py_NewRef(state->lru_list_elem_type);
+ obj->cache_info_type = Py_NewRef(cache_info_type);
obj->dict = NULL;
obj->weakreflist = NULL;
return (PyObject *)obj;
@@ -1306,8 +1286,7 @@ static PyObject *
lru_cache_descr_get(PyObject *self, PyObject *obj, PyObject *type)
{
if (obj == Py_None || obj == NULL) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
return PyMethod_New(self, obj);
}
@@ -1360,15 +1339,13 @@ lru_cache_reduce(PyObject *self, PyObject *unused)
static PyObject *
lru_cache_copy(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
lru_cache_deepcopy(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static int
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index a96d323..4e8acde 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -256,8 +256,7 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
res = gdbm_subscript(self, key);
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
PyErr_Clear();
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
return res;
}
@@ -566,8 +565,7 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls)
static PyObject *
gdbm__enter__(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -677,7 +675,6 @@ dbmopen_impl(PyObject *module, PyObject *filename, const char *flags,
return NULL;
}
for (flags++; *flags != '\0'; flags++) {
- char buf[40];
switch (*flags) {
#ifdef GDBM_FAST
case 'f':
@@ -695,9 +692,8 @@ dbmopen_impl(PyObject *module, PyObject *filename, const char *flags,
break;
#endif
default:
- PyOS_snprintf(buf, sizeof(buf), "Flag '%c' is not supported.",
- *flags);
- PyErr_SetString(state->gdbm_error, buf);
+ PyErr_Format(state->gdbm_error,
+ "Flag '%c' is not supported.", (unsigned char)*flags);
return NULL;
}
}
diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c
index 3dbaaa0..07ddc7b 100644
--- a/Modules/_heapqmodule.c
+++ b/Modules/_heapqmodule.c
@@ -197,8 +197,7 @@ heapreplace_internal(PyObject *heap, PyObject *item, int siftup_func(PyListObjec
}
returnitem = PyList_GET_ITEM(heap, 0);
- Py_INCREF(item);
- PyList_SET_ITEM(heap, 0, item);
+ PyList_SET_ITEM(heap, 0, Py_NewRef(item));
if (siftup_func((PyListObject *)heap, 0)) {
Py_DECREF(returnitem);
return NULL;
@@ -253,8 +252,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
int cmp;
if (PyList_GET_SIZE(heap) == 0) {
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
PyObject* top = PyList_GET_ITEM(heap, 0);
@@ -264,8 +262,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
if (cmp < 0)
return NULL;
if (cmp == 0) {
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
if (PyList_GET_SIZE(heap) == 0) {
@@ -274,8 +271,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
}
returnitem = PyList_GET_ITEM(heap, 0);
- Py_INCREF(item);
- PyList_SET_ITEM(heap, 0, item);
+ PyList_SET_ITEM(heap, 0, Py_NewRef(item));
if (siftup((PyListObject *)heap, 0)) {
Py_DECREF(returnitem);
return NULL;
@@ -410,8 +406,7 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
newitem = arr[pos];
while (pos > startpos) {
parentpos = (pos - 1) >> 1;
- parent = arr[parentpos];
- Py_INCREF(parent);
+ parent = Py_NewRef(arr[parentpos]);
Py_INCREF(newitem);
cmp = PyObject_RichCompareBool(parent, newitem, Py_LT);
Py_DECREF(parent);
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index a7b2e98..ccd40ab 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -212,8 +212,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode,
is_number = PyNumber_Check(file);
if (is_number) {
- path_or_fd = file;
- Py_INCREF(path_or_fd);
+ path_or_fd = Py_NewRef(file);
} else {
path_or_fd = PyOS_FSPath(file);
if (path_or_fd == NULL) {
@@ -489,8 +488,7 @@ _io_text_encoding_impl(PyObject *module, PyObject *encoding, int stacklevel)
encoding = &_Py_ID(locale);
}
}
- Py_INCREF(encoding);
- return encoding;
+ return Py_NewRef(encoding);
}
@@ -697,9 +695,8 @@ PyInit__io(void)
"UnsupportedOperation", PyExc_OSError, PyExc_ValueError);
if (state->unsupported_operation == NULL)
goto fail;
- Py_INCREF(state->unsupported_operation);
if (PyModule_AddObject(m, "UnsupportedOperation",
- state->unsupported_operation) < 0)
+ Py_NewRef(state->unsupported_operation)) < 0)
goto fail;
/* BlockingIOError, for compatibility */
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 4a4a199..e261093 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -481,8 +481,7 @@ buffered_close(buffered *self, PyObject *args)
if (r < 0)
goto end;
if (r > 0) {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
goto end;
}
@@ -1007,8 +1006,7 @@ _buffered_readinto_generic(buffered *self, Py_buffer *buffer, char readinto1)
break;
if (n < 0) {
if (n == -2) {
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
}
goto end;
}
@@ -1422,8 +1420,7 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw,
if (_PyIOBase_check_readable(raw, Py_True) == NULL)
return -1;
- Py_INCREF(raw);
- Py_XSETREF(self->raw, raw);
+ Py_XSETREF(self->raw, Py_NewRef(raw));
self->buffer_size = buffer_size;
self->readable = 1;
self->writable = 0;
diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c
index 930ef7e..41be349 100644
--- a/Modules/_io/bytesio.c
+++ b/Modules/_io/bytesio.c
@@ -324,8 +324,7 @@ _io_BytesIO_getbuffer_impl(bytesio *self)
buf = (bytesiobuf *) type->tp_alloc(type, 0);
if (buf == NULL)
return NULL;
- Py_INCREF(self);
- buf->source = self;
+ buf->source = (bytesio*)Py_NewRef(self);
view = PyMemoryView_FromObject((PyObject *) buf);
Py_DECREF(buf);
return view;
@@ -356,8 +355,7 @@ _io_BytesIO_getvalue_impl(bytesio *self)
return NULL;
}
}
- Py_INCREF(self->buf);
- return self->buf;
+ return Py_NewRef(self->buf);
}
/*[clinic input]
@@ -401,8 +399,7 @@ read_bytes(bytesio *self, Py_ssize_t size)
self->pos == 0 && size == PyBytes_GET_SIZE(self->buf) &&
self->exports == 0) {
self->pos += size;
- Py_INCREF(self->buf);
- return self->buf;
+ return Py_NewRef(self->buf);
}
output = PyBytes_AS_STRING(self->buf) + self->pos;
@@ -791,8 +788,7 @@ bytesio_getstate(bytesio *self, PyObject *Py_UNUSED(ignored))
if (initvalue == NULL)
return NULL;
if (self->dict == NULL) {
- Py_INCREF(Py_None);
- dict = Py_None;
+ dict = Py_NewRef(Py_None);
}
else {
dict = PyDict_Copy(self->dict);
@@ -875,8 +871,7 @@ bytesio_setstate(bytesio *self, PyObject *state)
return NULL;
}
else {
- Py_INCREF(dict);
- self->dict = dict;
+ self->dict = Py_NewRef(dict);
}
}
@@ -943,8 +938,7 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)
}
if (initvalue && initvalue != Py_None) {
if (PyBytes_CheckExact(initvalue)) {
- Py_INCREF(initvalue);
- Py_XSETREF(self->buf, initvalue);
+ Py_XSETREF(self->buf, Py_NewRef(initvalue));
self->string_size = PyBytes_GET_SIZE(initvalue);
}
else {
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 6ae43a8..7b9391e 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -464,8 +464,7 @@ iobase_enter(PyObject *self, PyObject *args)
if (iobase_check_closed(self))
return NULL;
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -642,8 +641,7 @@ iobase_iter(PyObject *self)
if (iobase_check_closed(self))
return NULL;
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index 0f31c17..5c3bf35 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -188,8 +188,7 @@ write_str(stringio *self, PyObject *obj)
self->decoder, obj, 1 /* always final */);
}
else {
- decoded = obj;
- Py_INCREF(decoded);
+ decoded = Py_NewRef(obj);
}
if (self->writenl) {
PyObject *translated = PyUnicode_Replace(
@@ -710,8 +709,7 @@ _io_StringIO___init___impl(stringio *self, PyObject *value,
is pointless for StringIO)
*/
if (newline != NULL && newline[0] == '\r') {
- self->writenl = self->readnl;
- Py_INCREF(self->writenl);
+ self->writenl = Py_NewRef(self->readnl);
}
if (self->readuniversal) {
@@ -823,8 +821,7 @@ stringio_getstate(stringio *self, PyObject *Py_UNUSED(ignored))
if (initvalue == NULL)
return NULL;
if (self->dict == NULL) {
- Py_INCREF(Py_None);
- dict = Py_None;
+ dict = Py_NewRef(Py_None);
}
else {
dict = PyDict_Copy(self->dict);
@@ -934,8 +931,7 @@ stringio_setstate(stringio *self, PyObject *state)
return NULL;
}
else {
- Py_INCREF(dict);
- self->dict = dict;
+ self->dict = Py_NewRef(dict);
}
}
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 3369694..8b5d00f 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -231,16 +231,14 @@ _io_IncrementalNewlineDecoder___init___impl(nldecoder_object *self,
PyObject *errors)
/*[clinic end generated code: output=fbd04d443e764ec2 input=89db6b19c6b126bf]*/
{
- self->decoder = decoder;
- Py_INCREF(decoder);
+ self->decoder = Py_NewRef(decoder);
if (errors == NULL) {
- self->errors = &_Py_ID(strict);
+ self->errors = Py_NewRef(&_Py_ID(strict));
}
else {
- self->errors = errors;
+ self->errors = Py_NewRef(errors);
}
- Py_INCREF(self->errors);
self->translate = translate ? 1 : 0;
self->seennl = 0;
@@ -301,8 +299,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself,
&_Py_ID(decode), input, final ? Py_True : Py_False, NULL);
}
else {
- output = input;
- Py_INCREF(output);
+ output = Py_NewRef(input);
}
if (check_decoded(output) < 0)
@@ -1148,8 +1145,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
* of the partially constructed object (like self->encoding)
*/
- Py_INCREF(errors);
- self->errors = errors;
+ self->errors = Py_NewRef(errors);
self->chunk_size = 8192;
self->line_buffering = line_buffering;
self->write_through = write_through;
@@ -1157,8 +1153,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
goto error;
}
- self->buffer = buffer;
- Py_INCREF(buffer);
+ self->buffer = Py_NewRef(buffer);
/* Build the decoder object */
if (_textiowrapper_set_decoder(self, codec_info, PyUnicode_AsUTF8(errors)) != 0)
@@ -1284,9 +1279,8 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding,
}
Py_DECREF(codec_info);
- Py_INCREF(errors);
Py_SETREF(self->encoding, encoding);
- Py_SETREF(self->errors, errors);
+ Py_SETREF(self->errors, Py_NewRef(errors));
return _textiowrapper_fix_encoder_state(self);
}
@@ -1502,8 +1496,7 @@ _textiowrapper_writeflush(textio *self)
PyObject *b;
if (PyBytes_Check(pending)) {
- b = pending;
- Py_INCREF(b);
+ b = Py_NewRef(pending);
}
else if (PyUnicode_Check(pending)) {
assert(PyUnicode_IS_ASCII(pending));
@@ -1618,8 +1611,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text)
// See bpo-43260
PyUnicode_GET_LENGTH(text) <= self->chunk_size &&
is_asciicompat_encoding(self->encodefunc)) {
- b = text;
- Py_INCREF(b);
+ b = Py_NewRef(text);
}
else {
b = (*self->encodefunc)((PyObject *) self, text);
@@ -1741,8 +1733,7 @@ textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)
return NULL;
}
else {
- chars = self->decoded_chars;
- Py_INCREF(chars);
+ chars = Py_NewRef(self->decoded_chars);
}
self->decoded_chars_used += n;
@@ -2139,10 +2130,9 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
}
if (remaining == NULL) {
- line = self->decoded_chars;
+ line = Py_NewRef(self->decoded_chars);
start = self->decoded_chars_used;
offset_to_buffer = 0;
- Py_INCREF(line);
}
else {
assert(self->decoded_chars_used == 0);
@@ -3115,8 +3105,7 @@ static PyObject *
textiowrapper_errors_get(textio *self, void *context)
{
CHECK_INITIALIZED(self);
- Py_INCREF(self->errors);
- return self->errors;
+ return Py_NewRef(self->errors);
}
static PyObject *
diff --git a/Modules/_json.c b/Modules/_json.c
index 82f960f..06f232f 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -1243,16 +1243,17 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (s == NULL)
return NULL;
- s->markers = markers;
- s->defaultfn = defaultfn;
- s->encoder = encoder;
- s->indent = indent;
- s->key_separator = key_separator;
- s->item_separator = item_separator;
+ s->markers = Py_NewRef(markers);
+ s->defaultfn = Py_NewRef(defaultfn);
+ s->encoder = Py_NewRef(encoder);
+ s->indent = Py_NewRef(indent);
+ s->key_separator = Py_NewRef(key_separator);
+ s->item_separator = Py_NewRef(item_separator);
s->sort_keys = sort_keys;
s->skipkeys = skipkeys;
s->allow_nan = allow_nan;
s->fast_encode = NULL;
+
if (PyCFunction_Check(s->encoder)) {
PyCFunction f = PyCFunction_GetFunction(s->encoder);
if (f == (PyCFunction)py_encode_basestring_ascii ||
@@ -1261,12 +1262,6 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
}
- Py_INCREF(s->markers);
- Py_INCREF(s->defaultfn);
- Py_INCREF(s->encoder);
- Py_INCREF(s->indent);
- Py_INCREF(s->key_separator);
- Py_INCREF(s->item_separator);
return (PyObject *)s;
}
@@ -1480,8 +1475,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
PyObject *encoded;
if (PyUnicode_Check(key)) {
- Py_INCREF(key);
- keystr = key;
+ keystr = Py_NewRef(key);
}
else if (PyFloat_Check(key)) {
keystr = encoder_encode_float(s, key);
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index a0e262b..cb80c8d 100644
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -128,8 +128,7 @@ normalizeUserObj(PyObject *obj)
{
PyCFunctionObject *fn;
if (!PyCFunction_Check(obj)) {
- Py_INCREF(obj);
- return obj;
+ return Py_NewRef(obj);
}
/* Replace built-in function objects with a descriptive string
because of built-in methods -- keeping a reference to
@@ -142,8 +141,7 @@ normalizeUserObj(PyObject *obj)
PyObject *modname = NULL;
if (mod != NULL) {
if (PyUnicode_Check(mod)) {
- modname = mod;
- Py_INCREF(modname);
+ modname = Py_NewRef(mod);
}
else if (PyModule_Check(mod)) {
modname = PyModule_GetNameObject(mod);
@@ -555,8 +553,7 @@ static int statsForEntry(rotating_node_t *node, void *arg)
}
}
else {
- Py_INCREF(Py_None);
- collect->sublist = Py_None;
+ collect->sublist = Py_NewRef(Py_None);
}
info = PyObject_CallFunction((PyObject*) collect->state->stats_entry_type,
@@ -781,8 +778,7 @@ profiler_init(ProfilerObject *pObj, PyObject *args, PyObject *kw)
if (setSubcalls(pObj, subcalls) < 0 || setBuiltins(pObj, builtins) < 0)
return -1;
pObj->externalTimerUnit = timeunit;
- Py_XINCREF(timer);
- Py_XSETREF(pObj->externalTimer, timer);
+ Py_XSETREF(pObj->externalTimer, Py_XNewRef(timer));
return 0;
}
diff --git a/Modules/_operator.c b/Modules/_operator.c
index 3005845..4f23671 100644
--- a/Modules/_operator.c
+++ b/Modules/_operator.c
@@ -722,8 +722,7 @@ _operator_is_not_impl(PyObject *module, PyObject *a, PyObject *b)
{
PyObject *result;
result = (a != b) ? Py_True : Py_False;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
/* compare_digest **********************************************************/
@@ -1010,8 +1009,7 @@ itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- Py_INCREF(item);
- ig->item = item;
+ ig->item = Py_NewRef(item);
ig->nitems = nitems;
ig->index = -1;
if (PyLong_CheckExact(item)) {
@@ -1095,8 +1093,7 @@ itemgetter_call_impl(itemgetterobject *ig, PyObject *obj)
&& ig->index < PyTuple_GET_SIZE(obj))
{
result = PyTuple_GET_ITEM(obj, ig->index);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
return PyObject_GetItem(obj, ig->item);
}
@@ -1440,8 +1437,7 @@ dotjoinattr(PyObject *attr, PyObject **attrsep)
}
return PyUnicode_Join(*attrsep, attr);
} else {
- Py_INCREF(attr);
- return attr;
+ return Py_NewRef(attr);
}
}
@@ -1594,8 +1590,7 @@ methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyUnicode_InternInPlace(&name);
mc->name = name;
- Py_XINCREF(kwds);
- mc->kwds = kwds;
+ mc->kwds = Py_XNewRef(kwds);
mc->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
if (mc->args == NULL) {
@@ -1740,12 +1735,10 @@ methodcaller_reduce(methodcallerobject *mc, PyObject *Py_UNUSED(ignored))
newargs = PyTuple_New(1 + callargcount);
if (newargs == NULL)
return NULL;
- Py_INCREF(mc->name);
- PyTuple_SET_ITEM(newargs, 0, mc->name);
+ PyTuple_SET_ITEM(newargs, 0, Py_NewRef(mc->name));
for (i = 0; i < callargcount; ++i) {
PyObject *arg = PyTuple_GET_ITEM(mc->args, i);
- Py_INCREF(arg);
- PyTuple_SET_ITEM(newargs, i + 1, arg);
+ PyTuple_SET_ITEM(newargs, i + 1, Py_NewRef(arg));
}
return Py_BuildValue("ON", Py_TYPE(mc), newargs);
}
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 51e0a24..db62094 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -386,10 +386,9 @@ init_method_ref(PyObject *self, PyObject *name,
if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
/* Deconstruct a bound Python method */
- func2 = PyMethod_GET_FUNCTION(func);
- Py_INCREF(func2);
*method_self = self; /* borrowed */
- Py_XSETREF(*method_func, func2);
+ func2 = PyMethod_GET_FUNCTION(func);
+ Py_XSETREF(*method_func, Py_NewRef(func2));
Py_DECREF(func);
return 0;
}
@@ -408,8 +407,7 @@ reconstruct_method(PyObject *func, PyObject *self)
return PyMethod_New(func, self);
}
else {
- Py_INCREF(func);
- return func;
+ return Py_NewRef(func);
}
}
@@ -907,8 +905,7 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
entry->me_value = value;
return 0;
}
- Py_INCREF(key);
- entry->me_key = key;
+ entry->me_key = Py_NewRef(key);
entry->me_value = value;
self->mt_used++;
@@ -1196,8 +1193,7 @@ _Pickler_SetBufferCallback(PicklerObject *self, PyObject *buffer_callback)
return -1;
}
- Py_XINCREF(buffer_callback);
- self->buffer_callback = buffer_callback;
+ self->buffer_callback = Py_XNewRef(buffer_callback);
return 0;
}
@@ -1543,9 +1539,8 @@ _Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)
return -1;
assert(idx < self->memo_size);
}
- Py_INCREF(value);
old_item = self->memo[idx];
- self->memo[idx] = value;
+ self->memo[idx] = Py_NewRef(value);
if (old_item != NULL) {
Py_DECREF(old_item);
}
@@ -1928,8 +1923,7 @@ whichmodule(PyObject *global, PyObject *dotted_path)
i = 0;
while (PyDict_Next(modules, &i, &module_name, &module)) {
if (_checkmodule(module_name, module, global, dotted_path) == 0) {
- Py_INCREF(module_name);
- return module_name;
+ return Py_NewRef(module_name);
}
if (PyErr_Occurred()) {
return NULL;
@@ -1965,8 +1959,7 @@ whichmodule(PyObject *global, PyObject *dotted_path)
/* If no module is found, use __main__. */
module_name = &_Py_ID(__main__);
- Py_INCREF(module_name);
- return module_name;
+ return Py_NewRef(module_name);
}
/* fast_save_enter() and fast_save_leave() are guards against recursive
@@ -3557,10 +3550,8 @@ fix_imports(PyObject **module_name, PyObject **global_name)
Py_CLEAR(*module_name);
Py_CLEAR(*global_name);
- Py_INCREF(fixed_module_name);
- Py_INCREF(fixed_global_name);
- *module_name = fixed_module_name;
- *global_name = fixed_global_name;
+ *module_name = Py_NewRef(fixed_module_name);
+ *global_name = Py_NewRef(fixed_global_name);
return 0;
}
else if (PyErr_Occurred()) {
@@ -3576,8 +3567,7 @@ fix_imports(PyObject **module_name, PyObject **global_name)
Py_TYPE(item)->tp_name);
return -1;
}
- Py_INCREF(item);
- Py_XSETREF(*module_name, item);
+ Py_XSETREF(*module_name, Py_NewRef(item));
}
else if (PyErr_Occurred()) {
return -1;
@@ -3602,8 +3592,7 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
const char global_op = GLOBAL;
if (name) {
- Py_INCREF(name);
- global_name = name;
+ global_name = Py_NewRef(name);
}
else {
if (_PyObject_LookupAttr(obj, &_Py_ID(__qualname__), &global_name) < 0)
@@ -3637,8 +3626,8 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
obj, module_name);
goto error;
}
- lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
- Py_INCREF(lastname);
+ lastname = Py_NewRef(PyList_GET_ITEM(dotted_path,
+ PyList_GET_SIZE(dotted_path) - 1));
cls = get_deep_attribute(module, dotted_path, &parent);
Py_CLEAR(dotted_path);
if (cls == NULL) {
@@ -3932,8 +3921,7 @@ get_class(PyObject *obj)
PyObject *cls;
if (_PyObject_LookupAttr(obj, &_Py_ID(__class__), &cls) == 0) {
- cls = (PyObject *) Py_TYPE(obj);
- Py_INCREF(cls);
+ cls = Py_NewRef(Py_TYPE(obj));
}
return cls;
}
@@ -4084,12 +4072,10 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
return -1;
}
PyTuple_SET_ITEM(newargs, 0, cls_new);
- Py_INCREF(cls);
- PyTuple_SET_ITEM(newargs, 1, cls);
+ PyTuple_SET_ITEM(newargs, 1, Py_NewRef(cls));
for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
PyObject *item = PyTuple_GET_ITEM(args, i);
- Py_INCREF(item);
- PyTuple_SET_ITEM(newargs, i + 2, item);
+ PyTuple_SET_ITEM(newargs, i + 2, Py_NewRef(item));
}
callable = PyObject_Call(st->partial, newargs, kwargs);
@@ -4405,8 +4391,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
}
}
if (reduce_func != NULL) {
- Py_INCREF(obj);
- reduce_value = _Pickle_FastCall(reduce_func, obj);
+ reduce_value = _Pickle_FastCall(reduce_func, Py_NewRef(obj));
}
else if (PyType_IsSubtype(type, &PyType_Type)) {
status = save_global(self, obj, NULL);
@@ -4869,8 +4854,7 @@ _pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
return NULL;
}
PyTuple_SET_ITEM(dict_args, 0, contents);
- Py_INCREF((PyObject *)&PyDict_Type);
- PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
+ PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
PyTuple_SET_ITEM(reduce_value, 1, dict_args);
return reduce_value;
}
@@ -4944,8 +4928,7 @@ PicklerMemoProxy_New(PicklerObject *pickler)
self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
if (self == NULL)
return NULL;
- Py_INCREF(pickler);
- self->pickler = pickler;
+ self->pickler = (PicklerObject*)Py_NewRef(pickler);
PyObject_GC_Track(self);
return (PyObject *)self;
}
@@ -5045,8 +5028,7 @@ Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored
}
self->pers_func_self = NULL;
- Py_INCREF(value);
- Py_XSETREF(self->pers_func, value);
+ Py_XSETREF(self->pers_func, Py_NewRef(value));
return 0;
}
@@ -7370,8 +7352,7 @@ _pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
return NULL;
}
PyTuple_SET_ITEM(constructor_args, 0, contents);
- Py_INCREF((PyObject *)&PyDict_Type);
- PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
+ PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
return reduce_value;
}
@@ -7446,8 +7427,7 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
&UnpicklerMemoProxyType);
if (self == NULL)
return NULL;
- Py_INCREF(unpickler);
- self->unpickler = unpickler;
+ self->unpickler = (UnpicklerObject*)Py_NewRef(unpickler);
PyObject_GC_Track(self);
return (PyObject *)self;
}
@@ -7483,8 +7463,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
return -1;
for (size_t i = 0; i < new_memo_size; i++) {
- Py_XINCREF(unpickler->memo[i]);
- new_memo[i] = unpickler->memo[i];
+ new_memo[i] = Py_XNewRef(unpickler->memo[i]);
}
}
else if (PyDict_Check(obj)) {
@@ -7564,8 +7543,7 @@ Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(i
}
self->pers_func_self = NULL;
- Py_INCREF(value);
- Py_XSETREF(self->pers_func, value);
+ Py_XSETREF(self->pers_func, Py_NewRef(value));
return 0;
}
@@ -7944,8 +7922,7 @@ PyInit__pickle(void)
m = PyState_FindModule(&_picklemodule);
if (m) {
- Py_INCREF(m);
- return m;
+ return Py_NewRef(m);
}
if (PyType_Ready(&Pdata_Type) < 0)
diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c
index 44039ce..4b6290a 100644
--- a/Modules/_sre/sre.c
+++ b/Modules/_sre/sre.c
@@ -459,8 +459,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
state->start = (void*) ((char*) ptr + start * state->charsize);
state->end = (void*) ((char*) ptr + end * state->charsize);
- Py_INCREF(string);
- state->string = string;
+ state->string = Py_NewRef(string);
state->pos = start;
state->endpos = end;
@@ -499,8 +498,7 @@ getslice(int isbytes, const void *ptr,
if (isbytes) {
if (PyBytes_CheckExact(string) &&
start == 0 && end == PyBytes_GET_SIZE(string)) {
- Py_INCREF(string);
- return string;
+ return Py_NewRef(string);
}
return PyBytes_FromStringAndSize(
(const char *)ptr + start, end - start);
@@ -1089,8 +1087,7 @@ pattern_subx(_sremodulestate* module_state,
if (PyCallable_Check(ptemplate)) {
/* sub/subn takes either a function or a template */
- filter = ptemplate;
- Py_INCREF(filter);
+ filter = Py_NewRef(ptemplate);
filter_type = CALLABLE;
} else {
/* if not callable, check if it's a literal string */
@@ -1109,8 +1106,7 @@ pattern_subx(_sremodulestate* module_state,
if (view.buf)
PyBuffer_Release(&view);
if (literal) {
- filter = ptemplate;
- Py_INCREF(filter);
+ filter = Py_NewRef(ptemplate);
filter_type = LITERAL;
} else {
/* not a literal; hand it over to the template compiler */
@@ -1120,8 +1116,8 @@ pattern_subx(_sremodulestate* module_state,
assert(Py_TYPE(filter) == module_state->Template_Type);
if (Py_SIZE(filter) == 0) {
- Py_INCREF(((TemplateObject *)filter)->literal);
- Py_SETREF(filter, ((TemplateObject *)filter)->literal);
+ Py_SETREF(filter,
+ Py_NewRef(((TemplateObject *)filter)->literal));
filter_type = LITERAL;
}
else {
@@ -1195,8 +1191,7 @@ pattern_subx(_sremodulestate* module_state,
goto error;
} else {
/* filter is literal string */
- item = filter;
- Py_INCREF(item);
+ item = Py_NewRef(filter);
}
/* add to list */
@@ -1317,8 +1312,7 @@ static PyObject *
_sre_SRE_Pattern___copy___impl(PatternObject *self)
/*[clinic end generated code: output=85dedc2db1bd8694 input=a730a59d863bc9f5]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
/*[clinic input]
@@ -1333,8 +1327,7 @@ static PyObject *
_sre_SRE_Pattern___deepcopy__(PatternObject *self, PyObject *memo)
/*[clinic end generated code: output=2ad25679c1f1204a input=a465b1602f997bed]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1500,19 +1493,16 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
PyBuffer_Release(&view);
}
- Py_INCREF(pattern);
- self->pattern = pattern;
+ self->pattern = Py_NewRef(pattern);
self->flags = flags;
self->groups = groups;
if (PyDict_GET_SIZE(groupindex) > 0) {
- Py_INCREF(groupindex);
- self->groupindex = groupindex;
+ self->groupindex = Py_NewRef(groupindex);
if (PyTuple_GET_SIZE(indexgroup) > 0) {
- Py_INCREF(indexgroup);
- self->indexgroup = indexgroup;
+ self->indexgroup = Py_NewRef(indexgroup);
}
}
@@ -1555,8 +1545,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
if (!self)
return NULL;
self->chunks = 1 + 2*n;
- self->literal = PyList_GET_ITEM(template, 0);
- Py_INCREF(self->literal);
+ self->literal = Py_NewRef(PyList_GET_ITEM(template, 0));
for (Py_ssize_t i = 0; i < n; i++) {
Py_ssize_t index = PyLong_AsSsize_t(PyList_GET_ITEM(template, 2*i+1));
if (index == -1 && PyErr_Occurred()) {
@@ -1576,8 +1565,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
literal = NULL;
self->chunks--;
}
- Py_XINCREF(literal);
- self->items[i].literal = literal;
+ self->items[i].literal = Py_XNewRef(literal);
}
return (PyObject*) self;
@@ -2128,8 +2116,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
if (self->string == Py_None || self->mark[index] < 0) {
/* return default value if the string or group is undefined */
- Py_INCREF(def);
- return def;
+ return Py_NewRef(def);
}
ptr = getstring(self->string, &length, &isbytes, &charsize, &view);
@@ -2448,8 +2435,7 @@ match_regs(MatchObject* self)
PyTuple_SET_ITEM(regs, index, item);
}
- Py_INCREF(regs);
- self->regs = regs;
+ self->regs = Py_NewRef(regs);
return regs;
}
@@ -2463,8 +2449,7 @@ static PyObject *
_sre_SRE_Match___copy___impl(MatchObject *self)
/*[clinic end generated code: output=a779c5fc8b5b4eb4 input=3bb4d30b6baddb5b]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
/*[clinic input]
@@ -2479,8 +2464,7 @@ static PyObject *
_sre_SRE_Match___deepcopy__(MatchObject *self, PyObject *memo)
/*[clinic end generated code: output=ba7cb46d655e4ee2 input=779d12a31c2c325e]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
PyDoc_STRVAR(match_doc,
@@ -2509,8 +2493,7 @@ match_lastgroup_get(MatchObject *self, void *Py_UNUSED(ignored))
{
PyObject *result = PyTuple_GET_ITEM(self->pattern->indexgroup,
self->lastindex);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
Py_RETURN_NONE;
}
@@ -2519,8 +2502,7 @@ static PyObject *
match_regs_get(MatchObject *self, void *Py_UNUSED(ignored))
{
if (self->regs) {
- Py_INCREF(self->regs);
- return self->regs;
+ return Py_NewRef(self->regs);
} else
return match_regs(self);
}
@@ -2564,11 +2546,9 @@ pattern_new_match(_sremodulestate* module_state,
if (!match)
return NULL;
- Py_INCREF(pattern);
- match->pattern = pattern;
+ match->pattern = (PatternObject*)Py_NewRef(pattern);
- Py_INCREF(state->string);
- match->string = state->string;
+ match->string = Py_NewRef(state->string);
match->regs = NULL;
match->groups = pattern->groups+1;
@@ -2788,8 +2768,7 @@ pattern_scanner(_sremodulestate *module_state,
return NULL;
}
- Py_INCREF(self);
- scanner->pattern = (PyObject*) self;
+ scanner->pattern = Py_NewRef(self);
PyObject_GC_Track(scanner);
return (PyObject*) scanner;
@@ -2834,8 +2813,7 @@ static PyObject *
expand_template(TemplateObject *self, MatchObject *match)
{
if (Py_SIZE(self) == 0) {
- Py_INCREF(self->literal);
- return self->literal;
+ return Py_NewRef(self->literal);
}
PyObject *result = NULL;
@@ -2855,8 +2833,7 @@ expand_template(TemplateObject *self, MatchObject *match)
out = &PyList_GET_ITEM(list, 0);
}
- Py_INCREF(self->literal);
- out[count++] = self->literal;
+ out[count++] = Py_NewRef(self->literal);
for (Py_ssize_t i = 0; i < Py_SIZE(self); i++) {
Py_ssize_t index = self->items[i].index;
if (index >= match->groups) {
@@ -2868,15 +2845,13 @@ expand_template(TemplateObject *self, MatchObject *match)
goto cleanup;
}
if (item != Py_None) {
- Py_INCREF(item);
- out[count++] = item;
+ out[count++] = Py_NewRef(item);
}
Py_DECREF(item);
PyObject *literal = self->items[i].literal;
if (literal != NULL) {
- Py_INCREF(literal);
- out[count++] = literal;
+ out[count++] = Py_NewRef(literal);
}
}
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index bf8bd9d..2826d15 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -415,8 +415,7 @@ static PyObject *
SSLError_str(PyOSErrorObject *self)
{
if (self->strerror != NULL && PyUnicode_Check(self->strerror)) {
- Py_INCREF(self->strerror);
- return self->strerror;
+ return Py_NewRef(self->strerror);
}
else
return PyObject_Str(self->args);
@@ -500,8 +499,7 @@ fill_and_set_sslerror(_sslmodulestate *state,
if (verify_str != NULL) {
verify_obj = PyUnicode_FromString(verify_str);
} else {
- verify_obj = Py_None;
- Py_INCREF(verify_obj);
+ verify_obj = Py_NewRef(Py_None);
}
break;
}
@@ -800,8 +798,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
self->ssl = NULL;
self->Socket = NULL;
- self->ctx = sslctx;
- Py_INCREF(sslctx);
+ self->ctx = (PySSLContext*)Py_NewRef(sslctx);
self->shutdown_seen_zero = 0;
self->owner = NULL;
self->server_hostname = NULL;
@@ -1026,8 +1023,7 @@ _asn1obj2py(_sslmodulestate *state, const ASN1_OBJECT *name, int no_name)
}
}
if (!buflen && no_name) {
- Py_INCREF(Py_None);
- name_obj = Py_None;
+ name_obj = Py_NewRef(Py_None);
}
else {
name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
@@ -1876,8 +1872,7 @@ _ssl__SSLSocket_get_unverified_chain_impl(PySSLSocket *self)
X509 *peer = SSL_get_peer_certificate(self->ssl);
if (peer == NULL) {
- peerobj = Py_None;
- Py_INCREF(peerobj);
+ peerobj = Py_NewRef(Py_None);
} else {
/* consume X509 reference on success */
peerobj = _PySSL_CertificateFromX509(self->ctx->state, peer, 0);
@@ -1907,8 +1902,7 @@ cipher_to_tuple(const SSL_CIPHER *cipher)
cipher_name = SSL_CIPHER_get_name(cipher);
if (cipher_name == NULL) {
- Py_INCREF(Py_None);
- PyTuple_SET_ITEM(retval, 0, Py_None);
+ PyTuple_SET_ITEM(retval, 0, Py_NewRef(Py_None));
} else {
v = PyUnicode_FromString(cipher_name);
if (v == NULL)
@@ -1918,8 +1912,7 @@ cipher_to_tuple(const SSL_CIPHER *cipher)
cipher_protocol = SSL_CIPHER_get_version(cipher);
if (cipher_protocol == NULL) {
- Py_INCREF(Py_None);
- PyTuple_SET_ITEM(retval, 1, Py_None);
+ PyTuple_SET_ITEM(retval, 1, Py_NewRef(Py_None));
} else {
v = PyUnicode_FromString(cipher_protocol);
if (v == NULL)
@@ -2103,16 +2096,14 @@ _ssl__SSLSocket_compression_impl(PySSLSocket *self)
}
static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
- Py_INCREF(self->ctx);
- return self->ctx;
+ return (PySSLContext*)Py_NewRef(self->ctx);
}
static int PySSL_set_context(PySSLSocket *self, PyObject *value,
void *closure) {
if (PyObject_TypeCheck(value, self->ctx->state->PySSLContext_Type)) {
- Py_INCREF(value);
- Py_SETREF(self->ctx, (PySSLContext *)value);
+ Py_SETREF(self->ctx, (PySSLContext *)Py_NewRef(value));
SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
/* Set SSL* internal msg_callback to state of new context's state */
SSL_set_msg_callback(
@@ -2150,8 +2141,7 @@ PySSL_get_server_hostname(PySSLSocket *self, void *c)
{
if (self->server_hostname == NULL)
Py_RETURN_NONE;
- Py_INCREF(self->server_hostname);
- return self->server_hostname;
+ return Py_NewRef(self->server_hostname);
}
PyDoc_STRVAR(PySSL_get_server_hostname_doc,
@@ -2166,8 +2156,7 @@ PySSL_get_owner(PySSLSocket *self, void *c)
Py_RETURN_NONE;
owner = PyWeakref_GetObject(self->owner);
- Py_INCREF(owner);
- return owner;
+ return Py_NewRef(owner);
}
static int
@@ -2820,8 +2809,7 @@ PySSL_get_session(PySSLSocket *self, void *closure) {
}
assert(self->ctx);
- pysess->ctx = self->ctx;
- Py_INCREF(pysess->ctx);
+ pysess->ctx = (PySSLContext*)Py_NewRef(self->ctx);
pysess->session = session;
PyObject_GC_Track(pysess);
return (PyObject *)pysess;
@@ -4459,8 +4447,7 @@ get_sni_callback(PySSLContext *self, void *c)
if (cb == NULL) {
Py_RETURN_NONE;
}
- Py_INCREF(cb);
- return cb;
+ return Py_NewRef(cb);
}
static int
@@ -4482,8 +4469,7 @@ set_sni_callback(PySSLContext *self, PyObject *arg, void *c)
"not a callable object");
return -1;
}
- Py_INCREF(arg);
- self->set_sni_cb = arg;
+ self->set_sni_cb = Py_NewRef(arg);
SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
}
@@ -5196,7 +5182,7 @@ _ssl_get_default_verify_paths_impl(PyObject *module)
#define CONVERT(info, target) { \
const char *tmp = (info); \
target = NULL; \
- if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
+ if (!tmp) { target = Py_NewRef(Py_None); } \
else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
target = PyBytes_FromString(tmp); } \
if (!target) goto error; \
@@ -5311,11 +5297,9 @@ certEncodingType(DWORD encodingType)
}
switch(encodingType) {
case X509_ASN_ENCODING:
- Py_INCREF(x509_asn);
- return x509_asn;
+ return Py_NewRef(x509_asn);
case PKCS_7_ASN_ENCODING:
- Py_INCREF(pkcs_7_asn);
- return pkcs_7_asn;
+ return Py_NewRef(pkcs_7_asn);
default:
return PyLong_FromLong(encodingType);
}
@@ -5717,8 +5701,7 @@ sslmodule_init_socketapi(PyObject *module)
if ((sockmod == NULL) || (sockmod->Sock_Type == NULL)) {
return -1;
}
- state->Sock_Type = sockmod->Sock_Type;
- Py_INCREF(state->Sock_Type);
+ state->Sock_Type = (PyTypeObject*)Py_NewRef(sockmod->Sock_Type);
return 0;
}
@@ -5925,8 +5908,7 @@ sslmodule_init_constants(PyObject *m)
#define addbool(m, key, value) \
do { \
PyObject *bool_obj = (value) ? Py_True : Py_False; \
- Py_INCREF(bool_obj); \
- PyModule_AddObject((m), (key), bool_obj); \
+ PyModule_AddObject((m), (key), Py_NewRef(bool_obj)); \
} while (0)
addbool(m, "HAS_SNI", 1);
diff --git a/Modules/_ssl/debughelpers.c b/Modules/_ssl/debughelpers.c
index 03c125e..08f3457 100644
--- a/Modules/_ssl/debughelpers.c
+++ b/Modules/_ssl/debughelpers.c
@@ -87,8 +87,7 @@ _PySSL_msg_callback(int write_p, int version, int content_type,
static PyObject *
_PySSLContext_get_msg_callback(PySSLContext *self, void *c) {
if (self->msg_cb != NULL) {
- Py_INCREF(self->msg_cb);
- return self->msg_cb;
+ return Py_NewRef(self->msg_cb);
} else {
Py_RETURN_NONE;
}
@@ -107,8 +106,7 @@ _PySSLContext_set_msg_callback(PySSLContext *self, PyObject *arg, void *c) {
"not a callable object");
return -1;
}
- Py_INCREF(arg);
- self->msg_cb = arg;
+ self->msg_cb = Py_NewRef(arg);
SSL_CTX_set_msg_callback(self->ctx, _PySSL_msg_callback);
}
return 0;
@@ -166,8 +164,7 @@ _PySSL_keylog_callback(const SSL *ssl, const char *line)
static PyObject *
_PySSLContext_get_keylog_filename(PySSLContext *self, void *c) {
if (self->keylog_filename != NULL) {
- Py_INCREF(self->keylog_filename);
- return self->keylog_filename;
+ return Py_NewRef(self->keylog_filename);
} else {
Py_RETURN_NONE;
}
@@ -203,8 +200,7 @@ _PySSLContext_set_keylog_filename(PySSLContext *self, PyObject *arg, void *c) {
"Can't malloc memory for keylog file");
return -1;
}
- Py_INCREF(arg);
- self->keylog_filename = arg;
+ self->keylog_filename = Py_NewRef(arg);
/* Write a header for seekable, empty files (this excludes pipes). */
PySSL_BEGIN_ALLOW_THREADS
diff --git a/Modules/_struct.c b/Modules/_struct.c
index f9bac34..2f2eb25 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1829,8 +1829,7 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer)
Py_DECREF(iter);
return NULL;
}
- Py_INCREF(self);
- iter->so = self;
+ iter->so = (PyStructObject*)Py_NewRef(self);
iter->index = 0;
return (PyObject *)iter;
}
@@ -2178,8 +2177,7 @@ cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr)
s_object = PyDict_GetItemWithError(state->cache, fmt);
if (s_object != NULL) {
- Py_INCREF(s_object);
- *ptr = (PyStructObject *)s_object;
+ *ptr = (PyStructObject *)Py_NewRef(s_object);
return Py_CLEANUP_SUPPORTED;
}
else if (PyErr_Occurred()) {
diff --git a/Modules/_testcapi/datetime.c b/Modules/_testcapi/datetime.c
new file mode 100644
index 0000000..9fb6562
--- /dev/null
+++ b/Modules/_testcapi/datetime.c
@@ -0,0 +1,453 @@
+#include "parts.h"
+
+#include "datetime.h" // PyDateTimeAPI
+
+
+static int test_run_counter = 0;
+
+static PyObject *
+test_datetime_capi(PyObject *self, PyObject *args)
+{
+ if (PyDateTimeAPI) {
+ if (test_run_counter) {
+ /* Probably regrtest.py -R */
+ Py_RETURN_NONE;
+ }
+ else {
+ PyErr_SetString(PyExc_AssertionError,
+ "PyDateTime_CAPI somehow initialized");
+ return NULL;
+ }
+ }
+ test_run_counter++;
+ PyDateTime_IMPORT;
+
+ if (PyDateTimeAPI) {
+ Py_RETURN_NONE;
+ }
+ return NULL;
+}
+
+/* Functions exposing the C API type checking for testing */
+#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
+do { \
+ PyObject *obj; \
+ int exact = 0; \
+ if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
+ return NULL; \
+ } \
+ int rv = exact?exact_method(obj):check_method(obj); \
+ if (rv) { \
+ Py_RETURN_TRUE; \
+ } \
+ Py_RETURN_FALSE; \
+} while (0) \
+
+static PyObject *
+datetime_check_date(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact);
+}
+
+static PyObject *
+datetime_check_time(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact);
+}
+
+static PyObject *
+datetime_check_datetime(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact);
+}
+
+static PyObject *
+datetime_check_delta(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact);
+}
+
+static PyObject *
+datetime_check_tzinfo(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact);
+}
+#undef MAKE_DATETIME_CHECK_FUNC
+
+
+/* Makes three variations on timezone representing UTC-5:
+ 1. timezone with offset and name from PyDateTimeAPI
+ 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
+ 3. timezone with offset (no name) from PyTimeZone_FromOffset
+*/
+static PyObject *
+make_timezones_capi(PyObject *self, PyObject *args)
+{
+ PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
+ PyObject *name = PyUnicode_FromString("EST");
+
+ PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
+ PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
+ PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
+
+ Py_DecRef(offset);
+ Py_DecRef(name);
+
+ PyObject *rv = PyTuple_New(3);
+ if (rv == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(rv, 0, est_zone_capi);
+ PyTuple_SET_ITEM(rv, 1, est_zone_macro);
+ PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
+
+ return rv;
+}
+
+static PyObject *
+get_timezones_offset_zero(PyObject *self, PyObject *args)
+{
+ PyObject *offset = PyDelta_FromDSU(0, 0, 0);
+ PyObject *name = PyUnicode_FromString("");
+
+ // These two should return the UTC singleton
+ PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
+ PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
+
+ // This one will return +00:00 zone, but not the UTC singleton
+ PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
+
+ Py_DecRef(offset);
+ Py_DecRef(name);
+
+ PyObject *rv = PyTuple_New(3);
+ PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
+ PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
+ PyTuple_SET_ITEM(rv, 2, non_utc_zone);
+
+ return rv;
+}
+
+static PyObject *
+get_timezone_utc_capi(PyObject *self, PyObject *args)
+{
+ int macro = 0;
+ if (!PyArg_ParseTuple(args, "|p", &macro)) {
+ return NULL;
+ }
+ if (macro) {
+ Py_INCREF(PyDateTime_TimeZone_UTC);
+ return PyDateTime_TimeZone_UTC;
+ }
+ Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
+ return PyDateTimeAPI->TimeZone_UTC;
+}
+
+static PyObject *
+get_date_fromdate(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+
+ if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDate_FromDate(year, month, day);
+ }
+ else {
+ rv = PyDateTimeAPI->Date_FromDate(
+ year, month, day,
+ PyDateTimeAPI->DateType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromdateandtime(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+ int hour, minute, second, microsecond;
+
+ if (!PyArg_ParseTuple(args, "piiiiiii",
+ &macro,
+ &year, &month, &day,
+ &hour, &minute, &second, &microsecond)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDateTime_FromDateAndTime(
+ year, month, day,
+ hour, minute, second, microsecond);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromDateAndTime(
+ year, month, day,
+ hour, minute, second, microsecond,
+ Py_None,
+ PyDateTimeAPI->DateTimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+ int hour, minute, second, microsecond, fold;
+
+ if (!PyArg_ParseTuple(args, "piiiiiiii",
+ &macro,
+ &year, &month, &day,
+ &hour, &minute, &second, &microsecond,
+ &fold)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDateTime_FromDateAndTimeAndFold(
+ year, month, day,
+ hour, minute, second, microsecond,
+ fold);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
+ year, month, day,
+ hour, minute, second, microsecond,
+ Py_None,
+ fold,
+ PyDateTimeAPI->DateTimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_time_fromtime(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int hour, minute, second, microsecond;
+
+ if (!PyArg_ParseTuple(args, "piiii",
+ &macro,
+ &hour, &minute, &second, &microsecond))
+ {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyTime_FromTime(hour, minute, second, microsecond);
+ }
+ else {
+ rv = PyDateTimeAPI->Time_FromTime(
+ hour, minute, second, microsecond,
+ Py_None,
+ PyDateTimeAPI->TimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_time_fromtimeandfold(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int hour, minute, second, microsecond, fold;
+
+ if (!PyArg_ParseTuple(args, "piiiii",
+ &macro,
+ &hour, &minute, &second, &microsecond,
+ &fold)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
+ }
+ else {
+ rv = PyDateTimeAPI->Time_FromTimeAndFold(
+ hour, minute, second, microsecond,
+ Py_None,
+ fold,
+ PyDateTimeAPI->TimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_delta_fromdsu(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int days, seconds, microseconds;
+
+ if (!PyArg_ParseTuple(args, "piii",
+ &macro,
+ &days, &seconds, &microseconds)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDelta_FromDSU(days, seconds, microseconds);
+ }
+ else {
+ rv = PyDateTimeAPI->Delta_FromDelta(
+ days, seconds, microseconds, 1,
+ PyDateTimeAPI->DeltaType);
+ }
+
+ return rv;
+}
+
+static PyObject *
+get_date_fromtimestamp(PyObject *self, PyObject *args)
+{
+ PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
+ int macro = 0;
+
+ if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
+ return NULL;
+ }
+
+ // Construct the argument tuple
+ if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
+ return NULL;
+ }
+
+ // Pass along to the API function
+ if (macro) {
+ rv = PyDate_FromTimestamp(tsargs);
+ }
+ else {
+ rv = PyDateTimeAPI->Date_FromTimestamp(
+ (PyObject *)PyDateTimeAPI->DateType, tsargs
+ );
+ }
+
+ Py_DECREF(tsargs);
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromtimestamp(PyObject *self, PyObject *args)
+{
+ int macro = 0;
+ int usetz = 0;
+ PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
+ if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
+ return NULL;
+ }
+
+ // Construct the argument tuple
+ if (usetz) {
+ tsargs = PyTuple_Pack(2, ts, tzinfo);
+ }
+ else {
+ tsargs = PyTuple_Pack(1, ts);
+ }
+
+ if (tsargs == NULL) {
+ return NULL;
+ }
+
+ // Pass along to the API function
+ if (macro) {
+ rv = PyDateTime_FromTimestamp(tsargs);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromTimestamp(
+ (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
+ );
+ }
+
+ Py_DECREF(tsargs);
+ return rv;
+}
+
+static PyObject *
+test_PyDateTime_GET(PyObject *self, PyObject *obj)
+{
+ int year, month, day;
+
+ year = PyDateTime_GET_YEAR(obj);
+ month = PyDateTime_GET_MONTH(obj);
+ day = PyDateTime_GET_DAY(obj);
+
+ return Py_BuildValue("(iii)", year, month, day);
+}
+
+static PyObject *
+test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
+{
+ int hour = PyDateTime_DATE_GET_HOUR(obj);
+ int minute = PyDateTime_DATE_GET_MINUTE(obj);
+ int second = PyDateTime_DATE_GET_SECOND(obj);
+ int microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
+ PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
+
+ return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
+}
+
+static PyObject *
+test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
+{
+ int hour = PyDateTime_TIME_GET_HOUR(obj);
+ int minute = PyDateTime_TIME_GET_MINUTE(obj);
+ int second = PyDateTime_TIME_GET_SECOND(obj);
+ int microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
+ PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
+
+ return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
+}
+
+static PyObject *
+test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
+{
+ int days = PyDateTime_DELTA_GET_DAYS(obj);
+ int seconds = PyDateTime_DELTA_GET_SECONDS(obj);
+ int microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
+
+ return Py_BuildValue("(iii)", days, seconds, microseconds);
+}
+
+static PyMethodDef test_methods[] = {
+ {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
+ {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
+ {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
+ {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
+ {"datetime_check_date", datetime_check_date, METH_VARARGS},
+ {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
+ {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
+ {"datetime_check_time", datetime_check_time, METH_VARARGS},
+ {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
+ {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
+ {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
+ {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
+ {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
+ {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
+ {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
+ {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
+ {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
+ {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
+ {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
+ {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
+ {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_DateTime(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/Modules/_testcapi/getargs.c b/Modules/_testcapi/getargs.c
new file mode 100644
index 0000000..25a8e5f
--- /dev/null
+++ b/Modules/_testcapi/getargs.c
@@ -0,0 +1,920 @@
+/*
+ * Tests for Python/getargs.c and Python/modsupport.c;
+ * APIs that parse and build arguments.
+ */
+
+#define PY_SSIZE_T_CLEAN
+
+#include "parts.h"
+
+static PyObject *
+parse_tuple_and_keywords(PyObject *self, PyObject *args)
+{
+ PyObject *sub_args;
+ PyObject *sub_kwargs;
+ const char *sub_format;
+ PyObject *sub_keywords;
+
+ double buffers[8][4]; /* double ensures alignment where necessary */
+ PyObject *converted[8];
+ char *keywords[8 + 1]; /* space for NULL at end */
+
+ PyObject *return_value = NULL;
+
+ if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
+ &sub_args, &sub_kwargs, &sub_format, &sub_keywords))
+ {
+ return NULL;
+ }
+
+ if (!(PyList_CheckExact(sub_keywords) ||
+ PyTuple_CheckExact(sub_keywords)))
+ {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: "
+ "sub_keywords must be either list or tuple");
+ return NULL;
+ }
+
+ memset(buffers, 0, sizeof(buffers));
+ memset(converted, 0, sizeof(converted));
+ memset(keywords, 0, sizeof(keywords));
+
+ Py_ssize_t size = PySequence_Fast_GET_SIZE(sub_keywords);
+ if (size > 8) {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: too many keywords in sub_keywords");
+ goto exit;
+ }
+
+ for (Py_ssize_t i = 0; i < size; i++) {
+ PyObject *o = PySequence_Fast_GET_ITEM(sub_keywords, i);
+ if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
+ PyErr_Format(PyExc_ValueError,
+ "parse_tuple_and_keywords: "
+ "could not convert keywords[%zd] to narrow string", i);
+ goto exit;
+ }
+ keywords[i] = PyBytes_AS_STRING(converted[i]);
+ }
+
+ int result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
+ sub_format, keywords,
+ buffers + 0, buffers + 1, buffers + 2, buffers + 3,
+ buffers + 4, buffers + 5, buffers + 6, buffers + 7);
+
+ if (result) {
+ return_value = Py_NewRef(Py_None);
+ }
+
+exit:
+ size = sizeof(converted) / sizeof(converted[0]);
+ for (Py_ssize_t i = 0; i < size; i++) {
+ Py_XDECREF(converted[i]);
+ }
+ return return_value;
+}
+
+static PyObject *
+get_args(PyObject *self, PyObject *args)
+{
+ if (args == NULL) {
+ args = Py_None;
+ }
+ return Py_NewRef(args);
+}
+
+static PyObject *
+get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ if (kwargs == NULL) {
+ kwargs = Py_None;
+ }
+ return Py_NewRef(kwargs);
+}
+
+static PyObject *
+getargs_w_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+
+ if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer)) {
+ return NULL;
+ }
+
+ if (2 <= buffer.len) {
+ char *str = buffer.buf;
+ str[0] = '[';
+ str[buffer.len-1] = ']';
+ }
+
+ PyObject *result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+static PyObject *
+test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ /* Test that formats can begin with '|'. See issue #4720. */
+ PyObject *dict = NULL;
+ static char *kwlist[] = {NULL};
+ PyObject *tuple = PyTuple_New(0);
+ if (!tuple) {
+ return NULL;
+ }
+ int result;
+ if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
+ goto done;
+ }
+ dict = PyDict_New();
+ if (!dict) {
+ goto done;
+ }
+ result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse",
+ kwlist);
+ done:
+ Py_DECREF(tuple);
+ Py_XDECREF(dict);
+ if (!result) {
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+/* Test tuple argument processing */
+static PyObject *
+getargs_tuple(PyObject *self, PyObject *args)
+{
+ int a, b, c;
+ if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c)) {
+ return NULL;
+ }
+ return Py_BuildValue("iii", a, b, c);
+}
+
+/* test PyArg_ParseTupleAndKeywords */
+static PyObject *
+getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
+ static const char fmt[] = "(ii)i|(i(ii))(iii)i";
+ int int_args[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
+ &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
+ &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iiiiiiiiii",
+ int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
+ int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
+}
+
+/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
+static PyObject *
+getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"required", "optional", "keyword_only", NULL};
+ int required = -1;
+ int optional = -1;
+ int keyword_only = -1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
+ &required, &optional, &keyword_only))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iii", required, optional, keyword_only);
+}
+
+/* test PyArg_ParseTupleAndKeywords positional-only arguments */
+static PyObject *
+getargs_positional_only_and_keywords(PyObject *self, PyObject *args,
+ PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "keyword", NULL};
+ int required = -1;
+ int optional = -1;
+ int keyword = -1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
+ &required, &optional, &keyword))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iii", required, optional, keyword);
+}
+
+/* Functions to call PyArg_ParseTuple with integer format codes,
+ and return the result.
+*/
+static PyObject *
+getargs_b(PyObject *self, PyObject *args)
+{
+ unsigned char value;
+ if (!PyArg_ParseTuple(args, "b", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_B(PyObject *self, PyObject *args)
+{
+ unsigned char value;
+ if (!PyArg_ParseTuple(args, "B", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_h(PyObject *self, PyObject *args)
+{
+ short value;
+ if (!PyArg_ParseTuple(args, "h", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong((long)value);
+}
+
+static PyObject *
+getargs_H(PyObject *self, PyObject *args)
+{
+ unsigned short value;
+ if (!PyArg_ParseTuple(args, "H", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_I(PyObject *self, PyObject *args)
+{
+ unsigned int value;
+ if (!PyArg_ParseTuple(args, "I", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_k(PyObject *self, PyObject *args)
+{
+ unsigned long value;
+ if (!PyArg_ParseTuple(args, "k", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong(value);
+}
+
+static PyObject *
+getargs_i(PyObject *self, PyObject *args)
+{
+ int value;
+ if (!PyArg_ParseTuple(args, "i", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong((long)value);
+}
+
+static PyObject *
+getargs_l(PyObject *self, PyObject *args)
+{
+ long value;
+ if (!PyArg_ParseTuple(args, "l", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong(value);
+}
+
+static PyObject *
+getargs_n(PyObject *self, PyObject *args)
+{
+ Py_ssize_t value;
+ if (!PyArg_ParseTuple(args, "n", &value)) {
+ return NULL;
+ }
+ return PyLong_FromSsize_t(value);
+}
+
+static PyObject *
+getargs_p(PyObject *self, PyObject *args)
+{
+ int value;
+ if (!PyArg_ParseTuple(args, "p", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong(value);
+}
+
+static PyObject *
+getargs_L(PyObject *self, PyObject *args)
+{
+ long long value;
+ if (!PyArg_ParseTuple(args, "L", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLongLong(value);
+}
+
+static PyObject *
+getargs_K(PyObject *self, PyObject *args)
+{
+ unsigned long long value;
+ if (!PyArg_ParseTuple(args, "K", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLongLong(value);
+}
+
+/* This function not only tests the 'k' getargs code, but also the
+ PyLong_AsUnsignedLongMask() function. */
+static PyObject *
+test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ PyObject *tuple, *num;
+ unsigned long value;
+
+ tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ /* a number larger than ULONG_MAX even on 64-bit platforms */
+ num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ value = PyLong_AsUnsignedLongMask(num);
+ if (value != ULONG_MAX) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: "
+ "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = 0;
+ if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
+ return NULL;
+ }
+ if (value != ULONG_MAX) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: k code returned wrong value for long 0xFFF...FFF");
+ return NULL;
+ }
+
+ Py_DECREF(num);
+ num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ value = PyLong_AsUnsignedLongMask(num);
+ if (value != (unsigned long)-0x42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: "
+ "PyLong_AsUnsignedLongMask() returned wrong value for long -0xFFF..000042");
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = 0;
+ if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
+ return NULL;
+ }
+ if (value != (unsigned long)-0x42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: k code returned wrong value for long -0xFFF..000042");
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_f(PyObject *self, PyObject *args)
+{
+ float f;
+ if (!PyArg_ParseTuple(args, "f", &f)) {
+ return NULL;
+ }
+ return PyFloat_FromDouble(f);
+}
+
+static PyObject *
+getargs_d(PyObject *self, PyObject *args)
+{
+ double d;
+ if (!PyArg_ParseTuple(args, "d", &d)) {
+ return NULL;
+ }
+ return PyFloat_FromDouble(d);
+}
+
+static PyObject *
+getargs_D(PyObject *self, PyObject *args)
+{
+ Py_complex cval;
+ if (!PyArg_ParseTuple(args, "D", &cval)) {
+ return NULL;
+ }
+ return PyComplex_FromCComplex(cval);
+}
+
+static PyObject *
+getargs_S(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "S", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_Y(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "Y", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_U(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "U", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_c(PyObject *self, PyObject *args)
+{
+ char c;
+ if (!PyArg_ParseTuple(args, "c", &c)) {
+ return NULL;
+ }
+ return PyLong_FromLong((unsigned char)c);
+}
+
+static PyObject *
+getargs_C(PyObject *self, PyObject *args)
+{
+ int c;
+ if (!PyArg_ParseTuple(args, "C", &c)) {
+ return NULL;
+ }
+ return PyLong_FromLong(c);
+}
+
+static PyObject *
+getargs_s(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "s", &str)) {
+ return NULL;
+ }
+ return PyBytes_FromString(str);
+}
+
+static PyObject *
+getargs_s_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *bytes;
+ if (!PyArg_ParseTuple(args, "s*", &buffer)) {
+ return NULL;
+ }
+ bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_s_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "s#", &str, &size)) {
+ return NULL;
+ }
+ return PyBytes_FromStringAndSize(str, size);
+}
+
+static PyObject *
+getargs_z(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "z", &str)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyBytes_FromString(str);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_z_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *bytes;
+ if (!PyArg_ParseTuple(args, "z*", &buffer)) {
+ return NULL;
+ }
+ if (buffer.buf != NULL) {
+ bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ }
+ else {
+ bytes = Py_NewRef(Py_None);
+ }
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_z_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "z#", &str, &size)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyBytes_FromStringAndSize(str, size);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_y(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "y", &str)) {
+ return NULL;
+ }
+ return PyBytes_FromString(str);
+}
+
+static PyObject *
+getargs_y_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ if (!PyArg_ParseTuple(args, "y*", &buffer)) {
+ return NULL;
+ }
+ PyObject *bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_y_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "y#", &str, &size)) {
+ return NULL;
+ }
+ return PyBytes_FromStringAndSize(str, size);
+}
+
+static PyObject *
+getargs_u(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ if (!PyArg_ParseTuple(args, "u", &str)) {
+ return NULL;
+ }
+ return PyUnicode_FromWideChar(str, -1);
+}
+
+static PyObject *
+getargs_u_hash(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "u#", &str, &size)) {
+ return NULL;
+ }
+ return PyUnicode_FromWideChar(str, size);
+}
+
+static PyObject *
+getargs_Z(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ if (!PyArg_ParseTuple(args, "Z", &str)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyUnicode_FromWideChar(str, -1);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_Z_hash(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "Z#", &str, &size)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyUnicode_FromWideChar(str, size);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_es(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ char *str;
+
+ if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding)) {
+ return NULL;
+ }
+ if (!PyArg_Parse(arg, "es", encoding, &str)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromString(str);
+ PyMem_Free(str);
+ return result;
+}
+
+static PyObject *
+getargs_et(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ char *str;
+
+ if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding)) {
+ return NULL;
+ }
+ if (!PyArg_Parse(arg, "et", encoding, &str)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromString(str);
+ PyMem_Free(str);
+ return result;
+}
+
+static PyObject *
+getargs_es_hash(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ PyByteArrayObject *buffer = NULL;
+ char *str = NULL;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer)) {
+ return NULL;
+ }
+ if (buffer != NULL) {
+ str = PyByteArray_AS_STRING(buffer);
+ size = PyByteArray_GET_SIZE(buffer);
+ }
+ if (!PyArg_Parse(arg, "es#", encoding, &str, &size)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromStringAndSize(str, size);
+ if (buffer == NULL) {
+ PyMem_Free(str);
+ }
+ return result;
+}
+
+static PyObject *
+getargs_et_hash(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ PyByteArrayObject *buffer = NULL;
+ char *str = NULL;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer)) {
+ return NULL;
+ }
+ if (buffer != NULL) {
+ str = PyByteArray_AS_STRING(buffer);
+ size = PyByteArray_GET_SIZE(buffer);
+ }
+ if (!PyArg_Parse(arg, "et#", encoding, &str, &size)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromStringAndSize(str, size);
+ if (buffer == NULL) {
+ PyMem_Free(str);
+ }
+ return result;
+}
+
+/* Test the L code for PyArg_ParseTuple. This should deliver a long long
+ for both long and int arguments. The test may leak a little memory if
+ it fails.
+*/
+static PyObject *
+test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ PyObject *tuple, *num;
+ long long value;
+
+ tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ num = PyLong_FromLong(42);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = -1;
+ if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
+ return NULL;
+ }
+ if (value != 42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_L_code: L code returned wrong value for long 42");
+ return NULL;
+ }
+
+ Py_DECREF(num);
+ num = PyLong_FromLong(42);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = -1;
+ if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
+ return NULL;
+ }
+ if (value != 42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_L_code: L code returned wrong value for int 42");
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+/* Test the s and z codes for PyArg_ParseTuple.
+*/
+static PyObject *
+test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ /* Unicode strings should be accepted */
+ PyObject *tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ PyObject *obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
+ "latin-1", NULL);
+ if (obj == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, obj);
+
+ /* These two blocks used to raise a TypeError:
+ * "argument must be string without null bytes, not str"
+ */
+ char *value;
+ if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+#undef PyArg_ParseTupleAndKeywords
+PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
+ const char *, char **, ...);
+
+static PyObject *
+getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "x", NULL};
+ Py_buffer buf = {NULL};
+ const char *s;
+ int len;
+ int i = 0;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords,
+ &buf, &s, &len, &i))
+ {
+ return NULL;
+ }
+ PyBuffer_Release(&buf);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "x", NULL};
+ Py_buffer buf = {NULL};
+ const char *s;
+ int len;
+ int i = 0;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords,
+ &buf, &s, &len, &i))
+ {
+ return NULL;
+ }
+ PyBuffer_Release(&buf);
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef test_methods[] = {
+ {"get_args", get_args, METH_VARARGS},
+ {"get_kwargs", _PyCFunction_CAST(get_kwargs), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_B", getargs_B, METH_VARARGS},
+ {"getargs_C", getargs_C, METH_VARARGS},
+ {"getargs_D", getargs_D, METH_VARARGS},
+ {"getargs_H", getargs_H, METH_VARARGS},
+ {"getargs_I", getargs_I, METH_VARARGS},
+ {"getargs_K", getargs_K, METH_VARARGS},
+ {"getargs_L", getargs_L, METH_VARARGS},
+ {"getargs_S", getargs_S, METH_VARARGS},
+ {"getargs_U", getargs_U, METH_VARARGS},
+ {"getargs_Y", getargs_Y, METH_VARARGS},
+ {"getargs_Z", getargs_Z, METH_VARARGS},
+ {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
+ {"getargs_b", getargs_b, METH_VARARGS},
+ {"getargs_c", getargs_c, METH_VARARGS},
+ {"getargs_d", getargs_d, METH_VARARGS},
+ {"getargs_es", getargs_es, METH_VARARGS},
+ {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
+ {"getargs_et", getargs_et, METH_VARARGS},
+ {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
+ {"getargs_f", getargs_f, METH_VARARGS},
+ {"getargs_h", getargs_h, METH_VARARGS},
+ {"getargs_i", getargs_i, METH_VARARGS},
+ {"getargs_k", getargs_k, METH_VARARGS},
+ {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_keywords", _PyCFunction_CAST(getargs_keywords), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_l", getargs_l, METH_VARARGS},
+ {"getargs_n", getargs_n, METH_VARARGS},
+ {"getargs_p", getargs_p, METH_VARARGS},
+ {"getargs_positional_only_and_keywords", _PyCFunction_CAST(getargs_positional_only_and_keywords), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s", getargs_s, METH_VARARGS},
+ {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
+ {"getargs_s_hash_int", _PyCFunction_CAST(getargs_s_hash_int), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s_hash_int2", _PyCFunction_CAST(getargs_s_hash_int2), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s_star", getargs_s_star, METH_VARARGS},
+ {"getargs_tuple", getargs_tuple, METH_VARARGS},
+ {"getargs_u", getargs_u, METH_VARARGS},
+ {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
+ {"getargs_w_star", getargs_w_star, METH_VARARGS},
+ {"getargs_y", getargs_y, METH_VARARGS},
+ {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
+ {"getargs_y_star", getargs_y_star, METH_VARARGS},
+ {"getargs_z", getargs_z, METH_VARARGS},
+ {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
+ {"getargs_z_star", getargs_z_star, METH_VARARGS},
+ {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
+ {"test_L_code", test_L_code, METH_NOARGS},
+ {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
+ {"test_k_code", test_k_code, METH_NOARGS},
+ {"test_s_code", test_s_code, METH_NOARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_GetArgs(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h
index 304e592..2fa8dac 100644
--- a/Modules/_testcapi/parts.h
+++ b/Modules/_testcapi/parts.h
@@ -27,6 +27,9 @@
int _PyTestCapi_Init_Vectorcall(PyObject *module);
int _PyTestCapi_Init_Heaptype(PyObject *module);
int _PyTestCapi_Init_Unicode(PyObject *module);
+int _PyTestCapi_Init_GetArgs(PyObject *module);
+int _PyTestCapi_Init_PyTime(PyObject *module);
+int _PyTestCapi_Init_DateTime(PyObject *module);
#ifdef LIMITED_API_AVAILABLE
int _PyTestCapi_Init_VectorcallLimited(PyObject *module);
diff --git a/Modules/_testcapi/pytime.c b/Modules/_testcapi/pytime.c
new file mode 100644
index 0000000..7422baf
--- /dev/null
+++ b/Modules/_testcapi/pytime.c
@@ -0,0 +1,274 @@
+#include "parts.h"
+
+#ifdef MS_WINDOWS
+# include <winsock2.h> // struct timeval
+#endif
+
+static PyObject *
+test_pytime_fromseconds(PyObject *self, PyObject *args)
+{
+ int seconds;
+ if (!PyArg_ParseTuple(args, "i", &seconds)) {
+ return NULL;
+ }
+ _PyTime_t ts = _PyTime_FromSeconds(seconds);
+ return _PyTime_AsNanosecondsObject(ts);
+}
+
+static int
+check_time_rounding(int round)
+{
+ if (round != _PyTime_ROUND_FLOOR
+ && round != _PyTime_ROUND_CEILING
+ && round != _PyTime_ROUND_HALF_EVEN
+ && round != _PyTime_ROUND_UP)
+ {
+ PyErr_SetString(PyExc_ValueError, "invalid rounding");
+ return -1;
+ }
+ return 0;
+}
+
+static PyObject *
+test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t ts;
+ if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
+ return NULL;
+ }
+ return _PyTime_AsNanosecondsObject(ts);
+}
+
+static PyObject *
+test_pytime_assecondsdouble(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t ts;
+ if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
+ return NULL;
+ }
+ double d = _PyTime_AsSecondsDouble(ts);
+ return PyFloat_FromDouble(d);
+}
+
+static PyObject *
+test_PyTime_AsTimeval(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timeval tv;
+ if (_PyTime_AsTimeval(t, &tv, round) < 0) {
+ return NULL;
+ }
+
+ PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
+ if (seconds == NULL) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
+}
+
+static PyObject *
+test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timeval tv;
+ _PyTime_AsTimeval_clamp(t, &tv, round);
+
+ PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
+ if (seconds == NULL) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
+}
+
+#ifdef HAVE_CLOCK_GETTIME
+static PyObject *
+test_PyTime_AsTimespec(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timespec ts;
+ if (_PyTime_AsTimespec(t, &ts) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
+}
+
+static PyObject *
+test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timespec ts;
+ _PyTime_AsTimespec_clamp(t, &ts);
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
+}
+#endif
+
+static PyObject *
+test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
+ _PyTime_t ns = _PyTime_FromNanoseconds(ms);
+ return _PyTime_AsNanosecondsObject(ns);
+}
+
+static PyObject *
+test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t us = _PyTime_AsMicroseconds(t, round);
+ _PyTime_t ns = _PyTime_FromNanoseconds(us);
+ return _PyTime_AsNanosecondsObject(ns);
+}
+
+static PyObject *
+test_pytime_object_to_time_t(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1) {
+ return NULL;
+ }
+ return _PyLong_FromTime_t(sec);
+}
+
+static PyObject *
+test_pytime_object_to_timeval(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long usec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
+}
+
+static PyObject *
+test_pytime_object_to_timespec(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long nsec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
+}
+
+static PyMethodDef test_methods[] = {
+ {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
+ {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
+ {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
+#ifdef HAVE_CLOCK_GETTIME
+ {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
+ {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
+#endif
+ {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
+ {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
+ {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
+ {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
+ {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
+ {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
+ {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_PyTime(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 62fd1f6..79beb1c 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -20,16 +20,11 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
-#include "datetime.h" // PyDateTimeAPI
#include "marshal.h" // PyMarshal_WriteLongToFile
#include "structmember.h" // PyMemberDef
#include <float.h> // FLT_MAX
#include <signal.h>
-#ifdef MS_WINDOWS
-# include <winsock2.h> // struct timeval
-#endif
-
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h> // W_STOPCODE
#endif
@@ -949,52 +944,6 @@ test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
return Py_None;
}
-/* Test the L code for PyArg_ParseTuple. This should deliver a long long
- for both long and int arguments. The test may leak a little memory if
- it fails.
-*/
-static PyObject *
-test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- PyObject *tuple, *num;
- long long value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- num = PyLong_FromLong(42);
- if (num == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = -1;
- if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
- return NULL;
- }
- if (value != 42)
- return raiseTestError("test_L_code",
- "L code returned wrong value for long 42");
-
- Py_DECREF(num);
- num = PyLong_FromLong(42);
- if (num == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = -1;
- if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
- return NULL;
- }
- if (value != 42)
- return raiseTestError("test_L_code",
- "L code returned wrong value for int 42");
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
static PyObject *
return_none(void *unused)
@@ -1234,699 +1183,6 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE;
}
-
-static PyObject *
-get_args(PyObject *self, PyObject *args)
-{
- if (args == NULL) {
- args = Py_None;
- }
- return Py_NewRef(args);
-}
-
-static PyObject *
-get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- if (kwargs == NULL) {
- kwargs = Py_None;
- }
- return Py_NewRef(kwargs);
-}
-
-/* Test tuple argument processing */
-static PyObject *
-getargs_tuple(PyObject *self, PyObject *args)
-{
- int a, b, c;
- if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
- return NULL;
- return Py_BuildValue("iii", a, b, c);
-}
-
-/* test PyArg_ParseTupleAndKeywords */
-static PyObject *
-getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
- static const char fmt[] = "(ii)i|(i(ii))(iii)i";
- int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
- &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
- &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
- return NULL;
- return Py_BuildValue("iiiiiiiiii",
- int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
- int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
-}
-
-/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
-static PyObject *
-getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"required", "optional", "keyword_only", NULL};
- int required = -1;
- int optional = -1;
- int keyword_only = -1;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
- &required, &optional, &keyword_only))
- return NULL;
- return Py_BuildValue("iii", required, optional, keyword_only);
-}
-
-/* test PyArg_ParseTupleAndKeywords positional-only arguments */
-static PyObject *
-getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "keyword", NULL};
- int required = -1;
- int optional = -1;
- int keyword = -1;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
- &required, &optional, &keyword))
- return NULL;
- return Py_BuildValue("iii", required, optional, keyword);
-}
-
-/* Functions to call PyArg_ParseTuple with integer format codes,
- and return the result.
-*/
-static PyObject *
-getargs_b(PyObject *self, PyObject *args)
-{
- unsigned char value;
- if (!PyArg_ParseTuple(args, "b", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_B(PyObject *self, PyObject *args)
-{
- unsigned char value;
- if (!PyArg_ParseTuple(args, "B", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_h(PyObject *self, PyObject *args)
-{
- short value;
- if (!PyArg_ParseTuple(args, "h", &value))
- return NULL;
- return PyLong_FromLong((long)value);
-}
-
-static PyObject *
-getargs_H(PyObject *self, PyObject *args)
-{
- unsigned short value;
- if (!PyArg_ParseTuple(args, "H", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_I(PyObject *self, PyObject *args)
-{
- unsigned int value;
- if (!PyArg_ParseTuple(args, "I", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_k(PyObject *self, PyObject *args)
-{
- unsigned long value;
- if (!PyArg_ParseTuple(args, "k", &value))
- return NULL;
- return PyLong_FromUnsignedLong(value);
-}
-
-static PyObject *
-getargs_i(PyObject *self, PyObject *args)
-{
- int value;
- if (!PyArg_ParseTuple(args, "i", &value))
- return NULL;
- return PyLong_FromLong((long)value);
-}
-
-static PyObject *
-getargs_l(PyObject *self, PyObject *args)
-{
- long value;
- if (!PyArg_ParseTuple(args, "l", &value))
- return NULL;
- return PyLong_FromLong(value);
-}
-
-static PyObject *
-getargs_n(PyObject *self, PyObject *args)
-{
- Py_ssize_t value;
- if (!PyArg_ParseTuple(args, "n", &value))
- return NULL;
- return PyLong_FromSsize_t(value);
-}
-
-static PyObject *
-getargs_p(PyObject *self, PyObject *args)
-{
- int value;
- if (!PyArg_ParseTuple(args, "p", &value))
- return NULL;
- return PyLong_FromLong(value);
-}
-
-static PyObject *
-getargs_L(PyObject *self, PyObject *args)
-{
- long long value;
- if (!PyArg_ParseTuple(args, "L", &value))
- return NULL;
- return PyLong_FromLongLong(value);
-}
-
-static PyObject *
-getargs_K(PyObject *self, PyObject *args)
-{
- unsigned long long value;
- if (!PyArg_ParseTuple(args, "K", &value))
- return NULL;
- return PyLong_FromUnsignedLongLong(value);
-}
-
-/* This function not only tests the 'k' getargs code, but also the
- PyLong_AsUnsignedLongMask() function. */
-static PyObject *
-test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- PyObject *tuple, *num;
- unsigned long value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- /* a number larger than ULONG_MAX even on 64-bit platforms */
- num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
- if (num == NULL)
- return NULL;
-
- value = PyLong_AsUnsignedLongMask(num);
- if (value != ULONG_MAX)
- return raiseTestError("test_k_code",
- "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = 0;
- if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
- return NULL;
- }
- if (value != ULONG_MAX)
- return raiseTestError("test_k_code",
- "k code returned wrong value for long 0xFFF...FFF");
-
- Py_DECREF(num);
- num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
- if (num == NULL)
- return NULL;
-
- value = PyLong_AsUnsignedLongMask(num);
- if (value != (unsigned long)-0x42)
- return raiseTestError("test_k_code",
- "PyLong_AsUnsignedLongMask() returned wrong "
- "value for long -0xFFF..000042");
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = 0;
- if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
- return NULL;
- }
- if (value != (unsigned long)-0x42)
- return raiseTestError("test_k_code",
- "k code returned wrong value for long -0xFFF..000042");
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_f(PyObject *self, PyObject *args)
-{
- float f;
- if (!PyArg_ParseTuple(args, "f", &f))
- return NULL;
- return PyFloat_FromDouble(f);
-}
-
-static PyObject *
-getargs_d(PyObject *self, PyObject *args)
-{
- double d;
- if (!PyArg_ParseTuple(args, "d", &d))
- return NULL;
- return PyFloat_FromDouble(d);
-}
-
-static PyObject *
-getargs_D(PyObject *self, PyObject *args)
-{
- Py_complex cval;
- if (!PyArg_ParseTuple(args, "D", &cval))
- return NULL;
- return PyComplex_FromCComplex(cval);
-}
-
-static PyObject *
-getargs_S(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "S", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_Y(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "Y", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_U(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "U", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_c(PyObject *self, PyObject *args)
-{
- char c;
- if (!PyArg_ParseTuple(args, "c", &c))
- return NULL;
- return PyLong_FromLong((unsigned char)c);
-}
-
-static PyObject *
-getargs_C(PyObject *self, PyObject *args)
-{
- int c;
- if (!PyArg_ParseTuple(args, "C", &c))
- return NULL;
- return PyLong_FromLong(c);
-}
-
-static PyObject *
-getargs_s(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "s", &str))
- return NULL;
- return PyBytes_FromString(str);
-}
-
-static PyObject *
-getargs_s_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "s*", &buffer))
- return NULL;
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_s_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "s#", &str, &size))
- return NULL;
- return PyBytes_FromStringAndSize(str, size);
-}
-
-static PyObject *
-getargs_z(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "z", &str))
- return NULL;
- if (str != NULL)
- return PyBytes_FromString(str);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_z_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "z*", &buffer))
- return NULL;
- if (buffer.buf != NULL)
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- else {
- bytes = Py_NewRef(Py_None);
- }
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_z_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "z#", &str, &size))
- return NULL;
- if (str != NULL)
- return PyBytes_FromStringAndSize(str, size);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_y(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "y", &str))
- return NULL;
- return PyBytes_FromString(str);
-}
-
-static PyObject *
-getargs_y_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "y*", &buffer))
- return NULL;
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_y_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "y#", &str, &size))
- return NULL;
- return PyBytes_FromStringAndSize(str, size);
-}
-
-static PyObject *
-getargs_u(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- if (!PyArg_ParseTuple(args, "u", &str))
- return NULL;
- return PyUnicode_FromWideChar(str, -1);
-}
-
-static PyObject *
-getargs_u_hash(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "u#", &str, &size))
- return NULL;
- return PyUnicode_FromWideChar(str, size);
-}
-
-static PyObject *
-getargs_Z(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- if (!PyArg_ParseTuple(args, "Z", &str))
- return NULL;
- if (str != NULL) {
- return PyUnicode_FromWideChar(str, -1);
- } else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_Z_hash(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "Z#", &str, &size))
- return NULL;
- if (str != NULL)
- return PyUnicode_FromWideChar(str, size);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_es(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- char *str;
-
- if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
- return NULL;
- if (!PyArg_Parse(arg, "es", encoding, &str))
- return NULL;
- result = PyBytes_FromString(str);
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_et(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- char *str;
-
- if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
- return NULL;
- if (!PyArg_Parse(arg, "et", encoding, &str))
- return NULL;
- result = PyBytes_FromString(str);
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_es_hash(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- PyByteArrayObject *buffer = NULL;
- char *str = NULL;
- Py_ssize_t size;
-
- if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
- return NULL;
- if (buffer != NULL) {
- str = PyByteArray_AS_STRING(buffer);
- size = PyByteArray_GET_SIZE(buffer);
- }
- if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
- return NULL;
- result = PyBytes_FromStringAndSize(str, size);
- if (buffer == NULL)
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_et_hash(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- PyByteArrayObject *buffer = NULL;
- char *str = NULL;
- Py_ssize_t size;
-
- if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
- return NULL;
- if (buffer != NULL) {
- str = PyByteArray_AS_STRING(buffer);
- size = PyByteArray_GET_SIZE(buffer);
- }
- if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
- return NULL;
- result = PyBytes_FromStringAndSize(str, size);
- if (buffer == NULL)
- PyMem_Free(str);
- return result;
-}
-
-/* Test the s and z codes for PyArg_ParseTuple.
-*/
-static PyObject *
-test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- /* Unicode strings should be accepted */
- PyObject *tuple, *obj;
- char *value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
- "latin-1", NULL);
- if (obj == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, obj);
-
- /* These two blocks used to raise a TypeError:
- * "argument must be string without null bytes, not str"
- */
- if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
- return NULL;
- }
-
- if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
- return NULL;
- }
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-parse_tuple_and_keywords(PyObject *self, PyObject *args)
-{
- PyObject *sub_args;
- PyObject *sub_kwargs;
- const char *sub_format;
- PyObject *sub_keywords;
-
- Py_ssize_t i, size;
- char *keywords[8 + 1]; /* space for NULL at end */
- PyObject *o;
- PyObject *converted[8];
-
- int result;
- PyObject *return_value = NULL;
-
- double buffers[8][4]; /* double ensures alignment where necessary */
-
- if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
- &sub_args, &sub_kwargs,
- &sub_format, &sub_keywords))
- return NULL;
-
- if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
- PyErr_SetString(PyExc_ValueError,
- "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
- return NULL;
- }
-
- memset(buffers, 0, sizeof(buffers));
- memset(converted, 0, sizeof(converted));
- memset(keywords, 0, sizeof(keywords));
-
- size = PySequence_Fast_GET_SIZE(sub_keywords);
- if (size > 8) {
- PyErr_SetString(PyExc_ValueError,
- "parse_tuple_and_keywords: too many keywords in sub_keywords");
- goto exit;
- }
-
- for (i = 0; i < size; i++) {
- o = PySequence_Fast_GET_ITEM(sub_keywords, i);
- if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
- PyErr_Format(PyExc_ValueError,
- "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
- goto exit;
- }
- keywords[i] = PyBytes_AS_STRING(converted[i]);
- }
-
- result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
- sub_format, keywords,
- buffers + 0, buffers + 1, buffers + 2, buffers + 3,
- buffers + 4, buffers + 5, buffers + 6, buffers + 7);
-
- if (result) {
- return_value = Py_NewRef(Py_None);
- }
-
-exit:
- size = sizeof(converted) / sizeof(converted[0]);
- for (i = 0; i < size; i++) {
- Py_XDECREF(converted[i]);
- }
- return return_value;
-}
-
-static PyObject *
-getargs_w_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *result;
- char *str;
-
- if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
- return NULL;
-
- if (2 <= buffer.len) {
- str = buffer.buf;
- str[0] = '[';
- str[buffer.len-1] = ']';
- }
-
- result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return result;
-}
-
-
-static PyObject *
-test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- /* Test that formats can begin with '|'. See issue #4720. */
- PyObject *tuple, *dict = NULL;
- static char *kwlist[] = {NULL};
- int result;
- tuple = PyTuple_New(0);
- if (!tuple)
- return NULL;
- if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
- goto done;
- }
- dict = PyDict_New();
- if (!dict)
- goto done;
- result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
- done:
- Py_DECREF(tuple);
- Py_XDECREF(dict);
- if (!result) {
- return NULL;
- }
- else {
- Py_RETURN_NONE;
- }
-}
-
/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
static PyObject *
test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
@@ -2065,411 +1321,6 @@ test_set_exc_info(PyObject *self, PyObject *args)
return orig_exc;
}
-static int test_run_counter = 0;
-
-static PyObject *
-test_datetime_capi(PyObject *self, PyObject *args) {
- if (PyDateTimeAPI) {
- if (test_run_counter) {
- /* Probably regrtest.py -R */
- Py_RETURN_NONE;
- }
- else {
- PyErr_SetString(PyExc_AssertionError,
- "PyDateTime_CAPI somehow initialized");
- return NULL;
- }
- }
- test_run_counter++;
- PyDateTime_IMPORT;
-
- if (PyDateTimeAPI)
- Py_RETURN_NONE;
- else
- return NULL;
-}
-
-/* Functions exposing the C API type checking for testing */
-#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
- PyObject *obj; \
- int exact = 0; \
- if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
- return NULL; \
- } \
- int rv = exact?exact_method(obj):check_method(obj); \
- if (rv) { \
- Py_RETURN_TRUE; \
- } else { \
- Py_RETURN_FALSE; \
- }
-
-static PyObject *
-datetime_check_date(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
-}
-
-static PyObject *
-datetime_check_time(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
-}
-
-static PyObject *
-datetime_check_datetime(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
-}
-
-static PyObject *
-datetime_check_delta(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
-}
-
-static PyObject *
-datetime_check_tzinfo(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
-}
-
-
-/* Makes three variations on timezone representing UTC-5:
- 1. timezone with offset and name from PyDateTimeAPI
- 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
- 3. timezone with offset (no name) from PyTimeZone_FromOffset
-*/
-static PyObject *
-make_timezones_capi(PyObject *self, PyObject *args) {
- PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
- PyObject *name = PyUnicode_FromString("EST");
-
- PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
- PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
- PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
-
- Py_DecRef(offset);
- Py_DecRef(name);
-
- PyObject *rv = PyTuple_New(3);
-
- PyTuple_SET_ITEM(rv, 0, est_zone_capi);
- PyTuple_SET_ITEM(rv, 1, est_zone_macro);
- PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
-
- return rv;
-}
-
-static PyObject *
-get_timezones_offset_zero(PyObject *self, PyObject *args) {
- PyObject *offset = PyDelta_FromDSU(0, 0, 0);
- PyObject *name = PyUnicode_FromString("");
-
- // These two should return the UTC singleton
- PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
- PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
-
- // This one will return +00:00 zone, but not the UTC singleton
- PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
-
- Py_DecRef(offset);
- Py_DecRef(name);
-
- PyObject *rv = PyTuple_New(3);
- PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
- PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
- PyTuple_SET_ITEM(rv, 2, non_utc_zone);
-
- return rv;
-}
-
-static PyObject *
-get_timezone_utc_capi(PyObject* self, PyObject *args) {
- int macro = 0;
- if (!PyArg_ParseTuple(args, "|p", &macro)) {
- return NULL;
- }
- if (macro) {
- return Py_NewRef(PyDateTime_TimeZone_UTC);
- } else {
- return Py_NewRef(PyDateTimeAPI->TimeZone_UTC);
- }
-}
-
-static PyObject *
-get_date_fromdate(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
-
- if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDate_FromDate(year, month, day);
- }
- else {
- rv = PyDateTimeAPI->Date_FromDate(
- year, month, day,
- PyDateTimeAPI->DateType);
- }
- return rv;
-}
-
-static PyObject *
-get_datetime_fromdateandtime(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
- int hour, minute, second, microsecond;
-
- if (!PyArg_ParseTuple(args, "piiiiiii",
- &macro,
- &year, &month, &day,
- &hour, &minute, &second, &microsecond)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDateTime_FromDateAndTime(
- year, month, day,
- hour, minute, second, microsecond);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromDateAndTime(
- year, month, day,
- hour, minute, second, microsecond,
- Py_None,
- PyDateTimeAPI->DateTimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
- int hour, minute, second, microsecond, fold;
-
- if (!PyArg_ParseTuple(args, "piiiiiiii",
- &macro,
- &year, &month, &day,
- &hour, &minute, &second, &microsecond,
- &fold)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDateTime_FromDateAndTimeAndFold(
- year, month, day,
- hour, minute, second, microsecond,
- fold);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
- year, month, day,
- hour, minute, second, microsecond,
- Py_None,
- fold,
- PyDateTimeAPI->DateTimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_time_fromtime(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int hour, minute, second, microsecond;
-
- if (!PyArg_ParseTuple(args, "piiii",
- &macro,
- &hour, &minute, &second, &microsecond)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyTime_FromTime(hour, minute, second, microsecond);
- }
- else {
- rv = PyDateTimeAPI->Time_FromTime(
- hour, minute, second, microsecond,
- Py_None,
- PyDateTimeAPI->TimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_time_fromtimeandfold(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int hour, minute, second, microsecond, fold;
-
- if (!PyArg_ParseTuple(args, "piiiii",
- &macro,
- &hour, &minute, &second, &microsecond,
- &fold)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
- }
- else {
- rv = PyDateTimeAPI->Time_FromTimeAndFold(
- hour, minute, second, microsecond,
- Py_None,
- fold,
- PyDateTimeAPI->TimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_delta_fromdsu(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int days, seconds, microseconds;
-
- if (!PyArg_ParseTuple(args, "piii",
- &macro,
- &days, &seconds, &microseconds)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDelta_FromDSU(days, seconds, microseconds);
- }
- else {
- rv = PyDateTimeAPI->Delta_FromDelta(
- days, seconds, microseconds, 1,
- PyDateTimeAPI->DeltaType);
- }
-
- return rv;
-}
-
-static PyObject *
-get_date_fromtimestamp(PyObject* self, PyObject *args)
-{
- PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
- int macro = 0;
-
- if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
- return NULL;
- }
-
- // Construct the argument tuple
- if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
- return NULL;
- }
-
- // Pass along to the API function
- if (macro) {
- rv = PyDate_FromTimestamp(tsargs);
- }
- else {
- rv = PyDateTimeAPI->Date_FromTimestamp(
- (PyObject *)PyDateTimeAPI->DateType, tsargs
- );
- }
-
- Py_DECREF(tsargs);
- return rv;
-}
-
-static PyObject *
-get_datetime_fromtimestamp(PyObject* self, PyObject *args)
-{
- int macro = 0;
- int usetz = 0;
- PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
- if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
- return NULL;
- }
-
- // Construct the argument tuple
- if (usetz) {
- tsargs = PyTuple_Pack(2, ts, tzinfo);
- }
- else {
- tsargs = PyTuple_Pack(1, ts);
- }
-
- if (tsargs == NULL) {
- return NULL;
- }
-
- // Pass along to the API function
- if (macro) {
- rv = PyDateTime_FromTimestamp(tsargs);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromTimestamp(
- (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
- );
- }
-
- Py_DECREF(tsargs);
- return rv;
-}
-
-static PyObject *
-test_PyDateTime_GET(PyObject *self, PyObject *obj)
-{
- int year, month, day;
-
- year = PyDateTime_GET_YEAR(obj);
- month = PyDateTime_GET_MONTH(obj);
- day = PyDateTime_GET_DAY(obj);
-
- return Py_BuildValue("(iii)", year, month, day);
-}
-
-static PyObject *
-test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
-{
- int hour, minute, second, microsecond;
-
- hour = PyDateTime_DATE_GET_HOUR(obj);
- minute = PyDateTime_DATE_GET_MINUTE(obj);
- second = PyDateTime_DATE_GET_SECOND(obj);
- microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
- PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
-
- return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
-}
-
-static PyObject *
-test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
-{
- int hour, minute, second, microsecond;
-
- hour = PyDateTime_TIME_GET_HOUR(obj);
- minute = PyDateTime_TIME_GET_MINUTE(obj);
- second = PyDateTime_TIME_GET_SECOND(obj);
- microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
- PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
-
- return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
-}
-
-static PyObject *
-test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
-{
- int days, seconds, microseconds;
-
- days = PyDateTime_DELTA_GET_DAYS(obj);
- seconds = PyDateTime_DELTA_GET_SECONDS(obj);
- microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
-
- return Py_BuildValue("(iii)", days, seconds, microseconds);
-}
-
/* test_thread_state spawns a thread of its own, and that thread releases
* `thread_done` when it's finished. The driver code has to know when the
* thread finishes, because the thread uses a PyObject (the callable) that
@@ -3283,66 +2134,6 @@ run_in_subinterp_with_config(PyObject *self, PyObject *args, PyObject *kwargs)
return PyLong_FromLong(r);
}
-static int
-check_time_rounding(int round)
-{
- if (round != _PyTime_ROUND_FLOOR
- && round != _PyTime_ROUND_CEILING
- && round != _PyTime_ROUND_HALF_EVEN
- && round != _PyTime_ROUND_UP) {
- PyErr_SetString(PyExc_ValueError, "invalid rounding");
- return -1;
- }
- return 0;
-}
-
-static PyObject *
-test_pytime_object_to_time_t(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
- return NULL;
- return _PyLong_FromTime_t(sec);
-}
-
-static PyObject *
-test_pytime_object_to_timeval(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- long usec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
- return NULL;
- return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
-}
-
-static PyObject *
-test_pytime_object_to_timespec(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- long nsec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
- return NULL;
- return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
-}
-
static void
slot_tp_del(PyObject *self)
{
@@ -4278,178 +3069,6 @@ getitem_with_error(PyObject *self, PyObject *args)
return PyObject_GetItem(map, key);
}
-static PyObject *
-test_pytime_fromseconds(PyObject *self, PyObject *args)
-{
- int seconds;
- if (!PyArg_ParseTuple(args, "i", &seconds)) {
- return NULL;
- }
- _PyTime_t ts = _PyTime_FromSeconds(seconds);
- return _PyTime_AsNanosecondsObject(ts);
-}
-
-static PyObject *
-test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t ts;
- if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
- return NULL;
- }
- return _PyTime_AsNanosecondsObject(ts);
-}
-
-static PyObject *
-test_pytime_assecondsdouble(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t ts;
- if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
- return NULL;
- }
- double d = _PyTime_AsSecondsDouble(ts);
- return PyFloat_FromDouble(d);
-}
-
-static PyObject *
-test_PyTime_AsTimeval(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timeval tv;
- if (_PyTime_AsTimeval(t, &tv, round) < 0) {
- return NULL;
- }
-
- PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
- if (seconds == NULL) {
- return NULL;
- }
- return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
-}
-
-static PyObject *
-test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timeval tv;
- _PyTime_AsTimeval_clamp(t, &tv, round);
-
- PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
- if (seconds == NULL) {
- return NULL;
- }
- return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
-}
-
-#ifdef HAVE_CLOCK_GETTIME
-static PyObject *
-test_PyTime_AsTimespec(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timespec ts;
- if (_PyTime_AsTimespec(t, &ts) == -1) {
- return NULL;
- }
- return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
-}
-
-static PyObject *
-test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timespec ts;
- _PyTime_AsTimespec_clamp(t, &ts);
- return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
-}
-#endif
-
-static PyObject *
-test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
- _PyTime_t ns = _PyTime_FromNanoseconds(ms);
- return _PyTime_AsNanosecondsObject(ns);
-}
-
-static PyObject *
-test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t us = _PyTime_AsMicroseconds(t, round);
- _PyTime_t ns = _PyTime_FromNanoseconds(us);
- return _PyTime_AsNanosecondsObject(ns);
-}
-
static PyObject*
pymem_buffer_overflow(PyObject *self, PyObject *args)
{
@@ -6108,8 +4727,6 @@ unwatch_type(PyObject *self, PyObject *args)
static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
-static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
-static PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
@@ -6117,27 +4734,6 @@ static PyMethodDef TestMethods[] = {
{"set_errno", set_errno, METH_VARARGS},
{"test_config", test_config, METH_NOARGS},
{"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
- {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
- {"datetime_check_date", datetime_check_date, METH_VARARGS},
- {"datetime_check_time", datetime_check_time, METH_VARARGS},
- {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
- {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
- {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
- {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
- {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
- {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
- {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
- {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
- {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
- {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
- {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
- {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
- {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
- {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
- {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
- {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
- {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
- {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
{"test_gc_control", test_gc_control, METH_NOARGS},
{"test_list_api", test_list_api, METH_NOARGS},
{"test_dict_iteration", test_dict_iteration, METH_NOARGS},
@@ -6159,9 +4755,6 @@ static PyMethodDef TestMethods[] = {
{"test_long_as_unsigned_long_long_mask",
test_long_as_unsigned_long_long_mask, METH_NOARGS},
{"test_long_numbits", test_long_numbits, METH_NOARGS},
- {"test_k_code", test_k_code, METH_NOARGS},
- {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
- {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
{"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
{"pyobject_str_from_null", pyobject_str_from_null, METH_NOARGS},
{"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
@@ -6177,66 +4770,11 @@ static PyMethodDef TestMethods[] = {
{"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
{"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
{"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
- {"get_args", get_args, METH_VARARGS},
{"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
{"test_get_type_name", test_get_type_name, METH_NOARGS},
{"test_get_type_qualname", test_get_type_qualname, METH_NOARGS},
- {"get_kwargs", _PyCFunction_CAST(get_kwargs),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_tuple", getargs_tuple, METH_VARARGS},
- {"getargs_keywords", _PyCFunction_CAST(getargs_keywords),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_positional_only_and_keywords",
- _PyCFunction_CAST(getargs_positional_only_and_keywords),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_b", getargs_b, METH_VARARGS},
- {"getargs_B", getargs_B, METH_VARARGS},
- {"getargs_h", getargs_h, METH_VARARGS},
- {"getargs_H", getargs_H, METH_VARARGS},
- {"getargs_I", getargs_I, METH_VARARGS},
- {"getargs_k", getargs_k, METH_VARARGS},
- {"getargs_i", getargs_i, METH_VARARGS},
- {"getargs_l", getargs_l, METH_VARARGS},
- {"getargs_n", getargs_n, METH_VARARGS},
- {"getargs_p", getargs_p, METH_VARARGS},
- {"getargs_L", getargs_L, METH_VARARGS},
- {"getargs_K", getargs_K, METH_VARARGS},
{"test_longlong_api", test_longlong_api, METH_NOARGS},
{"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
- {"test_L_code", test_L_code, METH_NOARGS},
- {"getargs_f", getargs_f, METH_VARARGS},
- {"getargs_d", getargs_d, METH_VARARGS},
- {"getargs_D", getargs_D, METH_VARARGS},
- {"getargs_S", getargs_S, METH_VARARGS},
- {"getargs_Y", getargs_Y, METH_VARARGS},
- {"getargs_U", getargs_U, METH_VARARGS},
- {"getargs_c", getargs_c, METH_VARARGS},
- {"getargs_C", getargs_C, METH_VARARGS},
- {"getargs_s", getargs_s, METH_VARARGS},
- {"getargs_s_star", getargs_s_star, METH_VARARGS},
- {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
- {"getargs_s_hash_int", _PyCFunction_CAST(getargs_s_hash_int),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_s_hash_int2", _PyCFunction_CAST(getargs_s_hash_int2),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_z", getargs_z, METH_VARARGS},
- {"getargs_z_star", getargs_z_star, METH_VARARGS},
- {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
- {"getargs_y", getargs_y, METH_VARARGS},
- {"getargs_y_star", getargs_y_star, METH_VARARGS},
- {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
- {"getargs_u", getargs_u, METH_VARARGS},
- {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
- {"getargs_Z", getargs_Z, METH_VARARGS},
- {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
- {"getargs_w_star", getargs_w_star, METH_VARARGS},
- {"getargs_es", getargs_es, METH_VARARGS},
- {"getargs_et", getargs_et, METH_VARARGS},
- {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
- {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
- {"test_s_code", test_s_code, METH_NOARGS},
{"_test_thread_state", test_thread_state, METH_VARARGS},
{"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
#ifdef HAVE_GETTIMEOFDAY
@@ -6257,9 +4795,6 @@ static PyMethodDef TestMethods[] = {
{"run_in_subinterp_with_config",
_PyCFunction_CAST(run_in_subinterp_with_config),
METH_VARARGS | METH_KEYWORDS},
- {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
- {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
- {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
{"with_tp_del", with_tp_del, METH_VARARGS},
{"create_cfunction", create_cfunction, METH_NOARGS},
{"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
@@ -6315,17 +4850,6 @@ static PyMethodDef TestMethods[] = {
{"return_result_with_error", return_result_with_error, METH_NOARGS},
{"getitem_with_error", getitem_with_error, METH_VARARGS},
{"Py_CompileString", pycompilestring, METH_O},
- {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
- {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
- {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
- {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
- {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
-#ifdef HAVE_CLOCK_GETTIME
- {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
- {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
-#endif
- {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
- {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
{"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
{"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
{"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
@@ -7227,6 +5751,15 @@ PyInit__testcapi(void)
if (_PyTestCapi_Init_Unicode(m) < 0) {
return NULL;
}
+ if (_PyTestCapi_Init_GetArgs(m) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_PyTime(m) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_DateTime(m) < 0) {
+ return NULL;
+ }
#ifndef LIMITED_API_AVAILABLE
PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False);
@@ -7284,35 +5817,3 @@ test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE;
}
-
-#undef PyArg_ParseTupleAndKeywords
-PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
- const char *, char **, ...);
-
-static PyObject *
-getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "x", NULL};
- Py_buffer buf = {NULL};
- const char *s;
- int len;
- int i = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords, &buf, &s, &len, &i))
- return NULL;
- PyBuffer_Release(&buf);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "x", NULL};
- Py_buffer buf = {NULL};
- const char *s;
- int len;
- int i = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords, &buf, &s, &len, &i))
- return NULL;
- PyBuffer_Release(&buf);
- Py_RETURN_NONE;
-}
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c
index 83ce756..cec114c 100644
--- a/Modules/_testinternalcapi.c
+++ b/Modules/_testinternalcapi.c
@@ -14,7 +14,7 @@
#include "Python.h"
#include "pycore_atomic_funcs.h" // _Py_atomic_int_get()
#include "pycore_bitutils.h" // _Py_bswap32()
-#include "pycore_compile.h" // _PyCompile_OptimizeCfg()
+#include "pycore_compile.h" // _PyCompile_CodeGen, _PyCompile_OptimizeCfg
#include "pycore_fileutils.h" // _Py_normpath
#include "pycore_frame.h" // _PyInterpreterFrame
#include "pycore_gc.h" // PyGC_Head
@@ -529,6 +529,26 @@ set_eval_frame_record(PyObject *self, PyObject *list)
Py_RETURN_NONE;
}
+/*[clinic input]
+
+_testinternalcapi.compiler_codegen -> object
+
+ ast: object
+ filename: object
+ optimize: int
+
+Apply compiler code generation to an AST.
+[clinic start generated code]*/
+
+static PyObject *
+_testinternalcapi_compiler_codegen_impl(PyObject *module, PyObject *ast,
+ PyObject *filename, int optimize)
+/*[clinic end generated code: output=fbbbbfb34700c804 input=e9fbe6562f7f75e4]*/
+{
+ PyCompilerFlags *flags = NULL;
+ return _PyCompile_CodeGen(ast, filename, flags, optimize);
+}
+
/*[clinic input]
@@ -612,6 +632,7 @@ static PyMethodDef TestMethods[] = {
{"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
{"set_eval_frame_default", set_eval_frame_default, METH_NOARGS, NULL},
{"set_eval_frame_record", set_eval_frame_record, METH_O, NULL},
+ _TESTINTERNALCAPI_COMPILER_CODEGEN_METHODDEF
_TESTINTERNALCAPI_OPTIMIZE_CFG_METHODDEF
{"get_interp_settings", get_interp_settings, METH_VARARGS, NULL},
{NULL, NULL} /* sentinel */
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 4807ad5..a5d5428 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -784,16 +784,14 @@ PyTclObject_string(PyTclObject *self, void *ignored)
if (!self->string)
return NULL;
}
- Py_INCREF(self->string);
- return self->string;
+ return Py_NewRef(self->string);
}
static PyObject *
PyTclObject_str(PyTclObject *self)
{
if (self->string) {
- Py_INCREF(self->string);
- return self->string;
+ return Py_NewRef(self->string);
}
/* XXX Could cache result if it is non-ASCII. */
return unicodeFromTclObj(self->value);
@@ -1736,8 +1734,7 @@ SetVar(TkappObject *self, PyObject *args, int flags)
if (!ok)
Tkinter_Error(self);
else {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
break;
@@ -1755,8 +1752,7 @@ SetVar(TkappObject *self, PyObject *args, int flags)
if (!ok)
Tkinter_Error(self);
else {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
break;
@@ -1842,8 +1838,7 @@ UnsetVar(TkappObject *self, PyObject *args, int flags)
if (code == TCL_ERROR)
res = Tkinter_Error(self);
else {
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
return res;
@@ -1883,8 +1878,7 @@ _tkinter_tkapp_getint(TkappObject *self, PyObject *arg)
PyObject *result;
if (PyLong_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyTclObject_Check(arg)) {
@@ -1928,8 +1922,7 @@ _tkinter_tkapp_getdouble(TkappObject *self, PyObject *arg)
double v;
if (PyFloat_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyNumber_Check(arg)) {
@@ -2145,8 +2138,7 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg)
return v;
}
if (PyTuple_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyList_Check(arg)) {
return PySequence_Tuple(arg);
@@ -2322,10 +2314,8 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name,
data = PyMem_NEW(PythonCmd_ClientData, 1);
if (!data)
return PyErr_NoMemory();
- Py_INCREF(self);
- Py_INCREF(func);
- data->self = (PyObject *) self;
- data->func = func;
+ data->self = Py_NewRef(self);
+ data->func = Py_NewRef(func);
if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
Tcl_Condition cond = NULL;
CommandEvent *ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent));
@@ -2430,10 +2420,8 @@ NewFHCD(PyObject *func, PyObject *file, int id)
FileHandler_ClientData *p;
p = PyMem_NEW(FileHandler_ClientData, 1);
if (p != NULL) {
- Py_XINCREF(func);
- Py_XINCREF(file);
- p->func = func;
- p->file = file;
+ p->func = Py_XNewRef(func);
+ p->file = Py_XNewRef(file);
p->id = id;
p->next = HeadFHCD;
HeadFHCD = p;
@@ -2591,13 +2579,11 @@ Tktt_New(PyObject *func)
if (v == NULL)
return NULL;
- Py_INCREF(func);
v->token = NULL;
- v->func = func;
+ v->func = Py_NewRef(func);
/* Extra reference, deleted when called or when handler is deleted */
- Py_INCREF(v);
- return v;
+ return (TkttObject*)Py_NewRef(v);
}
static void
@@ -2940,9 +2926,8 @@ _flatten1(FlattenContext* context, PyObject* item, int depth)
if (context->size + 1 > context->maxsize &&
!_bump(context, 1))
return 0;
- Py_INCREF(o);
PyTuple_SET_ITEM(context->tuple,
- context->size++, o);
+ context->size++, Py_NewRef(o));
}
}
} else {
@@ -3266,8 +3251,7 @@ PyInit__tkinter(void)
Py_DECREF(m);
return NULL;
}
- Py_INCREF(o);
- if (PyModule_AddObject(m, "TclError", o)) {
+ if (PyModule_AddObject(m, "TclError", Py_NewRef(o))) {
Py_DECREF(o);
Py_DECREF(m);
return NULL;
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index 44a1f7b..fe73d63 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -347,8 +347,8 @@ tracemalloc_get_frame(_PyInterpreterFrame *pyframe, frame_t *frame)
else {
/* tracemalloc_filenames is responsible to keep a reference
to the filename */
- Py_INCREF(filename);
- if (_Py_hashtable_set(tracemalloc_filenames, filename, NULL) < 0) {
+ if (_Py_hashtable_set(tracemalloc_filenames, Py_NewRef(filename),
+ NULL) < 0) {
Py_DECREF(filename);
#ifdef TRACE_DEBUG
tracemalloc_error("failed to intern the filename");
@@ -1085,8 +1085,7 @@ frame_to_pyobject(frame_t *frame)
if (frame_obj == NULL)
return NULL;
- Py_INCREF(frame->filename);
- PyTuple_SET_ITEM(frame_obj, 0, frame->filename);
+ PyTuple_SET_ITEM(frame_obj, 0, Py_NewRef(frame->filename));
lineno_obj = PyLong_FromUnsignedLong(frame->lineno);
if (lineno_obj == NULL) {
@@ -1107,8 +1106,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table)
if (intern_table != NULL) {
frames = _Py_hashtable_get(intern_table, (const void *)traceback);
if (frames) {
- Py_INCREF(frames);
- return frames;
+ return Py_NewRef(frames);
}
}
diff --git a/Modules/_typingmodule.c b/Modules/_typingmodule.c
index 8b6faa6..262dddb 100644
--- a/Modules/_typingmodule.c
+++ b/Modules/_typingmodule.c
@@ -23,8 +23,7 @@ static PyObject *
_typing__idfunc(PyObject *module, PyObject *x)
/*[clinic end generated code: output=63c38be4a6ec5f2c input=49f17284b43de451]*/
{
- Py_INCREF(x);
- return x;
+ return Py_NewRef(x);
}
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 71e74d1..7a9bedb 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -291,8 +291,7 @@ _winapi_Overlapped_getbuffer_impl(OverlappedObject *self)
return NULL;
}
res = self->read_buffer ? self->read_buffer : Py_None;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
/*[clinic input]
diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c
index 9d979ef..e65137e 100644
--- a/Modules/_xxsubinterpretersmodule.c
+++ b/Modules/_xxsubinterpretersmodule.c
@@ -1722,8 +1722,7 @@ _channelid_shared(PyObject *obj, _PyCrossInterpreterData *data)
xid->resolve = ((channelid *)obj)->resolve;
data->data = xid;
- Py_INCREF(obj);
- data->obj = obj;
+ data->obj = Py_NewRef(obj);
data->new_object = _channelid_from_xid;
data->free = PyMem_Free;
return 0;
@@ -2634,12 +2633,12 @@ PyInit__xxsubinterpreters(void)
}
/* Add other types */
- Py_INCREF(&ChannelIDtype);
- if (PyDict_SetItemString(ns, "ChannelID", (PyObject *)&ChannelIDtype) != 0) {
+ if (PyDict_SetItemString(ns, "ChannelID",
+ Py_NewRef(&ChannelIDtype)) != 0) {
return NULL;
}
- Py_INCREF(&_PyInterpreterID_Type);
- if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&_PyInterpreterID_Type) != 0) {
+ if (PyDict_SetItemString(ns, "InterpreterID",
+ Py_NewRef(&_PyInterpreterID_Type)) != 0) {
return NULL;
}
diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c
index 9986b91..34f5abd 100644
--- a/Modules/_zoneinfo.c
+++ b/Modules/_zoneinfo.c
@@ -227,8 +227,7 @@ zoneinfo_new_instance(PyTypeObject *type, PyObject *key)
}
Py_DECREF(rv);
- ((PyZoneInfo_ZoneInfo *)self)->key = key;
- Py_INCREF(key);
+ ((PyZoneInfo_ZoneInfo *)self)->key = Py_NewRef(key);
goto cleanup;
error:
@@ -381,10 +380,9 @@ zoneinfo_ZoneInfo_from_file_impl(PyTypeObject *type, PyObject *file_obj,
self->source = SOURCE_FILE;
self->file_repr = file_repr;
- self->key = key;
- Py_INCREF(key);
-
+ self->key = Py_NewRef(key);
return obj_self;
+
error:
Py_XDECREF(file_repr);
Py_XDECREF(self);
@@ -484,8 +482,7 @@ zoneinfo_utcoffset(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->utcoff);
- return tti->utcoff;
+ return Py_NewRef(tti->utcoff);
}
static PyObject *
@@ -495,8 +492,7 @@ zoneinfo_dst(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->dstoff);
- return tti->dstoff;
+ return Py_NewRef(tti->dstoff);
}
static PyObject *
@@ -506,8 +502,7 @@ zoneinfo_tzname(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->tzname);
- return tti->tzname;
+ return Py_NewRef(tti->tzname);
}
#define GET_DT_TZINFO PyDateTime_DATE_GET_TZINFO
@@ -651,8 +646,7 @@ static PyObject *
zoneinfo_str(PyZoneInfo_ZoneInfo *self)
{
if (!(self->key == Py_None)) {
- Py_INCREF(self->key);
- return self->key;
+ return Py_NewRef(self->key);
}
else {
return zoneinfo_repr(self);
@@ -793,8 +787,7 @@ build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out)
return -1;
}
- out->tzname = tzname;
- Py_INCREF(tzname);
+ out->tzname = Py_NewRef(tzname);
return 0;
}
@@ -1082,8 +1075,7 @@ load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj)
if (PyObject_IsTrue(tti->dstoff)) {
_ttinfo *tti_after = &(self->tzrule_after.std);
Py_DECREF(tti_after->dstoff);
- tti_after->dstoff = tti->dstoff;
- Py_INCREF(tti_after->dstoff);
+ tti_after->dstoff = Py_NewRef(tti->dstoff);
}
}
@@ -2285,13 +2277,10 @@ strong_cache_node_new(PyObject *key, PyObject *zone)
return NULL;
}
- Py_INCREF(key);
- Py_INCREF(zone);
-
node->next = NULL;
node->prev = NULL;
- node->key = key;
- node->zone = zone;
+ node->key = Py_NewRef(key);
+ node->zone = Py_NewRef(zone);
return node;
}
@@ -2443,8 +2432,7 @@ zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key)
if (node != NULL) {
move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, node);
- Py_INCREF(node->zone);
- return node->zone;
+ return Py_NewRef(node->zone);
}
return NULL; // Cache miss
@@ -2679,13 +2667,9 @@ zoneinfomodule_exec(PyObject *m)
}
if (NO_TTINFO.utcoff == NULL) {
- NO_TTINFO.utcoff = Py_None;
- NO_TTINFO.dstoff = Py_None;
- NO_TTINFO.tzname = Py_None;
-
- for (size_t i = 0; i < 3; ++i) {
- Py_INCREF(Py_None);
- }
+ NO_TTINFO.utcoff = Py_NewRef(Py_None);
+ NO_TTINFO.dstoff = Py_NewRef(Py_None);
+ NO_TTINFO.tzname = Py_NewRef(Py_None);
}
if (initialize_caches()) {
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 8013c5c..dcf510e 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -709,8 +709,7 @@ array_richcompare(PyObject *v, PyObject *w, int op)
res = Py_False;
else
res = Py_True;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
if (va->ob_descr == wa->ob_descr && va->ob_descr->compareitems != NULL) {
@@ -733,8 +732,7 @@ array_richcompare(PyObject *v, PyObject *w, int op)
default: return NULL; /* cannot happen */
}
PyObject *res = cmp ? Py_True : Py_False;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
@@ -778,18 +776,15 @@ array_richcompare(PyObject *v, PyObject *w, int op)
res = Py_True;
else
res = Py_False;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
/* We have an item that differs. First, shortcuts for EQ/NE */
if (op == Py_EQ) {
- Py_INCREF(Py_False);
- res = Py_False;
+ res = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- Py_INCREF(Py_True);
- res = Py_True;
+ res = Py_NewRef(Py_True);
}
else {
/* Compare the final item again using the proper operator */
@@ -1060,8 +1055,7 @@ array_inplace_concat(arrayobject *self, PyObject *bb)
}
if (array_do_extend(state, self, bb) == -1)
return NULL;
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1085,8 +1079,7 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n)
_PyBytes_Repeat(self->ob_item, n*size, self->ob_item, size);
}
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
@@ -1947,9 +1940,8 @@ make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Py_DECREF(typecode_obj);
return NULL;
}
- Py_INCREF(items);
PyTuple_SET_ITEM(new_args, 0, typecode_obj);
- PyTuple_SET_ITEM(new_args, 1, items);
+ PyTuple_SET_ITEM(new_args, 1, Py_NewRef(items));
array_obj = array_new(arraytype, new_args, NULL);
Py_DECREF(new_args);
@@ -2219,8 +2211,7 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
return NULL;
}
if (dict == NULL) {
- dict = Py_None;
- Py_INCREF(dict);
+ dict = Py_NewRef(Py_None);
}
mformat_code = typecode_to_mformat_code(typecode);
@@ -2572,8 +2563,7 @@ array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
}
view->buf = (void *)self->ob_item;
- view->obj = (PyObject*)self;
- Py_INCREF(self);
+ view->obj = Py_NewRef(self);
if (view->buf == NULL)
view->buf = (void *)emptybuf;
view->len = Py_SIZE(self) * self->ob_descr->itemsize;
@@ -2885,8 +2875,7 @@ array_iter(arrayobject *ao)
if (it == NULL)
return NULL;
- Py_INCREF(ao);
- it->ao = ao;
+ it->ao = (arrayobject*)Py_NewRef(ao);
it->index = 0;
it->getitem = ao->ob_descr->getitem;
PyObject_GC_Track(it);
@@ -3083,8 +3072,8 @@ array_modexec(PyObject *m)
CREATE_TYPE(m, state->ArrayIterType, &arrayiter_spec);
Py_SET_TYPE(state->ArrayIterType, &PyType_Type);
- Py_INCREF((PyObject *)state->ArrayType);
- if (PyModule_AddObject(m, "ArrayType", (PyObject *)state->ArrayType) < 0) {
+ if (PyModule_AddObject(m, "ArrayType",
+ Py_NewRef((PyObject *)state->ArrayType)) < 0) {
Py_DECREF((PyObject *)state->ArrayType);
return -1;
}
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 4769ab2..6d67fce 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -141,8 +141,7 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored
else if (self->errors == ERROR_REPLACE)
errors = "replace";
else {
- Py_INCREF(self->errors);
- return self->errors;
+ return Py_NewRef(self->errors);
}
return PyUnicode_FromString(errors);
@@ -341,8 +340,7 @@ multibytecodec_encerror(MultibyteCodec *codec,
goto errorexit;
}
else {
- Py_INCREF(tobj);
- retstr = tobj;
+ retstr = Py_NewRef(tobj);
}
assert(PyBytes_Check(retstr));
@@ -786,11 +784,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
if (ctx->pending) {
PyObject *inbuf_tmp;
- Py_INCREF(ctx->pending);
- origpending = ctx->pending;
+ origpending = Py_NewRef(ctx->pending);
- Py_INCREF(ctx->pending);
- inbuf_tmp = ctx->pending;
+ inbuf_tmp = Py_NewRef(ctx->pending);
PyUnicode_Append(&inbuf_tmp, unistr);
if (inbuf_tmp == NULL)
goto errorexit;
@@ -800,8 +796,7 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
else {
origpending = NULL;
- Py_INCREF(unistr);
- inbuf = unistr;
+ inbuf = Py_NewRef(unistr);
}
if (PyUnicode_READY(inbuf) < 0)
goto errorexit;
@@ -1645,8 +1640,7 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
- self->stream = stream;
- Py_INCREF(stream);
+ self->stream = Py_NewRef(stream);
self->pendingsize = 0;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
@@ -1869,8 +1863,7 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
- self->stream = stream;
- Py_INCREF(stream);
+ self->stream = Py_NewRef(stream);
self->pending = NULL;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
diff --git a/Modules/clinic/_testinternalcapi.c.h b/Modules/clinic/_testinternalcapi.c.h
index 8113fff..e8d5681 100644
--- a/Modules/clinic/_testinternalcapi.c.h
+++ b/Modules/clinic/_testinternalcapi.c.h
@@ -8,6 +8,69 @@ preserve
#endif
+PyDoc_STRVAR(_testinternalcapi_compiler_codegen__doc__,
+"compiler_codegen($module, /, ast, filename, optimize)\n"
+"--\n"
+"\n"
+"Apply compiler code generation to an AST.");
+
+#define _TESTINTERNALCAPI_COMPILER_CODEGEN_METHODDEF \
+ {"compiler_codegen", _PyCFunction_CAST(_testinternalcapi_compiler_codegen), METH_FASTCALL|METH_KEYWORDS, _testinternalcapi_compiler_codegen__doc__},
+
+static PyObject *
+_testinternalcapi_compiler_codegen_impl(PyObject *module, PyObject *ast,
+ PyObject *filename, int optimize);
+
+static PyObject *
+_testinternalcapi_compiler_codegen(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 3
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(ast), &_Py_ID(filename), &_Py_ID(optimize), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"ast", "filename", "optimize", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "compiler_codegen",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[3];
+ PyObject *ast;
+ PyObject *filename;
+ int optimize;
+
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ ast = args[0];
+ filename = args[1];
+ optimize = _PyLong_AsInt(args[2]);
+ if (optimize == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = _testinternalcapi_compiler_codegen_impl(module, ast, filename, optimize);
+
+exit:
+ return return_value;
+}
+
PyDoc_STRVAR(_testinternalcapi_optimize_cfg__doc__,
"optimize_cfg($module, /, instructions, consts)\n"
"--\n"
@@ -65,4 +128,4 @@ _testinternalcapi_optimize_cfg(PyObject *module, PyObject *const *args, Py_ssize
exit:
return return_value;
}
-/*[clinic end generated code: output=3b1fd713290f68a9 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=efe95836482fd542 input=a9049054013a1b77]*/
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 75832e9..cacfad7 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -1870,8 +1870,7 @@ gc_is_tracked(PyObject *module, PyObject *obj)
result = Py_True;
else
result = Py_False;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
/*[clinic input]
diff --git a/Modules/getpath.c b/Modules/getpath.c
index ceacf36..13db010 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -125,8 +125,7 @@ getpath_isabs(PyObject *Py_UNUSED(self), PyObject *args)
r = _Py_isabs(path) ? Py_True : Py_False;
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -153,11 +152,10 @@ getpath_hassuffix(PyObject *Py_UNUSED(self), PyObject *args)
wcscmp(&path[len - suffixLen], suffix) != 0
#endif
) {
- r = Py_False;
+ r = Py_NewRef(Py_False);
} else {
- r = Py_True;
+ r = Py_NewRef(Py_True);
}
- Py_INCREF(r);
PyMem_Free((void *)suffix);
}
PyMem_Free((void *)path);
@@ -187,8 +185,7 @@ getpath_isdir(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -213,8 +210,7 @@ getpath_isfile(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -247,8 +243,7 @@ getpath_isxfile(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -488,8 +483,7 @@ done:
goto done;
}
if (!S_ISLNK(st.st_mode)) {
- Py_INCREF(pathobj);
- r = pathobj;
+ r = Py_NewRef(pathobj);
goto done;
}
wchar_t resolved[MAXPATHLEN+1];
@@ -504,8 +498,7 @@ done:
return r;
#endif
- Py_INCREF(pathobj);
- return pathobj;
+ return Py_NewRef(pathobj);
}
@@ -591,8 +584,7 @@ wchar_to_dict(PyObject *dict, const char *key, const wchar_t *s)
return 0;
}
} else {
- u = Py_None;
- Py_INCREF(u);
+ u = Py_NewRef(Py_None);
}
r = PyDict_SetItemString(dict, key, u) == 0;
Py_DECREF(u);
@@ -617,8 +609,7 @@ decode_to_dict(PyObject *dict, const char *key, const char *s)
return 0;
}
} else {
- u = Py_None;
- Py_INCREF(u);
+ u = Py_NewRef(Py_None);
}
r = PyDict_SetItemString(dict, key, u) == 0;
Py_DECREF(u);
diff --git a/Modules/getpath.py b/Modules/getpath.py
index d24b152..ab0d2dc 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -679,9 +679,8 @@ elif not pythonpath_was_set:
else:
library_dir = executable_dir
pythonpath.append(joinpath(library_dir, ZIP_LANDMARK))
- elif build_prefix or venv_prefix:
+ elif build_prefix:
# QUIRK: POSIX uses the default prefix when in the build directory
- # or a venv
pythonpath.append(joinpath(PREFIX, ZIP_LANDMARK))
else:
pythonpath.append(joinpath(prefix, ZIP_LANDMARK))
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 4642787..16a2f45 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2048,8 +2048,7 @@ factorial_odd_part(unsigned long n)
inner = PyLong_FromLong(1);
if (inner == NULL)
return NULL;
- outer = inner;
- Py_INCREF(outer);
+ outer = Py_NewRef(inner);
upper = 3;
for (i = _Py_bit_length(n) - 2; i >= 0; i--) {
@@ -3521,8 +3520,7 @@ perm_comb(PyObject *n, unsigned long long k, int iscomb)
return PyLong_FromLong(1);
}
if (k == 1) {
- Py_INCREF(n);
- return n;
+ return Py_NewRef(n);
}
/* P(n, k) = P(n, j) * P(n-j, k-j) */
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index f1c126f..79f4eba 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -534,8 +534,7 @@ oss_close(oss_audio_t *self, PyObject *unused)
static PyObject *
oss_self(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1135,10 +1134,8 @@ PyInit_ossaudiodev(void)
NULL, NULL);
if (OSSAudioError) {
/* Each call to PyModule_AddObject decrefs it; compensate: */
- Py_INCREF(OSSAudioError);
- Py_INCREF(OSSAudioError);
- PyModule_AddObject(m, "error", OSSAudioError);
- PyModule_AddObject(m, "OSSAudioError", OSSAudioError);
+ PyModule_AddObject(m, "error", Py_NewRef(OSSAudioError));
+ PyModule_AddObject(m, "OSSAudioError", Py_NewRef(OSSAudioError));
}
/* Build 'control_labels' and 'control_names' lists and add them
diff --git a/Modules/overlapped.c b/Modules/overlapped.c
index deb772e..02c0f40 100644
--- a/Modules/overlapped.c
+++ b/Modules/overlapped.c
@@ -912,8 +912,7 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
_PyBytes_Resize(&self->allocated_buffer, transferred))
return NULL;
- Py_INCREF(self->allocated_buffer);
- return self->allocated_buffer;
+ return Py_NewRef(self->allocated_buffer);
case TYPE_READ_FROM:
assert(PyBytes_CheckExact(self->read_from.allocated_buffer));
@@ -940,14 +939,12 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
}
// first item: message
- Py_INCREF(self->read_from.allocated_buffer);
PyTuple_SET_ITEM(self->read_from.result, 0,
- self->read_from.allocated_buffer);
+ Py_NewRef(self->read_from.allocated_buffer));
// second item: address
PyTuple_SET_ITEM(self->read_from.result, 1, addr);
- Py_INCREF(self->read_from.result);
- return self->read_from.result;
+ return Py_NewRef(self->read_from.result);
case TYPE_READ_FROM_INTO:
// unparse the address
addr = unparse_address((SOCKADDR*)&self->read_from_into.address,
@@ -970,8 +967,7 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
// second item: address
PyTuple_SET_ITEM(self->read_from_into.result, 1, addr);
- Py_INCREF(self->read_from_into.result);
- return self->read_from_into.result;
+ return Py_NewRef(self->read_from_into.result);
default:
return PyLong_FromUnsignedLong((unsigned long) transferred);
}
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index d863f9f..5968c19 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1221,8 +1221,7 @@ path_converter(PyObject *o, void *p)
#endif
}
else if (is_bytes) {
- bytes = o;
- Py_INCREF(bytes);
+ bytes = Py_NewRef(o);
}
else if (is_index) {
if (!_fd_converter(o, &path->fd)) {
@@ -2240,8 +2239,7 @@ statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
for (i = 7; i <= 9; i++) {
if (result->ob_item[i+3] == Py_None) {
Py_DECREF(Py_None);
- Py_INCREF(result->ob_item[i]);
- result->ob_item[i+3] = result->ob_item[i];
+ result->ob_item[i+3] = Py_NewRef(result->ob_item[i]);
}
}
return (PyObject*)result;
@@ -6888,8 +6886,7 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority)
res = PyStructSequence_New(type);
if (!res)
return NULL;
- Py_INCREF(sched_priority);
- PyStructSequence_SET_ITEM(res, 0, sched_priority);
+ PyStructSequence_SET_ITEM(res, 0, Py_NewRef(sched_priority));
return res;
}
@@ -8017,8 +8014,7 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal)
err = GetLastError();
result = PyErr_SetFromWindowsErr(err);
} else {
- Py_INCREF(Py_None);
- result = Py_None;
+ result = Py_NewRef(Py_None);
}
CloseHandle(handle);
@@ -8647,7 +8643,7 @@ os_unshare_impl(PyObject *module, int flags)
if (res != 0) {
return posix_error();
}
-
+
Py_RETURN_NONE;
}
#endif
@@ -13693,8 +13689,7 @@ DirEntry_get_lstat(PyTypeObject *defining_class, DirEntry *self)
self->lstat = DirEntry_fetch_stat(module, self, 0);
#endif
}
- Py_XINCREF(self->lstat);
- return self->lstat;
+ return Py_XNewRef(self->lstat);
}
/*[clinic input]
@@ -13730,8 +13725,7 @@ os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class,
}
}
- Py_XINCREF(self->stat);
- return self->stat;
+ return Py_XNewRef(self->stat);
}
/* Set exception and return -1 on error, 0 for False, 1 for True */
@@ -13905,8 +13899,7 @@ static PyObject *
os_DirEntry___fspath___impl(DirEntry *self)
/*[clinic end generated code: output=6dd7f7ef752e6f4f input=3c49d0cf38df4fac]*/
{
- Py_INCREF(self->path);
- return self->path;
+ return Py_NewRef(self->path);
}
static PyMemberDef DirEntry_members[] = {
@@ -14114,8 +14107,7 @@ DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name,
goto error;
if (path->fd != -1) {
- entry->path = entry->name;
- Py_INCREF(entry->path);
+ entry->path = Py_NewRef(entry->name);
}
else if (!entry->path)
goto error;
@@ -14306,8 +14298,7 @@ ScandirIterator_close(ScandirIterator *self, PyObject *args)
static PyObject *
ScandirIterator_enter(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -14515,8 +14506,7 @@ PyOS_FSPath(PyObject *path)
PyObject *path_repr = NULL;
if (PyUnicode_Check(path) || PyBytes_Check(path)) {
- Py_INCREF(path);
- return path;
+ return Py_NewRef(path);
}
func = _PyObject_LookupSpecial(path, &_Py_ID(__fspath__));
@@ -15881,8 +15871,7 @@ posixmodule_exec(PyObject *m)
if (setup_confname_tables(m))
return -1;
- Py_INCREF(PyExc_OSError);
- PyModule_AddObject(m, "error", PyExc_OSError);
+ PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError));
#if defined(HAVE_WAITID) && !defined(__APPLE__)
waitid_result_desc.name = MODNAME ".waitid_result";
@@ -15890,8 +15879,7 @@ posixmodule_exec(PyObject *m)
if (WaitidResultType == NULL) {
return -1;
}
- Py_INCREF(WaitidResultType);
- PyModule_AddObject(m, "waitid_result", WaitidResultType);
+ PyModule_AddObject(m, "waitid_result", Py_NewRef(WaitidResultType));
state->WaitidResultType = WaitidResultType;
#endif
@@ -15903,8 +15891,7 @@ posixmodule_exec(PyObject *m)
if (StatResultType == NULL) {
return -1;
}
- Py_INCREF(StatResultType);
- PyModule_AddObject(m, "stat_result", StatResultType);
+ PyModule_AddObject(m, "stat_result", Py_NewRef(StatResultType));
state->StatResultType = StatResultType;
structseq_new = ((PyTypeObject *)StatResultType)->tp_new;
((PyTypeObject *)StatResultType)->tp_new = statresult_new;
@@ -15914,8 +15901,7 @@ posixmodule_exec(PyObject *m)
if (StatVFSResultType == NULL) {
return -1;
}
- Py_INCREF(StatVFSResultType);
- PyModule_AddObject(m, "statvfs_result", StatVFSResultType);
+ PyModule_AddObject(m, "statvfs_result", Py_NewRef(StatVFSResultType));
state->StatVFSResultType = StatVFSResultType;
#ifdef NEED_TICKS_PER_SECOND
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
@@ -15933,8 +15919,7 @@ posixmodule_exec(PyObject *m)
if (SchedParamType == NULL) {
return -1;
}
- Py_INCREF(SchedParamType);
- PyModule_AddObject(m, "sched_param", SchedParamType);
+ PyModule_AddObject(m, "sched_param", Py_NewRef(SchedParamType));
state->SchedParamType = SchedParamType;
((PyTypeObject *)SchedParamType)->tp_new = os_sched_param;
#endif
@@ -15944,8 +15929,7 @@ posixmodule_exec(PyObject *m)
if (TerminalSizeType == NULL) {
return -1;
}
- Py_INCREF(TerminalSizeType);
- PyModule_AddObject(m, "terminal_size", TerminalSizeType);
+ PyModule_AddObject(m, "terminal_size", Py_NewRef(TerminalSizeType));
state->TerminalSizeType = TerminalSizeType;
/* initialize scandir types */
@@ -15959,8 +15943,7 @@ posixmodule_exec(PyObject *m)
if (DirEntryType == NULL) {
return -1;
}
- Py_INCREF(DirEntryType);
- PyModule_AddObject(m, "DirEntry", DirEntryType);
+ PyModule_AddObject(m, "DirEntry", Py_NewRef(DirEntryType));
state->DirEntryType = DirEntryType;
times_result_desc.name = MODNAME ".times_result";
@@ -15968,16 +15951,15 @@ posixmodule_exec(PyObject *m)
if (TimesResultType == NULL) {
return -1;
}
- Py_INCREF(TimesResultType);
- PyModule_AddObject(m, "times_result", TimesResultType);
+ PyModule_AddObject(m, "times_result", Py_NewRef(TimesResultType));
state->TimesResultType = TimesResultType;
PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc);
if (UnameResultType == NULL) {
return -1;
}
- Py_INCREF(UnameResultType);
- PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType);
+ ;
+ PyModule_AddObject(m, "uname_result", Py_NewRef(UnameResultType));
state->UnameResultType = (PyObject *)UnameResultType;
if ((state->billion = PyLong_FromLong(1000000000)) == NULL)
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 3fe4259..0e0a9cf 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -959,8 +959,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,
encoding);
new_parser->handlers = 0;
- new_parser->intern = self->intern;
- Py_XINCREF(new_parser->intern);
+ new_parser->intern = Py_XNewRef(self->intern);
if (self->buffer != NULL) {
new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
@@ -991,8 +990,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
for (i = 0; handler_info[i].name != NULL; i++) {
PyObject *handler = self->handlers[i];
if (handler != NULL) {
- Py_INCREF(handler);
- new_parser->handlers[i] = handler;
+ new_parser->handlers[i] = Py_NewRef(handler);
handler_info[i].setter(new_parser->itself,
handler_info[i].handler);
}
@@ -1148,8 +1146,7 @@ newxmlparseobject(pyexpat_state *state, const char *encoding,
self->in_callback = 0;
self->ns_prefixes = 0;
self->handlers = NULL;
- self->intern = intern;
- Py_XINCREF(self->intern);
+ self->intern = Py_XNewRef(intern);
/* namespace_separator is either NULL or contains one char + \0 */
self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
@@ -1232,8 +1229,7 @@ xmlparse_handler_getter(xmlparseobject *self, struct HandlerInfo *hi)
PyObject *result = self->handlers[handlernum];
if (result == NULL)
result = Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static int
@@ -1365,9 +1361,7 @@ xmlparse_buffer_size_setter(xmlparseobject *self, PyObject *v, void *closure)
/* check maximum */
if (new_buffer_size > INT_MAX) {
- char errmsg[100];
- sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX);
- PyErr_SetString(PyExc_ValueError, errmsg);
+ PyErr_Format(PyExc_ValueError, "buffer_size must not be greater than %i", INT_MAX);
return -1;
}
@@ -1796,15 +1790,13 @@ add_errors_module(PyObject *mod)
goto error;
}
- Py_INCREF(codes_dict);
- if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) {
+ if (PyModule_AddObject(errors_module, "codes", Py_NewRef(codes_dict)) < 0) {
Py_DECREF(codes_dict);
goto error;
}
Py_CLEAR(codes_dict);
- Py_INCREF(rev_codes_dict);
- if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) {
+ if (PyModule_AddObject(errors_module, "messages", Py_NewRef(rev_codes_dict)) < 0) {
Py_DECREF(rev_codes_dict);
goto error;
}
diff --git a/Modules/readline.c b/Modules/readline.c
index 27b89de..fdb6356 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -402,8 +402,7 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *function)
Py_CLEAR(*hook_var);
}
else if (PyCallable_Check(function)) {
- Py_INCREF(function);
- Py_XSETREF(*hook_var, function);
+ Py_XSETREF(*hook_var, Py_NewRef(function));
}
else {
PyErr_Format(PyExc_TypeError,
@@ -524,8 +523,7 @@ static PyObject *
readline_get_begidx_impl(PyObject *module)
/*[clinic end generated code: output=362616ee8ed1b2b1 input=e083b81c8eb4bac3]*/
{
- Py_INCREF(readlinestate_global->begidx);
- return readlinestate_global->begidx;
+ return Py_NewRef(readlinestate_global->begidx);
}
/* Get the ending index for the scope of the tab-completion */
@@ -540,8 +538,7 @@ static PyObject *
readline_get_endidx_impl(PyObject *module)
/*[clinic end generated code: output=7f763350b12d7517 input=d4c7e34a625fd770]*/
{
- Py_INCREF(readlinestate_global->endidx);
- return readlinestate_global->endidx;
+ return Py_NewRef(readlinestate_global->endidx);
}
/* Set the tab-completion word-delimiters that readline uses */
@@ -784,8 +781,7 @@ readline_get_completer_impl(PyObject *module)
if (readlinestate_global->completer == NULL) {
Py_RETURN_NONE;
}
- Py_INCREF(readlinestate_global->completer);
- return readlinestate_global->completer;
+ return Py_NewRef(readlinestate_global->completer);
}
/* Private function to get current length of history. XXX It may be
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index e99dfc6..4ecb88c 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -4110,8 +4110,7 @@ makeval_recvmsg(ssize_t received, void *data)
if (received < PyBytes_GET_SIZE(*buf))
_PyBytes_Resize(buf, received);
- Py_XINCREF(*buf);
- return *buf;
+ return Py_XNewRef(*buf);
}
/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
@@ -4390,8 +4389,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args)
} while (len > 0);
PyBuffer_Release(&pbuf);
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
done:
PyBuffer_Release(&pbuf);
@@ -7346,29 +7344,22 @@ PyInit__socket(void)
if (m == NULL)
return NULL;
- Py_INCREF(PyExc_OSError);
- PyModule_AddObject(m, "error", PyExc_OSError);
+ PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError));
socket_herror = PyErr_NewException("socket.herror",
PyExc_OSError, NULL);
if (socket_herror == NULL)
return NULL;
- Py_INCREF(socket_herror);
- PyModule_AddObject(m, "herror", socket_herror);
+ PyModule_AddObject(m, "herror", Py_NewRef(socket_herror));
socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
NULL);
if (socket_gaierror == NULL)
return NULL;
- Py_INCREF(socket_gaierror);
- PyModule_AddObject(m, "gaierror", socket_gaierror);
+ PyModule_AddObject(m, "gaierror", Py_NewRef(socket_gaierror));
PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError);
- Py_INCREF((PyObject *)&sock_type);
- if (PyModule_AddObject(m, "SocketType",
- (PyObject *)&sock_type) != 0)
+ if (PyModule_AddObject(m, "SocketType", Py_NewRef(&sock_type)) != 0)
return NULL;
- Py_INCREF((PyObject *)&sock_type);
- if (PyModule_AddObject(m, "socket",
- (PyObject *)&sock_type) != 0)
+ if (PyModule_AddObject(m, "socket", Py_NewRef(&sock_type)) != 0)
return NULL;
#ifdef ENABLE_IPV6
@@ -7376,8 +7367,7 @@ PyInit__socket(void)
#else
has_ipv6 = Py_False;
#endif
- Py_INCREF(has_ipv6);
- PyModule_AddObject(m, "has_ipv6", has_ipv6);
+ PyModule_AddObject(m, "has_ipv6", Py_NewRef(has_ipv6));
/* Export C API */
PySocketModule_APIObject *capi = sock_get_api();
diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
index c25ecc2..4ef1d8c 100644
--- a/Modules/symtablemodule.c
+++ b/Modules/symtablemodule.c
@@ -56,8 +56,7 @@ _symtable_symtable_impl(PyObject *module, PyObject *source,
if (st == NULL) {
return NULL;
}
- t = (PyObject *)st->st_top;
- Py_INCREF(t);
+ t = Py_NewRef(st->st_top);
_PySymtable_Free(st);
return t;
}
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 3201470..59fccd4 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -159,8 +159,7 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr,
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyLong_FromLong(rc);
@@ -194,8 +193,7 @@ unicodedata_UCD_digit_impl(PyObject *self, int chr, PyObject *default_value)
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyLong_FromLong(rc);
@@ -246,8 +244,7 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr,
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyFloat_FromDouble(rc);
@@ -917,8 +914,7 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form,
result = (m == YES) ? Py_True : Py_False;
}
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
@@ -943,39 +939,34 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form,
if (PyUnicode_GET_LENGTH(input) == 0) {
/* Special case empty input strings, since resizing
them later would cause internal errors. */
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
if (PyUnicode_CompareWithASCIIString(form, "NFC") == 0) {
if (is_normalized_quickcheck(self, input,
true, false, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfc_nfkc(self, input, 0);
}
if (PyUnicode_CompareWithASCIIString(form, "NFKC") == 0) {
if (is_normalized_quickcheck(self, input,
true, true, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfc_nfkc(self, input, 1);
}
if (PyUnicode_CompareWithASCIIString(form, "NFD") == 0) {
if (is_normalized_quickcheck(self, input,
false, false, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfd_nfkd(self, input, 0);
}
if (PyUnicode_CompareWithASCIIString(form, "NFKD") == 0) {
if (is_normalized_quickcheck(self, input,
false, true, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfd_nfkd(self, input, 1);
}
@@ -1370,8 +1361,7 @@ unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value)
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c
index e234504..5f5297b 100644
--- a/Modules/xxlimited.c
+++ b/Modules/xxlimited.c
@@ -155,8 +155,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -210,18 +209,15 @@ Xxo_demo(XxoObject *self, PyTypeObject *defining_class,
/* Test if the argument is "str" */
if (PyUnicode_Check(o)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
/* test if the argument is of the Xxo class */
if (PyObject_TypeCheck(o, defining_class)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
diff --git a/Modules/xxlimited_35.c b/Modules/xxlimited_35.c
index 8d29c71..361c7e7 100644
--- a/Modules/xxlimited_35.c
+++ b/Modules/xxlimited_35.c
@@ -64,11 +64,9 @@ Xxo_demo(XxoObject *self, PyObject *args)
return NULL;
/* Test availability of fast type checks */
if (o != NULL && PyUnicode_Check(o)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
@@ -83,8 +81,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -176,8 +173,7 @@ xx_roj(PyObject *self, PyObject *args)
long b;
if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c
index a6e5071..a676fdb 100644
--- a/Modules/xxmodule.c
+++ b/Modules/xxmodule.c
@@ -52,8 +52,7 @@ Xxo_demo(XxoObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":demo"))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
@@ -68,8 +67,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -195,8 +193,7 @@ xx_bug(PyObject *self, PyObject *args)
printf("\n");
/* Py_DECREF(item); */
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
/* Test bad format character */
@@ -208,8 +205,7 @@ xx_roj(PyObject *self, PyObject *args)
long b;
if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
@@ -266,8 +262,7 @@ static PyTypeObject Str_Type = {
static PyObject *
null_richcompare(PyObject *self, PyObject *other, int op)
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ return Py_NewRef(Py_NotImplemented);
}
static PyTypeObject Null_Type = {
diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c
index 12306f2..8512baf 100644
--- a/Modules/xxsubtype.c
+++ b/Modules/xxsubtype.c
@@ -39,8 +39,7 @@ spamlist_setstate(spamlistobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "i:setstate", &state))
return NULL;
self->state = state;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyObject *
@@ -53,12 +52,9 @@ spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw)
self = Py_None;
if (kw == NULL)
kw = Py_None;
- Py_INCREF(self);
- PyTuple_SET_ITEM(result, 0, self);
- Py_INCREF(args);
- PyTuple_SET_ITEM(result, 1, args);
- Py_INCREF(kw);
- PyTuple_SET_ITEM(result, 2, kw);
+ PyTuple_SET_ITEM(result, 0, Py_NewRef(self));
+ PyTuple_SET_ITEM(result, 1, Py_NewRef(args));
+ PyTuple_SET_ITEM(result, 2, Py_NewRef(kw));
}
return result;
}
@@ -164,8 +160,7 @@ spamdict_setstate(spamdictobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "i:setstate", &state))
return NULL;
self->state = state;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef spamdict_methods[] = {
@@ -279,14 +274,12 @@ xxsubtype_exec(PyObject* m)
if (PyType_Ready(&spamdict_type) < 0)
return -1;
- Py_INCREF(&spamlist_type);
if (PyModule_AddObject(m, "spamlist",
- (PyObject *) &spamlist_type) < 0)
+ Py_NewRef(&spamlist_type)) < 0)
return -1;
- Py_INCREF(&spamdict_type);
if (PyModule_AddObject(m, "spamdict",
- (PyObject *) &spamdict_type) < 0)
+ Py_NewRef(&spamdict_type)) < 0)
return -1;
return 0;
}
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 30c2515..1cdfd01 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -671,8 +671,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
self->zst.next_in = NULL;
self->zst.avail_in = 0;
if (zdict != NULL) {
- Py_INCREF(zdict);
- self->zdict = zdict;
+ self->zdict = Py_NewRef(zdict);
}
int err = inflateInit2(&self->zst, wbits);
switch (err) {
@@ -1089,12 +1088,9 @@ zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls)
zlib_error(state, self->zst, err, "while copying compression object");
goto error;
}
- Py_INCREF(self->unused_data);
- Py_XSETREF(return_value->unused_data, self->unused_data);
- Py_INCREF(self->unconsumed_tail);
- Py_XSETREF(return_value->unconsumed_tail, self->unconsumed_tail);
- Py_XINCREF(self->zdict);
- Py_XSETREF(return_value->zdict, self->zdict);
+ Py_XSETREF(return_value->unused_data, Py_NewRef(self->unused_data));
+ Py_XSETREF(return_value->unconsumed_tail, Py_NewRef(self->unconsumed_tail));
+ Py_XSETREF(return_value->zdict, Py_XNewRef(self->zdict));
return_value->eof = self->eof;
/* Mark it as being initialized */
@@ -1177,12 +1173,9 @@ zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls)
goto error;
}
- Py_INCREF(self->unused_data);
- Py_XSETREF(return_value->unused_data, self->unused_data);
- Py_INCREF(self->unconsumed_tail);
- Py_XSETREF(return_value->unconsumed_tail, self->unconsumed_tail);
- Py_XINCREF(self->zdict);
- Py_XSETREF(return_value->zdict, self->zdict);
+ Py_XSETREF(return_value->unused_data, Py_NewRef(self->unused_data));
+ Py_XSETREF(return_value->unconsumed_tail, Py_NewRef(self->unconsumed_tail));
+ Py_XSETREF(return_value->zdict, Py_XNewRef(self->zdict));
return_value->eof = self->eof;
/* Mark it as being initialized */
@@ -1440,11 +1433,11 @@ arrange_output_buffer_with_maximum(uint32_t *avail_out,
return length;
}
-/* Decompress data of length self->avail_in_real in self->state.next_in. The
- output buffer is allocated dynamically and returned. If the max_length is
- of sufficiently low size, max_length is allocated immediately. At most
- max_length bytes are returned, so some of the input may not be consumed.
- self->state.next_in and self->avail_in_real are updated to reflect the
+/* Decompress data of length self->avail_in_real in self->state.next_in. The
+ output buffer is allocated dynamically and returned. If the max_length is
+ of sufficiently low size, max_length is allocated immediately. At most
+ max_length bytes are returned, so some of the input may not be consumed.
+ self->state.next_in and self->avail_in_real are updated to reflect the
consumed input. */
static PyObject*
decompress_buf(ZlibDecompressor *self, Py_ssize_t max_length)
@@ -1456,11 +1449,11 @@ decompress_buf(ZlibDecompressor *self, Py_ssize_t max_length)
Py_ssize_t hard_limit;
Py_ssize_t obuflen;
zlibstate *state = PyType_GetModuleState(Py_TYPE(self));
-
+
int err = Z_OK;
- /* When sys.maxsize is passed as default use DEF_BUF_SIZE as start buffer.
- In this particular case the data may not necessarily be very big, so
+ /* When sys.maxsize is passed as default use DEF_BUF_SIZE as start buffer.
+ In this particular case the data may not necessarily be very big, so
it is better to grow dynamically.*/
if ((max_length < 0) || max_length == PY_SSIZE_T_MAX) {
hard_limit = PY_SSIZE_T_MAX;
@@ -1544,7 +1537,7 @@ success:
static PyObject *
-decompress(ZlibDecompressor *self, uint8_t *data,
+decompress(ZlibDecompressor *self, uint8_t *data,
size_t len, Py_ssize_t max_length)
{
bool input_buffer_in_use;
@@ -1713,8 +1706,8 @@ PyDoc_STRVAR(ZlibDecompressor__new____doc__,
"\n");
static PyObject *
-ZlibDecompressor__new__(PyTypeObject *cls,
- PyObject *args,
+ZlibDecompressor__new__(PyTypeObject *cls,
+ PyObject *args,
PyObject *kwargs)
{
static char *keywords[] = {"wbits", "zdict", NULL};
@@ -1727,16 +1720,13 @@ ZlibDecompressor__new__(PyTypeObject *cls,
args, kwargs, format, keywords, &wbits, &zdict)) {
return NULL;
}
- ZlibDecompressor *self = PyObject_New(ZlibDecompressor, cls);
+ ZlibDecompressor *self = PyObject_New(ZlibDecompressor, cls);
self->eof = 0;
self->needs_input = 1;
self->avail_in_real = 0;
self->input_buffer = NULL;
self->input_buffer_size = 0;
- if (zdict != NULL) {
- Py_INCREF(zdict);
- }
- self->zdict = zdict;
+ self->zdict = Py_XNewRef(zdict);
self->zst.opaque = NULL;
self->zst.zalloc = PyZlib_Malloc;
self->zst.zfree = PyZlib_Free;
@@ -2042,14 +2032,12 @@ zlib_exec(PyObject *mod)
return -1;
}
- Py_INCREF(state->ZlibError);
- if (PyModule_AddObject(mod, "error", state->ZlibError) < 0) {
+ if (PyModule_AddObject(mod, "error", Py_NewRef(state->ZlibError)) < 0) {
Py_DECREF(state->ZlibError);
return -1;
}
- Py_INCREF(state->ZlibDecompressorType);
- if (PyModule_AddObject(mod, "_ZlibDecompressor",
- (PyObject *)state->ZlibDecompressorType) < 0) {
+ if (PyModule_AddObject(mod, "_ZlibDecompressor",
+ Py_NewRef(state->ZlibDecompressorType)) < 0) {
Py_DECREF(state->ZlibDecompressorType);
return -1;
}
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 076f447..675d6d8 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -43,9 +43,7 @@ class object "PyObject *" "&PyBaseObject_Type"
PyUnicode_IS_READY(name) && \
(PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE)
-// bpo-42745: next_version_tag remains shared by all interpreters because of static types
-// Used to set PyTypeObject.tp_version_tag
-static unsigned int next_version_tag = 1;
+#define next_version_tag (_PyRuntime.types.next_version_tag)
typedef struct PySlot_Offset {
short subslot_offset;
@@ -5828,7 +5826,8 @@ static PyObject *
object___reduce_ex___impl(PyObject *self, int protocol)
/*[clinic end generated code: output=2e157766f6b50094 input=f326b43fb8a4c5ff]*/
{
- static PyObject *objreduce;
+#define objreduce \
+ (_Py_INTERP_CACHED_OBJECT(_PyInterpreterState_Get(), objreduce))
PyObject *reduce, *res;
if (objreduce == NULL) {
@@ -5864,6 +5863,7 @@ object___reduce_ex___impl(PyObject *self, int protocol)
}
return _common_reduce(self, protocol);
+#undef objreduce
}
static PyObject *
@@ -8524,8 +8524,6 @@ __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
an all-zero entry.
*/
-typedef struct wrapperbase slotdef;
-
#undef TPSLOT
#undef FLSLOT
#undef AMSLOT
@@ -8574,7 +8572,7 @@ typedef struct wrapperbase slotdef;
ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
#NAME "($self, value, /)\n--\n\n" DOC)
-static slotdef slotdefs[] = {
+static pytype_slotdef slotdefs[] = {
TPSLOT(__getattribute__, tp_getattr, NULL, NULL, ""),
TPSLOT(__getattr__, tp_getattr, NULL, NULL, ""),
TPSLOT(__setattr__, tp_setattr, NULL, NULL, ""),
@@ -8799,12 +8797,6 @@ slotptr(PyTypeObject *type, int ioffset)
return (void **)ptr;
}
-/* Length of array of slotdef pointers used to store slots with the
- same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
- the same __name__, for any __name__. Since that's a static property, it is
- appropriate to declare fixed-size arrays for this. */
-#define MAX_EQUIV 10
-
/* Return a slot pointer for a given name, but ONLY if the attribute has
exactly one slot function. The name must be an interned string. */
static void **
@@ -8813,9 +8805,10 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
/* XXX Maybe this could be optimized more -- but is it worth it? */
/* pname and ptrs act as a little cache */
- static PyObject *pname;
- static slotdef *ptrs[MAX_EQUIV];
- slotdef *p, **pp;
+ PyInterpreterState *interp = _PyInterpreterState_Get();
+#define pname _Py_INTERP_CACHED_OBJECT(interp, type_slots_pname)
+#define ptrs _Py_INTERP_CACHED_OBJECT(interp, type_slots_ptrs)
+ pytype_slotdef *p, **pp;
void **res, **ptr;
if (pname != name) {
@@ -8842,6 +8835,8 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
res = ptr;
}
return res;
+#undef pname
+#undef ptrs
}
@@ -8899,8 +8894,8 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
* When done, return a pointer to the next slotdef with a different offset,
* because that's convenient for fixup_slot_dispatchers(). This function never
* sets an exception: if an internal error happens (unlikely), it's ignored. */
-static slotdef *
-update_one_slot(PyTypeObject *type, slotdef *p)
+static pytype_slotdef *
+update_one_slot(PyTypeObject *type, pytype_slotdef *p)
{
PyObject *descr;
PyWrapperDescrObject *d;
@@ -9015,7 +9010,7 @@ update_one_slot(PyTypeObject *type, slotdef *p)
static int
update_slots_callback(PyTypeObject *type, void *data)
{
- slotdef **pp = (slotdef **)data;
+ pytype_slotdef **pp = (pytype_slotdef **)data;
for (; *pp; pp++) {
update_one_slot(type, *pp);
}
@@ -9026,9 +9021,9 @@ update_slots_callback(PyTypeObject *type, void *data)
static int
update_slot(PyTypeObject *type, PyObject *name)
{
- slotdef *ptrs[MAX_EQUIV];
- slotdef *p;
- slotdef **pp;
+ pytype_slotdef *ptrs[MAX_EQUIV];
+ pytype_slotdef *p;
+ pytype_slotdef **pp;
int offset;
assert(PyUnicode_CheckExact(name));
@@ -9065,7 +9060,7 @@ static void
fixup_slot_dispatchers(PyTypeObject *type)
{
assert(!PyErr_Occurred());
- for (slotdef *p = slotdefs; p->name; ) {
+ for (pytype_slotdef *p = slotdefs; p->name; ) {
p = update_one_slot(type, p);
}
}
@@ -9073,7 +9068,7 @@ fixup_slot_dispatchers(PyTypeObject *type)
static void
update_all_slots(PyTypeObject* type)
{
- slotdef *p;
+ pytype_slotdef *p;
/* Clear the VALID_VERSION flag of 'type' and all its subclasses. */
PyType_Modified(type);
@@ -9244,7 +9239,7 @@ static int
add_operators(PyTypeObject *type)
{
PyObject *dict = type->tp_dict;
- slotdef *p;
+ pytype_slotdef *p;
PyObject *descr;
void **ptr;
diff --git a/PC/_msi.c b/PC/_msi.c
index 01f7fea..b104e3c 100644
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -701,8 +701,7 @@ _msi_SummaryInformation_GetProperty_impl(msiobj *self, int field)
result = PyBytes_FromStringAndSize(sval, ssize);
break;
case VT_EMPTY:
- Py_INCREF(Py_None);
- result = Py_None;
+ result = Py_NewRef(Py_None);
break;
default:
PyErr_Format(PyExc_NotImplementedError, "result of type %d", type);
diff --git a/PC/winreg.c b/PC/winreg.c
index 6ae0d81..df34e8c 100644
--- a/PC/winreg.c
+++ b/PC/winreg.c
@@ -308,8 +308,7 @@ static PyHKEYObject *
winreg_HKEYType___enter___impl(PyHKEYObject *self)
/*[clinic end generated code: output=52c34986dab28990 input=c40fab1f0690a8e2]*/
{
- Py_XINCREF(self);
- return self;
+ return (PyHKEYObject*)Py_XNewRef(self);
}
@@ -784,8 +783,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
support it natively, we should handle the bits. */
default:
if (retDataSize == 0) {
- Py_INCREF(Py_None);
- obData = Py_None;
+ obData = Py_NewRef(Py_None);
}
else
obData = PyBytes_FromStringAndSize(
diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj
index b7d40c8..90b951c 100644
--- a/PCbuild/_testcapi.vcxproj
+++ b/PCbuild/_testcapi.vcxproj
@@ -94,10 +94,13 @@
</PropertyGroup>
<ItemGroup>
<ClCompile Include="..\Modules\_testcapimodule.c" />
+ <ClCompile Include="..\Modules\_testcapi\getargs.c" />
<ClCompile Include="..\Modules\_testcapi\vectorcall.c" />
<ClCompile Include="..\Modules\_testcapi\vectorcall_limited.c" />
<ClCompile Include="..\Modules\_testcapi\heaptype.c" />
<ClCompile Include="..\Modules\_testcapi\unicode.c" />
+ <ClCompile Include="..\Modules\_testcapi\pytime.c" />
+ <ClCompile Include="..\Modules\_testcapi\datetime.c" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\PC\python_nt.rc" />
diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters
index fc2c434..504898d 100644
--- a/PCbuild/_testcapi.vcxproj.filters
+++ b/PCbuild/_testcapi.vcxproj.filters
@@ -12,6 +12,9 @@
<ClCompile Include="..\Modules\_testcapimodule.c">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\Modules\_testcapi\getargs.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\Modules\_testcapi\vectorcall.c">
<Filter>Source Files</Filter>
</ClCompile>
@@ -24,6 +27,12 @@
<ClCompile Include="..\Modules\_testcapi\unicode.c">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\Modules\_testcapi\pytime.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_testcapi\datetime.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\PC\python_nt.rc">
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 972d896..3e30761 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -675,8 +675,7 @@ class Obj2ModVisitor(PickleVisitor):
self.emit("if (%s == NULL) goto failed;" % field.name, depth+1)
self.emit("for (i = 0; i < len; i++) {", depth+1)
self.emit("%s val;" % ctype, depth+2)
- self.emit("PyObject *tmp2 = PyList_GET_ITEM(tmp, i);", depth+2)
- self.emit("Py_INCREF(tmp2);", depth+2)
+ self.emit("PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));", depth+2)
with self.recursive_call(name, depth+2):
self.emit("res = obj2ast_%s(state, tmp2, &val, arena);" %
field.type, depth+2, reflow=False)
@@ -1021,9 +1020,11 @@ static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyO
*out = NULL;
return -1;
}
- Py_INCREF(obj);
+ *out = Py_NewRef(obj);
+ }
+ else {
+ *out = NULL;
}
- *out = obj;
return 0;
}
@@ -1483,6 +1484,10 @@ def generate_ast_fini(module_state, f):
for s in module_state:
f.write(" Py_CLEAR(state->" + s + ');\n')
f.write(textwrap.dedent("""
+ if (_PyInterpreterState_Get() == _PyInterpreterState_Main()) {
+ Py_CLEAR(_Py_CACHED_OBJECT(str_replace_inf));
+ }
+
#if !defined(NDEBUG)
state->initialized = -1;
#else
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index b57aca3..d113c47 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -263,6 +263,10 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->vararg);
Py_CLEAR(state->withitem_type);
+ if (_PyInterpreterState_Get() == _PyInterpreterState_Main()) {
+ Py_CLEAR(_Py_CACHED_OBJECT(str_replace_inf));
+ }
+
#if !defined(NDEBUG)
state->initialized = -1;
#else
@@ -1019,9 +1023,11 @@ static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyO
*out = NULL;
return -1;
}
- Py_INCREF(obj);
+ *out = Py_NewRef(obj);
+ }
+ else {
+ *out = NULL;
}
- *out = obj;
return 0;
}
@@ -5479,8 +5485,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Module' node")) {
goto failed;
}
@@ -5516,8 +5521,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
if (type_ignores == NULL) goto failed;
for (i = 0; i < len; i++) {
type_ignore_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Module' node")) {
goto failed;
}
@@ -5565,8 +5569,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Interactive' node")) {
goto failed;
}
@@ -5644,8 +5647,7 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
if (argtypes == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'FunctionType' node")) {
goto failed;
}
@@ -5841,8 +5843,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) {
goto failed;
}
@@ -5878,8 +5879,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (decorator_list == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) {
goto failed;
}
@@ -6002,8 +6002,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) {
goto failed;
}
@@ -6039,8 +6038,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (decorator_list == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) {
goto failed;
}
@@ -6146,8 +6144,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (bases == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) {
goto failed;
}
@@ -6183,8 +6180,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (keywords == NULL) goto failed;
for (i = 0; i < len; i++) {
keyword_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) {
goto failed;
}
@@ -6220,8 +6216,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) {
goto failed;
}
@@ -6257,8 +6252,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (decorator_list == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) {
goto failed;
}
@@ -6338,8 +6332,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (targets == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Delete' node")) {
goto failed;
}
@@ -6390,8 +6383,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (targets == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Assign' node")) {
goto failed;
}
@@ -6662,8 +6654,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'For' node")) {
goto failed;
}
@@ -6699,8 +6690,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'For' node")) {
goto failed;
}
@@ -6804,8 +6794,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) {
goto failed;
}
@@ -6841,8 +6830,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) {
goto failed;
}
@@ -6928,8 +6916,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'While' node")) {
goto failed;
}
@@ -6965,8 +6952,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'While' node")) {
goto failed;
}
@@ -7034,8 +7020,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'If' node")) {
goto failed;
}
@@ -7071,8 +7056,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'If' node")) {
goto failed;
}
@@ -7123,8 +7107,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (items == NULL) goto failed;
for (i = 0; i < len; i++) {
withitem_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'With' node")) {
goto failed;
}
@@ -7160,8 +7143,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'With' node")) {
goto failed;
}
@@ -7229,8 +7211,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (items == NULL) goto failed;
for (i = 0; i < len; i++) {
withitem_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) {
goto failed;
}
@@ -7266,8 +7247,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) {
goto failed;
}
@@ -7351,8 +7331,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (cases == NULL) goto failed;
for (i = 0; i < len; i++) {
match_case_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Match' node")) {
goto failed;
}
@@ -7452,8 +7431,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) {
goto failed;
}
@@ -7489,8 +7467,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (handlers == NULL) goto failed;
for (i = 0; i < len; i++) {
excepthandler_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) {
goto failed;
}
@@ -7526,8 +7503,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) {
goto failed;
}
@@ -7563,8 +7539,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (finalbody == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) {
goto failed;
}
@@ -7616,8 +7591,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) {
goto failed;
}
@@ -7653,8 +7627,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (handlers == NULL) goto failed;
for (i = 0; i < len; i++) {
excepthandler_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) {
goto failed;
}
@@ -7690,8 +7663,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (orelse == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) {
goto failed;
}
@@ -7727,8 +7699,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (finalbody == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) {
goto failed;
}
@@ -7825,8 +7796,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (names == NULL) goto failed;
for (i = 0; i < len; i++) {
alias_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Import' node")) {
goto failed;
}
@@ -7894,8 +7864,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (names == NULL) goto failed;
for (i = 0; i < len; i++) {
alias_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) {
goto failed;
}
@@ -7961,8 +7930,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (names == NULL) goto failed;
for (i = 0; i < len; i++) {
identifier val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Global' node")) {
goto failed;
}
@@ -8011,8 +7979,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (names == NULL) goto failed;
for (i = 0; i < len; i++) {
identifier val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Nonlocal' node")) {
goto failed;
}
@@ -8237,8 +8204,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (values == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'BoolOp' node")) {
goto failed;
}
@@ -8564,8 +8530,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (keys == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Dict' node")) {
goto failed;
}
@@ -8601,8 +8566,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (values == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Dict' node")) {
goto failed;
}
@@ -8651,8 +8615,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (elts == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Set' node")) {
goto failed;
}
@@ -8719,8 +8682,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (generators == NULL) goto failed;
for (i = 0; i < len; i++) {
comprehension_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ListComp' node")) {
goto failed;
}
@@ -8787,8 +8749,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (generators == NULL) goto failed;
for (i = 0; i < len; i++) {
comprehension_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'SetComp' node")) {
goto failed;
}
@@ -8873,8 +8834,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (generators == NULL) goto failed;
for (i = 0; i < len; i++) {
comprehension_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'DictComp' node")) {
goto failed;
}
@@ -8941,8 +8901,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (generators == NULL) goto failed;
for (i = 0; i < len; i++) {
comprehension_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'GeneratorExp' node")) {
goto failed;
}
@@ -9100,8 +9059,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (ops == NULL) goto failed;
for (i = 0; i < len; i++) {
cmpop_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Compare' node")) {
goto failed;
}
@@ -9137,8 +9095,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (comparators == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Compare' node")) {
goto failed;
}
@@ -9206,8 +9163,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (args == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Call' node")) {
goto failed;
}
@@ -9243,8 +9199,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (keywords == NULL) goto failed;
for (i = 0; i < len; i++) {
keyword_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Call' node")) {
goto failed;
}
@@ -9360,8 +9315,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (values == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'JoinedStr' node")) {
goto failed;
}
@@ -9687,8 +9641,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (elts == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'List' node")) {
goto failed;
}
@@ -9755,8 +9708,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (elts == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'Tuple' node")) {
goto failed;
}
@@ -10242,8 +10194,7 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty*
if (ifs == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'comprehension' node")) {
goto failed;
}
@@ -10432,8 +10383,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty*
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) {
goto failed;
}
@@ -10494,8 +10444,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
if (posonlyargs == NULL) goto failed;
for (i = 0; i < len; i++) {
arg_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) {
goto failed;
}
@@ -10531,8 +10480,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
if (args == NULL) goto failed;
for (i = 0; i < len; i++) {
arg_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) {
goto failed;
}
@@ -10585,8 +10533,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
if (kwonlyargs == NULL) goto failed;
for (i = 0; i < len; i++) {
arg_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) {
goto failed;
}
@@ -10622,8 +10569,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
if (kw_defaults == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) {
goto failed;
}
@@ -10676,8 +10622,7 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
if (defaults == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) {
goto failed;
}
@@ -11196,8 +11141,7 @@ obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out,
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'match_case' node")) {
goto failed;
}
@@ -11393,8 +11337,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (patterns == NULL) goto failed;
for (i = 0; i < len; i++) {
pattern_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchSequence' node")) {
goto failed;
}
@@ -11445,8 +11388,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (keys == NULL) goto failed;
for (i = 0; i < len; i++) {
expr_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) {
goto failed;
}
@@ -11482,8 +11424,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (patterns == NULL) goto failed;
for (i = 0; i < len; i++) {
pattern_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) {
goto failed;
}
@@ -11569,8 +11510,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (patterns == NULL) goto failed;
for (i = 0; i < len; i++) {
pattern_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) {
goto failed;
}
@@ -11606,8 +11546,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (kwd_attrs == NULL) goto failed;
for (i = 0; i < len; i++) {
identifier val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) {
goto failed;
}
@@ -11643,8 +11582,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (kwd_patterns == NULL) goto failed;
for (i = 0; i < len; i++) {
pattern_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) {
goto failed;
}
@@ -11772,8 +11710,7 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out,
if (patterns == NULL) goto failed;
for (i = 0; i < len; i++) {
pattern_ty val;
- PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
- Py_INCREF(tmp2);
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
if (_Py_EnterRecursiveCall(" while traversing 'MatchOr' node")) {
goto failed;
}
diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c
index 6565b6b..79b2e2f 100644
--- a/Python/ast_unparse.c
+++ b/Python/ast_unparse.c
@@ -13,7 +13,7 @@ _Py_DECLARE_STR(open_br, "{");
_Py_DECLARE_STR(dbl_open_br, "{{");
_Py_DECLARE_STR(close_br, "}");
_Py_DECLARE_STR(dbl_close_br, "}}");
-static PyObject *_str_replace_inf;
+#define _str_replace_inf _Py_CACHED_OBJECT(str_replace_inf)
/* Forward declarations for recursion via helper functions. */
static PyObject *
diff --git a/Python/compile.c b/Python/compile.c
index 37f3b23..bd41ebc 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -122,7 +122,7 @@
(opcode) == STORE_FAST__STORE_FAST)
#define IS_TOP_LEVEL_AWAIT(c) ( \
- (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
+ (c->c_flags.cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
&& (c->u->u_ste->ste_type == ModuleBlock))
typedef _PyCompilerSrcLocation location;
@@ -418,7 +418,7 @@ struct compiler {
PyObject *c_filename;
struct symtable *c_st;
PyFutureFeatures c_future; /* module's __future__ */
- PyCompilerFlags *c_flags;
+ PyCompilerFlags c_flags;
int c_optimize; /* optimization level */
int c_interactive; /* true if in interactive mode */
@@ -583,11 +583,11 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
return result;
}
+
static int
-compiler_init(struct compiler *c)
+compiler_setup(struct compiler *c, mod_ty mod, PyObject *filename,
+ PyCompilerFlags flags, int optimize, PyArena *arena)
{
- memset(c, 0, sizeof(struct compiler));
-
c->c_const_cache = PyDict_New();
if (!c->c_const_cache) {
return 0;
@@ -595,57 +595,65 @@ compiler_init(struct compiler *c)
c->c_stack = PyList_New(0);
if (!c->c_stack) {
- Py_CLEAR(c->c_const_cache);
return 0;
}
- return 1;
-}
-
-PyCodeObject *
-_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
- int optimize, PyArena *arena)
-{
- struct compiler c;
- PyCodeObject *co = NULL;
- PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
- int merged;
- if (!compiler_init(&c))
- return NULL;
- c.c_filename = Py_NewRef(filename);
- c.c_arena = arena;
- if (!_PyFuture_FromAST(mod, filename, &c.c_future)) {
- goto finally;
- }
- if (!flags) {
- flags = &local_flags;
+ c->c_filename = Py_NewRef(filename);
+ c->c_arena = arena;
+ if (!_PyFuture_FromAST(mod, filename, &c->c_future)) {
+ return 0;
}
- merged = c.c_future.ff_features | flags->cf_flags;
- c.c_future.ff_features = merged;
- flags->cf_flags = merged;
- c.c_flags = flags;
- c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
- c.c_nestlevel = 0;
+ int merged = c->c_future.ff_features | flags.cf_flags;
+ c->c_future.ff_features = merged;
+ flags.cf_flags = merged;
+ c->c_flags = flags;
+ c->c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
+ c->c_nestlevel = 0;
_PyASTOptimizeState state;
- state.optimize = c.c_optimize;
+ state.optimize = c->c_optimize;
state.ff_features = merged;
if (!_PyAST_Optimize(mod, arena, &state)) {
- goto finally;
+ return 0;
}
-
- c.c_st = _PySymtable_Build(mod, filename, &c.c_future);
- if (c.c_st == NULL) {
- if (!PyErr_Occurred())
+ c->c_st = _PySymtable_Build(mod, filename, &c->c_future);
+ if (c->c_st == NULL) {
+ if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_SystemError, "no symtable");
- goto finally;
+ }
+ return 0;
}
+ return 1;
+}
- co = compiler_mod(&c, mod);
+static struct compiler*
+new_compiler(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
+ int optimize, PyArena *arena)
+{
+ PyCompilerFlags flags = pflags ? *pflags : _PyCompilerFlags_INIT;
+ struct compiler *c = PyMem_Calloc(1, sizeof(struct compiler));
+ if (c == NULL) {
+ return NULL;
+ }
+ if (!compiler_setup(c, mod, filename, flags, optimize, arena)) {
+ compiler_free(c);
+ return NULL;
+ }
+ return c;
+}
- finally:
- compiler_free(&c);
+PyCodeObject *
+_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
+ int optimize, PyArena *arena)
+{
+ struct compiler *c = new_compiler(mod, filename, pflags, optimize, arena);
+ if (c == NULL) {
+ return NULL;
+ }
+
+ PyCodeObject *co = compiler_mod(c, mod);
+ compiler_free(c);
assert(co || PyErr_Occurred());
return co;
}
@@ -656,8 +664,9 @@ compiler_free(struct compiler *c)
if (c->c_st)
_PySymtable_Free(c->c_st);
Py_XDECREF(c->c_filename);
- Py_DECREF(c->c_const_cache);
- Py_DECREF(c->c_stack);
+ Py_XDECREF(c->c_const_cache);
+ Py_XDECREF(c->c_stack);
+ PyMem_Free(c);
}
static PyObject *
@@ -2136,15 +2145,13 @@ compiler_body(struct compiler *c, location loc, asdl_stmt_seq *stmts)
return 1;
}
-static PyCodeObject *
-compiler_mod(struct compiler *c, mod_ty mod)
+static int
+compiler_codegen(struct compiler *c, mod_ty mod)
{
- PyCodeObject *co;
- int addNone = 1;
_Py_DECLARE_STR(anon_module, "<module>");
if (!compiler_enter_scope(c, &_Py_STR(anon_module), COMPILER_SCOPE_MODULE,
mod, 1)) {
- return NULL;
+ return 0;
}
location loc = LOCATION(1, 1, 0, 0);
switch (mod->kind) {
@@ -2163,7 +2170,6 @@ compiler_mod(struct compiler *c, mod_ty mod)
break;
case Expression_kind:
VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
- addNone = 0;
break;
default:
PyErr_Format(PyExc_SystemError,
@@ -2171,7 +2177,17 @@ compiler_mod(struct compiler *c, mod_ty mod)
mod->kind);
return 0;
}
- co = assemble(c, addNone);
+ return 1;
+}
+
+static PyCodeObject *
+compiler_mod(struct compiler *c, mod_ty mod)
+{
+ int addNone = mod->kind != Expression_kind;
+ if (!compiler_codegen(c, mod)) {
+ return NULL;
+ }
+ PyCodeObject *co = assemble(c, addNone);
compiler_exit_scope(c);
return co;
}
@@ -8229,7 +8245,7 @@ compute_code_flags(struct compiler *c)
}
/* (Only) inherit compilerflags in PyCF_MASK */
- flags |= (c->c_flags->cf_flags & PyCF_MASK);
+ flags |= (c->c_flags.cf_flags & PyCF_MASK);
if ((IS_TOP_LEVEL_AWAIT(c)) &&
ste->ste_coroutine &&
@@ -9860,6 +9876,9 @@ duplicate_exits_without_lineno(cfg_builder *g)
/* Access to compiler optimizations for unit tests.
*
+ * _PyCompile_CodeGen takes and AST, applies code-gen and
+ * returns the unoptimized CFG as an instruction list.
+ *
* _PyCompile_OptimizeCfg takes an instruction list, constructs
* a CFG, optimizes it and converts back to an instruction list.
*
@@ -9954,7 +9973,9 @@ cfg_to_instructions(cfg_builder *g)
for (int i = 0; i < b->b_iused; i++) {
struct instr *instr = &b->b_instr[i];
location loc = instr->i_loc;
- int arg = HAS_TARGET(instr->i_opcode) ? instr->i_target->b_label : instr->i_oparg;
+ int arg = HAS_TARGET(instr->i_opcode) ?
+ instr->i_target->b_label : instr->i_oparg;
+
PyObject *inst_tuple = Py_BuildValue(
"(iiiiii)", instr->i_opcode, arg,
loc.lineno, loc.end_lineno,
@@ -9977,6 +9998,52 @@ error:
return NULL;
}
+PyObject *
+_PyCompile_CodeGen(PyObject *ast, PyObject *filename, PyCompilerFlags *pflags,
+ int optimize)
+{
+ PyObject *res = NULL;
+
+ if (!PyAST_Check(ast)) {
+ PyErr_SetString(PyExc_TypeError, "expected an AST");
+ return NULL;
+ }
+
+ PyArena *arena = _PyArena_New();
+ if (arena == NULL) {
+ return NULL;
+ }
+
+ mod_ty mod = PyAST_obj2mod(ast, arena, 0 /* exec */);
+ if (mod == NULL || !_PyAST_Validate(mod)) {
+ _PyArena_Free(arena);
+ return NULL;
+ }
+
+ struct compiler *c = new_compiler(mod, filename, pflags, optimize, arena);
+ if (c == NULL) {
+ _PyArena_Free(arena);
+ return NULL;
+ }
+
+ if (!compiler_codegen(c, mod)) {
+ goto finally;
+ }
+
+ cfg_builder *g = CFG_BUILDER(c);
+
+ if (translate_jump_labels_to_targets(g->g_entryblock) < 0) {
+ goto finally;
+ }
+
+ res = cfg_to_instructions(g);
+
+finally:
+ compiler_exit_scope(c);
+ compiler_free(c);
+ _PyArena_Free(arena);
+ return res;
+}
PyObject *
_PyCompile_OptimizeCfg(PyObject *instructions, PyObject *consts)
diff --git a/Python/import.c b/Python/import.c
index daee16e..c12b3e0 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -94,9 +94,9 @@ _PyImportZip_Init(PyThreadState *tstate)
in different threads to return with a partially loaded module.
These calls are serialized by the global interpreter lock. */
-static PyThread_type_lock import_lock = NULL;
-static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
-static int import_lock_level = 0;
+#define import_lock _PyRuntime.imports.lock.mutex
+#define import_lock_thread _PyRuntime.imports.lock.thread
+#define import_lock_level _PyRuntime.imports.lock.level
void
_PyImport_AcquireLock(void)
@@ -1759,8 +1759,8 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
PyObject *mod = NULL;
PyInterpreterState *interp = tstate->interp;
int import_time = _PyInterpreterState_GetConfig(interp)->import_time;
- static int import_level;
- static _PyTime_t accumulated;
+#define import_level _PyRuntime.imports.find_and_load.import_level
+#define accumulated _PyRuntime.imports.find_and_load.accumulated
_PyTime_t t1 = 0, accumulated_copy = accumulated;
@@ -1781,12 +1781,13 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
* _PyDict_GetItemIdWithError().
*/
if (import_time) {
- static int header = 1;
+#define header _PyRuntime.imports.find_and_load.header
if (header) {
fputs("import time: self [us] | cumulative | imported package\n",
stderr);
header = 0;
}
+#undef header
import_level++;
t1 = _PyTime_GetPerfCounter();
@@ -1816,6 +1817,8 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
}
return mod;
+#undef import_level
+#undef accumulated
}
PyObject *
diff --git a/Python/pystate.c b/Python/pystate.c
index 5d1814f..5c9e4ff 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -275,7 +275,9 @@ alloc_interpreter(void)
static void
free_interpreter(PyInterpreterState *interp)
{
- if (!interp->_static) {
+ // The main interpreter is statically allocated so
+ // should not be freed.
+ if (interp != &_PyRuntime._main_interpreter) {
PyMem_RawFree(interp);
}
}
@@ -359,7 +361,6 @@ PyInterpreterState_New(void)
interp = &runtime->_main_interpreter;
assert(interp->id == 0);
assert(interp->next == NULL);
- assert(interp->_static);
interpreters->main = interp;
}
@@ -374,9 +375,6 @@ PyInterpreterState_New(void)
// Set to _PyInterpreterState_INIT.
memcpy(interp, &initial._main_interpreter,
sizeof(*interp));
- // We need to adjust any fields that are different from the initial
- // interpreter (as defined in _PyInterpreterState_INIT):
- interp->_static = false;
if (id < 0) {
/* overflow or Py_Initialize() not called yet! */
@@ -762,7 +760,9 @@ alloc_threadstate(void)
static void
free_threadstate(PyThreadState *tstate)
{
- if (!tstate->_static) {
+ // The initial thread state of the interpreter is allocated
+ // as part of the interpreter state so should not be freed.
+ if (tstate != &tstate->interp->_initial_thread) {
PyMem_RawFree(tstate);
}
}
@@ -845,7 +845,6 @@ new_threadstate(PyInterpreterState *interp)
assert(id == 1);
used_newtstate = 0;
tstate = &interp->_initial_thread;
- assert(tstate->_static);
}
else {
// Every valid interpreter must have at least one thread.
@@ -857,9 +856,6 @@ new_threadstate(PyInterpreterState *interp)
memcpy(tstate,
&initial._main_interpreter._initial_thread,
sizeof(*tstate));
- // We need to adjust any fields that are different from the initial
- // thread (as defined in _PyThreadState_INIT):
- tstate->_static = false;
}
interp->threads.head = tstate;
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 1090b12..6f0a126 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -431,6 +431,8 @@ sys_addaudithook_impl(PyObject *module, PyObject *hook)
if (interp->audit_hooks == NULL) {
return NULL;
}
+ /* Avoid having our list of hooks show up in the GC module */
+ PyObject_GC_UnTrack(interp->audit_hooks);
}
if (PyList_Append(interp->audit_hooks, hook) < 0) {
diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv
index ad4e0ae..b60f16d 100644
--- a/Tools/c-analyzer/cpython/globals-to-fix.tsv
+++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv
@@ -299,15 +299,6 @@ Objects/setobject.c - _PySet_Dummy -
Objects/sliceobject.c - _Py_EllipsisObject -
#-----------------------
-# cached - initialized once
-
-# manually cached PyUnicodeObject
-Python/ast_unparse.c - _str_replace_inf -
-
-# other
-Objects/typeobject.c object___reduce_ex___impl objreduce -
-
-#-----------------------
# other
# initialized once
@@ -315,9 +306,6 @@ Python/context.c - _token_missing -
Python/hamt.c - _empty_bitmap_node -
Python/hamt.c - _empty_hamt -
-# state
-Objects/typeobject.c resolve_slotdups pname -
-
##################################
# global non-objects to fix in core code
@@ -380,8 +368,6 @@ Python/dtoa.c - p5s -
Python/fileutils.c - _Py_open_cloexec_works -
Python/fileutils.c - force_ascii -
Python/fileutils.c set_inheritable ioctl_works -
-Python/import.c - import_lock -
-Python/import.c import_find_and_load header -
#-----------------------
# unlikely to change after init (or main thread)
@@ -438,17 +424,11 @@ Python/perf_trampoline.c - perf_status -
Python/perf_trampoline.c - extra_code_index -
Python/perf_trampoline.c - code_arena -
Python/perf_trampoline.c - trampoline_api -
-Objects/typeobject.c - next_version_tag -
-Objects/typeobject.c resolve_slotdups ptrs -
Parser/pegen.c - memo_statistics -
Python/bootstrap_hash.c - urandom_cache -
Python/ceval_gil.c make_pending_calls busy -
Python/ceval.c _PyEval_SetProfile reentrant -
Python/ceval.c _PyEval_SetTrace reentrant -
-Python/import.c - import_lock_level -
-Python/import.c - import_lock_thread -
-Python/import.c import_find_and_load accumulated -
-Python/import.c import_find_and_load import_level -
Python/modsupport.c - _Py_PackageContext -
Python/thread_pthread_stubs.h - py_tls_entries -
Python/pyfpe.c - PyFPE_counter -
@@ -513,27 +493,12 @@ Modules/itertoolsmodule.c - ziplongest_type -
#-----------------------
# other
-# statically initializd pointer to static type
-# XXX should be const?
-Modules/_io/winconsoleio.c - _PyWindowsConsoleIO_Type -
-
-# initialized once
-Modules/_functoolsmodule.c - kwd_mark -
-Modules/_io/_iomodule.c - _PyIO_empty_bytes -
-Modules/_testcapi/heaptype.c - _testcapimodule -
-Modules/_testcapi/unicode.c - _testcapimodule -
-Modules/_tracemalloc.c - tracemalloc_empty_traceback -
-Modules/signalmodule.c - DefaultHandler -
-Modules/signalmodule.c - IgnoreHandler -
-Modules/signalmodule.c - IntHandler -
-
# state
Modules/faulthandler.c - fatal_error -
Modules/faulthandler.c - thread -
Modules/faulthandler.c - user_signals -
Modules/faulthandler.c - stack -
Modules/faulthandler.c - old_stack -
-Modules/signalmodule.c - Handlers -
##################################
@@ -554,6 +519,7 @@ Modules/timemodule.c _PyTime_GetProcessTimeWithInfo ticks_per_second -
Modules/_tracemalloc.c - allocators -
Modules/_tracemalloc.c - tables_lock -
+Modules/_tracemalloc.c - tracemalloc_empty_traceback -
Modules/_tracemalloc.c - tracemalloc_traced_memory -
Modules/_tracemalloc.c - tracemalloc_peak_traced_memory -
Modules/_tracemalloc.c - tracemalloc_filenames -
@@ -567,6 +533,7 @@ Modules/posixmodule.c - environ -
Modules/signalmodule.c - is_tripped -
Modules/signalmodule.c - signal_global_state -
Modules/signalmodule.c - wakeup -
+Modules/signalmodule.c - Handlers -
##################################
diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv
index e657fa7..414e68d 100644
--- a/Tools/c-analyzer/cpython/ignored.tsv
+++ b/Tools/c-analyzer/cpython/ignored.tsv
@@ -181,6 +181,8 @@ Modules/_testbuffer.c ndarray_memoryview_from_buffer strides -
Modules/_testbuffer.c ndarray_memoryview_from_buffer suboffsets -
Modules/_testbuffer.c ndarray_push kwlist -
Modules/_testbuffer.c staticarray_init kwlist -
+Modules/_testcapi/heaptype.c - _testcapimodule -
+Modules/_testcapi/unicode.c - _testcapimodule -
Modules/_testcapimodule.c - ContainerNoGC_members -
Modules/_testcapimodule.c - ContainerNoGC_type -
Modules/_testcapimodule.c - FmData -
@@ -379,6 +381,7 @@ Modules/_decimal/_decimal.c - ssize_constants -
Modules/_elementtree.c - ExpatMemoryHandler -
Modules/_io/_iomodule.c - static_types -
Modules/_io/textio.c - encodefuncs -
+Modules/_io/winconsoleio.c - _PyWindowsConsoleIO_Type -
Modules/_localemodule.c - langinfo_constants -
Modules/_pickle.c - READ_WHOLE_LINE -
Modules/_sqlite/module.c - error_codes -