mirror of https://github.com/python/cpython
Merge the 3.12.0a2 release into main.
This commit is contained in:
commit
73943cbc4c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
======================
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
=============
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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, \
|
||||
}
|
||||
|
|
|
@ -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), \
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
|
@ -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)
|
|
@ -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(
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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."""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -0,0 +1,2 @@
|
|||
Fix zip path for venv created from a non-installed python on POSIX
|
||||
platforms.
|
|
@ -0,0 +1,2 @@
|
|||
Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying a custom event loop factory.
|
||||
Patch by Kumar Aditya.
|
|
@ -0,0 +1,2 @@
|
|||
Avoid publishing list of active per-interpreter audit hooks via the
|
||||
:mod:`gc` module
|
|
@ -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*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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", ¯o)) {
|
||||
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", ¯o, &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",
|
||||
¯o,
|
||||
&year, &month, &day,
|
||||
&hour, &minute, &second, µsecond)) {
|
||||
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",
|
||||
¯o,
|
||||
&year, &month, &day,
|
||||
&hour, &minute, &second, µsecond,
|
||||
&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",
|
||||
¯o,
|
||||
&hour, &minute, &second, µsecond))
|
||||
{
|
||||
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",
|
||||
¯o,
|
||||
&hour, &minute, &second, µsecond,
|
||||
&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",
|
||||
¯o,
|
||||
&days, &seconds, µseconds)) {
|
||||
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, ¯o)) {
|
||||
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, ¯o)) {
|
||||
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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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]*/
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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) */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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[] = {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue