Merge the 3.12.0a2 release into main.

This commit is contained in:
Thomas Wouters 2022-11-15 13:38:09 +01:00
commit 73943cbc4c
108 changed files with 3340 additions and 3289 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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
======================

View File

@ -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.

View File

@ -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
=============

View File

@ -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;

View File

@ -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);

View File

@ -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) \

View File

@ -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));

View File

@ -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)

View File

@ -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;
};

View File

@ -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;

View File

@ -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.

View File

@ -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, \
}

View File

@ -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), \

View File

@ -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 {

View File

@ -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);

View File

@ -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)

View File

@ -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

View File

@ -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
class CodegenTestCase(CompilationStepTestCase):
def generate_code(self, ast):
insts = compiler_codegen(ast, "my_file.py", 0)
return insts
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
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.
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)
# pad exp with -1's (if location info is incomplete)
exp += (-1,) * (len(act) - len(exp))
self.assertEqual(exp, act)

View File

@ -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):

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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(

View File

@ -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):

View File

@ -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):

View File

@ -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."""

View File

@ -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) \
@ # Build PYC files for the 3 optimization levels (0, 1, 2)
-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)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
$(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
-j0 -d $(LIBDEST) -f \
-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

View File

@ -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.

View File

@ -0,0 +1,2 @@
Fix zip path for venv created from a non-installed python on POSIX
platforms.

View File

@ -0,0 +1,2 @@
Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying a custom event loop factory.
Patch by Kumar Aditya.

View File

@ -0,0 +1,2 @@
Avoid publishing list of active per-interpreter audit hooks via the
:mod:`gc` module

View File

@ -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*

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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,

View File

@ -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 *

View File

@ -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 */

View File

@ -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

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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 {

View File

@ -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 *

View File

@ -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);
}
}

View File

@ -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 *

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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

View File

@ -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()) {

View File

@ -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;
}

920
Modules/_testcapi/getargs.c Normal file
View File

@ -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;
}

View File

@ -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);

274
Modules/_testcapi/pytime.c Normal file
View File

@ -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;
}

File diff suppressed because it is too large Load Diff

View File

@ -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 */

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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]

View File

@ -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;
}

View File

@ -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()) {

View File

@ -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;
}

View File

@ -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)

View File

@ -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]*/

View File

@ -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]

View File

@ -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);

View File

@ -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))

View File

@ -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) */

View File

@ -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

View File

@ -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);
}

View File

@ -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)

View File

@ -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;
}

View File

@ -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

View File

@ -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();

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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[] = {

View File

@ -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);
}

View File

@ -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 = {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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(

View File

@ -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" />

View File

@ -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">

View File

@ -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

Some files were not shown because too many files have changed in this diff Show More