summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Setup.stdlib.in2
-rw-r--r--Modules/_abc.c18
-rw-r--r--Modules/_collectionsmodule.c60
-rw-r--r--Modules/_csv.c9
-rw-r--r--Modules/_ctypes/callproc.c24
-rw-r--r--Modules/_curses_panel.c27
-rw-r--r--Modules/_cursesmodule.c3
-rw-r--r--Modules/_datetimemodule.c101
-rw-r--r--Modules/_dbmmodule.c6
-rw-r--r--Modules/_decimal/_decimal.c107
-rw-r--r--Modules/_functoolsmodule.c69
-rw-r--r--Modules/_gdbmmodule.c12
-rw-r--r--Modules/_heapqmodule.c15
-rw-r--r--Modules/_io/_iomodule.c9
-rw-r--r--Modules/_io/bufferedio.c9
-rw-r--r--Modules/_io/bytesio.c18
-rw-r--r--Modules/_io/iobase.c6
-rw-r--r--Modules/_io/stringio.c12
-rw-r--r--Modules/_io/textio.c35
-rw-r--r--Modules/_json.c22
-rw-r--r--Modules/_lsprof.c12
-rw-r--r--Modules/_operator.c21
-rw-r--r--Modules/_pickle.c75
-rw-r--r--Modules/_sre/sre.c79
-rw-r--r--Modules/_ssl.c56
-rw-r--r--Modules/_ssl/debughelpers.c12
-rw-r--r--Modules/_struct.c6
-rw-r--r--Modules/_testcapi/datetime.c453
-rw-r--r--Modules/_testcapi/getargs.c920
-rw-r--r--Modules/_testcapi/parts.h3
-rw-r--r--Modules/_testcapi/pytime.c274
-rw-r--r--Modules/_testcapimodule.c1517
-rw-r--r--Modules/_testinternalcapi.c23
-rw-r--r--Modules/_tkinter.c48
-rw-r--r--Modules/_tracemalloc.c10
-rw-r--r--Modules/_typingmodule.c3
-rw-r--r--Modules/_winapi.c3
-rw-r--r--Modules/_xxsubinterpretersmodule.c11
-rw-r--r--Modules/_zoneinfo.c46
-rw-r--r--Modules/arraymodule.c37
-rw-r--r--Modules/cjkcodecs/multibytecodec.c21
-rw-r--r--Modules/clinic/_testinternalcapi.c.h65
-rw-r--r--Modules/gcmodule.c3
-rw-r--r--Modules/getpath.c29
-rw-r--r--Modules/getpath.py3
-rw-r--r--Modules/mathmodule.c6
-rw-r--r--Modules/ossaudiodev.c9
-rw-r--r--Modules/overlapped.c12
-rw-r--r--Modules/posixmodule.c60
-rw-r--r--Modules/pyexpat.c22
-rw-r--r--Modules/readline.c12
-rw-r--r--Modules/socketmodule.c26
-rw-r--r--Modules/symtablemodule.c3
-rw-r--r--Modules/unicodedata.c30
-rw-r--r--Modules/xxlimited.c12
-rw-r--r--Modules/xxlimited_35.c12
-rw-r--r--Modules/xxmodule.c15
-rw-r--r--Modules/xxsubtype.c21
-rw-r--r--Modules/zlibmodule.c58
59 files changed, 2198 insertions, 2394 deletions
diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in
index 74d2222..e250f83 100644
--- a/Modules/Setup.stdlib.in
+++ b/Modules/Setup.stdlib.in
@@ -169,7 +169,7 @@
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
-@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c
+@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c
# Some testing modules MUST be built as shared libraries.
*shared*
diff --git a/Modules/_abc.c b/Modules/_abc.c
index b22daa8..e6e7242 100644
--- a/Modules/_abc.c
+++ b/Modules/_abc.c
@@ -524,8 +524,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
}
int result = PyObject_IsSubclass(subclass, self);
if (result > 0) {
- Py_INCREF(subclass);
- return subclass; /* Already a subclass. */
+ return Py_NewRef(subclass); /* Already a subclass. */
}
if (result < 0) {
return NULL;
@@ -561,8 +560,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
set_collection_flag_recursive((PyTypeObject *)subclass, collection_flag);
}
}
- Py_INCREF(subclass);
- return subclass;
+ return Py_NewRef(subclass);
}
@@ -598,8 +596,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
goto end;
}
if (incache > 0) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
goto end;
}
subtype = (PyObject *)Py_TYPE(instance);
@@ -610,8 +607,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
goto end;
}
if (incache > 0) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
goto end;
}
}
@@ -802,8 +798,7 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self,
end:
Py_DECREF(impl);
Py_XDECREF(subclasses);
- Py_XINCREF(result);
- return result;
+ return Py_XNewRef(result);
}
@@ -842,8 +837,7 @@ subclasscheck_check_registry(_abc_data *impl, PyObject *subclass,
Py_ssize_t i = 0;
while (_PySet_NextEntry(impl->_abc_registry, &pos, &key, &hash)) {
- Py_INCREF(key);
- copy[i++] = key;
+ copy[i++] = Py_NewRef(key);
}
assert(i == registry_size);
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 741cfbe..f1fd271 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -299,8 +299,7 @@ deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
static PyObject *
deque_append(dequeobject *deque, PyObject *item)
{
- Py_INCREF(item);
- if (deque_append_internal(deque, item, deque->maxlen) < 0)
+ if (deque_append_internal(deque, Py_NewRef(item), deque->maxlen) < 0)
return NULL;
Py_RETURN_NONE;
}
@@ -336,8 +335,7 @@ deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
static PyObject *
deque_appendleft(dequeobject *deque, PyObject *item)
{
- Py_INCREF(item);
- if (deque_appendleft_internal(deque, item, deque->maxlen) < 0)
+ if (deque_appendleft_internal(deque, Py_NewRef(item), deque->maxlen) < 0)
return NULL;
Py_RETURN_NONE;
}
@@ -655,14 +653,12 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
size = Py_SIZE(deque);
if (size == 0 || n == 1) {
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if (n <= 0) {
deque_clear(deque);
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if (size == 1) {
@@ -693,13 +689,11 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
i += m;
while (m--) {
deque->rightindex++;
- Py_INCREF(item);
- deque->rightblock->data[deque->rightindex] = item;
+ deque->rightblock->data[deque->rightindex] = Py_NewRef(item);
}
}
Py_SET_SIZE(deque, Py_SIZE(deque) + i);
- Py_INCREF(deque);
- return (PyObject *)deque;
+ return Py_NewRef(deque);
}
if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
@@ -972,8 +966,7 @@ deque_count(dequeobject *deque, PyObject *v)
while (--n >= 0) {
CHECK_NOT_END(b);
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Py_DECREF(item);
if (cmp < 0)
@@ -1011,8 +1004,7 @@ deque_contains(dequeobject *deque, PyObject *v)
while (--n >= 0) {
CHECK_NOT_END(b);
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Py_DECREF(item);
if (cmp) {
@@ -1201,8 +1193,7 @@ deque_item(dequeobject *deque, Py_ssize_t i)
}
}
item = b->data[i];
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static int
@@ -1231,8 +1222,7 @@ deque_remove(dequeobject *deque, PyObject *value)
int cmp, rv;
for (i = 0 ; i < n; i++) {
- item = b->data[index];
- Py_INCREF(item);
+ item = Py_NewRef(b->data[index]);
cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Py_DECREF(item);
if (cmp < 0) {
@@ -1292,9 +1282,8 @@ deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
while (--n >= 0)
b = b->leftlink;
}
- Py_INCREF(v);
old_value = b->data[i];
- b->data[i] = v;
+ b->data[i] = Py_NewRef(v);
Py_DECREF(old_value);
return 0;
}
@@ -1686,8 +1675,7 @@ deque_iter(dequeobject *deque)
return NULL;
it->b = deque->leftblock;
it->index = deque->leftindex;
- Py_INCREF(deque);
- it->deque = deque;
+ it->deque = (dequeobject*)Py_NewRef(deque);
it->state = deque->state;
it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
@@ -1734,8 +1722,7 @@ dequeiter_next(dequeiterobject *it)
it->b = it->b->rightlink;
it->index = 0;
}
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static PyObject *
@@ -1844,8 +1831,7 @@ deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored))
return NULL;
it->b = deque->rightblock;
it->index = deque->rightindex;
- Py_INCREF(deque);
- it->deque = deque;
+ it->deque = (dequeobject*)Py_NewRef(deque);
it->state = deque->state;
it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
@@ -1876,8 +1862,7 @@ dequereviter_next(dequeiterobject *it)
it->b = it->b->leftlink;
it->index = BLOCKLEN - 1;
}
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
static PyObject *
@@ -2203,8 +2188,7 @@ defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
}
if (newargs == NULL)
return -1;
- Py_XINCREF(newdefault);
- dd->default_factory = newdefault;
+ dd->default_factory = Py_XNewRef(newdefault);
result = PyDict_Type.tp_init(self, newargs, kwds);
Py_DECREF(newargs);
Py_XDECREF(olddefault);
@@ -2414,8 +2398,7 @@ tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
return NULL;
}
self->index = index;
- Py_INCREF(doc);
- self->doc = doc;
+ self->doc = Py_NewRef(doc);
return (PyObject *)self;
}
@@ -2426,13 +2409,11 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
PyObject *result;
if (obj == NULL) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
if (!PyTuple_Check(obj)) {
if (obj == Py_None) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
PyErr_Format(PyExc_TypeError,
"descriptor for index '%zd' for tuple subclasses "
@@ -2448,8 +2429,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
}
result = PyTuple_GET_ITEM(obj, index);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static int
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 25bf86f..bd33708 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -176,8 +176,7 @@ get_char_or_None(Py_UCS4 c)
static PyObject *
Dialect_get_lineterminator(DialectObj *self, void *Py_UNUSED(ignored))
{
- Py_XINCREF(self->lineterminator);
- return self->lineterminator;
+ return Py_XNewRef(self->lineterminator);
}
static PyObject *
@@ -316,8 +315,7 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
else {
if (PyUnicode_READY(src) == -1)
return -1;
- Py_INCREF(src);
- Py_XSETREF(*target, src);
+ Py_XSETREF(*target, Py_NewRef(src));
}
}
return 0;
@@ -514,8 +512,7 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
goto err;
}
- ret = (PyObject *)self;
- Py_INCREF(self);
+ ret = Py_NewRef(self);
err:
Py_CLEAR(self);
Py_CLEAR(dialect);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 520a0f9..a6c005b 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1880,7 +1880,6 @@ POINTER(PyObject *self, PyObject *cls)
PyObject *result;
PyTypeObject *typ;
PyObject *key;
- char *buf;
result = PyDict_GetItemWithError(_ctypes_ptrtype_cache, cls);
if (result) {
@@ -1890,18 +1889,11 @@ POINTER(PyObject *self, PyObject *cls)
return NULL;
}
if (PyUnicode_CheckExact(cls)) {
- const char *name = PyUnicode_AsUTF8(cls);
- if (name == NULL)
- return NULL;
- buf = PyMem_Malloc(strlen(name) + 3 + 1);
- if (buf == NULL)
- return PyErr_NoMemory();
- sprintf(buf, "LP_%s", name);
+ PyObject *name = PyUnicode_FromFormat("LP_%U", cls);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
- "s(O){}",
- buf,
+ "N(O){}",
+ name,
&PyCPointer_Type);
- PyMem_Free(buf);
if (result == NULL)
return result;
key = PyLong_FromVoidPtr(result);
@@ -1911,16 +1903,12 @@ POINTER(PyObject *self, PyObject *cls)
}
} else if (PyType_Check(cls)) {
typ = (PyTypeObject *)cls;
- buf = PyMem_Malloc(strlen(typ->tp_name) + 3 + 1);
- if (buf == NULL)
- return PyErr_NoMemory();
- sprintf(buf, "LP_%s", typ->tp_name);
+ PyObject *name = PyUnicode_FromFormat("LP_%s", typ->tp_name);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
- "s(O){sO}",
- buf,
+ "N(O){sO}",
+ name,
&PyCPointer_Type,
"_type_", cls);
- PyMem_Free(buf);
if (result == NULL)
return result;
key = Py_NewRef(cls);
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index 0b328f9..cd408d6 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -261,8 +261,7 @@ PyCursesPanel_New(_curses_panel_state *state, PANEL *pan,
Py_DECREF(po);
return NULL;
}
- po->wo = wo;
- Py_INCREF(wo);
+ po->wo = (PyCursesWindowObject*)Py_NewRef(wo);
return (PyObject *)po;
}
@@ -313,8 +312,7 @@ _curses_panel_panel_above_impl(PyCursesPanelObject *self)
"panel_above: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/* panel_below(NULL) returns the top panel in the stack. To get
@@ -344,8 +342,7 @@ _curses_panel_panel_below_impl(PyCursesPanelObject *self)
"panel_below: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -394,8 +391,7 @@ static PyObject *
_curses_panel_panel_window_impl(PyCursesPanelObject *self)
/*[clinic end generated code: output=5f05940d4106b4cb input=6067353d2c307901]*/
{
- Py_INCREF(self->wo);
- return (PyObject *)self->wo;
+ return Py_NewRef(self->wo);
}
/*[clinic input]
@@ -428,8 +424,7 @@ _curses_panel_panel_replace_impl(PyCursesPanelObject *self,
PyErr_SetString(state->PyCursesError, "replace_panel() returned ERR");
return NULL;
}
- Py_INCREF(win);
- Py_SETREF(po->wo, win);
+ Py_SETREF(po->wo, Py_NewRef(win));
Py_RETURN_NONE;
}
@@ -486,8 +481,7 @@ _curses_panel_panel_userptr_impl(PyCursesPanelObject *self,
return NULL;
}
- Py_INCREF(obj);
- return obj;
+ return Py_NewRef(obj);
}
@@ -555,8 +549,7 @@ _curses_panel_bottom_panel_impl(PyObject *module)
"panel_above: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -614,8 +607,7 @@ _curses_panel_top_panel_impl(PyObject *module)
"panel_below: can't find Panel Object");
return NULL;
}
- Py_INCREF(po);
- return (PyObject *)po;
+ return Py_NewRef(po);
}
/*[clinic input]
@@ -670,8 +662,7 @@ _curses_panel_exec(PyObject *mod)
state->PyCursesError = PyErr_NewException(
"_curses_panel.error", NULL, NULL);
- Py_INCREF(state->PyCursesError);
- if (PyModule_AddObject(mod, "error", state->PyCursesError) < 0) {
+ if (PyModule_AddObject(mod, "error", Py_NewRef(state->PyCursesError)) < 0) {
Py_DECREF(state->PyCursesError);
return -1;
}
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 0ddd6dc..5146b40 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -389,8 +389,7 @@ PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
#endif
}
else if (PyBytes_Check(obj)) {
- Py_INCREF(obj);
- *bytes = obj;
+ *bytes = Py_NewRef(obj);
/* check for embedded null bytes */
if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
Py_DECREF(obj);
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 15170b3..20e8516 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -189,8 +189,7 @@ divide_nearest(PyObject *m, PyObject *n)
temp = _PyLong_DivmodNear(m, n);
if (temp == NULL)
return NULL;
- result = PyTuple_GET_ITEM(temp, 0);
- Py_INCREF(result);
+ result = Py_NewRef(PyTuple_GET_ITEM(temp, 0));
Py_DECREF(temp);
return result;
@@ -1005,8 +1004,7 @@ new_datetime_ex2(int year, int month, int day, int hour, int minute,
DATE_SET_SECOND(self, second);
DATE_SET_MICROSECOND(self, usecond);
if (aware) {
- Py_INCREF(tzinfo);
- self->tzinfo = tzinfo;
+ self->tzinfo = Py_NewRef(tzinfo);
}
DATE_SET_FOLD(self, fold);
}
@@ -1083,8 +1081,7 @@ new_time_ex2(int hour, int minute, int second, int usecond,
TIME_SET_SECOND(self, second);
TIME_SET_MICROSECOND(self, usecond);
if (aware) {
- Py_INCREF(tzinfo);
- self->tzinfo = tzinfo;
+ self->tzinfo = Py_NewRef(tzinfo);
}
TIME_SET_FOLD(self, fold);
}
@@ -1165,10 +1162,8 @@ create_timezone(PyObject *offset, PyObject *name)
if (self == NULL) {
return NULL;
}
- Py_INCREF(offset);
- self->offset = offset;
- Py_XINCREF(name);
- self->name = name;
+ self->offset = Py_NewRef(offset);
+ self->name = Py_XNewRef(name);
return (PyObject *)self;
}
@@ -1182,8 +1177,7 @@ new_timezone(PyObject *offset, PyObject *name)
assert(name == NULL || PyUnicode_Check(name));
if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) {
- Py_INCREF(PyDateTime_TimeZone_UTC);
- return PyDateTime_TimeZone_UTC;
+ return Py_NewRef(PyDateTime_TimeZone_UTC);
}
if ((GET_TD_DAYS(offset) == -1 &&
GET_TD_SECONDS(offset) == 0 &&
@@ -1397,8 +1391,7 @@ tzinfo_from_isoformat_results(int rv, int tzoffset, int tz_useconds)
if (rv == 1) {
// Create a timezone from offset in seconds (0 returns UTC)
if (tzoffset == 0) {
- Py_INCREF(PyDateTime_TimeZone_UTC);
- return PyDateTime_TimeZone_UTC;
+ return Py_NewRef(PyDateTime_TimeZone_UTC);
}
PyObject *delta = new_delta(0, tzoffset, tz_useconds, 1);
@@ -1409,8 +1402,7 @@ tzinfo_from_isoformat_results(int rv, int tzoffset, int tz_useconds)
Py_DECREF(delta);
}
else {
- tzinfo = Py_None;
- Py_INCREF(Py_None);
+ tzinfo = Py_NewRef(Py_None);
}
return tzinfo;
@@ -1943,8 +1935,7 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
goto BadDivmod;
}
- num = PyTuple_GET_ITEM(tuple, 0); /* leftover seconds */
- Py_INCREF(num);
+ num = Py_NewRef(PyTuple_GET_ITEM(tuple, 0)); /* leftover seconds */
Py_DECREF(tuple);
tuple = checked_divmod(num, seconds_per_day);
@@ -1962,8 +1953,7 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
goto BadDivmod;
}
- num = PyTuple_GET_ITEM(tuple, 0); /* leftover days */
- Py_INCREF(num);
+ num = Py_NewRef(PyTuple_GET_ITEM(tuple, 0)); /* leftover days */
d = _PyLong_AsInt(num);
if (d == -1 && PyErr_Occurred()) {
goto Done;
@@ -3346,8 +3336,7 @@ iso_calendar_date_year(PyDateTime_IsoCalendarDate *self, void *unused)
if (year == NULL) {
return NULL;
}
- Py_INCREF(year);
- return year;
+ return Py_NewRef(year);
}
static PyObject *
@@ -3357,8 +3346,7 @@ iso_calendar_date_week(PyDateTime_IsoCalendarDate *self, void *unused)
if (week == NULL) {
return NULL;
}
- Py_INCREF(week);
- return week;
+ return Py_NewRef(week);
}
static PyObject *
@@ -3368,8 +3356,7 @@ iso_calendar_date_weekday(PyDateTime_IsoCalendarDate *self, void *unused)
if (weekday == NULL) {
return NULL;
}
- Py_INCREF(weekday);
- return weekday;
+ return Py_NewRef(weekday);
}
static PyGetSetDef iso_calendar_date_getset[] = {
@@ -3980,8 +3967,7 @@ timezone_str(PyDateTime_TimeZone *self)
char sign;
if (self->name != NULL) {
- Py_INCREF(self->name);
- return self->name;
+ return Py_NewRef(self->name);
}
if ((PyObject *)self == PyDateTime_TimeZone_UTC ||
(GET_TD_DAYS(self->offset) == 0 &&
@@ -3997,8 +3983,7 @@ timezone_str(PyDateTime_TimeZone *self)
}
else {
sign = '+';
- offset = self->offset;
- Py_INCREF(offset);
+ offset = Py_NewRef(self->offset);
}
/* Offset is not negative here. */
microseconds = GET_TD_MICROSECONDS(offset);
@@ -4033,8 +4018,7 @@ timezone_utcoffset(PyDateTime_TimeZone *self, PyObject *dt)
if (_timezone_check_argument(dt, "utcoffset") == -1)
return NULL;
- Py_INCREF(self->offset);
- return self->offset;
+ return Py_NewRef(self->offset);
}
static PyObject *
@@ -4171,8 +4155,7 @@ static PyObject *
time_tzinfo(PyDateTime_Time *self, void *unused)
{
PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static PyObject *
@@ -4217,8 +4200,7 @@ time_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
me->hashcode = -1;
me->hastzinfo = aware;
if (aware) {
- Py_INCREF(tzinfo);
- me->tzinfo = tzinfo;
+ me->tzinfo = Py_NewRef(tzinfo);
}
if (pdata[0] & (1 << 7)) {
me->data[0] -= 128;
@@ -4514,12 +4496,10 @@ time_richcompare(PyObject *self, PyObject *other, int op)
result = diff_to_bool(diff, op);
}
else if (op == Py_EQ) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
}
else {
PyErr_SetString(PyExc_TypeError,
@@ -4548,8 +4528,7 @@ time_hash(PyDateTime_Time *self)
return -1;
}
else {
- self0 = (PyObject *)self;
- Py_INCREF(self0);
+ self0 = Py_NewRef(self);
}
offset = time_utcoffset(self0, NULL);
Py_DECREF(self0);
@@ -4846,8 +4825,7 @@ static PyObject *
datetime_tzinfo(PyDateTime_DateTime *self, void *unused)
{
PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static PyObject *
@@ -4894,8 +4872,7 @@ datetime_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
me->hashcode = -1;
me->hastzinfo = aware;
if (aware) {
- Py_INCREF(tzinfo);
- me->tzinfo = tzinfo;
+ me->tzinfo = Py_NewRef(tzinfo);
}
if (pdata[2] & (1 << 7)) {
me->data[2] -= 128;
@@ -5307,8 +5284,7 @@ _sanitize_isoformat_str(PyObject *dtstr)
}
if (surrogate_separator == 0) {
- Py_INCREF(dtstr);
- return dtstr;
+ return Py_NewRef(dtstr);
}
PyObject *str_out = _PyUnicode_Copy(dtstr);
@@ -5622,9 +5598,8 @@ datetime_subtract(PyObject *left, PyObject *right)
int delta_d, delta_s, delta_us;
if (GET_DT_TZINFO(left) == GET_DT_TZINFO(right)) {
- offset2 = offset1 = Py_None;
- Py_INCREF(offset1);
- Py_INCREF(offset2);
+ offset1 = Py_NewRef(Py_None);
+ offset2 = Py_NewRef(Py_None);
}
else {
offset1 = datetime_utcoffset(left, NULL);
@@ -5969,12 +5944,10 @@ datetime_richcompare(PyObject *self, PyObject *other, int op)
result = diff_to_bool(diff, op);
}
else if (op == Py_EQ) {
- result = Py_False;
- Py_INCREF(result);
+ result = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- result = Py_True;
- Py_INCREF(result);
+ result = Py_NewRef(Py_True);
}
else {
PyErr_SetString(PyExc_TypeError,
@@ -6006,8 +5979,7 @@ datetime_hash(PyDateTime_DateTime *self)
return -1;
}
else {
- self0 = (PyObject *)self;
- Py_INCREF(self0);
+ self0 = Py_NewRef(self);
}
offset = datetime_utcoffset(self0, NULL);
Py_DECREF(self0);
@@ -6224,15 +6196,13 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
if (self_tzinfo == NULL)
return NULL;
} else {
- self_tzinfo = self->tzinfo;
- Py_INCREF(self_tzinfo);
+ self_tzinfo = Py_NewRef(self->tzinfo);
}
/* Conversion to self's own time zone is a NOP. */
if (self_tzinfo == tzinfo) {
Py_DECREF(self_tzinfo);
- Py_INCREF(self);
- return self;
+ return (PyDateTime_DateTime*)Py_NewRef(self);
}
/* Convert self to UTC. */
@@ -6278,8 +6248,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
else {
/* Result is already aware - just replace tzinfo. */
temp = result->tzinfo;
- result->tzinfo = PyDateTime_TimeZone_UTC;
- Py_INCREF(result->tzinfo);
+ result->tzinfo = Py_NewRef(PyDateTime_TimeZone_UTC);
Py_DECREF(temp);
}
@@ -6449,8 +6418,7 @@ datetime_utctimetuple(PyDateTime_DateTime *self, PyObject *Py_UNUSED(ignored))
tzinfo = GET_DT_TZINFO(self);
if (tzinfo == Py_None) {
- utcself = self;
- Py_INCREF(utcself);
+ utcself = (PyDateTime_DateTime*)Py_NewRef(self);
}
else {
PyObject *offset;
@@ -6459,8 +6427,7 @@ datetime_utctimetuple(PyDateTime_DateTime *self, PyObject *Py_UNUSED(ignored))
return NULL;
if (offset == Py_None) {
Py_DECREF(offset);
- utcself = self;
- Py_INCREF(utcself);
+ utcself = (PyDateTime_DateTime*)Py_NewRef(self);
}
else {
utcself = (PyDateTime_DateTime *)add_datetime_timedelta(self,
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 9c83e38..5437602 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -358,8 +358,7 @@ _dbm_dbm_get_impl(dbmobject *self, PyTypeObject *cls, const char *key,
return PyBytes_FromStringAndSize(val.dptr, val.dsize);
}
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
/*[clinic input]
@@ -419,8 +418,7 @@ _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key,
static PyObject *
dbm__enter__(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
index 548bd60..2d6e4e4 100644
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -116,15 +116,13 @@ static PyTypeObject PyDecContextManager_Type;
Py_LOCAL_INLINE(PyObject *)
incr_true(void)
{
- Py_INCREF(Py_True);
- return Py_True;
+ return Py_NewRef(Py_True);
}
Py_LOCAL_INLINE(PyObject *)
incr_false(void)
{
- Py_INCREF(Py_False);
- return Py_False;
+ return Py_NewRef(Py_False);
}
@@ -655,8 +653,7 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
}
}
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
static PyObject *
@@ -754,8 +751,7 @@ context_getround(PyObject *self, void *closure UNUSED)
{
int i = mpd_getround(CTX(self));
- Py_INCREF(round_map[i]);
- return round_map[i];
+ return Py_NewRef(round_map[i]);
}
static PyObject *
@@ -1122,13 +1118,11 @@ context_getattr(PyObject *self, PyObject *name)
if (PyUnicode_Check(name)) {
if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) {
retval = ((PyDecContextObject *)self)->traps;
- Py_INCREF(retval);
- return retval;
+ return Py_NewRef(retval);
}
if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) {
retval = ((PyDecContextObject *)self)->flags;
- Py_INCREF(retval);
- return retval;
+ return Py_NewRef(retval);
}
}
@@ -1602,8 +1596,7 @@ PyDec_GetCurrentContext(PyObject *self UNUSED, PyObject *args UNUSED)
return NULL;
}
- Py_INCREF(context);
- return context;
+ return Py_NewRef(context);
}
/* Set the thread local context to a new context, decrement old reference */
@@ -1778,8 +1771,7 @@ ctxmanager_new(PyTypeObject *type UNUSED, PyObject *args, PyObject *kwds)
Py_DECREF(self);
return NULL;
}
- self->global = global;
- Py_INCREF(self->global);
+ self->global = Py_NewRef(global);
int ret = context_setattrs(
self->local, prec, rounding,
@@ -1814,8 +1806,7 @@ ctxmanager_set_local(PyDecContextManagerObject *self, PyObject *args UNUSED)
}
Py_DECREF(ret);
- Py_INCREF(self->local);
- return self->local;
+ return Py_NewRef(self->local);
}
static PyObject *
@@ -2418,8 +2409,7 @@ PyDecType_FromDecimalExact(PyTypeObject *type, PyObject *v, PyObject *context)
uint32_t status = 0;
if (type == &PyDec_Type && PyDec_CheckExact(v)) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
dec = PyDecType_New(type);
@@ -2440,8 +2430,7 @@ static PyObject *
sequence_as_tuple(PyObject *v, PyObject *ex, const char *mesg)
{
if (PyTuple_Check(v)) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
if (PyList_Check(v)) {
return PyList_AsTuple(v);
@@ -2863,8 +2852,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
{
if (PyDec_Check(v)) {
- *conv = v;
- Py_INCREF(v);
+ *conv = Py_NewRef(v);
return 1;
}
if (PyLong_Check(v)) {
@@ -2881,8 +2869,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
Py_TYPE(v)->tp_name);
}
else {
- Py_INCREF(Py_NotImplemented);
- *conv = Py_NotImplemented;
+ *conv = Py_NewRef(Py_NotImplemented);
}
return 0;
}
@@ -3041,8 +3028,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
*vcmp = v;
if (PyDec_Check(w)) {
- Py_INCREF(w);
- *wcmp = w;
+ *wcmp = Py_NewRef(w);
}
else if (PyLong_Check(w)) {
*wcmp = PyDec_FromLongExact(w, context);
@@ -3074,8 +3060,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
}
}
else {
- Py_INCREF(Py_NotImplemented);
- *wcmp = Py_NotImplemented;
+ *wcmp = Py_NewRef(Py_NotImplemented);
}
}
else {
@@ -3093,8 +3078,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
}
}
else {
- Py_INCREF(Py_NotImplemented);
- *wcmp = Py_NotImplemented;
+ *wcmp = Py_NewRef(Py_NotImplemented);
}
}
@@ -4329,15 +4313,13 @@ dec_mpd_adjexp(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_canonical(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
dec_conjugate(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -4654,8 +4636,7 @@ dec_complex(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_copy(PyObject *self, PyObject *dummy UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
/* __floor__ */
@@ -4838,8 +4819,7 @@ dec_trunc(PyObject *self, PyObject *dummy UNUSED)
static PyObject *
dec_real(PyObject *self, void *closure UNUSED)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -5384,8 +5364,7 @@ ctx_canonical(PyObject *context UNUSED, PyObject *v)
return NULL;
}
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
static PyObject *
@@ -5916,23 +5895,17 @@ PyInit__decimal(void)
/* Create the module */
ASSIGN_PTR(m, PyModule_Create(&_decimal_module));
-
/* Add types to the module */
- Py_INCREF(&PyDec_Type);
- CHECK_INT(PyModule_AddObject(m, "Decimal", (PyObject *)&PyDec_Type));
- Py_INCREF(&PyDecContext_Type);
+ CHECK_INT(PyModule_AddObject(m, "Decimal", Py_NewRef(&PyDec_Type)));
CHECK_INT(PyModule_AddObject(m, "Context",
- (PyObject *)&PyDecContext_Type));
- Py_INCREF(DecimalTuple);
- CHECK_INT(PyModule_AddObject(m, "DecimalTuple", (PyObject *)DecimalTuple));
-
+ Py_NewRef(&PyDecContext_Type)));
+ CHECK_INT(PyModule_AddObject(m, "DecimalTuple", Py_NewRef(DecimalTuple)));
/* Create top level exception */
ASSIGN_PTR(DecimalException, PyErr_NewException(
"decimal.DecimalException",
PyExc_ArithmeticError, NULL));
- Py_INCREF(DecimalException);
- CHECK_INT(PyModule_AddObject(m, "DecimalException", DecimalException));
+ CHECK_INT(PyModule_AddObject(m, "DecimalException", Py_NewRef(DecimalException)));
/* Create signal tuple */
ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));
@@ -5972,12 +5945,10 @@ PyInit__decimal(void)
Py_DECREF(base);
/* add to module */
- Py_INCREF(cm->ex);
- CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+ CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
/* add to signal tuple */
- Py_INCREF(cm->ex);
- PyTuple_SET_ITEM(SignalTuple, i, cm->ex);
+ PyTuple_SET_ITEM(SignalTuple, i, Py_NewRef(cm->ex));
}
/*
@@ -6003,45 +5974,38 @@ PyInit__decimal(void)
ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL));
Py_DECREF(base);
- Py_INCREF(cm->ex);
- CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+ CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
}
/* Init default context template first */
ASSIGN_PTR(default_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
- Py_INCREF(default_context_template);
CHECK_INT(PyModule_AddObject(m, "DefaultContext",
- default_context_template));
+ Py_NewRef(default_context_template)));
#ifndef WITH_DECIMAL_CONTEXTVAR
ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__"));
- Py_INCREF(Py_False);
- CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_False));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_False)));
#else
ASSIGN_PTR(current_context_var, PyContextVar_New("decimal_context", NULL));
- Py_INCREF(Py_True);
- CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_True));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_True)));
#endif
- Py_INCREF(Py_True);
- CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_True));
+ CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_NewRef(Py_True)));
/* Init basic context template */
ASSIGN_PTR(basic_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_basic_context(basic_context_template);
- Py_INCREF(basic_context_template);
CHECK_INT(PyModule_AddObject(m, "BasicContext",
- basic_context_template));
+ Py_NewRef(basic_context_template)));
/* Init extended context template */
ASSIGN_PTR(extended_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_extended_context(extended_context_template);
- Py_INCREF(extended_context_template);
CHECK_INT(PyModule_AddObject(m, "ExtendedContext",
- extended_context_template));
+ Py_NewRef(extended_context_template)));
/* Init mpd_ssize_t constants */
@@ -6060,8 +6024,7 @@ PyInit__decimal(void)
/* Init string constants */
for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) {
ASSIGN_PTR(round_map[i], PyUnicode_InternFromString(mpd_round_string[i]));
- Py_INCREF(round_map[i]);
- CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], round_map[i]));
+ CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], Py_NewRef(round_map[i])));
}
/* Add specification version number */
diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
index e4036e1..3aef296 100644
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -105,8 +105,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
if (pto == NULL)
return NULL;
- pto->fn = func;
- Py_INCREF(func);
+ pto->fn = Py_NewRef(func);
nargs = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX);
if (nargs == NULL) {
@@ -131,8 +130,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
pto->kw = PyDict_New();
}
else if (Py_REFCNT(kw) == 1) {
- Py_INCREF(kw);
- pto->kw = kw;
+ pto->kw = Py_NewRef(kw);
}
else {
pto->kw = PyDict_Copy(kw);
@@ -302,8 +300,7 @@ partial_call(partialobject *pto, PyObject *args, PyObject *kwargs)
PyObject *kwargs2;
if (PyDict_GET_SIZE(pto->kw) == 0) {
/* kwargs can be NULL */
- kwargs2 = kwargs;
- Py_XINCREF(kwargs2);
+ kwargs2 = Py_XNewRef(kwargs);
}
else {
/* bpo-27840, bpo-29318: dictionary of keyword parameters must be
@@ -463,8 +460,7 @@ partial_setstate(partialobject *pto, PyObject *state)
else
Py_INCREF(dict);
- Py_INCREF(fn);
- Py_SETREF(pto->fn, fn);
+ Py_SETREF(pto->fn, Py_NewRef(fn));
Py_SETREF(pto->args, fnargs);
Py_SETREF(pto->kw, kw);
Py_XSETREF(pto->dict, dict);
@@ -588,10 +584,8 @@ keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds)
if (result == NULL) {
return NULL;
}
- Py_INCREF(ko->cmp);
- result->cmp = ko->cmp;
- Py_INCREF(object);
- result->object = object;
+ result->cmp = Py_NewRef(ko->cmp);
+ result->object = Py_NewRef(object);
PyObject_GC_Track(result);
return (PyObject *)result;
}
@@ -654,8 +648,7 @@ _functools_cmp_to_key_impl(PyObject *module, PyObject *mycmp)
object = PyObject_GC_New(keyobject, state->keyobject_type);
if (!object)
return NULL;
- Py_INCREF(mycmp);
- object->cmp = mycmp;
+ object->cmp = Py_NewRef(mycmp);
object->object = NULL;
PyObject_GC_Track(object);
return (PyObject *)object;
@@ -837,12 +830,10 @@ lru_cache_make_key(PyObject *kwd_mark, PyObject *args,
if (PyUnicode_CheckExact(key) || PyLong_CheckExact(key)) {
/* For common scalar keys, save space by
dropping the enclosing args tuple */
- Py_INCREF(key);
- return key;
+ return Py_NewRef(key);
}
}
- Py_INCREF(args);
- return args;
+ return Py_NewRef(args);
}
key_size = PyTuple_GET_SIZE(args);
@@ -858,31 +849,25 @@ lru_cache_make_key(PyObject *kwd_mark, PyObject *args,
key_pos = 0;
for (pos = 0; pos < PyTuple_GET_SIZE(args); ++pos) {
PyObject *item = PyTuple_GET_ITEM(args, pos);
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
if (kwds_size) {
- Py_INCREF(kwd_mark);
- PyTuple_SET_ITEM(key, key_pos++, kwd_mark);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(kwd_mark));
for (pos = 0; PyDict_Next(kwds, &pos, &keyword, &value);) {
- Py_INCREF(keyword);
- PyTuple_SET_ITEM(key, key_pos++, keyword);
- Py_INCREF(value);
- PyTuple_SET_ITEM(key, key_pos++, value);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(keyword));
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(value));
}
assert(key_pos == PyTuple_GET_SIZE(args) + kwds_size * 2 + 1);
}
if (typed) {
for (pos = 0; pos < PyTuple_GET_SIZE(args); ++pos) {
PyObject *item = (PyObject *)Py_TYPE(PyTuple_GET_ITEM(args, pos));
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
if (kwds_size) {
for (pos = 0; PyDict_Next(kwds, &pos, &keyword, &value);) {
PyObject *item = (PyObject *)Py_TYPE(value);
- Py_INCREF(item);
- PyTuple_SET_ITEM(key, key_pos++, item);
+ PyTuple_SET_ITEM(key, key_pos++, Py_NewRef(item));
}
}
}
@@ -1084,8 +1069,7 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds
return NULL;
}
lru_cache_append_link(self, link);
- Py_INCREF(result); /* for return */
- return result;
+ return Py_NewRef(result);
}
/* Since the cache is full, we need to evict an old key and add
a new key. Rather than free the old link and allocate a new
@@ -1230,16 +1214,12 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw)
obj->wrapper = wrapper;
obj->typed = typed;
obj->cache = cachedict;
- Py_INCREF(func);
- obj->func = func;
+ obj->func = Py_NewRef(func);
obj->misses = obj->hits = 0;
obj->maxsize = maxsize;
- Py_INCREF(state->kwd_mark);
- obj->kwd_mark = state->kwd_mark;
- Py_INCREF(state->lru_list_elem_type);
- obj->lru_list_elem_type = state->lru_list_elem_type;
- Py_INCREF(cache_info_type);
- obj->cache_info_type = cache_info_type;
+ obj->kwd_mark = Py_NewRef(state->kwd_mark);
+ obj->lru_list_elem_type = (PyTypeObject*)Py_NewRef(state->lru_list_elem_type);
+ obj->cache_info_type = Py_NewRef(cache_info_type);
obj->dict = NULL;
obj->weakreflist = NULL;
return (PyObject *)obj;
@@ -1306,8 +1286,7 @@ static PyObject *
lru_cache_descr_get(PyObject *self, PyObject *obj, PyObject *type)
{
if (obj == Py_None || obj == NULL) {
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
return PyMethod_New(self, obj);
}
@@ -1360,15 +1339,13 @@ lru_cache_reduce(PyObject *self, PyObject *unused)
static PyObject *
lru_cache_copy(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
lru_cache_deepcopy(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static int
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index a96d323..4e8acde 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -256,8 +256,7 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
res = gdbm_subscript(self, key);
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
PyErr_Clear();
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
return res;
}
@@ -566,8 +565,7 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls)
static PyObject *
gdbm__enter__(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -677,7 +675,6 @@ dbmopen_impl(PyObject *module, PyObject *filename, const char *flags,
return NULL;
}
for (flags++; *flags != '\0'; flags++) {
- char buf[40];
switch (*flags) {
#ifdef GDBM_FAST
case 'f':
@@ -695,9 +692,8 @@ dbmopen_impl(PyObject *module, PyObject *filename, const char *flags,
break;
#endif
default:
- PyOS_snprintf(buf, sizeof(buf), "Flag '%c' is not supported.",
- *flags);
- PyErr_SetString(state->gdbm_error, buf);
+ PyErr_Format(state->gdbm_error,
+ "Flag '%c' is not supported.", (unsigned char)*flags);
return NULL;
}
}
diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c
index 3dbaaa0..07ddc7b 100644
--- a/Modules/_heapqmodule.c
+++ b/Modules/_heapqmodule.c
@@ -197,8 +197,7 @@ heapreplace_internal(PyObject *heap, PyObject *item, int siftup_func(PyListObjec
}
returnitem = PyList_GET_ITEM(heap, 0);
- Py_INCREF(item);
- PyList_SET_ITEM(heap, 0, item);
+ PyList_SET_ITEM(heap, 0, Py_NewRef(item));
if (siftup_func((PyListObject *)heap, 0)) {
Py_DECREF(returnitem);
return NULL;
@@ -253,8 +252,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
int cmp;
if (PyList_GET_SIZE(heap) == 0) {
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
PyObject* top = PyList_GET_ITEM(heap, 0);
@@ -264,8 +262,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
if (cmp < 0)
return NULL;
if (cmp == 0) {
- Py_INCREF(item);
- return item;
+ return Py_NewRef(item);
}
if (PyList_GET_SIZE(heap) == 0) {
@@ -274,8 +271,7 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item)
}
returnitem = PyList_GET_ITEM(heap, 0);
- Py_INCREF(item);
- PyList_SET_ITEM(heap, 0, item);
+ PyList_SET_ITEM(heap, 0, Py_NewRef(item));
if (siftup((PyListObject *)heap, 0)) {
Py_DECREF(returnitem);
return NULL;
@@ -410,8 +406,7 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
newitem = arr[pos];
while (pos > startpos) {
parentpos = (pos - 1) >> 1;
- parent = arr[parentpos];
- Py_INCREF(parent);
+ parent = Py_NewRef(arr[parentpos]);
Py_INCREF(newitem);
cmp = PyObject_RichCompareBool(parent, newitem, Py_LT);
Py_DECREF(parent);
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index a7b2e98..ccd40ab 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -212,8 +212,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode,
is_number = PyNumber_Check(file);
if (is_number) {
- path_or_fd = file;
- Py_INCREF(path_or_fd);
+ path_or_fd = Py_NewRef(file);
} else {
path_or_fd = PyOS_FSPath(file);
if (path_or_fd == NULL) {
@@ -489,8 +488,7 @@ _io_text_encoding_impl(PyObject *module, PyObject *encoding, int stacklevel)
encoding = &_Py_ID(locale);
}
}
- Py_INCREF(encoding);
- return encoding;
+ return Py_NewRef(encoding);
}
@@ -697,9 +695,8 @@ PyInit__io(void)
"UnsupportedOperation", PyExc_OSError, PyExc_ValueError);
if (state->unsupported_operation == NULL)
goto fail;
- Py_INCREF(state->unsupported_operation);
if (PyModule_AddObject(m, "UnsupportedOperation",
- state->unsupported_operation) < 0)
+ Py_NewRef(state->unsupported_operation)) < 0)
goto fail;
/* BlockingIOError, for compatibility */
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 4a4a199..e261093 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -481,8 +481,7 @@ buffered_close(buffered *self, PyObject *args)
if (r < 0)
goto end;
if (r > 0) {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
goto end;
}
@@ -1007,8 +1006,7 @@ _buffered_readinto_generic(buffered *self, Py_buffer *buffer, char readinto1)
break;
if (n < 0) {
if (n == -2) {
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
}
goto end;
}
@@ -1422,8 +1420,7 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw,
if (_PyIOBase_check_readable(raw, Py_True) == NULL)
return -1;
- Py_INCREF(raw);
- Py_XSETREF(self->raw, raw);
+ Py_XSETREF(self->raw, Py_NewRef(raw));
self->buffer_size = buffer_size;
self->readable = 1;
self->writable = 0;
diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c
index 930ef7e..41be349 100644
--- a/Modules/_io/bytesio.c
+++ b/Modules/_io/bytesio.c
@@ -324,8 +324,7 @@ _io_BytesIO_getbuffer_impl(bytesio *self)
buf = (bytesiobuf *) type->tp_alloc(type, 0);
if (buf == NULL)
return NULL;
- Py_INCREF(self);
- buf->source = self;
+ buf->source = (bytesio*)Py_NewRef(self);
view = PyMemoryView_FromObject((PyObject *) buf);
Py_DECREF(buf);
return view;
@@ -356,8 +355,7 @@ _io_BytesIO_getvalue_impl(bytesio *self)
return NULL;
}
}
- Py_INCREF(self->buf);
- return self->buf;
+ return Py_NewRef(self->buf);
}
/*[clinic input]
@@ -401,8 +399,7 @@ read_bytes(bytesio *self, Py_ssize_t size)
self->pos == 0 && size == PyBytes_GET_SIZE(self->buf) &&
self->exports == 0) {
self->pos += size;
- Py_INCREF(self->buf);
- return self->buf;
+ return Py_NewRef(self->buf);
}
output = PyBytes_AS_STRING(self->buf) + self->pos;
@@ -791,8 +788,7 @@ bytesio_getstate(bytesio *self, PyObject *Py_UNUSED(ignored))
if (initvalue == NULL)
return NULL;
if (self->dict == NULL) {
- Py_INCREF(Py_None);
- dict = Py_None;
+ dict = Py_NewRef(Py_None);
}
else {
dict = PyDict_Copy(self->dict);
@@ -875,8 +871,7 @@ bytesio_setstate(bytesio *self, PyObject *state)
return NULL;
}
else {
- Py_INCREF(dict);
- self->dict = dict;
+ self->dict = Py_NewRef(dict);
}
}
@@ -943,8 +938,7 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)
}
if (initvalue && initvalue != Py_None) {
if (PyBytes_CheckExact(initvalue)) {
- Py_INCREF(initvalue);
- Py_XSETREF(self->buf, initvalue);
+ Py_XSETREF(self->buf, Py_NewRef(initvalue));
self->string_size = PyBytes_GET_SIZE(initvalue);
}
else {
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 6ae43a8..7b9391e 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -464,8 +464,7 @@ iobase_enter(PyObject *self, PyObject *args)
if (iobase_check_closed(self))
return NULL;
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -642,8 +641,7 @@ iobase_iter(PyObject *self)
if (iobase_check_closed(self))
return NULL;
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index 0f31c17..5c3bf35 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -188,8 +188,7 @@ write_str(stringio *self, PyObject *obj)
self->decoder, obj, 1 /* always final */);
}
else {
- decoded = obj;
- Py_INCREF(decoded);
+ decoded = Py_NewRef(obj);
}
if (self->writenl) {
PyObject *translated = PyUnicode_Replace(
@@ -710,8 +709,7 @@ _io_StringIO___init___impl(stringio *self, PyObject *value,
is pointless for StringIO)
*/
if (newline != NULL && newline[0] == '\r') {
- self->writenl = self->readnl;
- Py_INCREF(self->writenl);
+ self->writenl = Py_NewRef(self->readnl);
}
if (self->readuniversal) {
@@ -823,8 +821,7 @@ stringio_getstate(stringio *self, PyObject *Py_UNUSED(ignored))
if (initvalue == NULL)
return NULL;
if (self->dict == NULL) {
- Py_INCREF(Py_None);
- dict = Py_None;
+ dict = Py_NewRef(Py_None);
}
else {
dict = PyDict_Copy(self->dict);
@@ -934,8 +931,7 @@ stringio_setstate(stringio *self, PyObject *state)
return NULL;
}
else {
- Py_INCREF(dict);
- self->dict = dict;
+ self->dict = Py_NewRef(dict);
}
}
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 3369694..8b5d00f 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -231,16 +231,14 @@ _io_IncrementalNewlineDecoder___init___impl(nldecoder_object *self,
PyObject *errors)
/*[clinic end generated code: output=fbd04d443e764ec2 input=89db6b19c6b126bf]*/
{
- self->decoder = decoder;
- Py_INCREF(decoder);
+ self->decoder = Py_NewRef(decoder);
if (errors == NULL) {
- self->errors = &_Py_ID(strict);
+ self->errors = Py_NewRef(&_Py_ID(strict));
}
else {
- self->errors = errors;
+ self->errors = Py_NewRef(errors);
}
- Py_INCREF(self->errors);
self->translate = translate ? 1 : 0;
self->seennl = 0;
@@ -301,8 +299,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself,
&_Py_ID(decode), input, final ? Py_True : Py_False, NULL);
}
else {
- output = input;
- Py_INCREF(output);
+ output = Py_NewRef(input);
}
if (check_decoded(output) < 0)
@@ -1148,8 +1145,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
* of the partially constructed object (like self->encoding)
*/
- Py_INCREF(errors);
- self->errors = errors;
+ self->errors = Py_NewRef(errors);
self->chunk_size = 8192;
self->line_buffering = line_buffering;
self->write_through = write_through;
@@ -1157,8 +1153,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
goto error;
}
- self->buffer = buffer;
- Py_INCREF(buffer);
+ self->buffer = Py_NewRef(buffer);
/* Build the decoder object */
if (_textiowrapper_set_decoder(self, codec_info, PyUnicode_AsUTF8(errors)) != 0)
@@ -1284,9 +1279,8 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding,
}
Py_DECREF(codec_info);
- Py_INCREF(errors);
Py_SETREF(self->encoding, encoding);
- Py_SETREF(self->errors, errors);
+ Py_SETREF(self->errors, Py_NewRef(errors));
return _textiowrapper_fix_encoder_state(self);
}
@@ -1502,8 +1496,7 @@ _textiowrapper_writeflush(textio *self)
PyObject *b;
if (PyBytes_Check(pending)) {
- b = pending;
- Py_INCREF(b);
+ b = Py_NewRef(pending);
}
else if (PyUnicode_Check(pending)) {
assert(PyUnicode_IS_ASCII(pending));
@@ -1618,8 +1611,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text)
// See bpo-43260
PyUnicode_GET_LENGTH(text) <= self->chunk_size &&
is_asciicompat_encoding(self->encodefunc)) {
- b = text;
- Py_INCREF(b);
+ b = Py_NewRef(text);
}
else {
b = (*self->encodefunc)((PyObject *) self, text);
@@ -1741,8 +1733,7 @@ textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)
return NULL;
}
else {
- chars = self->decoded_chars;
- Py_INCREF(chars);
+ chars = Py_NewRef(self->decoded_chars);
}
self->decoded_chars_used += n;
@@ -2139,10 +2130,9 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
}
if (remaining == NULL) {
- line = self->decoded_chars;
+ line = Py_NewRef(self->decoded_chars);
start = self->decoded_chars_used;
offset_to_buffer = 0;
- Py_INCREF(line);
}
else {
assert(self->decoded_chars_used == 0);
@@ -3115,8 +3105,7 @@ static PyObject *
textiowrapper_errors_get(textio *self, void *context)
{
CHECK_INITIALIZED(self);
- Py_INCREF(self->errors);
- return self->errors;
+ return Py_NewRef(self->errors);
}
static PyObject *
diff --git a/Modules/_json.c b/Modules/_json.c
index 82f960f..06f232f 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -1243,16 +1243,17 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (s == NULL)
return NULL;
- s->markers = markers;
- s->defaultfn = defaultfn;
- s->encoder = encoder;
- s->indent = indent;
- s->key_separator = key_separator;
- s->item_separator = item_separator;
+ s->markers = Py_NewRef(markers);
+ s->defaultfn = Py_NewRef(defaultfn);
+ s->encoder = Py_NewRef(encoder);
+ s->indent = Py_NewRef(indent);
+ s->key_separator = Py_NewRef(key_separator);
+ s->item_separator = Py_NewRef(item_separator);
s->sort_keys = sort_keys;
s->skipkeys = skipkeys;
s->allow_nan = allow_nan;
s->fast_encode = NULL;
+
if (PyCFunction_Check(s->encoder)) {
PyCFunction f = PyCFunction_GetFunction(s->encoder);
if (f == (PyCFunction)py_encode_basestring_ascii ||
@@ -1261,12 +1262,6 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
}
- Py_INCREF(s->markers);
- Py_INCREF(s->defaultfn);
- Py_INCREF(s->encoder);
- Py_INCREF(s->indent);
- Py_INCREF(s->key_separator);
- Py_INCREF(s->item_separator);
return (PyObject *)s;
}
@@ -1480,8 +1475,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
PyObject *encoded;
if (PyUnicode_Check(key)) {
- Py_INCREF(key);
- keystr = key;
+ keystr = Py_NewRef(key);
}
else if (PyFloat_Check(key)) {
keystr = encoder_encode_float(s, key);
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index a0e262b..cb80c8d 100644
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -128,8 +128,7 @@ normalizeUserObj(PyObject *obj)
{
PyCFunctionObject *fn;
if (!PyCFunction_Check(obj)) {
- Py_INCREF(obj);
- return obj;
+ return Py_NewRef(obj);
}
/* Replace built-in function objects with a descriptive string
because of built-in methods -- keeping a reference to
@@ -142,8 +141,7 @@ normalizeUserObj(PyObject *obj)
PyObject *modname = NULL;
if (mod != NULL) {
if (PyUnicode_Check(mod)) {
- modname = mod;
- Py_INCREF(modname);
+ modname = Py_NewRef(mod);
}
else if (PyModule_Check(mod)) {
modname = PyModule_GetNameObject(mod);
@@ -555,8 +553,7 @@ static int statsForEntry(rotating_node_t *node, void *arg)
}
}
else {
- Py_INCREF(Py_None);
- collect->sublist = Py_None;
+ collect->sublist = Py_NewRef(Py_None);
}
info = PyObject_CallFunction((PyObject*) collect->state->stats_entry_type,
@@ -781,8 +778,7 @@ profiler_init(ProfilerObject *pObj, PyObject *args, PyObject *kw)
if (setSubcalls(pObj, subcalls) < 0 || setBuiltins(pObj, builtins) < 0)
return -1;
pObj->externalTimerUnit = timeunit;
- Py_XINCREF(timer);
- Py_XSETREF(pObj->externalTimer, timer);
+ Py_XSETREF(pObj->externalTimer, Py_XNewRef(timer));
return 0;
}
diff --git a/Modules/_operator.c b/Modules/_operator.c
index 3005845..4f23671 100644
--- a/Modules/_operator.c
+++ b/Modules/_operator.c
@@ -722,8 +722,7 @@ _operator_is_not_impl(PyObject *module, PyObject *a, PyObject *b)
{
PyObject *result;
result = (a != b) ? Py_True : Py_False;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
/* compare_digest **********************************************************/
@@ -1010,8 +1009,7 @@ itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- Py_INCREF(item);
- ig->item = item;
+ ig->item = Py_NewRef(item);
ig->nitems = nitems;
ig->index = -1;
if (PyLong_CheckExact(item)) {
@@ -1095,8 +1093,7 @@ itemgetter_call_impl(itemgetterobject *ig, PyObject *obj)
&& ig->index < PyTuple_GET_SIZE(obj))
{
result = PyTuple_GET_ITEM(obj, ig->index);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
return PyObject_GetItem(obj, ig->item);
}
@@ -1440,8 +1437,7 @@ dotjoinattr(PyObject *attr, PyObject **attrsep)
}
return PyUnicode_Join(*attrsep, attr);
} else {
- Py_INCREF(attr);
- return attr;
+ return Py_NewRef(attr);
}
}
@@ -1594,8 +1590,7 @@ methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyUnicode_InternInPlace(&name);
mc->name = name;
- Py_XINCREF(kwds);
- mc->kwds = kwds;
+ mc->kwds = Py_XNewRef(kwds);
mc->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
if (mc->args == NULL) {
@@ -1740,12 +1735,10 @@ methodcaller_reduce(methodcallerobject *mc, PyObject *Py_UNUSED(ignored))
newargs = PyTuple_New(1 + callargcount);
if (newargs == NULL)
return NULL;
- Py_INCREF(mc->name);
- PyTuple_SET_ITEM(newargs, 0, mc->name);
+ PyTuple_SET_ITEM(newargs, 0, Py_NewRef(mc->name));
for (i = 0; i < callargcount; ++i) {
PyObject *arg = PyTuple_GET_ITEM(mc->args, i);
- Py_INCREF(arg);
- PyTuple_SET_ITEM(newargs, i + 1, arg);
+ PyTuple_SET_ITEM(newargs, i + 1, Py_NewRef(arg));
}
return Py_BuildValue("ON", Py_TYPE(mc), newargs);
}
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 51e0a24..db62094 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -386,10 +386,9 @@ init_method_ref(PyObject *self, PyObject *name,
if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
/* Deconstruct a bound Python method */
- func2 = PyMethod_GET_FUNCTION(func);
- Py_INCREF(func2);
*method_self = self; /* borrowed */
- Py_XSETREF(*method_func, func2);
+ func2 = PyMethod_GET_FUNCTION(func);
+ Py_XSETREF(*method_func, Py_NewRef(func2));
Py_DECREF(func);
return 0;
}
@@ -408,8 +407,7 @@ reconstruct_method(PyObject *func, PyObject *self)
return PyMethod_New(func, self);
}
else {
- Py_INCREF(func);
- return func;
+ return Py_NewRef(func);
}
}
@@ -907,8 +905,7 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
entry->me_value = value;
return 0;
}
- Py_INCREF(key);
- entry->me_key = key;
+ entry->me_key = Py_NewRef(key);
entry->me_value = value;
self->mt_used++;
@@ -1196,8 +1193,7 @@ _Pickler_SetBufferCallback(PicklerObject *self, PyObject *buffer_callback)
return -1;
}
- Py_XINCREF(buffer_callback);
- self->buffer_callback = buffer_callback;
+ self->buffer_callback = Py_XNewRef(buffer_callback);
return 0;
}
@@ -1543,9 +1539,8 @@ _Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)
return -1;
assert(idx < self->memo_size);
}
- Py_INCREF(value);
old_item = self->memo[idx];
- self->memo[idx] = value;
+ self->memo[idx] = Py_NewRef(value);
if (old_item != NULL) {
Py_DECREF(old_item);
}
@@ -1928,8 +1923,7 @@ whichmodule(PyObject *global, PyObject *dotted_path)
i = 0;
while (PyDict_Next(modules, &i, &module_name, &module)) {
if (_checkmodule(module_name, module, global, dotted_path) == 0) {
- Py_INCREF(module_name);
- return module_name;
+ return Py_NewRef(module_name);
}
if (PyErr_Occurred()) {
return NULL;
@@ -1965,8 +1959,7 @@ whichmodule(PyObject *global, PyObject *dotted_path)
/* If no module is found, use __main__. */
module_name = &_Py_ID(__main__);
- Py_INCREF(module_name);
- return module_name;
+ return Py_NewRef(module_name);
}
/* fast_save_enter() and fast_save_leave() are guards against recursive
@@ -3557,10 +3550,8 @@ fix_imports(PyObject **module_name, PyObject **global_name)
Py_CLEAR(*module_name);
Py_CLEAR(*global_name);
- Py_INCREF(fixed_module_name);
- Py_INCREF(fixed_global_name);
- *module_name = fixed_module_name;
- *global_name = fixed_global_name;
+ *module_name = Py_NewRef(fixed_module_name);
+ *global_name = Py_NewRef(fixed_global_name);
return 0;
}
else if (PyErr_Occurred()) {
@@ -3576,8 +3567,7 @@ fix_imports(PyObject **module_name, PyObject **global_name)
Py_TYPE(item)->tp_name);
return -1;
}
- Py_INCREF(item);
- Py_XSETREF(*module_name, item);
+ Py_XSETREF(*module_name, Py_NewRef(item));
}
else if (PyErr_Occurred()) {
return -1;
@@ -3602,8 +3592,7 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
const char global_op = GLOBAL;
if (name) {
- Py_INCREF(name);
- global_name = name;
+ global_name = Py_NewRef(name);
}
else {
if (_PyObject_LookupAttr(obj, &_Py_ID(__qualname__), &global_name) < 0)
@@ -3637,8 +3626,8 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
obj, module_name);
goto error;
}
- lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
- Py_INCREF(lastname);
+ lastname = Py_NewRef(PyList_GET_ITEM(dotted_path,
+ PyList_GET_SIZE(dotted_path) - 1));
cls = get_deep_attribute(module, dotted_path, &parent);
Py_CLEAR(dotted_path);
if (cls == NULL) {
@@ -3932,8 +3921,7 @@ get_class(PyObject *obj)
PyObject *cls;
if (_PyObject_LookupAttr(obj, &_Py_ID(__class__), &cls) == 0) {
- cls = (PyObject *) Py_TYPE(obj);
- Py_INCREF(cls);
+ cls = Py_NewRef(Py_TYPE(obj));
}
return cls;
}
@@ -4084,12 +4072,10 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
return -1;
}
PyTuple_SET_ITEM(newargs, 0, cls_new);
- Py_INCREF(cls);
- PyTuple_SET_ITEM(newargs, 1, cls);
+ PyTuple_SET_ITEM(newargs, 1, Py_NewRef(cls));
for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
PyObject *item = PyTuple_GET_ITEM(args, i);
- Py_INCREF(item);
- PyTuple_SET_ITEM(newargs, i + 2, item);
+ PyTuple_SET_ITEM(newargs, i + 2, Py_NewRef(item));
}
callable = PyObject_Call(st->partial, newargs, kwargs);
@@ -4405,8 +4391,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
}
}
if (reduce_func != NULL) {
- Py_INCREF(obj);
- reduce_value = _Pickle_FastCall(reduce_func, obj);
+ reduce_value = _Pickle_FastCall(reduce_func, Py_NewRef(obj));
}
else if (PyType_IsSubtype(type, &PyType_Type)) {
status = save_global(self, obj, NULL);
@@ -4869,8 +4854,7 @@ _pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
return NULL;
}
PyTuple_SET_ITEM(dict_args, 0, contents);
- Py_INCREF((PyObject *)&PyDict_Type);
- PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
+ PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
PyTuple_SET_ITEM(reduce_value, 1, dict_args);
return reduce_value;
}
@@ -4944,8 +4928,7 @@ PicklerMemoProxy_New(PicklerObject *pickler)
self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
if (self == NULL)
return NULL;
- Py_INCREF(pickler);
- self->pickler = pickler;
+ self->pickler = (PicklerObject*)Py_NewRef(pickler);
PyObject_GC_Track(self);
return (PyObject *)self;
}
@@ -5045,8 +5028,7 @@ Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored
}
self->pers_func_self = NULL;
- Py_INCREF(value);
- Py_XSETREF(self->pers_func, value);
+ Py_XSETREF(self->pers_func, Py_NewRef(value));
return 0;
}
@@ -7370,8 +7352,7 @@ _pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
return NULL;
}
PyTuple_SET_ITEM(constructor_args, 0, contents);
- Py_INCREF((PyObject *)&PyDict_Type);
- PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
+ PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
return reduce_value;
}
@@ -7446,8 +7427,7 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
&UnpicklerMemoProxyType);
if (self == NULL)
return NULL;
- Py_INCREF(unpickler);
- self->unpickler = unpickler;
+ self->unpickler = (UnpicklerObject*)Py_NewRef(unpickler);
PyObject_GC_Track(self);
return (PyObject *)self;
}
@@ -7483,8 +7463,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
return -1;
for (size_t i = 0; i < new_memo_size; i++) {
- Py_XINCREF(unpickler->memo[i]);
- new_memo[i] = unpickler->memo[i];
+ new_memo[i] = Py_XNewRef(unpickler->memo[i]);
}
}
else if (PyDict_Check(obj)) {
@@ -7564,8 +7543,7 @@ Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(i
}
self->pers_func_self = NULL;
- Py_INCREF(value);
- Py_XSETREF(self->pers_func, value);
+ Py_XSETREF(self->pers_func, Py_NewRef(value));
return 0;
}
@@ -7944,8 +7922,7 @@ PyInit__pickle(void)
m = PyState_FindModule(&_picklemodule);
if (m) {
- Py_INCREF(m);
- return m;
+ return Py_NewRef(m);
}
if (PyType_Ready(&Pdata_Type) < 0)
diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c
index 44039ce..4b6290a 100644
--- a/Modules/_sre/sre.c
+++ b/Modules/_sre/sre.c
@@ -459,8 +459,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
state->start = (void*) ((char*) ptr + start * state->charsize);
state->end = (void*) ((char*) ptr + end * state->charsize);
- Py_INCREF(string);
- state->string = string;
+ state->string = Py_NewRef(string);
state->pos = start;
state->endpos = end;
@@ -499,8 +498,7 @@ getslice(int isbytes, const void *ptr,
if (isbytes) {
if (PyBytes_CheckExact(string) &&
start == 0 && end == PyBytes_GET_SIZE(string)) {
- Py_INCREF(string);
- return string;
+ return Py_NewRef(string);
}
return PyBytes_FromStringAndSize(
(const char *)ptr + start, end - start);
@@ -1089,8 +1087,7 @@ pattern_subx(_sremodulestate* module_state,
if (PyCallable_Check(ptemplate)) {
/* sub/subn takes either a function or a template */
- filter = ptemplate;
- Py_INCREF(filter);
+ filter = Py_NewRef(ptemplate);
filter_type = CALLABLE;
} else {
/* if not callable, check if it's a literal string */
@@ -1109,8 +1106,7 @@ pattern_subx(_sremodulestate* module_state,
if (view.buf)
PyBuffer_Release(&view);
if (literal) {
- filter = ptemplate;
- Py_INCREF(filter);
+ filter = Py_NewRef(ptemplate);
filter_type = LITERAL;
} else {
/* not a literal; hand it over to the template compiler */
@@ -1120,8 +1116,8 @@ pattern_subx(_sremodulestate* module_state,
assert(Py_TYPE(filter) == module_state->Template_Type);
if (Py_SIZE(filter) == 0) {
- Py_INCREF(((TemplateObject *)filter)->literal);
- Py_SETREF(filter, ((TemplateObject *)filter)->literal);
+ Py_SETREF(filter,
+ Py_NewRef(((TemplateObject *)filter)->literal));
filter_type = LITERAL;
}
else {
@@ -1195,8 +1191,7 @@ pattern_subx(_sremodulestate* module_state,
goto error;
} else {
/* filter is literal string */
- item = filter;
- Py_INCREF(item);
+ item = Py_NewRef(filter);
}
/* add to list */
@@ -1317,8 +1312,7 @@ static PyObject *
_sre_SRE_Pattern___copy___impl(PatternObject *self)
/*[clinic end generated code: output=85dedc2db1bd8694 input=a730a59d863bc9f5]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
/*[clinic input]
@@ -1333,8 +1327,7 @@ static PyObject *
_sre_SRE_Pattern___deepcopy__(PatternObject *self, PyObject *memo)
/*[clinic end generated code: output=2ad25679c1f1204a input=a465b1602f997bed]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1500,19 +1493,16 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
PyBuffer_Release(&view);
}
- Py_INCREF(pattern);
- self->pattern = pattern;
+ self->pattern = Py_NewRef(pattern);
self->flags = flags;
self->groups = groups;
if (PyDict_GET_SIZE(groupindex) > 0) {
- Py_INCREF(groupindex);
- self->groupindex = groupindex;
+ self->groupindex = Py_NewRef(groupindex);
if (PyTuple_GET_SIZE(indexgroup) > 0) {
- Py_INCREF(indexgroup);
- self->indexgroup = indexgroup;
+ self->indexgroup = Py_NewRef(indexgroup);
}
}
@@ -1555,8 +1545,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
if (!self)
return NULL;
self->chunks = 1 + 2*n;
- self->literal = PyList_GET_ITEM(template, 0);
- Py_INCREF(self->literal);
+ self->literal = Py_NewRef(PyList_GET_ITEM(template, 0));
for (Py_ssize_t i = 0; i < n; i++) {
Py_ssize_t index = PyLong_AsSsize_t(PyList_GET_ITEM(template, 2*i+1));
if (index == -1 && PyErr_Occurred()) {
@@ -1576,8 +1565,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template)
literal = NULL;
self->chunks--;
}
- Py_XINCREF(literal);
- self->items[i].literal = literal;
+ self->items[i].literal = Py_XNewRef(literal);
}
return (PyObject*) self;
@@ -2128,8 +2116,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
if (self->string == Py_None || self->mark[index] < 0) {
/* return default value if the string or group is undefined */
- Py_INCREF(def);
- return def;
+ return Py_NewRef(def);
}
ptr = getstring(self->string, &length, &isbytes, &charsize, &view);
@@ -2448,8 +2435,7 @@ match_regs(MatchObject* self)
PyTuple_SET_ITEM(regs, index, item);
}
- Py_INCREF(regs);
- self->regs = regs;
+ self->regs = Py_NewRef(regs);
return regs;
}
@@ -2463,8 +2449,7 @@ static PyObject *
_sre_SRE_Match___copy___impl(MatchObject *self)
/*[clinic end generated code: output=a779c5fc8b5b4eb4 input=3bb4d30b6baddb5b]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
/*[clinic input]
@@ -2479,8 +2464,7 @@ static PyObject *
_sre_SRE_Match___deepcopy__(MatchObject *self, PyObject *memo)
/*[clinic end generated code: output=ba7cb46d655e4ee2 input=779d12a31c2c325e]*/
{
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
PyDoc_STRVAR(match_doc,
@@ -2509,8 +2493,7 @@ match_lastgroup_get(MatchObject *self, void *Py_UNUSED(ignored))
{
PyObject *result = PyTuple_GET_ITEM(self->pattern->indexgroup,
self->lastindex);
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
Py_RETURN_NONE;
}
@@ -2519,8 +2502,7 @@ static PyObject *
match_regs_get(MatchObject *self, void *Py_UNUSED(ignored))
{
if (self->regs) {
- Py_INCREF(self->regs);
- return self->regs;
+ return Py_NewRef(self->regs);
} else
return match_regs(self);
}
@@ -2564,11 +2546,9 @@ pattern_new_match(_sremodulestate* module_state,
if (!match)
return NULL;
- Py_INCREF(pattern);
- match->pattern = pattern;
+ match->pattern = (PatternObject*)Py_NewRef(pattern);
- Py_INCREF(state->string);
- match->string = state->string;
+ match->string = Py_NewRef(state->string);
match->regs = NULL;
match->groups = pattern->groups+1;
@@ -2788,8 +2768,7 @@ pattern_scanner(_sremodulestate *module_state,
return NULL;
}
- Py_INCREF(self);
- scanner->pattern = (PyObject*) self;
+ scanner->pattern = Py_NewRef(self);
PyObject_GC_Track(scanner);
return (PyObject*) scanner;
@@ -2834,8 +2813,7 @@ static PyObject *
expand_template(TemplateObject *self, MatchObject *match)
{
if (Py_SIZE(self) == 0) {
- Py_INCREF(self->literal);
- return self->literal;
+ return Py_NewRef(self->literal);
}
PyObject *result = NULL;
@@ -2855,8 +2833,7 @@ expand_template(TemplateObject *self, MatchObject *match)
out = &PyList_GET_ITEM(list, 0);
}
- Py_INCREF(self->literal);
- out[count++] = self->literal;
+ out[count++] = Py_NewRef(self->literal);
for (Py_ssize_t i = 0; i < Py_SIZE(self); i++) {
Py_ssize_t index = self->items[i].index;
if (index >= match->groups) {
@@ -2868,15 +2845,13 @@ expand_template(TemplateObject *self, MatchObject *match)
goto cleanup;
}
if (item != Py_None) {
- Py_INCREF(item);
- out[count++] = item;
+ out[count++] = Py_NewRef(item);
}
Py_DECREF(item);
PyObject *literal = self->items[i].literal;
if (literal != NULL) {
- Py_INCREF(literal);
- out[count++] = literal;
+ out[count++] = Py_NewRef(literal);
}
}
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index bf8bd9d..2826d15 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -415,8 +415,7 @@ static PyObject *
SSLError_str(PyOSErrorObject *self)
{
if (self->strerror != NULL && PyUnicode_Check(self->strerror)) {
- Py_INCREF(self->strerror);
- return self->strerror;
+ return Py_NewRef(self->strerror);
}
else
return PyObject_Str(self->args);
@@ -500,8 +499,7 @@ fill_and_set_sslerror(_sslmodulestate *state,
if (verify_str != NULL) {
verify_obj = PyUnicode_FromString(verify_str);
} else {
- verify_obj = Py_None;
- Py_INCREF(verify_obj);
+ verify_obj = Py_NewRef(Py_None);
}
break;
}
@@ -800,8 +798,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
self->ssl = NULL;
self->Socket = NULL;
- self->ctx = sslctx;
- Py_INCREF(sslctx);
+ self->ctx = (PySSLContext*)Py_NewRef(sslctx);
self->shutdown_seen_zero = 0;
self->owner = NULL;
self->server_hostname = NULL;
@@ -1026,8 +1023,7 @@ _asn1obj2py(_sslmodulestate *state, const ASN1_OBJECT *name, int no_name)
}
}
if (!buflen && no_name) {
- Py_INCREF(Py_None);
- name_obj = Py_None;
+ name_obj = Py_NewRef(Py_None);
}
else {
name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
@@ -1876,8 +1872,7 @@ _ssl__SSLSocket_get_unverified_chain_impl(PySSLSocket *self)
X509 *peer = SSL_get_peer_certificate(self->ssl);
if (peer == NULL) {
- peerobj = Py_None;
- Py_INCREF(peerobj);
+ peerobj = Py_NewRef(Py_None);
} else {
/* consume X509 reference on success */
peerobj = _PySSL_CertificateFromX509(self->ctx->state, peer, 0);
@@ -1907,8 +1902,7 @@ cipher_to_tuple(const SSL_CIPHER *cipher)
cipher_name = SSL_CIPHER_get_name(cipher);
if (cipher_name == NULL) {
- Py_INCREF(Py_None);
- PyTuple_SET_ITEM(retval, 0, Py_None);
+ PyTuple_SET_ITEM(retval, 0, Py_NewRef(Py_None));
} else {
v = PyUnicode_FromString(cipher_name);
if (v == NULL)
@@ -1918,8 +1912,7 @@ cipher_to_tuple(const SSL_CIPHER *cipher)
cipher_protocol = SSL_CIPHER_get_version(cipher);
if (cipher_protocol == NULL) {
- Py_INCREF(Py_None);
- PyTuple_SET_ITEM(retval, 1, Py_None);
+ PyTuple_SET_ITEM(retval, 1, Py_NewRef(Py_None));
} else {
v = PyUnicode_FromString(cipher_protocol);
if (v == NULL)
@@ -2103,16 +2096,14 @@ _ssl__SSLSocket_compression_impl(PySSLSocket *self)
}
static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
- Py_INCREF(self->ctx);
- return self->ctx;
+ return (PySSLContext*)Py_NewRef(self->ctx);
}
static int PySSL_set_context(PySSLSocket *self, PyObject *value,
void *closure) {
if (PyObject_TypeCheck(value, self->ctx->state->PySSLContext_Type)) {
- Py_INCREF(value);
- Py_SETREF(self->ctx, (PySSLContext *)value);
+ Py_SETREF(self->ctx, (PySSLContext *)Py_NewRef(value));
SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
/* Set SSL* internal msg_callback to state of new context's state */
SSL_set_msg_callback(
@@ -2150,8 +2141,7 @@ PySSL_get_server_hostname(PySSLSocket *self, void *c)
{
if (self->server_hostname == NULL)
Py_RETURN_NONE;
- Py_INCREF(self->server_hostname);
- return self->server_hostname;
+ return Py_NewRef(self->server_hostname);
}
PyDoc_STRVAR(PySSL_get_server_hostname_doc,
@@ -2166,8 +2156,7 @@ PySSL_get_owner(PySSLSocket *self, void *c)
Py_RETURN_NONE;
owner = PyWeakref_GetObject(self->owner);
- Py_INCREF(owner);
- return owner;
+ return Py_NewRef(owner);
}
static int
@@ -2820,8 +2809,7 @@ PySSL_get_session(PySSLSocket *self, void *closure) {
}
assert(self->ctx);
- pysess->ctx = self->ctx;
- Py_INCREF(pysess->ctx);
+ pysess->ctx = (PySSLContext*)Py_NewRef(self->ctx);
pysess->session = session;
PyObject_GC_Track(pysess);
return (PyObject *)pysess;
@@ -4459,8 +4447,7 @@ get_sni_callback(PySSLContext *self, void *c)
if (cb == NULL) {
Py_RETURN_NONE;
}
- Py_INCREF(cb);
- return cb;
+ return Py_NewRef(cb);
}
static int
@@ -4482,8 +4469,7 @@ set_sni_callback(PySSLContext *self, PyObject *arg, void *c)
"not a callable object");
return -1;
}
- Py_INCREF(arg);
- self->set_sni_cb = arg;
+ self->set_sni_cb = Py_NewRef(arg);
SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
}
@@ -5196,7 +5182,7 @@ _ssl_get_default_verify_paths_impl(PyObject *module)
#define CONVERT(info, target) { \
const char *tmp = (info); \
target = NULL; \
- if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
+ if (!tmp) { target = Py_NewRef(Py_None); } \
else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
target = PyBytes_FromString(tmp); } \
if (!target) goto error; \
@@ -5311,11 +5297,9 @@ certEncodingType(DWORD encodingType)
}
switch(encodingType) {
case X509_ASN_ENCODING:
- Py_INCREF(x509_asn);
- return x509_asn;
+ return Py_NewRef(x509_asn);
case PKCS_7_ASN_ENCODING:
- Py_INCREF(pkcs_7_asn);
- return pkcs_7_asn;
+ return Py_NewRef(pkcs_7_asn);
default:
return PyLong_FromLong(encodingType);
}
@@ -5717,8 +5701,7 @@ sslmodule_init_socketapi(PyObject *module)
if ((sockmod == NULL) || (sockmod->Sock_Type == NULL)) {
return -1;
}
- state->Sock_Type = sockmod->Sock_Type;
- Py_INCREF(state->Sock_Type);
+ state->Sock_Type = (PyTypeObject*)Py_NewRef(sockmod->Sock_Type);
return 0;
}
@@ -5925,8 +5908,7 @@ sslmodule_init_constants(PyObject *m)
#define addbool(m, key, value) \
do { \
PyObject *bool_obj = (value) ? Py_True : Py_False; \
- Py_INCREF(bool_obj); \
- PyModule_AddObject((m), (key), bool_obj); \
+ PyModule_AddObject((m), (key), Py_NewRef(bool_obj)); \
} while (0)
addbool(m, "HAS_SNI", 1);
diff --git a/Modules/_ssl/debughelpers.c b/Modules/_ssl/debughelpers.c
index 03c125e..08f3457 100644
--- a/Modules/_ssl/debughelpers.c
+++ b/Modules/_ssl/debughelpers.c
@@ -87,8 +87,7 @@ _PySSL_msg_callback(int write_p, int version, int content_type,
static PyObject *
_PySSLContext_get_msg_callback(PySSLContext *self, void *c) {
if (self->msg_cb != NULL) {
- Py_INCREF(self->msg_cb);
- return self->msg_cb;
+ return Py_NewRef(self->msg_cb);
} else {
Py_RETURN_NONE;
}
@@ -107,8 +106,7 @@ _PySSLContext_set_msg_callback(PySSLContext *self, PyObject *arg, void *c) {
"not a callable object");
return -1;
}
- Py_INCREF(arg);
- self->msg_cb = arg;
+ self->msg_cb = Py_NewRef(arg);
SSL_CTX_set_msg_callback(self->ctx, _PySSL_msg_callback);
}
return 0;
@@ -166,8 +164,7 @@ _PySSL_keylog_callback(const SSL *ssl, const char *line)
static PyObject *
_PySSLContext_get_keylog_filename(PySSLContext *self, void *c) {
if (self->keylog_filename != NULL) {
- Py_INCREF(self->keylog_filename);
- return self->keylog_filename;
+ return Py_NewRef(self->keylog_filename);
} else {
Py_RETURN_NONE;
}
@@ -203,8 +200,7 @@ _PySSLContext_set_keylog_filename(PySSLContext *self, PyObject *arg, void *c) {
"Can't malloc memory for keylog file");
return -1;
}
- Py_INCREF(arg);
- self->keylog_filename = arg;
+ self->keylog_filename = Py_NewRef(arg);
/* Write a header for seekable, empty files (this excludes pipes). */
PySSL_BEGIN_ALLOW_THREADS
diff --git a/Modules/_struct.c b/Modules/_struct.c
index f9bac34..2f2eb25 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1829,8 +1829,7 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer)
Py_DECREF(iter);
return NULL;
}
- Py_INCREF(self);
- iter->so = self;
+ iter->so = (PyStructObject*)Py_NewRef(self);
iter->index = 0;
return (PyObject *)iter;
}
@@ -2178,8 +2177,7 @@ cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr)
s_object = PyDict_GetItemWithError(state->cache, fmt);
if (s_object != NULL) {
- Py_INCREF(s_object);
- *ptr = (PyStructObject *)s_object;
+ *ptr = (PyStructObject *)Py_NewRef(s_object);
return Py_CLEANUP_SUPPORTED;
}
else if (PyErr_Occurred()) {
diff --git a/Modules/_testcapi/datetime.c b/Modules/_testcapi/datetime.c
new file mode 100644
index 0000000..9fb6562
--- /dev/null
+++ b/Modules/_testcapi/datetime.c
@@ -0,0 +1,453 @@
+#include "parts.h"
+
+#include "datetime.h" // PyDateTimeAPI
+
+
+static int test_run_counter = 0;
+
+static PyObject *
+test_datetime_capi(PyObject *self, PyObject *args)
+{
+ if (PyDateTimeAPI) {
+ if (test_run_counter) {
+ /* Probably regrtest.py -R */
+ Py_RETURN_NONE;
+ }
+ else {
+ PyErr_SetString(PyExc_AssertionError,
+ "PyDateTime_CAPI somehow initialized");
+ return NULL;
+ }
+ }
+ test_run_counter++;
+ PyDateTime_IMPORT;
+
+ if (PyDateTimeAPI) {
+ Py_RETURN_NONE;
+ }
+ return NULL;
+}
+
+/* Functions exposing the C API type checking for testing */
+#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
+do { \
+ PyObject *obj; \
+ int exact = 0; \
+ if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
+ return NULL; \
+ } \
+ int rv = exact?exact_method(obj):check_method(obj); \
+ if (rv) { \
+ Py_RETURN_TRUE; \
+ } \
+ Py_RETURN_FALSE; \
+} while (0) \
+
+static PyObject *
+datetime_check_date(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact);
+}
+
+static PyObject *
+datetime_check_time(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact);
+}
+
+static PyObject *
+datetime_check_datetime(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact);
+}
+
+static PyObject *
+datetime_check_delta(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact);
+}
+
+static PyObject *
+datetime_check_tzinfo(PyObject *self, PyObject *args)
+{
+ MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact);
+}
+#undef MAKE_DATETIME_CHECK_FUNC
+
+
+/* Makes three variations on timezone representing UTC-5:
+ 1. timezone with offset and name from PyDateTimeAPI
+ 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
+ 3. timezone with offset (no name) from PyTimeZone_FromOffset
+*/
+static PyObject *
+make_timezones_capi(PyObject *self, PyObject *args)
+{
+ PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
+ PyObject *name = PyUnicode_FromString("EST");
+
+ PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
+ PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
+ PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
+
+ Py_DecRef(offset);
+ Py_DecRef(name);
+
+ PyObject *rv = PyTuple_New(3);
+ if (rv == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(rv, 0, est_zone_capi);
+ PyTuple_SET_ITEM(rv, 1, est_zone_macro);
+ PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
+
+ return rv;
+}
+
+static PyObject *
+get_timezones_offset_zero(PyObject *self, PyObject *args)
+{
+ PyObject *offset = PyDelta_FromDSU(0, 0, 0);
+ PyObject *name = PyUnicode_FromString("");
+
+ // These two should return the UTC singleton
+ PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
+ PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
+
+ // This one will return +00:00 zone, but not the UTC singleton
+ PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
+
+ Py_DecRef(offset);
+ Py_DecRef(name);
+
+ PyObject *rv = PyTuple_New(3);
+ PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
+ PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
+ PyTuple_SET_ITEM(rv, 2, non_utc_zone);
+
+ return rv;
+}
+
+static PyObject *
+get_timezone_utc_capi(PyObject *self, PyObject *args)
+{
+ int macro = 0;
+ if (!PyArg_ParseTuple(args, "|p", &macro)) {
+ return NULL;
+ }
+ if (macro) {
+ Py_INCREF(PyDateTime_TimeZone_UTC);
+ return PyDateTime_TimeZone_UTC;
+ }
+ Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
+ return PyDateTimeAPI->TimeZone_UTC;
+}
+
+static PyObject *
+get_date_fromdate(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+
+ if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDate_FromDate(year, month, day);
+ }
+ else {
+ rv = PyDateTimeAPI->Date_FromDate(
+ year, month, day,
+ PyDateTimeAPI->DateType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromdateandtime(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+ int hour, minute, second, microsecond;
+
+ if (!PyArg_ParseTuple(args, "piiiiiii",
+ &macro,
+ &year, &month, &day,
+ &hour, &minute, &second, &microsecond)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDateTime_FromDateAndTime(
+ year, month, day,
+ hour, minute, second, microsecond);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromDateAndTime(
+ year, month, day,
+ hour, minute, second, microsecond,
+ Py_None,
+ PyDateTimeAPI->DateTimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int year, month, day;
+ int hour, minute, second, microsecond, fold;
+
+ if (!PyArg_ParseTuple(args, "piiiiiiii",
+ &macro,
+ &year, &month, &day,
+ &hour, &minute, &second, &microsecond,
+ &fold)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDateTime_FromDateAndTimeAndFold(
+ year, month, day,
+ hour, minute, second, microsecond,
+ fold);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
+ year, month, day,
+ hour, minute, second, microsecond,
+ Py_None,
+ fold,
+ PyDateTimeAPI->DateTimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_time_fromtime(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int hour, minute, second, microsecond;
+
+ if (!PyArg_ParseTuple(args, "piiii",
+ &macro,
+ &hour, &minute, &second, &microsecond))
+ {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyTime_FromTime(hour, minute, second, microsecond);
+ }
+ else {
+ rv = PyDateTimeAPI->Time_FromTime(
+ hour, minute, second, microsecond,
+ Py_None,
+ PyDateTimeAPI->TimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_time_fromtimeandfold(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int hour, minute, second, microsecond, fold;
+
+ if (!PyArg_ParseTuple(args, "piiiii",
+ &macro,
+ &hour, &minute, &second, &microsecond,
+ &fold)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
+ }
+ else {
+ rv = PyDateTimeAPI->Time_FromTimeAndFold(
+ hour, minute, second, microsecond,
+ Py_None,
+ fold,
+ PyDateTimeAPI->TimeType);
+ }
+ return rv;
+}
+
+static PyObject *
+get_delta_fromdsu(PyObject *self, PyObject *args)
+{
+ PyObject *rv = NULL;
+ int macro;
+ int days, seconds, microseconds;
+
+ if (!PyArg_ParseTuple(args, "piii",
+ &macro,
+ &days, &seconds, &microseconds)) {
+ return NULL;
+ }
+
+ if (macro) {
+ rv = PyDelta_FromDSU(days, seconds, microseconds);
+ }
+ else {
+ rv = PyDateTimeAPI->Delta_FromDelta(
+ days, seconds, microseconds, 1,
+ PyDateTimeAPI->DeltaType);
+ }
+
+ return rv;
+}
+
+static PyObject *
+get_date_fromtimestamp(PyObject *self, PyObject *args)
+{
+ PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
+ int macro = 0;
+
+ if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
+ return NULL;
+ }
+
+ // Construct the argument tuple
+ if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
+ return NULL;
+ }
+
+ // Pass along to the API function
+ if (macro) {
+ rv = PyDate_FromTimestamp(tsargs);
+ }
+ else {
+ rv = PyDateTimeAPI->Date_FromTimestamp(
+ (PyObject *)PyDateTimeAPI->DateType, tsargs
+ );
+ }
+
+ Py_DECREF(tsargs);
+ return rv;
+}
+
+static PyObject *
+get_datetime_fromtimestamp(PyObject *self, PyObject *args)
+{
+ int macro = 0;
+ int usetz = 0;
+ PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
+ if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
+ return NULL;
+ }
+
+ // Construct the argument tuple
+ if (usetz) {
+ tsargs = PyTuple_Pack(2, ts, tzinfo);
+ }
+ else {
+ tsargs = PyTuple_Pack(1, ts);
+ }
+
+ if (tsargs == NULL) {
+ return NULL;
+ }
+
+ // Pass along to the API function
+ if (macro) {
+ rv = PyDateTime_FromTimestamp(tsargs);
+ }
+ else {
+ rv = PyDateTimeAPI->DateTime_FromTimestamp(
+ (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
+ );
+ }
+
+ Py_DECREF(tsargs);
+ return rv;
+}
+
+static PyObject *
+test_PyDateTime_GET(PyObject *self, PyObject *obj)
+{
+ int year, month, day;
+
+ year = PyDateTime_GET_YEAR(obj);
+ month = PyDateTime_GET_MONTH(obj);
+ day = PyDateTime_GET_DAY(obj);
+
+ return Py_BuildValue("(iii)", year, month, day);
+}
+
+static PyObject *
+test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
+{
+ int hour = PyDateTime_DATE_GET_HOUR(obj);
+ int minute = PyDateTime_DATE_GET_MINUTE(obj);
+ int second = PyDateTime_DATE_GET_SECOND(obj);
+ int microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
+ PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
+
+ return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
+}
+
+static PyObject *
+test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
+{
+ int hour = PyDateTime_TIME_GET_HOUR(obj);
+ int minute = PyDateTime_TIME_GET_MINUTE(obj);
+ int second = PyDateTime_TIME_GET_SECOND(obj);
+ int microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
+ PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
+
+ return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
+}
+
+static PyObject *
+test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
+{
+ int days = PyDateTime_DELTA_GET_DAYS(obj);
+ int seconds = PyDateTime_DELTA_GET_SECONDS(obj);
+ int microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
+
+ return Py_BuildValue("(iii)", days, seconds, microseconds);
+}
+
+static PyMethodDef test_methods[] = {
+ {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
+ {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
+ {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
+ {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
+ {"datetime_check_date", datetime_check_date, METH_VARARGS},
+ {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
+ {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
+ {"datetime_check_time", datetime_check_time, METH_VARARGS},
+ {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
+ {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
+ {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
+ {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
+ {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
+ {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
+ {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
+ {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
+ {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
+ {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
+ {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
+ {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
+ {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_DateTime(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/Modules/_testcapi/getargs.c b/Modules/_testcapi/getargs.c
new file mode 100644
index 0000000..25a8e5f
--- /dev/null
+++ b/Modules/_testcapi/getargs.c
@@ -0,0 +1,920 @@
+/*
+ * Tests for Python/getargs.c and Python/modsupport.c;
+ * APIs that parse and build arguments.
+ */
+
+#define PY_SSIZE_T_CLEAN
+
+#include "parts.h"
+
+static PyObject *
+parse_tuple_and_keywords(PyObject *self, PyObject *args)
+{
+ PyObject *sub_args;
+ PyObject *sub_kwargs;
+ const char *sub_format;
+ PyObject *sub_keywords;
+
+ double buffers[8][4]; /* double ensures alignment where necessary */
+ PyObject *converted[8];
+ char *keywords[8 + 1]; /* space for NULL at end */
+
+ PyObject *return_value = NULL;
+
+ if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
+ &sub_args, &sub_kwargs, &sub_format, &sub_keywords))
+ {
+ return NULL;
+ }
+
+ if (!(PyList_CheckExact(sub_keywords) ||
+ PyTuple_CheckExact(sub_keywords)))
+ {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: "
+ "sub_keywords must be either list or tuple");
+ return NULL;
+ }
+
+ memset(buffers, 0, sizeof(buffers));
+ memset(converted, 0, sizeof(converted));
+ memset(keywords, 0, sizeof(keywords));
+
+ Py_ssize_t size = PySequence_Fast_GET_SIZE(sub_keywords);
+ if (size > 8) {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: too many keywords in sub_keywords");
+ goto exit;
+ }
+
+ for (Py_ssize_t i = 0; i < size; i++) {
+ PyObject *o = PySequence_Fast_GET_ITEM(sub_keywords, i);
+ if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
+ PyErr_Format(PyExc_ValueError,
+ "parse_tuple_and_keywords: "
+ "could not convert keywords[%zd] to narrow string", i);
+ goto exit;
+ }
+ keywords[i] = PyBytes_AS_STRING(converted[i]);
+ }
+
+ int result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
+ sub_format, keywords,
+ buffers + 0, buffers + 1, buffers + 2, buffers + 3,
+ buffers + 4, buffers + 5, buffers + 6, buffers + 7);
+
+ if (result) {
+ return_value = Py_NewRef(Py_None);
+ }
+
+exit:
+ size = sizeof(converted) / sizeof(converted[0]);
+ for (Py_ssize_t i = 0; i < size; i++) {
+ Py_XDECREF(converted[i]);
+ }
+ return return_value;
+}
+
+static PyObject *
+get_args(PyObject *self, PyObject *args)
+{
+ if (args == NULL) {
+ args = Py_None;
+ }
+ return Py_NewRef(args);
+}
+
+static PyObject *
+get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ if (kwargs == NULL) {
+ kwargs = Py_None;
+ }
+ return Py_NewRef(kwargs);
+}
+
+static PyObject *
+getargs_w_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+
+ if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer)) {
+ return NULL;
+ }
+
+ if (2 <= buffer.len) {
+ char *str = buffer.buf;
+ str[0] = '[';
+ str[buffer.len-1] = ']';
+ }
+
+ PyObject *result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+static PyObject *
+test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ /* Test that formats can begin with '|'. See issue #4720. */
+ PyObject *dict = NULL;
+ static char *kwlist[] = {NULL};
+ PyObject *tuple = PyTuple_New(0);
+ if (!tuple) {
+ return NULL;
+ }
+ int result;
+ if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
+ goto done;
+ }
+ dict = PyDict_New();
+ if (!dict) {
+ goto done;
+ }
+ result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse",
+ kwlist);
+ done:
+ Py_DECREF(tuple);
+ Py_XDECREF(dict);
+ if (!result) {
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+/* Test tuple argument processing */
+static PyObject *
+getargs_tuple(PyObject *self, PyObject *args)
+{
+ int a, b, c;
+ if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c)) {
+ return NULL;
+ }
+ return Py_BuildValue("iii", a, b, c);
+}
+
+/* test PyArg_ParseTupleAndKeywords */
+static PyObject *
+getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
+ static const char fmt[] = "(ii)i|(i(ii))(iii)i";
+ int int_args[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
+ &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
+ &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iiiiiiiiii",
+ int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
+ int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
+}
+
+/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
+static PyObject *
+getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"required", "optional", "keyword_only", NULL};
+ int required = -1;
+ int optional = -1;
+ int keyword_only = -1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
+ &required, &optional, &keyword_only))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iii", required, optional, keyword_only);
+}
+
+/* test PyArg_ParseTupleAndKeywords positional-only arguments */
+static PyObject *
+getargs_positional_only_and_keywords(PyObject *self, PyObject *args,
+ PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "keyword", NULL};
+ int required = -1;
+ int optional = -1;
+ int keyword = -1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
+ &required, &optional, &keyword))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("iii", required, optional, keyword);
+}
+
+/* Functions to call PyArg_ParseTuple with integer format codes,
+ and return the result.
+*/
+static PyObject *
+getargs_b(PyObject *self, PyObject *args)
+{
+ unsigned char value;
+ if (!PyArg_ParseTuple(args, "b", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_B(PyObject *self, PyObject *args)
+{
+ unsigned char value;
+ if (!PyArg_ParseTuple(args, "B", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_h(PyObject *self, PyObject *args)
+{
+ short value;
+ if (!PyArg_ParseTuple(args, "h", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong((long)value);
+}
+
+static PyObject *
+getargs_H(PyObject *self, PyObject *args)
+{
+ unsigned short value;
+ if (!PyArg_ParseTuple(args, "H", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_I(PyObject *self, PyObject *args)
+{
+ unsigned int value;
+ if (!PyArg_ParseTuple(args, "I", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong((unsigned long)value);
+}
+
+static PyObject *
+getargs_k(PyObject *self, PyObject *args)
+{
+ unsigned long value;
+ if (!PyArg_ParseTuple(args, "k", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong(value);
+}
+
+static PyObject *
+getargs_i(PyObject *self, PyObject *args)
+{
+ int value;
+ if (!PyArg_ParseTuple(args, "i", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong((long)value);
+}
+
+static PyObject *
+getargs_l(PyObject *self, PyObject *args)
+{
+ long value;
+ if (!PyArg_ParseTuple(args, "l", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong(value);
+}
+
+static PyObject *
+getargs_n(PyObject *self, PyObject *args)
+{
+ Py_ssize_t value;
+ if (!PyArg_ParseTuple(args, "n", &value)) {
+ return NULL;
+ }
+ return PyLong_FromSsize_t(value);
+}
+
+static PyObject *
+getargs_p(PyObject *self, PyObject *args)
+{
+ int value;
+ if (!PyArg_ParseTuple(args, "p", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLong(value);
+}
+
+static PyObject *
+getargs_L(PyObject *self, PyObject *args)
+{
+ long long value;
+ if (!PyArg_ParseTuple(args, "L", &value)) {
+ return NULL;
+ }
+ return PyLong_FromLongLong(value);
+}
+
+static PyObject *
+getargs_K(PyObject *self, PyObject *args)
+{
+ unsigned long long value;
+ if (!PyArg_ParseTuple(args, "K", &value)) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLongLong(value);
+}
+
+/* This function not only tests the 'k' getargs code, but also the
+ PyLong_AsUnsignedLongMask() function. */
+static PyObject *
+test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ PyObject *tuple, *num;
+ unsigned long value;
+
+ tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ /* a number larger than ULONG_MAX even on 64-bit platforms */
+ num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ value = PyLong_AsUnsignedLongMask(num);
+ if (value != ULONG_MAX) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: "
+ "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = 0;
+ if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
+ return NULL;
+ }
+ if (value != ULONG_MAX) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: k code returned wrong value for long 0xFFF...FFF");
+ return NULL;
+ }
+
+ Py_DECREF(num);
+ num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ value = PyLong_AsUnsignedLongMask(num);
+ if (value != (unsigned long)-0x42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: "
+ "PyLong_AsUnsignedLongMask() returned wrong value for long -0xFFF..000042");
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = 0;
+ if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
+ return NULL;
+ }
+ if (value != (unsigned long)-0x42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_k_code: k code returned wrong value for long -0xFFF..000042");
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_f(PyObject *self, PyObject *args)
+{
+ float f;
+ if (!PyArg_ParseTuple(args, "f", &f)) {
+ return NULL;
+ }
+ return PyFloat_FromDouble(f);
+}
+
+static PyObject *
+getargs_d(PyObject *self, PyObject *args)
+{
+ double d;
+ if (!PyArg_ParseTuple(args, "d", &d)) {
+ return NULL;
+ }
+ return PyFloat_FromDouble(d);
+}
+
+static PyObject *
+getargs_D(PyObject *self, PyObject *args)
+{
+ Py_complex cval;
+ if (!PyArg_ParseTuple(args, "D", &cval)) {
+ return NULL;
+ }
+ return PyComplex_FromCComplex(cval);
+}
+
+static PyObject *
+getargs_S(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "S", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_Y(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "Y", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_U(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "U", &obj)) {
+ return NULL;
+ }
+ return Py_NewRef(obj);
+}
+
+static PyObject *
+getargs_c(PyObject *self, PyObject *args)
+{
+ char c;
+ if (!PyArg_ParseTuple(args, "c", &c)) {
+ return NULL;
+ }
+ return PyLong_FromLong((unsigned char)c);
+}
+
+static PyObject *
+getargs_C(PyObject *self, PyObject *args)
+{
+ int c;
+ if (!PyArg_ParseTuple(args, "C", &c)) {
+ return NULL;
+ }
+ return PyLong_FromLong(c);
+}
+
+static PyObject *
+getargs_s(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "s", &str)) {
+ return NULL;
+ }
+ return PyBytes_FromString(str);
+}
+
+static PyObject *
+getargs_s_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *bytes;
+ if (!PyArg_ParseTuple(args, "s*", &buffer)) {
+ return NULL;
+ }
+ bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_s_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "s#", &str, &size)) {
+ return NULL;
+ }
+ return PyBytes_FromStringAndSize(str, size);
+}
+
+static PyObject *
+getargs_z(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "z", &str)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyBytes_FromString(str);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_z_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *bytes;
+ if (!PyArg_ParseTuple(args, "z*", &buffer)) {
+ return NULL;
+ }
+ if (buffer.buf != NULL) {
+ bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ }
+ else {
+ bytes = Py_NewRef(Py_None);
+ }
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_z_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "z#", &str, &size)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyBytes_FromStringAndSize(str, size);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_y(PyObject *self, PyObject *args)
+{
+ char *str;
+ if (!PyArg_ParseTuple(args, "y", &str)) {
+ return NULL;
+ }
+ return PyBytes_FromString(str);
+}
+
+static PyObject *
+getargs_y_star(PyObject *self, PyObject *args)
+{
+ Py_buffer buffer;
+ if (!PyArg_ParseTuple(args, "y*", &buffer)) {
+ return NULL;
+ }
+ PyObject *bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
+ PyBuffer_Release(&buffer);
+ return bytes;
+}
+
+static PyObject *
+getargs_y_hash(PyObject *self, PyObject *args)
+{
+ char *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "y#", &str, &size)) {
+ return NULL;
+ }
+ return PyBytes_FromStringAndSize(str, size);
+}
+
+static PyObject *
+getargs_u(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ if (!PyArg_ParseTuple(args, "u", &str)) {
+ return NULL;
+ }
+ return PyUnicode_FromWideChar(str, -1);
+}
+
+static PyObject *
+getargs_u_hash(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "u#", &str, &size)) {
+ return NULL;
+ }
+ return PyUnicode_FromWideChar(str, size);
+}
+
+static PyObject *
+getargs_Z(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ if (!PyArg_ParseTuple(args, "Z", &str)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyUnicode_FromWideChar(str, -1);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_Z_hash(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *str;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "Z#", &str, &size)) {
+ return NULL;
+ }
+ if (str != NULL) {
+ return PyUnicode_FromWideChar(str, size);
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_es(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ char *str;
+
+ if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding)) {
+ return NULL;
+ }
+ if (!PyArg_Parse(arg, "es", encoding, &str)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromString(str);
+ PyMem_Free(str);
+ return result;
+}
+
+static PyObject *
+getargs_et(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ char *str;
+
+ if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding)) {
+ return NULL;
+ }
+ if (!PyArg_Parse(arg, "et", encoding, &str)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromString(str);
+ PyMem_Free(str);
+ return result;
+}
+
+static PyObject *
+getargs_es_hash(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ PyByteArrayObject *buffer = NULL;
+ char *str = NULL;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer)) {
+ return NULL;
+ }
+ if (buffer != NULL) {
+ str = PyByteArray_AS_STRING(buffer);
+ size = PyByteArray_GET_SIZE(buffer);
+ }
+ if (!PyArg_Parse(arg, "es#", encoding, &str, &size)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromStringAndSize(str, size);
+ if (buffer == NULL) {
+ PyMem_Free(str);
+ }
+ return result;
+}
+
+static PyObject *
+getargs_et_hash(PyObject *self, PyObject *args)
+{
+ PyObject *arg;
+ const char *encoding = NULL;
+ PyByteArrayObject *buffer = NULL;
+ char *str = NULL;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer)) {
+ return NULL;
+ }
+ if (buffer != NULL) {
+ str = PyByteArray_AS_STRING(buffer);
+ size = PyByteArray_GET_SIZE(buffer);
+ }
+ if (!PyArg_Parse(arg, "et#", encoding, &str, &size)) {
+ return NULL;
+ }
+ PyObject *result = PyBytes_FromStringAndSize(str, size);
+ if (buffer == NULL) {
+ PyMem_Free(str);
+ }
+ return result;
+}
+
+/* Test the L code for PyArg_ParseTuple. This should deliver a long long
+ for both long and int arguments. The test may leak a little memory if
+ it fails.
+*/
+static PyObject *
+test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ PyObject *tuple, *num;
+ long long value;
+
+ tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ num = PyLong_FromLong(42);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = -1;
+ if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
+ return NULL;
+ }
+ if (value != 42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_L_code: L code returned wrong value for long 42");
+ return NULL;
+ }
+
+ Py_DECREF(num);
+ num = PyLong_FromLong(42);
+ if (num == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, num);
+
+ value = -1;
+ if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
+ return NULL;
+ }
+ if (value != 42) {
+ PyErr_SetString(PyExc_AssertionError,
+ "test_L_code: L code returned wrong value for int 42");
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+/* Test the s and z codes for PyArg_ParseTuple.
+*/
+static PyObject *
+test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ /* Unicode strings should be accepted */
+ PyObject *tuple = PyTuple_New(1);
+ if (tuple == NULL) {
+ return NULL;
+ }
+
+ PyObject *obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
+ "latin-1", NULL);
+ if (obj == NULL) {
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, 0, obj);
+
+ /* These two blocks used to raise a TypeError:
+ * "argument must be string without null bytes, not str"
+ */
+ char *value;
+ if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
+ return NULL;
+ }
+
+ Py_DECREF(tuple);
+ Py_RETURN_NONE;
+}
+
+#undef PyArg_ParseTupleAndKeywords
+PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
+ const char *, char **, ...);
+
+static PyObject *
+getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "x", NULL};
+ Py_buffer buf = {NULL};
+ const char *s;
+ int len;
+ int i = 0;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords,
+ &buf, &s, &len, &i))
+ {
+ return NULL;
+ }
+ PyBuffer_Release(&buf);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+getargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"", "", "x", NULL};
+ Py_buffer buf = {NULL};
+ const char *s;
+ int len;
+ int i = 0;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords,
+ &buf, &s, &len, &i))
+ {
+ return NULL;
+ }
+ PyBuffer_Release(&buf);
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef test_methods[] = {
+ {"get_args", get_args, METH_VARARGS},
+ {"get_kwargs", _PyCFunction_CAST(get_kwargs), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_B", getargs_B, METH_VARARGS},
+ {"getargs_C", getargs_C, METH_VARARGS},
+ {"getargs_D", getargs_D, METH_VARARGS},
+ {"getargs_H", getargs_H, METH_VARARGS},
+ {"getargs_I", getargs_I, METH_VARARGS},
+ {"getargs_K", getargs_K, METH_VARARGS},
+ {"getargs_L", getargs_L, METH_VARARGS},
+ {"getargs_S", getargs_S, METH_VARARGS},
+ {"getargs_U", getargs_U, METH_VARARGS},
+ {"getargs_Y", getargs_Y, METH_VARARGS},
+ {"getargs_Z", getargs_Z, METH_VARARGS},
+ {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
+ {"getargs_b", getargs_b, METH_VARARGS},
+ {"getargs_c", getargs_c, METH_VARARGS},
+ {"getargs_d", getargs_d, METH_VARARGS},
+ {"getargs_es", getargs_es, METH_VARARGS},
+ {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
+ {"getargs_et", getargs_et, METH_VARARGS},
+ {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
+ {"getargs_f", getargs_f, METH_VARARGS},
+ {"getargs_h", getargs_h, METH_VARARGS},
+ {"getargs_i", getargs_i, METH_VARARGS},
+ {"getargs_k", getargs_k, METH_VARARGS},
+ {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_keywords", _PyCFunction_CAST(getargs_keywords), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_l", getargs_l, METH_VARARGS},
+ {"getargs_n", getargs_n, METH_VARARGS},
+ {"getargs_p", getargs_p, METH_VARARGS},
+ {"getargs_positional_only_and_keywords", _PyCFunction_CAST(getargs_positional_only_and_keywords), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s", getargs_s, METH_VARARGS},
+ {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
+ {"getargs_s_hash_int", _PyCFunction_CAST(getargs_s_hash_int), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s_hash_int2", _PyCFunction_CAST(getargs_s_hash_int2), METH_VARARGS|METH_KEYWORDS},
+ {"getargs_s_star", getargs_s_star, METH_VARARGS},
+ {"getargs_tuple", getargs_tuple, METH_VARARGS},
+ {"getargs_u", getargs_u, METH_VARARGS},
+ {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
+ {"getargs_w_star", getargs_w_star, METH_VARARGS},
+ {"getargs_y", getargs_y, METH_VARARGS},
+ {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
+ {"getargs_y_star", getargs_y_star, METH_VARARGS},
+ {"getargs_z", getargs_z, METH_VARARGS},
+ {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
+ {"getargs_z_star", getargs_z_star, METH_VARARGS},
+ {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
+ {"test_L_code", test_L_code, METH_NOARGS},
+ {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
+ {"test_k_code", test_k_code, METH_NOARGS},
+ {"test_s_code", test_s_code, METH_NOARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_GetArgs(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h
index 304e592..2fa8dac 100644
--- a/Modules/_testcapi/parts.h
+++ b/Modules/_testcapi/parts.h
@@ -27,6 +27,9 @@
int _PyTestCapi_Init_Vectorcall(PyObject *module);
int _PyTestCapi_Init_Heaptype(PyObject *module);
int _PyTestCapi_Init_Unicode(PyObject *module);
+int _PyTestCapi_Init_GetArgs(PyObject *module);
+int _PyTestCapi_Init_PyTime(PyObject *module);
+int _PyTestCapi_Init_DateTime(PyObject *module);
#ifdef LIMITED_API_AVAILABLE
int _PyTestCapi_Init_VectorcallLimited(PyObject *module);
diff --git a/Modules/_testcapi/pytime.c b/Modules/_testcapi/pytime.c
new file mode 100644
index 0000000..7422baf
--- /dev/null
+++ b/Modules/_testcapi/pytime.c
@@ -0,0 +1,274 @@
+#include "parts.h"
+
+#ifdef MS_WINDOWS
+# include <winsock2.h> // struct timeval
+#endif
+
+static PyObject *
+test_pytime_fromseconds(PyObject *self, PyObject *args)
+{
+ int seconds;
+ if (!PyArg_ParseTuple(args, "i", &seconds)) {
+ return NULL;
+ }
+ _PyTime_t ts = _PyTime_FromSeconds(seconds);
+ return _PyTime_AsNanosecondsObject(ts);
+}
+
+static int
+check_time_rounding(int round)
+{
+ if (round != _PyTime_ROUND_FLOOR
+ && round != _PyTime_ROUND_CEILING
+ && round != _PyTime_ROUND_HALF_EVEN
+ && round != _PyTime_ROUND_UP)
+ {
+ PyErr_SetString(PyExc_ValueError, "invalid rounding");
+ return -1;
+ }
+ return 0;
+}
+
+static PyObject *
+test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t ts;
+ if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
+ return NULL;
+ }
+ return _PyTime_AsNanosecondsObject(ts);
+}
+
+static PyObject *
+test_pytime_assecondsdouble(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t ts;
+ if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
+ return NULL;
+ }
+ double d = _PyTime_AsSecondsDouble(ts);
+ return PyFloat_FromDouble(d);
+}
+
+static PyObject *
+test_PyTime_AsTimeval(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timeval tv;
+ if (_PyTime_AsTimeval(t, &tv, round) < 0) {
+ return NULL;
+ }
+
+ PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
+ if (seconds == NULL) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
+}
+
+static PyObject *
+test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timeval tv;
+ _PyTime_AsTimeval_clamp(t, &tv, round);
+
+ PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
+ if (seconds == NULL) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
+}
+
+#ifdef HAVE_CLOCK_GETTIME
+static PyObject *
+test_PyTime_AsTimespec(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timespec ts;
+ if (_PyTime_AsTimespec(t, &ts) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
+}
+
+static PyObject *
+test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args, "O", &obj)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ struct timespec ts;
+ _PyTime_AsTimespec_clamp(t, &ts);
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
+}
+#endif
+
+static PyObject *
+test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
+ _PyTime_t ns = _PyTime_FromNanoseconds(ms);
+ return _PyTime_AsNanosecondsObject(ns);
+}
+
+static PyObject *
+test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
+ return NULL;
+ }
+ _PyTime_t t;
+ if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ _PyTime_t us = _PyTime_AsMicroseconds(t, round);
+ _PyTime_t ns = _PyTime_FromNanoseconds(us);
+ return _PyTime_AsNanosecondsObject(ns);
+}
+
+static PyObject *
+test_pytime_object_to_time_t(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1) {
+ return NULL;
+ }
+ return _PyLong_FromTime_t(sec);
+}
+
+static PyObject *
+test_pytime_object_to_timeval(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long usec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
+}
+
+static PyObject *
+test_pytime_object_to_timespec(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long nsec;
+ int round;
+ if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round)) {
+ return NULL;
+ }
+ if (check_time_rounding(round) < 0) {
+ return NULL;
+ }
+ if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1) {
+ return NULL;
+ }
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
+}
+
+static PyMethodDef test_methods[] = {
+ {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
+ {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
+ {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
+#ifdef HAVE_CLOCK_GETTIME
+ {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
+ {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
+#endif
+ {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
+ {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
+ {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
+ {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
+ {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
+ {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
+ {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_PyTime(PyObject *mod)
+{
+ if (PyModule_AddFunctions(mod, test_methods) < 0) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 62fd1f6..79beb1c 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -20,16 +20,11 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
-#include "datetime.h" // PyDateTimeAPI
#include "marshal.h" // PyMarshal_WriteLongToFile
#include "structmember.h" // PyMemberDef
#include <float.h> // FLT_MAX
#include <signal.h>
-#ifdef MS_WINDOWS
-# include <winsock2.h> // struct timeval
-#endif
-
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h> // W_STOPCODE
#endif
@@ -949,52 +944,6 @@ test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
return Py_None;
}
-/* Test the L code for PyArg_ParseTuple. This should deliver a long long
- for both long and int arguments. The test may leak a little memory if
- it fails.
-*/
-static PyObject *
-test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- PyObject *tuple, *num;
- long long value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- num = PyLong_FromLong(42);
- if (num == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = -1;
- if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
- return NULL;
- }
- if (value != 42)
- return raiseTestError("test_L_code",
- "L code returned wrong value for long 42");
-
- Py_DECREF(num);
- num = PyLong_FromLong(42);
- if (num == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = -1;
- if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
- return NULL;
- }
- if (value != 42)
- return raiseTestError("test_L_code",
- "L code returned wrong value for int 42");
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
static PyObject *
return_none(void *unused)
@@ -1234,699 +1183,6 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE;
}
-
-static PyObject *
-get_args(PyObject *self, PyObject *args)
-{
- if (args == NULL) {
- args = Py_None;
- }
- return Py_NewRef(args);
-}
-
-static PyObject *
-get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- if (kwargs == NULL) {
- kwargs = Py_None;
- }
- return Py_NewRef(kwargs);
-}
-
-/* Test tuple argument processing */
-static PyObject *
-getargs_tuple(PyObject *self, PyObject *args)
-{
- int a, b, c;
- if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
- return NULL;
- return Py_BuildValue("iii", a, b, c);
-}
-
-/* test PyArg_ParseTupleAndKeywords */
-static PyObject *
-getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
- static const char fmt[] = "(ii)i|(i(ii))(iii)i";
- int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
- &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
- &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
- return NULL;
- return Py_BuildValue("iiiiiiiiii",
- int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
- int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
-}
-
-/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
-static PyObject *
-getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"required", "optional", "keyword_only", NULL};
- int required = -1;
- int optional = -1;
- int keyword_only = -1;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
- &required, &optional, &keyword_only))
- return NULL;
- return Py_BuildValue("iii", required, optional, keyword_only);
-}
-
-/* test PyArg_ParseTupleAndKeywords positional-only arguments */
-static PyObject *
-getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "keyword", NULL};
- int required = -1;
- int optional = -1;
- int keyword = -1;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
- &required, &optional, &keyword))
- return NULL;
- return Py_BuildValue("iii", required, optional, keyword);
-}
-
-/* Functions to call PyArg_ParseTuple with integer format codes,
- and return the result.
-*/
-static PyObject *
-getargs_b(PyObject *self, PyObject *args)
-{
- unsigned char value;
- if (!PyArg_ParseTuple(args, "b", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_B(PyObject *self, PyObject *args)
-{
- unsigned char value;
- if (!PyArg_ParseTuple(args, "B", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_h(PyObject *self, PyObject *args)
-{
- short value;
- if (!PyArg_ParseTuple(args, "h", &value))
- return NULL;
- return PyLong_FromLong((long)value);
-}
-
-static PyObject *
-getargs_H(PyObject *self, PyObject *args)
-{
- unsigned short value;
- if (!PyArg_ParseTuple(args, "H", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_I(PyObject *self, PyObject *args)
-{
- unsigned int value;
- if (!PyArg_ParseTuple(args, "I", &value))
- return NULL;
- return PyLong_FromUnsignedLong((unsigned long)value);
-}
-
-static PyObject *
-getargs_k(PyObject *self, PyObject *args)
-{
- unsigned long value;
- if (!PyArg_ParseTuple(args, "k", &value))
- return NULL;
- return PyLong_FromUnsignedLong(value);
-}
-
-static PyObject *
-getargs_i(PyObject *self, PyObject *args)
-{
- int value;
- if (!PyArg_ParseTuple(args, "i", &value))
- return NULL;
- return PyLong_FromLong((long)value);
-}
-
-static PyObject *
-getargs_l(PyObject *self, PyObject *args)
-{
- long value;
- if (!PyArg_ParseTuple(args, "l", &value))
- return NULL;
- return PyLong_FromLong(value);
-}
-
-static PyObject *
-getargs_n(PyObject *self, PyObject *args)
-{
- Py_ssize_t value;
- if (!PyArg_ParseTuple(args, "n", &value))
- return NULL;
- return PyLong_FromSsize_t(value);
-}
-
-static PyObject *
-getargs_p(PyObject *self, PyObject *args)
-{
- int value;
- if (!PyArg_ParseTuple(args, "p", &value))
- return NULL;
- return PyLong_FromLong(value);
-}
-
-static PyObject *
-getargs_L(PyObject *self, PyObject *args)
-{
- long long value;
- if (!PyArg_ParseTuple(args, "L", &value))
- return NULL;
- return PyLong_FromLongLong(value);
-}
-
-static PyObject *
-getargs_K(PyObject *self, PyObject *args)
-{
- unsigned long long value;
- if (!PyArg_ParseTuple(args, "K", &value))
- return NULL;
- return PyLong_FromUnsignedLongLong(value);
-}
-
-/* This function not only tests the 'k' getargs code, but also the
- PyLong_AsUnsignedLongMask() function. */
-static PyObject *
-test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- PyObject *tuple, *num;
- unsigned long value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- /* a number larger than ULONG_MAX even on 64-bit platforms */
- num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
- if (num == NULL)
- return NULL;
-
- value = PyLong_AsUnsignedLongMask(num);
- if (value != ULONG_MAX)
- return raiseTestError("test_k_code",
- "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = 0;
- if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
- return NULL;
- }
- if (value != ULONG_MAX)
- return raiseTestError("test_k_code",
- "k code returned wrong value for long 0xFFF...FFF");
-
- Py_DECREF(num);
- num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
- if (num == NULL)
- return NULL;
-
- value = PyLong_AsUnsignedLongMask(num);
- if (value != (unsigned long)-0x42)
- return raiseTestError("test_k_code",
- "PyLong_AsUnsignedLongMask() returned wrong "
- "value for long -0xFFF..000042");
-
- PyTuple_SET_ITEM(tuple, 0, num);
-
- value = 0;
- if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
- return NULL;
- }
- if (value != (unsigned long)-0x42)
- return raiseTestError("test_k_code",
- "k code returned wrong value for long -0xFFF..000042");
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_f(PyObject *self, PyObject *args)
-{
- float f;
- if (!PyArg_ParseTuple(args, "f", &f))
- return NULL;
- return PyFloat_FromDouble(f);
-}
-
-static PyObject *
-getargs_d(PyObject *self, PyObject *args)
-{
- double d;
- if (!PyArg_ParseTuple(args, "d", &d))
- return NULL;
- return PyFloat_FromDouble(d);
-}
-
-static PyObject *
-getargs_D(PyObject *self, PyObject *args)
-{
- Py_complex cval;
- if (!PyArg_ParseTuple(args, "D", &cval))
- return NULL;
- return PyComplex_FromCComplex(cval);
-}
-
-static PyObject *
-getargs_S(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "S", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_Y(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "Y", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_U(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "U", &obj))
- return NULL;
- return Py_NewRef(obj);
-}
-
-static PyObject *
-getargs_c(PyObject *self, PyObject *args)
-{
- char c;
- if (!PyArg_ParseTuple(args, "c", &c))
- return NULL;
- return PyLong_FromLong((unsigned char)c);
-}
-
-static PyObject *
-getargs_C(PyObject *self, PyObject *args)
-{
- int c;
- if (!PyArg_ParseTuple(args, "C", &c))
- return NULL;
- return PyLong_FromLong(c);
-}
-
-static PyObject *
-getargs_s(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "s", &str))
- return NULL;
- return PyBytes_FromString(str);
-}
-
-static PyObject *
-getargs_s_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "s*", &buffer))
- return NULL;
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_s_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "s#", &str, &size))
- return NULL;
- return PyBytes_FromStringAndSize(str, size);
-}
-
-static PyObject *
-getargs_z(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "z", &str))
- return NULL;
- if (str != NULL)
- return PyBytes_FromString(str);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_z_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "z*", &buffer))
- return NULL;
- if (buffer.buf != NULL)
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- else {
- bytes = Py_NewRef(Py_None);
- }
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_z_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "z#", &str, &size))
- return NULL;
- if (str != NULL)
- return PyBytes_FromStringAndSize(str, size);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_y(PyObject *self, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "y", &str))
- return NULL;
- return PyBytes_FromString(str);
-}
-
-static PyObject *
-getargs_y_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *bytes;
- if (!PyArg_ParseTuple(args, "y*", &buffer))
- return NULL;
- bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return bytes;
-}
-
-static PyObject *
-getargs_y_hash(PyObject *self, PyObject *args)
-{
- char *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "y#", &str, &size))
- return NULL;
- return PyBytes_FromStringAndSize(str, size);
-}
-
-static PyObject *
-getargs_u(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- if (!PyArg_ParseTuple(args, "u", &str))
- return NULL;
- return PyUnicode_FromWideChar(str, -1);
-}
-
-static PyObject *
-getargs_u_hash(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "u#", &str, &size))
- return NULL;
- return PyUnicode_FromWideChar(str, size);
-}
-
-static PyObject *
-getargs_Z(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- if (!PyArg_ParseTuple(args, "Z", &str))
- return NULL;
- if (str != NULL) {
- return PyUnicode_FromWideChar(str, -1);
- } else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_Z_hash(PyObject *self, PyObject *args)
-{
- Py_UNICODE *str;
- Py_ssize_t size;
- if (!PyArg_ParseTuple(args, "Z#", &str, &size))
- return NULL;
- if (str != NULL)
- return PyUnicode_FromWideChar(str, size);
- else
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_es(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- char *str;
-
- if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
- return NULL;
- if (!PyArg_Parse(arg, "es", encoding, &str))
- return NULL;
- result = PyBytes_FromString(str);
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_et(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- char *str;
-
- if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
- return NULL;
- if (!PyArg_Parse(arg, "et", encoding, &str))
- return NULL;
- result = PyBytes_FromString(str);
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_es_hash(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- PyByteArrayObject *buffer = NULL;
- char *str = NULL;
- Py_ssize_t size;
-
- if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
- return NULL;
- if (buffer != NULL) {
- str = PyByteArray_AS_STRING(buffer);
- size = PyByteArray_GET_SIZE(buffer);
- }
- if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
- return NULL;
- result = PyBytes_FromStringAndSize(str, size);
- if (buffer == NULL)
- PyMem_Free(str);
- return result;
-}
-
-static PyObject *
-getargs_et_hash(PyObject *self, PyObject *args)
-{
- PyObject *arg, *result;
- const char *encoding = NULL;
- PyByteArrayObject *buffer = NULL;
- char *str = NULL;
- Py_ssize_t size;
-
- if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
- return NULL;
- if (buffer != NULL) {
- str = PyByteArray_AS_STRING(buffer);
- size = PyByteArray_GET_SIZE(buffer);
- }
- if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
- return NULL;
- result = PyBytes_FromStringAndSize(str, size);
- if (buffer == NULL)
- PyMem_Free(str);
- return result;
-}
-
-/* Test the s and z codes for PyArg_ParseTuple.
-*/
-static PyObject *
-test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- /* Unicode strings should be accepted */
- PyObject *tuple, *obj;
- char *value;
-
- tuple = PyTuple_New(1);
- if (tuple == NULL)
- return NULL;
-
- obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
- "latin-1", NULL);
- if (obj == NULL)
- return NULL;
-
- PyTuple_SET_ITEM(tuple, 0, obj);
-
- /* These two blocks used to raise a TypeError:
- * "argument must be string without null bytes, not str"
- */
- if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
- return NULL;
- }
-
- if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
- return NULL;
- }
-
- Py_DECREF(tuple);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-parse_tuple_and_keywords(PyObject *self, PyObject *args)
-{
- PyObject *sub_args;
- PyObject *sub_kwargs;
- const char *sub_format;
- PyObject *sub_keywords;
-
- Py_ssize_t i, size;
- char *keywords[8 + 1]; /* space for NULL at end */
- PyObject *o;
- PyObject *converted[8];
-
- int result;
- PyObject *return_value = NULL;
-
- double buffers[8][4]; /* double ensures alignment where necessary */
-
- if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
- &sub_args, &sub_kwargs,
- &sub_format, &sub_keywords))
- return NULL;
-
- if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
- PyErr_SetString(PyExc_ValueError,
- "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
- return NULL;
- }
-
- memset(buffers, 0, sizeof(buffers));
- memset(converted, 0, sizeof(converted));
- memset(keywords, 0, sizeof(keywords));
-
- size = PySequence_Fast_GET_SIZE(sub_keywords);
- if (size > 8) {
- PyErr_SetString(PyExc_ValueError,
- "parse_tuple_and_keywords: too many keywords in sub_keywords");
- goto exit;
- }
-
- for (i = 0; i < size; i++) {
- o = PySequence_Fast_GET_ITEM(sub_keywords, i);
- if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
- PyErr_Format(PyExc_ValueError,
- "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
- goto exit;
- }
- keywords[i] = PyBytes_AS_STRING(converted[i]);
- }
-
- result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
- sub_format, keywords,
- buffers + 0, buffers + 1, buffers + 2, buffers + 3,
- buffers + 4, buffers + 5, buffers + 6, buffers + 7);
-
- if (result) {
- return_value = Py_NewRef(Py_None);
- }
-
-exit:
- size = sizeof(converted) / sizeof(converted[0]);
- for (i = 0; i < size; i++) {
- Py_XDECREF(converted[i]);
- }
- return return_value;
-}
-
-static PyObject *
-getargs_w_star(PyObject *self, PyObject *args)
-{
- Py_buffer buffer;
- PyObject *result;
- char *str;
-
- if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
- return NULL;
-
- if (2 <= buffer.len) {
- str = buffer.buf;
- str[0] = '[';
- str[buffer.len-1] = ']';
- }
-
- result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
- PyBuffer_Release(&buffer);
- return result;
-}
-
-
-static PyObject *
-test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- /* Test that formats can begin with '|'. See issue #4720. */
- PyObject *tuple, *dict = NULL;
- static char *kwlist[] = {NULL};
- int result;
- tuple = PyTuple_New(0);
- if (!tuple)
- return NULL;
- if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
- goto done;
- }
- dict = PyDict_New();
- if (!dict)
- goto done;
- result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
- done:
- Py_DECREF(tuple);
- Py_XDECREF(dict);
- if (!result) {
- return NULL;
- }
- else {
- Py_RETURN_NONE;
- }
-}
-
/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
static PyObject *
test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
@@ -2065,411 +1321,6 @@ test_set_exc_info(PyObject *self, PyObject *args)
return orig_exc;
}
-static int test_run_counter = 0;
-
-static PyObject *
-test_datetime_capi(PyObject *self, PyObject *args) {
- if (PyDateTimeAPI) {
- if (test_run_counter) {
- /* Probably regrtest.py -R */
- Py_RETURN_NONE;
- }
- else {
- PyErr_SetString(PyExc_AssertionError,
- "PyDateTime_CAPI somehow initialized");
- return NULL;
- }
- }
- test_run_counter++;
- PyDateTime_IMPORT;
-
- if (PyDateTimeAPI)
- Py_RETURN_NONE;
- else
- return NULL;
-}
-
-/* Functions exposing the C API type checking for testing */
-#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
- PyObject *obj; \
- int exact = 0; \
- if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
- return NULL; \
- } \
- int rv = exact?exact_method(obj):check_method(obj); \
- if (rv) { \
- Py_RETURN_TRUE; \
- } else { \
- Py_RETURN_FALSE; \
- }
-
-static PyObject *
-datetime_check_date(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
-}
-
-static PyObject *
-datetime_check_time(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
-}
-
-static PyObject *
-datetime_check_datetime(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
-}
-
-static PyObject *
-datetime_check_delta(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
-}
-
-static PyObject *
-datetime_check_tzinfo(PyObject *self, PyObject *args) {
- MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
-}
-
-
-/* Makes three variations on timezone representing UTC-5:
- 1. timezone with offset and name from PyDateTimeAPI
- 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
- 3. timezone with offset (no name) from PyTimeZone_FromOffset
-*/
-static PyObject *
-make_timezones_capi(PyObject *self, PyObject *args) {
- PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
- PyObject *name = PyUnicode_FromString("EST");
-
- PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
- PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
- PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
-
- Py_DecRef(offset);
- Py_DecRef(name);
-
- PyObject *rv = PyTuple_New(3);
-
- PyTuple_SET_ITEM(rv, 0, est_zone_capi);
- PyTuple_SET_ITEM(rv, 1, est_zone_macro);
- PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
-
- return rv;
-}
-
-static PyObject *
-get_timezones_offset_zero(PyObject *self, PyObject *args) {
- PyObject *offset = PyDelta_FromDSU(0, 0, 0);
- PyObject *name = PyUnicode_FromString("");
-
- // These two should return the UTC singleton
- PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
- PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
-
- // This one will return +00:00 zone, but not the UTC singleton
- PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
-
- Py_DecRef(offset);
- Py_DecRef(name);
-
- PyObject *rv = PyTuple_New(3);
- PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
- PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
- PyTuple_SET_ITEM(rv, 2, non_utc_zone);
-
- return rv;
-}
-
-static PyObject *
-get_timezone_utc_capi(PyObject* self, PyObject *args) {
- int macro = 0;
- if (!PyArg_ParseTuple(args, "|p", &macro)) {
- return NULL;
- }
- if (macro) {
- return Py_NewRef(PyDateTime_TimeZone_UTC);
- } else {
- return Py_NewRef(PyDateTimeAPI->TimeZone_UTC);
- }
-}
-
-static PyObject *
-get_date_fromdate(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
-
- if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDate_FromDate(year, month, day);
- }
- else {
- rv = PyDateTimeAPI->Date_FromDate(
- year, month, day,
- PyDateTimeAPI->DateType);
- }
- return rv;
-}
-
-static PyObject *
-get_datetime_fromdateandtime(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
- int hour, minute, second, microsecond;
-
- if (!PyArg_ParseTuple(args, "piiiiiii",
- &macro,
- &year, &month, &day,
- &hour, &minute, &second, &microsecond)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDateTime_FromDateAndTime(
- year, month, day,
- hour, minute, second, microsecond);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromDateAndTime(
- year, month, day,
- hour, minute, second, microsecond,
- Py_None,
- PyDateTimeAPI->DateTimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int year, month, day;
- int hour, minute, second, microsecond, fold;
-
- if (!PyArg_ParseTuple(args, "piiiiiiii",
- &macro,
- &year, &month, &day,
- &hour, &minute, &second, &microsecond,
- &fold)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDateTime_FromDateAndTimeAndFold(
- year, month, day,
- hour, minute, second, microsecond,
- fold);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
- year, month, day,
- hour, minute, second, microsecond,
- Py_None,
- fold,
- PyDateTimeAPI->DateTimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_time_fromtime(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int hour, minute, second, microsecond;
-
- if (!PyArg_ParseTuple(args, "piiii",
- &macro,
- &hour, &minute, &second, &microsecond)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyTime_FromTime(hour, minute, second, microsecond);
- }
- else {
- rv = PyDateTimeAPI->Time_FromTime(
- hour, minute, second, microsecond,
- Py_None,
- PyDateTimeAPI->TimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_time_fromtimeandfold(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int hour, minute, second, microsecond, fold;
-
- if (!PyArg_ParseTuple(args, "piiiii",
- &macro,
- &hour, &minute, &second, &microsecond,
- &fold)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
- }
- else {
- rv = PyDateTimeAPI->Time_FromTimeAndFold(
- hour, minute, second, microsecond,
- Py_None,
- fold,
- PyDateTimeAPI->TimeType);
- }
- return rv;
-}
-
-static PyObject *
-get_delta_fromdsu(PyObject *self, PyObject *args)
-{
- PyObject *rv = NULL;
- int macro;
- int days, seconds, microseconds;
-
- if (!PyArg_ParseTuple(args, "piii",
- &macro,
- &days, &seconds, &microseconds)) {
- return NULL;
- }
-
- if (macro) {
- rv = PyDelta_FromDSU(days, seconds, microseconds);
- }
- else {
- rv = PyDateTimeAPI->Delta_FromDelta(
- days, seconds, microseconds, 1,
- PyDateTimeAPI->DeltaType);
- }
-
- return rv;
-}
-
-static PyObject *
-get_date_fromtimestamp(PyObject* self, PyObject *args)
-{
- PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
- int macro = 0;
-
- if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
- return NULL;
- }
-
- // Construct the argument tuple
- if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
- return NULL;
- }
-
- // Pass along to the API function
- if (macro) {
- rv = PyDate_FromTimestamp(tsargs);
- }
- else {
- rv = PyDateTimeAPI->Date_FromTimestamp(
- (PyObject *)PyDateTimeAPI->DateType, tsargs
- );
- }
-
- Py_DECREF(tsargs);
- return rv;
-}
-
-static PyObject *
-get_datetime_fromtimestamp(PyObject* self, PyObject *args)
-{
- int macro = 0;
- int usetz = 0;
- PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
- if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
- return NULL;
- }
-
- // Construct the argument tuple
- if (usetz) {
- tsargs = PyTuple_Pack(2, ts, tzinfo);
- }
- else {
- tsargs = PyTuple_Pack(1, ts);
- }
-
- if (tsargs == NULL) {
- return NULL;
- }
-
- // Pass along to the API function
- if (macro) {
- rv = PyDateTime_FromTimestamp(tsargs);
- }
- else {
- rv = PyDateTimeAPI->DateTime_FromTimestamp(
- (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
- );
- }
-
- Py_DECREF(tsargs);
- return rv;
-}
-
-static PyObject *
-test_PyDateTime_GET(PyObject *self, PyObject *obj)
-{
- int year, month, day;
-
- year = PyDateTime_GET_YEAR(obj);
- month = PyDateTime_GET_MONTH(obj);
- day = PyDateTime_GET_DAY(obj);
-
- return Py_BuildValue("(iii)", year, month, day);
-}
-
-static PyObject *
-test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
-{
- int hour, minute, second, microsecond;
-
- hour = PyDateTime_DATE_GET_HOUR(obj);
- minute = PyDateTime_DATE_GET_MINUTE(obj);
- second = PyDateTime_DATE_GET_SECOND(obj);
- microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
- PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
-
- return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
-}
-
-static PyObject *
-test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
-{
- int hour, minute, second, microsecond;
-
- hour = PyDateTime_TIME_GET_HOUR(obj);
- minute = PyDateTime_TIME_GET_MINUTE(obj);
- second = PyDateTime_TIME_GET_SECOND(obj);
- microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
- PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
-
- return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
-}
-
-static PyObject *
-test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
-{
- int days, seconds, microseconds;
-
- days = PyDateTime_DELTA_GET_DAYS(obj);
- seconds = PyDateTime_DELTA_GET_SECONDS(obj);
- microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
-
- return Py_BuildValue("(iii)", days, seconds, microseconds);
-}
-
/* test_thread_state spawns a thread of its own, and that thread releases
* `thread_done` when it's finished. The driver code has to know when the
* thread finishes, because the thread uses a PyObject (the callable) that
@@ -3283,66 +2134,6 @@ run_in_subinterp_with_config(PyObject *self, PyObject *args, PyObject *kwargs)
return PyLong_FromLong(r);
}
-static int
-check_time_rounding(int round)
-{
- if (round != _PyTime_ROUND_FLOOR
- && round != _PyTime_ROUND_CEILING
- && round != _PyTime_ROUND_HALF_EVEN
- && round != _PyTime_ROUND_UP) {
- PyErr_SetString(PyExc_ValueError, "invalid rounding");
- return -1;
- }
- return 0;
-}
-
-static PyObject *
-test_pytime_object_to_time_t(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
- return NULL;
- return _PyLong_FromTime_t(sec);
-}
-
-static PyObject *
-test_pytime_object_to_timeval(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- long usec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
- return NULL;
- return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
-}
-
-static PyObject *
-test_pytime_object_to_timespec(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- time_t sec;
- long nsec;
- int round;
- if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
- return NULL;
- if (check_time_rounding(round) < 0)
- return NULL;
- if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
- return NULL;
- return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
-}
-
static void
slot_tp_del(PyObject *self)
{
@@ -4278,178 +3069,6 @@ getitem_with_error(PyObject *self, PyObject *args)
return PyObject_GetItem(map, key);
}
-static PyObject *
-test_pytime_fromseconds(PyObject *self, PyObject *args)
-{
- int seconds;
- if (!PyArg_ParseTuple(args, "i", &seconds)) {
- return NULL;
- }
- _PyTime_t ts = _PyTime_FromSeconds(seconds);
- return _PyTime_AsNanosecondsObject(ts);
-}
-
-static PyObject *
-test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t ts;
- if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
- return NULL;
- }
- return _PyTime_AsNanosecondsObject(ts);
-}
-
-static PyObject *
-test_pytime_assecondsdouble(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t ts;
- if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
- return NULL;
- }
- double d = _PyTime_AsSecondsDouble(ts);
- return PyFloat_FromDouble(d);
-}
-
-static PyObject *
-test_PyTime_AsTimeval(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timeval tv;
- if (_PyTime_AsTimeval(t, &tv, round) < 0) {
- return NULL;
- }
-
- PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
- if (seconds == NULL) {
- return NULL;
- }
- return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
-}
-
-static PyObject *
-test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timeval tv;
- _PyTime_AsTimeval_clamp(t, &tv, round);
-
- PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
- if (seconds == NULL) {
- return NULL;
- }
- return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
-}
-
-#ifdef HAVE_CLOCK_GETTIME
-static PyObject *
-test_PyTime_AsTimespec(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timespec ts;
- if (_PyTime_AsTimespec(t, &ts) == -1) {
- return NULL;
- }
- return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
-}
-
-static PyObject *
-test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- if (!PyArg_ParseTuple(args, "O", &obj)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- struct timespec ts;
- _PyTime_AsTimespec_clamp(t, &ts);
- return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
-}
-#endif
-
-static PyObject *
-test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
- _PyTime_t ns = _PyTime_FromNanoseconds(ms);
- return _PyTime_AsNanosecondsObject(ns);
-}
-
-static PyObject *
-test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
-{
- PyObject *obj;
- int round;
- if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
- return NULL;
- }
- _PyTime_t t;
- if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
- return NULL;
- }
- if (check_time_rounding(round) < 0) {
- return NULL;
- }
- _PyTime_t us = _PyTime_AsMicroseconds(t, round);
- _PyTime_t ns = _PyTime_FromNanoseconds(us);
- return _PyTime_AsNanosecondsObject(ns);
-}
-
static PyObject*
pymem_buffer_overflow(PyObject *self, PyObject *args)
{
@@ -6108,8 +4727,6 @@ unwatch_type(PyObject *self, PyObject *args)
static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
-static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
-static PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
@@ -6117,27 +4734,6 @@ static PyMethodDef TestMethods[] = {
{"set_errno", set_errno, METH_VARARGS},
{"test_config", test_config, METH_NOARGS},
{"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
- {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
- {"datetime_check_date", datetime_check_date, METH_VARARGS},
- {"datetime_check_time", datetime_check_time, METH_VARARGS},
- {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
- {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
- {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
- {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
- {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
- {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
- {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
- {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
- {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
- {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
- {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
- {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
- {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
- {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
- {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
- {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
- {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
- {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
{"test_gc_control", test_gc_control, METH_NOARGS},
{"test_list_api", test_list_api, METH_NOARGS},
{"test_dict_iteration", test_dict_iteration, METH_NOARGS},
@@ -6159,9 +4755,6 @@ static PyMethodDef TestMethods[] = {
{"test_long_as_unsigned_long_long_mask",
test_long_as_unsigned_long_long_mask, METH_NOARGS},
{"test_long_numbits", test_long_numbits, METH_NOARGS},
- {"test_k_code", test_k_code, METH_NOARGS},
- {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
- {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
{"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
{"pyobject_str_from_null", pyobject_str_from_null, METH_NOARGS},
{"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
@@ -6177,66 +4770,11 @@ static PyMethodDef TestMethods[] = {
{"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
{"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
{"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
- {"get_args", get_args, METH_VARARGS},
{"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
{"test_get_type_name", test_get_type_name, METH_NOARGS},
{"test_get_type_qualname", test_get_type_qualname, METH_NOARGS},
- {"get_kwargs", _PyCFunction_CAST(get_kwargs),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_tuple", getargs_tuple, METH_VARARGS},
- {"getargs_keywords", _PyCFunction_CAST(getargs_keywords),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_positional_only_and_keywords",
- _PyCFunction_CAST(getargs_positional_only_and_keywords),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_b", getargs_b, METH_VARARGS},
- {"getargs_B", getargs_B, METH_VARARGS},
- {"getargs_h", getargs_h, METH_VARARGS},
- {"getargs_H", getargs_H, METH_VARARGS},
- {"getargs_I", getargs_I, METH_VARARGS},
- {"getargs_k", getargs_k, METH_VARARGS},
- {"getargs_i", getargs_i, METH_VARARGS},
- {"getargs_l", getargs_l, METH_VARARGS},
- {"getargs_n", getargs_n, METH_VARARGS},
- {"getargs_p", getargs_p, METH_VARARGS},
- {"getargs_L", getargs_L, METH_VARARGS},
- {"getargs_K", getargs_K, METH_VARARGS},
{"test_longlong_api", test_longlong_api, METH_NOARGS},
{"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
- {"test_L_code", test_L_code, METH_NOARGS},
- {"getargs_f", getargs_f, METH_VARARGS},
- {"getargs_d", getargs_d, METH_VARARGS},
- {"getargs_D", getargs_D, METH_VARARGS},
- {"getargs_S", getargs_S, METH_VARARGS},
- {"getargs_Y", getargs_Y, METH_VARARGS},
- {"getargs_U", getargs_U, METH_VARARGS},
- {"getargs_c", getargs_c, METH_VARARGS},
- {"getargs_C", getargs_C, METH_VARARGS},
- {"getargs_s", getargs_s, METH_VARARGS},
- {"getargs_s_star", getargs_s_star, METH_VARARGS},
- {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
- {"getargs_s_hash_int", _PyCFunction_CAST(getargs_s_hash_int),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_s_hash_int2", _PyCFunction_CAST(getargs_s_hash_int2),
- METH_VARARGS|METH_KEYWORDS},
- {"getargs_z", getargs_z, METH_VARARGS},
- {"getargs_z_star", getargs_z_star, METH_VARARGS},
- {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
- {"getargs_y", getargs_y, METH_VARARGS},
- {"getargs_y_star", getargs_y_star, METH_VARARGS},
- {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
- {"getargs_u", getargs_u, METH_VARARGS},
- {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
- {"getargs_Z", getargs_Z, METH_VARARGS},
- {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
- {"getargs_w_star", getargs_w_star, METH_VARARGS},
- {"getargs_es", getargs_es, METH_VARARGS},
- {"getargs_et", getargs_et, METH_VARARGS},
- {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
- {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
- {"test_s_code", test_s_code, METH_NOARGS},
{"_test_thread_state", test_thread_state, METH_VARARGS},
{"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
#ifdef HAVE_GETTIMEOFDAY
@@ -6257,9 +4795,6 @@ static PyMethodDef TestMethods[] = {
{"run_in_subinterp_with_config",
_PyCFunction_CAST(run_in_subinterp_with_config),
METH_VARARGS | METH_KEYWORDS},
- {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
- {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
- {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
{"with_tp_del", with_tp_del, METH_VARARGS},
{"create_cfunction", create_cfunction, METH_NOARGS},
{"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
@@ -6315,17 +4850,6 @@ static PyMethodDef TestMethods[] = {
{"return_result_with_error", return_result_with_error, METH_NOARGS},
{"getitem_with_error", getitem_with_error, METH_VARARGS},
{"Py_CompileString", pycompilestring, METH_O},
- {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
- {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
- {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
- {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
- {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
-#ifdef HAVE_CLOCK_GETTIME
- {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
- {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
-#endif
- {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
- {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
{"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
{"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
{"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
@@ -7227,6 +5751,15 @@ PyInit__testcapi(void)
if (_PyTestCapi_Init_Unicode(m) < 0) {
return NULL;
}
+ if (_PyTestCapi_Init_GetArgs(m) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_PyTime(m) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_DateTime(m) < 0) {
+ return NULL;
+ }
#ifndef LIMITED_API_AVAILABLE
PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False);
@@ -7284,35 +5817,3 @@ test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE;
}
-
-#undef PyArg_ParseTupleAndKeywords
-PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
- const char *, char **, ...);
-
-static PyObject *
-getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "x", NULL};
- Py_buffer buf = {NULL};
- const char *s;
- int len;
- int i = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords, &buf, &s, &len, &i))
- return NULL;
- PyBuffer_Release(&buf);
- Py_RETURN_NONE;
-}
-
-static PyObject *
-getargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *keywords[] = {"", "", "x", NULL};
- Py_buffer buf = {NULL};
- const char *s;
- int len;
- int i = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords, &buf, &s, &len, &i))
- return NULL;
- PyBuffer_Release(&buf);
- Py_RETURN_NONE;
-}
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c
index 83ce756..cec114c 100644
--- a/Modules/_testinternalcapi.c
+++ b/Modules/_testinternalcapi.c
@@ -14,7 +14,7 @@
#include "Python.h"
#include "pycore_atomic_funcs.h" // _Py_atomic_int_get()
#include "pycore_bitutils.h" // _Py_bswap32()
-#include "pycore_compile.h" // _PyCompile_OptimizeCfg()
+#include "pycore_compile.h" // _PyCompile_CodeGen, _PyCompile_OptimizeCfg
#include "pycore_fileutils.h" // _Py_normpath
#include "pycore_frame.h" // _PyInterpreterFrame
#include "pycore_gc.h" // PyGC_Head
@@ -529,6 +529,26 @@ set_eval_frame_record(PyObject *self, PyObject *list)
Py_RETURN_NONE;
}
+/*[clinic input]
+
+_testinternalcapi.compiler_codegen -> object
+
+ ast: object
+ filename: object
+ optimize: int
+
+Apply compiler code generation to an AST.
+[clinic start generated code]*/
+
+static PyObject *
+_testinternalcapi_compiler_codegen_impl(PyObject *module, PyObject *ast,
+ PyObject *filename, int optimize)
+/*[clinic end generated code: output=fbbbbfb34700c804 input=e9fbe6562f7f75e4]*/
+{
+ PyCompilerFlags *flags = NULL;
+ return _PyCompile_CodeGen(ast, filename, flags, optimize);
+}
+
/*[clinic input]
@@ -612,6 +632,7 @@ static PyMethodDef TestMethods[] = {
{"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
{"set_eval_frame_default", set_eval_frame_default, METH_NOARGS, NULL},
{"set_eval_frame_record", set_eval_frame_record, METH_O, NULL},
+ _TESTINTERNALCAPI_COMPILER_CODEGEN_METHODDEF
_TESTINTERNALCAPI_OPTIMIZE_CFG_METHODDEF
{"get_interp_settings", get_interp_settings, METH_VARARGS, NULL},
{NULL, NULL} /* sentinel */
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 4807ad5..a5d5428 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -784,16 +784,14 @@ PyTclObject_string(PyTclObject *self, void *ignored)
if (!self->string)
return NULL;
}
- Py_INCREF(self->string);
- return self->string;
+ return Py_NewRef(self->string);
}
static PyObject *
PyTclObject_str(PyTclObject *self)
{
if (self->string) {
- Py_INCREF(self->string);
- return self->string;
+ return Py_NewRef(self->string);
}
/* XXX Could cache result if it is non-ASCII. */
return unicodeFromTclObj(self->value);
@@ -1736,8 +1734,7 @@ SetVar(TkappObject *self, PyObject *args, int flags)
if (!ok)
Tkinter_Error(self);
else {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
break;
@@ -1755,8 +1752,7 @@ SetVar(TkappObject *self, PyObject *args, int flags)
if (!ok)
Tkinter_Error(self);
else {
- res = Py_None;
- Py_INCREF(res);
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
break;
@@ -1842,8 +1838,7 @@ UnsetVar(TkappObject *self, PyObject *args, int flags)
if (code == TCL_ERROR)
res = Tkinter_Error(self);
else {
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
}
LEAVE_OVERLAP_TCL
return res;
@@ -1883,8 +1878,7 @@ _tkinter_tkapp_getint(TkappObject *self, PyObject *arg)
PyObject *result;
if (PyLong_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyTclObject_Check(arg)) {
@@ -1928,8 +1922,7 @@ _tkinter_tkapp_getdouble(TkappObject *self, PyObject *arg)
double v;
if (PyFloat_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyNumber_Check(arg)) {
@@ -2145,8 +2138,7 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg)
return v;
}
if (PyTuple_Check(arg)) {
- Py_INCREF(arg);
- return arg;
+ return Py_NewRef(arg);
}
if (PyList_Check(arg)) {
return PySequence_Tuple(arg);
@@ -2322,10 +2314,8 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name,
data = PyMem_NEW(PythonCmd_ClientData, 1);
if (!data)
return PyErr_NoMemory();
- Py_INCREF(self);
- Py_INCREF(func);
- data->self = (PyObject *) self;
- data->func = func;
+ data->self = Py_NewRef(self);
+ data->func = Py_NewRef(func);
if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
Tcl_Condition cond = NULL;
CommandEvent *ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent));
@@ -2430,10 +2420,8 @@ NewFHCD(PyObject *func, PyObject *file, int id)
FileHandler_ClientData *p;
p = PyMem_NEW(FileHandler_ClientData, 1);
if (p != NULL) {
- Py_XINCREF(func);
- Py_XINCREF(file);
- p->func = func;
- p->file = file;
+ p->func = Py_XNewRef(func);
+ p->file = Py_XNewRef(file);
p->id = id;
p->next = HeadFHCD;
HeadFHCD = p;
@@ -2591,13 +2579,11 @@ Tktt_New(PyObject *func)
if (v == NULL)
return NULL;
- Py_INCREF(func);
v->token = NULL;
- v->func = func;
+ v->func = Py_NewRef(func);
/* Extra reference, deleted when called or when handler is deleted */
- Py_INCREF(v);
- return v;
+ return (TkttObject*)Py_NewRef(v);
}
static void
@@ -2940,9 +2926,8 @@ _flatten1(FlattenContext* context, PyObject* item, int depth)
if (context->size + 1 > context->maxsize &&
!_bump(context, 1))
return 0;
- Py_INCREF(o);
PyTuple_SET_ITEM(context->tuple,
- context->size++, o);
+ context->size++, Py_NewRef(o));
}
}
} else {
@@ -3266,8 +3251,7 @@ PyInit__tkinter(void)
Py_DECREF(m);
return NULL;
}
- Py_INCREF(o);
- if (PyModule_AddObject(m, "TclError", o)) {
+ if (PyModule_AddObject(m, "TclError", Py_NewRef(o))) {
Py_DECREF(o);
Py_DECREF(m);
return NULL;
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index 44a1f7b..fe73d63 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -347,8 +347,8 @@ tracemalloc_get_frame(_PyInterpreterFrame *pyframe, frame_t *frame)
else {
/* tracemalloc_filenames is responsible to keep a reference
to the filename */
- Py_INCREF(filename);
- if (_Py_hashtable_set(tracemalloc_filenames, filename, NULL) < 0) {
+ if (_Py_hashtable_set(tracemalloc_filenames, Py_NewRef(filename),
+ NULL) < 0) {
Py_DECREF(filename);
#ifdef TRACE_DEBUG
tracemalloc_error("failed to intern the filename");
@@ -1085,8 +1085,7 @@ frame_to_pyobject(frame_t *frame)
if (frame_obj == NULL)
return NULL;
- Py_INCREF(frame->filename);
- PyTuple_SET_ITEM(frame_obj, 0, frame->filename);
+ PyTuple_SET_ITEM(frame_obj, 0, Py_NewRef(frame->filename));
lineno_obj = PyLong_FromUnsignedLong(frame->lineno);
if (lineno_obj == NULL) {
@@ -1107,8 +1106,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table)
if (intern_table != NULL) {
frames = _Py_hashtable_get(intern_table, (const void *)traceback);
if (frames) {
- Py_INCREF(frames);
- return frames;
+ return Py_NewRef(frames);
}
}
diff --git a/Modules/_typingmodule.c b/Modules/_typingmodule.c
index 8b6faa6..262dddb 100644
--- a/Modules/_typingmodule.c
+++ b/Modules/_typingmodule.c
@@ -23,8 +23,7 @@ static PyObject *
_typing__idfunc(PyObject *module, PyObject *x)
/*[clinic end generated code: output=63c38be4a6ec5f2c input=49f17284b43de451]*/
{
- Py_INCREF(x);
- return x;
+ return Py_NewRef(x);
}
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 71e74d1..7a9bedb 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -291,8 +291,7 @@ _winapi_Overlapped_getbuffer_impl(OverlappedObject *self)
return NULL;
}
res = self->read_buffer ? self->read_buffer : Py_None;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
/*[clinic input]
diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c
index 9d979ef..e65137e 100644
--- a/Modules/_xxsubinterpretersmodule.c
+++ b/Modules/_xxsubinterpretersmodule.c
@@ -1722,8 +1722,7 @@ _channelid_shared(PyObject *obj, _PyCrossInterpreterData *data)
xid->resolve = ((channelid *)obj)->resolve;
data->data = xid;
- Py_INCREF(obj);
- data->obj = obj;
+ data->obj = Py_NewRef(obj);
data->new_object = _channelid_from_xid;
data->free = PyMem_Free;
return 0;
@@ -2634,12 +2633,12 @@ PyInit__xxsubinterpreters(void)
}
/* Add other types */
- Py_INCREF(&ChannelIDtype);
- if (PyDict_SetItemString(ns, "ChannelID", (PyObject *)&ChannelIDtype) != 0) {
+ if (PyDict_SetItemString(ns, "ChannelID",
+ Py_NewRef(&ChannelIDtype)) != 0) {
return NULL;
}
- Py_INCREF(&_PyInterpreterID_Type);
- if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&_PyInterpreterID_Type) != 0) {
+ if (PyDict_SetItemString(ns, "InterpreterID",
+ Py_NewRef(&_PyInterpreterID_Type)) != 0) {
return NULL;
}
diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c
index 9986b91..34f5abd 100644
--- a/Modules/_zoneinfo.c
+++ b/Modules/_zoneinfo.c
@@ -227,8 +227,7 @@ zoneinfo_new_instance(PyTypeObject *type, PyObject *key)
}
Py_DECREF(rv);
- ((PyZoneInfo_ZoneInfo *)self)->key = key;
- Py_INCREF(key);
+ ((PyZoneInfo_ZoneInfo *)self)->key = Py_NewRef(key);
goto cleanup;
error:
@@ -381,10 +380,9 @@ zoneinfo_ZoneInfo_from_file_impl(PyTypeObject *type, PyObject *file_obj,
self->source = SOURCE_FILE;
self->file_repr = file_repr;
- self->key = key;
- Py_INCREF(key);
-
+ self->key = Py_NewRef(key);
return obj_self;
+
error:
Py_XDECREF(file_repr);
Py_XDECREF(self);
@@ -484,8 +482,7 @@ zoneinfo_utcoffset(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->utcoff);
- return tti->utcoff;
+ return Py_NewRef(tti->utcoff);
}
static PyObject *
@@ -495,8 +492,7 @@ zoneinfo_dst(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->dstoff);
- return tti->dstoff;
+ return Py_NewRef(tti->dstoff);
}
static PyObject *
@@ -506,8 +502,7 @@ zoneinfo_tzname(PyObject *self, PyObject *dt)
if (tti == NULL) {
return NULL;
}
- Py_INCREF(tti->tzname);
- return tti->tzname;
+ return Py_NewRef(tti->tzname);
}
#define GET_DT_TZINFO PyDateTime_DATE_GET_TZINFO
@@ -651,8 +646,7 @@ static PyObject *
zoneinfo_str(PyZoneInfo_ZoneInfo *self)
{
if (!(self->key == Py_None)) {
- Py_INCREF(self->key);
- return self->key;
+ return Py_NewRef(self->key);
}
else {
return zoneinfo_repr(self);
@@ -793,8 +787,7 @@ build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out)
return -1;
}
- out->tzname = tzname;
- Py_INCREF(tzname);
+ out->tzname = Py_NewRef(tzname);
return 0;
}
@@ -1082,8 +1075,7 @@ load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj)
if (PyObject_IsTrue(tti->dstoff)) {
_ttinfo *tti_after = &(self->tzrule_after.std);
Py_DECREF(tti_after->dstoff);
- tti_after->dstoff = tti->dstoff;
- Py_INCREF(tti_after->dstoff);
+ tti_after->dstoff = Py_NewRef(tti->dstoff);
}
}
@@ -2285,13 +2277,10 @@ strong_cache_node_new(PyObject *key, PyObject *zone)
return NULL;
}
- Py_INCREF(key);
- Py_INCREF(zone);
-
node->next = NULL;
node->prev = NULL;
- node->key = key;
- node->zone = zone;
+ node->key = Py_NewRef(key);
+ node->zone = Py_NewRef(zone);
return node;
}
@@ -2443,8 +2432,7 @@ zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key)
if (node != NULL) {
move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, node);
- Py_INCREF(node->zone);
- return node->zone;
+ return Py_NewRef(node->zone);
}
return NULL; // Cache miss
@@ -2679,13 +2667,9 @@ zoneinfomodule_exec(PyObject *m)
}
if (NO_TTINFO.utcoff == NULL) {
- NO_TTINFO.utcoff = Py_None;
- NO_TTINFO.dstoff = Py_None;
- NO_TTINFO.tzname = Py_None;
-
- for (size_t i = 0; i < 3; ++i) {
- Py_INCREF(Py_None);
- }
+ NO_TTINFO.utcoff = Py_NewRef(Py_None);
+ NO_TTINFO.dstoff = Py_NewRef(Py_None);
+ NO_TTINFO.tzname = Py_NewRef(Py_None);
}
if (initialize_caches()) {
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 8013c5c..dcf510e 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -709,8 +709,7 @@ array_richcompare(PyObject *v, PyObject *w, int op)
res = Py_False;
else
res = Py_True;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
if (va->ob_descr == wa->ob_descr && va->ob_descr->compareitems != NULL) {
@@ -733,8 +732,7 @@ array_richcompare(PyObject *v, PyObject *w, int op)
default: return NULL; /* cannot happen */
}
PyObject *res = cmp ? Py_True : Py_False;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
@@ -778,18 +776,15 @@ array_richcompare(PyObject *v, PyObject *w, int op)
res = Py_True;
else
res = Py_False;
- Py_INCREF(res);
- return res;
+ return Py_NewRef(res);
}
/* We have an item that differs. First, shortcuts for EQ/NE */
if (op == Py_EQ) {
- Py_INCREF(Py_False);
- res = Py_False;
+ res = Py_NewRef(Py_False);
}
else if (op == Py_NE) {
- Py_INCREF(Py_True);
- res = Py_True;
+ res = Py_NewRef(Py_True);
}
else {
/* Compare the final item again using the proper operator */
@@ -1060,8 +1055,7 @@ array_inplace_concat(arrayobject *self, PyObject *bb)
}
if (array_do_extend(state, self, bb) == -1)
return NULL;
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1085,8 +1079,7 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n)
_PyBytes_Repeat(self->ob_item, n*size, self->ob_item, size);
}
- Py_INCREF(self);
- return (PyObject *)self;
+ return Py_NewRef(self);
}
@@ -1947,9 +1940,8 @@ make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Py_DECREF(typecode_obj);
return NULL;
}
- Py_INCREF(items);
PyTuple_SET_ITEM(new_args, 0, typecode_obj);
- PyTuple_SET_ITEM(new_args, 1, items);
+ PyTuple_SET_ITEM(new_args, 1, Py_NewRef(items));
array_obj = array_new(arraytype, new_args, NULL);
Py_DECREF(new_args);
@@ -2219,8 +2211,7 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
return NULL;
}
if (dict == NULL) {
- dict = Py_None;
- Py_INCREF(dict);
+ dict = Py_NewRef(Py_None);
}
mformat_code = typecode_to_mformat_code(typecode);
@@ -2572,8 +2563,7 @@ array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
}
view->buf = (void *)self->ob_item;
- view->obj = (PyObject*)self;
- Py_INCREF(self);
+ view->obj = Py_NewRef(self);
if (view->buf == NULL)
view->buf = (void *)emptybuf;
view->len = Py_SIZE(self) * self->ob_descr->itemsize;
@@ -2885,8 +2875,7 @@ array_iter(arrayobject *ao)
if (it == NULL)
return NULL;
- Py_INCREF(ao);
- it->ao = ao;
+ it->ao = (arrayobject*)Py_NewRef(ao);
it->index = 0;
it->getitem = ao->ob_descr->getitem;
PyObject_GC_Track(it);
@@ -3083,8 +3072,8 @@ array_modexec(PyObject *m)
CREATE_TYPE(m, state->ArrayIterType, &arrayiter_spec);
Py_SET_TYPE(state->ArrayIterType, &PyType_Type);
- Py_INCREF((PyObject *)state->ArrayType);
- if (PyModule_AddObject(m, "ArrayType", (PyObject *)state->ArrayType) < 0) {
+ if (PyModule_AddObject(m, "ArrayType",
+ Py_NewRef((PyObject *)state->ArrayType)) < 0) {
Py_DECREF((PyObject *)state->ArrayType);
return -1;
}
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 4769ab2..6d67fce 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -141,8 +141,7 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored
else if (self->errors == ERROR_REPLACE)
errors = "replace";
else {
- Py_INCREF(self->errors);
- return self->errors;
+ return Py_NewRef(self->errors);
}
return PyUnicode_FromString(errors);
@@ -341,8 +340,7 @@ multibytecodec_encerror(MultibyteCodec *codec,
goto errorexit;
}
else {
- Py_INCREF(tobj);
- retstr = tobj;
+ retstr = Py_NewRef(tobj);
}
assert(PyBytes_Check(retstr));
@@ -786,11 +784,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
if (ctx->pending) {
PyObject *inbuf_tmp;
- Py_INCREF(ctx->pending);
- origpending = ctx->pending;
+ origpending = Py_NewRef(ctx->pending);
- Py_INCREF(ctx->pending);
- inbuf_tmp = ctx->pending;
+ inbuf_tmp = Py_NewRef(ctx->pending);
PyUnicode_Append(&inbuf_tmp, unistr);
if (inbuf_tmp == NULL)
goto errorexit;
@@ -800,8 +796,7 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
else {
origpending = NULL;
- Py_INCREF(unistr);
- inbuf = unistr;
+ inbuf = Py_NewRef(unistr);
}
if (PyUnicode_READY(inbuf) < 0)
goto errorexit;
@@ -1645,8 +1640,7 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
- self->stream = stream;
- Py_INCREF(stream);
+ self->stream = Py_NewRef(stream);
self->pendingsize = 0;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
@@ -1869,8 +1863,7 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
- self->stream = stream;
- Py_INCREF(stream);
+ self->stream = Py_NewRef(stream);
self->pending = NULL;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
diff --git a/Modules/clinic/_testinternalcapi.c.h b/Modules/clinic/_testinternalcapi.c.h
index 8113fff..e8d5681 100644
--- a/Modules/clinic/_testinternalcapi.c.h
+++ b/Modules/clinic/_testinternalcapi.c.h
@@ -8,6 +8,69 @@ preserve
#endif
+PyDoc_STRVAR(_testinternalcapi_compiler_codegen__doc__,
+"compiler_codegen($module, /, ast, filename, optimize)\n"
+"--\n"
+"\n"
+"Apply compiler code generation to an AST.");
+
+#define _TESTINTERNALCAPI_COMPILER_CODEGEN_METHODDEF \
+ {"compiler_codegen", _PyCFunction_CAST(_testinternalcapi_compiler_codegen), METH_FASTCALL|METH_KEYWORDS, _testinternalcapi_compiler_codegen__doc__},
+
+static PyObject *
+_testinternalcapi_compiler_codegen_impl(PyObject *module, PyObject *ast,
+ PyObject *filename, int optimize);
+
+static PyObject *
+_testinternalcapi_compiler_codegen(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 3
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(ast), &_Py_ID(filename), &_Py_ID(optimize), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"ast", "filename", "optimize", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "compiler_codegen",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[3];
+ PyObject *ast;
+ PyObject *filename;
+ int optimize;
+
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ ast = args[0];
+ filename = args[1];
+ optimize = _PyLong_AsInt(args[2]);
+ if (optimize == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = _testinternalcapi_compiler_codegen_impl(module, ast, filename, optimize);
+
+exit:
+ return return_value;
+}
+
PyDoc_STRVAR(_testinternalcapi_optimize_cfg__doc__,
"optimize_cfg($module, /, instructions, consts)\n"
"--\n"
@@ -65,4 +128,4 @@ _testinternalcapi_optimize_cfg(PyObject *module, PyObject *const *args, Py_ssize
exit:
return return_value;
}
-/*[clinic end generated code: output=3b1fd713290f68a9 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=efe95836482fd542 input=a9049054013a1b77]*/
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 75832e9..cacfad7 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -1870,8 +1870,7 @@ gc_is_tracked(PyObject *module, PyObject *obj)
result = Py_True;
else
result = Py_False;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
/*[clinic input]
diff --git a/Modules/getpath.c b/Modules/getpath.c
index ceacf36..13db010 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -125,8 +125,7 @@ getpath_isabs(PyObject *Py_UNUSED(self), PyObject *args)
r = _Py_isabs(path) ? Py_True : Py_False;
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -153,11 +152,10 @@ getpath_hassuffix(PyObject *Py_UNUSED(self), PyObject *args)
wcscmp(&path[len - suffixLen], suffix) != 0
#endif
) {
- r = Py_False;
+ r = Py_NewRef(Py_False);
} else {
- r = Py_True;
+ r = Py_NewRef(Py_True);
}
- Py_INCREF(r);
PyMem_Free((void *)suffix);
}
PyMem_Free((void *)path);
@@ -187,8 +185,7 @@ getpath_isdir(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -213,8 +210,7 @@ getpath_isfile(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -247,8 +243,7 @@ getpath_isxfile(PyObject *Py_UNUSED(self), PyObject *args)
#endif
PyMem_Free((void *)path);
}
- Py_XINCREF(r);
- return r;
+ return Py_XNewRef(r);
}
@@ -488,8 +483,7 @@ done:
goto done;
}
if (!S_ISLNK(st.st_mode)) {
- Py_INCREF(pathobj);
- r = pathobj;
+ r = Py_NewRef(pathobj);
goto done;
}
wchar_t resolved[MAXPATHLEN+1];
@@ -504,8 +498,7 @@ done:
return r;
#endif
- Py_INCREF(pathobj);
- return pathobj;
+ return Py_NewRef(pathobj);
}
@@ -591,8 +584,7 @@ wchar_to_dict(PyObject *dict, const char *key, const wchar_t *s)
return 0;
}
} else {
- u = Py_None;
- Py_INCREF(u);
+ u = Py_NewRef(Py_None);
}
r = PyDict_SetItemString(dict, key, u) == 0;
Py_DECREF(u);
@@ -617,8 +609,7 @@ decode_to_dict(PyObject *dict, const char *key, const char *s)
return 0;
}
} else {
- u = Py_None;
- Py_INCREF(u);
+ u = Py_NewRef(Py_None);
}
r = PyDict_SetItemString(dict, key, u) == 0;
Py_DECREF(u);
diff --git a/Modules/getpath.py b/Modules/getpath.py
index d24b152..ab0d2dc 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -679,9 +679,8 @@ elif not pythonpath_was_set:
else:
library_dir = executable_dir
pythonpath.append(joinpath(library_dir, ZIP_LANDMARK))
- elif build_prefix or venv_prefix:
+ elif build_prefix:
# QUIRK: POSIX uses the default prefix when in the build directory
- # or a venv
pythonpath.append(joinpath(PREFIX, ZIP_LANDMARK))
else:
pythonpath.append(joinpath(prefix, ZIP_LANDMARK))
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 4642787..16a2f45 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2048,8 +2048,7 @@ factorial_odd_part(unsigned long n)
inner = PyLong_FromLong(1);
if (inner == NULL)
return NULL;
- outer = inner;
- Py_INCREF(outer);
+ outer = Py_NewRef(inner);
upper = 3;
for (i = _Py_bit_length(n) - 2; i >= 0; i--) {
@@ -3521,8 +3520,7 @@ perm_comb(PyObject *n, unsigned long long k, int iscomb)
return PyLong_FromLong(1);
}
if (k == 1) {
- Py_INCREF(n);
- return n;
+ return Py_NewRef(n);
}
/* P(n, k) = P(n, j) * P(n-j, k-j) */
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index f1c126f..79f4eba 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -534,8 +534,7 @@ oss_close(oss_audio_t *self, PyObject *unused)
static PyObject *
oss_self(PyObject *self, PyObject *unused)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -1135,10 +1134,8 @@ PyInit_ossaudiodev(void)
NULL, NULL);
if (OSSAudioError) {
/* Each call to PyModule_AddObject decrefs it; compensate: */
- Py_INCREF(OSSAudioError);
- Py_INCREF(OSSAudioError);
- PyModule_AddObject(m, "error", OSSAudioError);
- PyModule_AddObject(m, "OSSAudioError", OSSAudioError);
+ PyModule_AddObject(m, "error", Py_NewRef(OSSAudioError));
+ PyModule_AddObject(m, "OSSAudioError", Py_NewRef(OSSAudioError));
}
/* Build 'control_labels' and 'control_names' lists and add them
diff --git a/Modules/overlapped.c b/Modules/overlapped.c
index deb772e..02c0f40 100644
--- a/Modules/overlapped.c
+++ b/Modules/overlapped.c
@@ -912,8 +912,7 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
_PyBytes_Resize(&self->allocated_buffer, transferred))
return NULL;
- Py_INCREF(self->allocated_buffer);
- return self->allocated_buffer;
+ return Py_NewRef(self->allocated_buffer);
case TYPE_READ_FROM:
assert(PyBytes_CheckExact(self->read_from.allocated_buffer));
@@ -940,14 +939,12 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
}
// first item: message
- Py_INCREF(self->read_from.allocated_buffer);
PyTuple_SET_ITEM(self->read_from.result, 0,
- self->read_from.allocated_buffer);
+ Py_NewRef(self->read_from.allocated_buffer));
// second item: address
PyTuple_SET_ITEM(self->read_from.result, 1, addr);
- Py_INCREF(self->read_from.result);
- return self->read_from.result;
+ return Py_NewRef(self->read_from.result);
case TYPE_READ_FROM_INTO:
// unparse the address
addr = unparse_address((SOCKADDR*)&self->read_from_into.address,
@@ -970,8 +967,7 @@ _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait)
// second item: address
PyTuple_SET_ITEM(self->read_from_into.result, 1, addr);
- Py_INCREF(self->read_from_into.result);
- return self->read_from_into.result;
+ return Py_NewRef(self->read_from_into.result);
default:
return PyLong_FromUnsignedLong((unsigned long) transferred);
}
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index d863f9f..5968c19 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1221,8 +1221,7 @@ path_converter(PyObject *o, void *p)
#endif
}
else if (is_bytes) {
- bytes = o;
- Py_INCREF(bytes);
+ bytes = Py_NewRef(o);
}
else if (is_index) {
if (!_fd_converter(o, &path->fd)) {
@@ -2240,8 +2239,7 @@ statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
for (i = 7; i <= 9; i++) {
if (result->ob_item[i+3] == Py_None) {
Py_DECREF(Py_None);
- Py_INCREF(result->ob_item[i]);
- result->ob_item[i+3] = result->ob_item[i];
+ result->ob_item[i+3] = Py_NewRef(result->ob_item[i]);
}
}
return (PyObject*)result;
@@ -6888,8 +6886,7 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority)
res = PyStructSequence_New(type);
if (!res)
return NULL;
- Py_INCREF(sched_priority);
- PyStructSequence_SET_ITEM(res, 0, sched_priority);
+ PyStructSequence_SET_ITEM(res, 0, Py_NewRef(sched_priority));
return res;
}
@@ -8017,8 +8014,7 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal)
err = GetLastError();
result = PyErr_SetFromWindowsErr(err);
} else {
- Py_INCREF(Py_None);
- result = Py_None;
+ result = Py_NewRef(Py_None);
}
CloseHandle(handle);
@@ -8647,7 +8643,7 @@ os_unshare_impl(PyObject *module, int flags)
if (res != 0) {
return posix_error();
}
-
+
Py_RETURN_NONE;
}
#endif
@@ -13693,8 +13689,7 @@ DirEntry_get_lstat(PyTypeObject *defining_class, DirEntry *self)
self->lstat = DirEntry_fetch_stat(module, self, 0);
#endif
}
- Py_XINCREF(self->lstat);
- return self->lstat;
+ return Py_XNewRef(self->lstat);
}
/*[clinic input]
@@ -13730,8 +13725,7 @@ os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class,
}
}
- Py_XINCREF(self->stat);
- return self->stat;
+ return Py_XNewRef(self->stat);
}
/* Set exception and return -1 on error, 0 for False, 1 for True */
@@ -13905,8 +13899,7 @@ static PyObject *
os_DirEntry___fspath___impl(DirEntry *self)
/*[clinic end generated code: output=6dd7f7ef752e6f4f input=3c49d0cf38df4fac]*/
{
- Py_INCREF(self->path);
- return self->path;
+ return Py_NewRef(self->path);
}
static PyMemberDef DirEntry_members[] = {
@@ -14114,8 +14107,7 @@ DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name,
goto error;
if (path->fd != -1) {
- entry->path = entry->name;
- Py_INCREF(entry->path);
+ entry->path = Py_NewRef(entry->name);
}
else if (!entry->path)
goto error;
@@ -14306,8 +14298,7 @@ ScandirIterator_close(ScandirIterator *self, PyObject *args)
static PyObject *
ScandirIterator_enter(PyObject *self, PyObject *args)
{
- Py_INCREF(self);
- return self;
+ return Py_NewRef(self);
}
static PyObject *
@@ -14515,8 +14506,7 @@ PyOS_FSPath(PyObject *path)
PyObject *path_repr = NULL;
if (PyUnicode_Check(path) || PyBytes_Check(path)) {
- Py_INCREF(path);
- return path;
+ return Py_NewRef(path);
}
func = _PyObject_LookupSpecial(path, &_Py_ID(__fspath__));
@@ -15881,8 +15871,7 @@ posixmodule_exec(PyObject *m)
if (setup_confname_tables(m))
return -1;
- Py_INCREF(PyExc_OSError);
- PyModule_AddObject(m, "error", PyExc_OSError);
+ PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError));
#if defined(HAVE_WAITID) && !defined(__APPLE__)
waitid_result_desc.name = MODNAME ".waitid_result";
@@ -15890,8 +15879,7 @@ posixmodule_exec(PyObject *m)
if (WaitidResultType == NULL) {
return -1;
}
- Py_INCREF(WaitidResultType);
- PyModule_AddObject(m, "waitid_result", WaitidResultType);
+ PyModule_AddObject(m, "waitid_result", Py_NewRef(WaitidResultType));
state->WaitidResultType = WaitidResultType;
#endif
@@ -15903,8 +15891,7 @@ posixmodule_exec(PyObject *m)
if (StatResultType == NULL) {
return -1;
}
- Py_INCREF(StatResultType);
- PyModule_AddObject(m, "stat_result", StatResultType);
+ PyModule_AddObject(m, "stat_result", Py_NewRef(StatResultType));
state->StatResultType = StatResultType;
structseq_new = ((PyTypeObject *)StatResultType)->tp_new;
((PyTypeObject *)StatResultType)->tp_new = statresult_new;
@@ -15914,8 +15901,7 @@ posixmodule_exec(PyObject *m)
if (StatVFSResultType == NULL) {
return -1;
}
- Py_INCREF(StatVFSResultType);
- PyModule_AddObject(m, "statvfs_result", StatVFSResultType);
+ PyModule_AddObject(m, "statvfs_result", Py_NewRef(StatVFSResultType));
state->StatVFSResultType = StatVFSResultType;
#ifdef NEED_TICKS_PER_SECOND
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
@@ -15933,8 +15919,7 @@ posixmodule_exec(PyObject *m)
if (SchedParamType == NULL) {
return -1;
}
- Py_INCREF(SchedParamType);
- PyModule_AddObject(m, "sched_param", SchedParamType);
+ PyModule_AddObject(m, "sched_param", Py_NewRef(SchedParamType));
state->SchedParamType = SchedParamType;
((PyTypeObject *)SchedParamType)->tp_new = os_sched_param;
#endif
@@ -15944,8 +15929,7 @@ posixmodule_exec(PyObject *m)
if (TerminalSizeType == NULL) {
return -1;
}
- Py_INCREF(TerminalSizeType);
- PyModule_AddObject(m, "terminal_size", TerminalSizeType);
+ PyModule_AddObject(m, "terminal_size", Py_NewRef(TerminalSizeType));
state->TerminalSizeType = TerminalSizeType;
/* initialize scandir types */
@@ -15959,8 +15943,7 @@ posixmodule_exec(PyObject *m)
if (DirEntryType == NULL) {
return -1;
}
- Py_INCREF(DirEntryType);
- PyModule_AddObject(m, "DirEntry", DirEntryType);
+ PyModule_AddObject(m, "DirEntry", Py_NewRef(DirEntryType));
state->DirEntryType = DirEntryType;
times_result_desc.name = MODNAME ".times_result";
@@ -15968,16 +15951,15 @@ posixmodule_exec(PyObject *m)
if (TimesResultType == NULL) {
return -1;
}
- Py_INCREF(TimesResultType);
- PyModule_AddObject(m, "times_result", TimesResultType);
+ PyModule_AddObject(m, "times_result", Py_NewRef(TimesResultType));
state->TimesResultType = TimesResultType;
PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc);
if (UnameResultType == NULL) {
return -1;
}
- Py_INCREF(UnameResultType);
- PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType);
+ ;
+ PyModule_AddObject(m, "uname_result", Py_NewRef(UnameResultType));
state->UnameResultType = (PyObject *)UnameResultType;
if ((state->billion = PyLong_FromLong(1000000000)) == NULL)
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 3fe4259..0e0a9cf 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -959,8 +959,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,
encoding);
new_parser->handlers = 0;
- new_parser->intern = self->intern;
- Py_XINCREF(new_parser->intern);
+ new_parser->intern = Py_XNewRef(self->intern);
if (self->buffer != NULL) {
new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
@@ -991,8 +990,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
for (i = 0; handler_info[i].name != NULL; i++) {
PyObject *handler = self->handlers[i];
if (handler != NULL) {
- Py_INCREF(handler);
- new_parser->handlers[i] = handler;
+ new_parser->handlers[i] = Py_NewRef(handler);
handler_info[i].setter(new_parser->itself,
handler_info[i].handler);
}
@@ -1148,8 +1146,7 @@ newxmlparseobject(pyexpat_state *state, const char *encoding,
self->in_callback = 0;
self->ns_prefixes = 0;
self->handlers = NULL;
- self->intern = intern;
- Py_XINCREF(self->intern);
+ self->intern = Py_XNewRef(intern);
/* namespace_separator is either NULL or contains one char + \0 */
self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
@@ -1232,8 +1229,7 @@ xmlparse_handler_getter(xmlparseobject *self, struct HandlerInfo *hi)
PyObject *result = self->handlers[handlernum];
if (result == NULL)
result = Py_None;
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
static int
@@ -1365,9 +1361,7 @@ xmlparse_buffer_size_setter(xmlparseobject *self, PyObject *v, void *closure)
/* check maximum */
if (new_buffer_size > INT_MAX) {
- char errmsg[100];
- sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX);
- PyErr_SetString(PyExc_ValueError, errmsg);
+ PyErr_Format(PyExc_ValueError, "buffer_size must not be greater than %i", INT_MAX);
return -1;
}
@@ -1796,15 +1790,13 @@ add_errors_module(PyObject *mod)
goto error;
}
- Py_INCREF(codes_dict);
- if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) {
+ if (PyModule_AddObject(errors_module, "codes", Py_NewRef(codes_dict)) < 0) {
Py_DECREF(codes_dict);
goto error;
}
Py_CLEAR(codes_dict);
- Py_INCREF(rev_codes_dict);
- if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) {
+ if (PyModule_AddObject(errors_module, "messages", Py_NewRef(rev_codes_dict)) < 0) {
Py_DECREF(rev_codes_dict);
goto error;
}
diff --git a/Modules/readline.c b/Modules/readline.c
index 27b89de..fdb6356 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -402,8 +402,7 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *function)
Py_CLEAR(*hook_var);
}
else if (PyCallable_Check(function)) {
- Py_INCREF(function);
- Py_XSETREF(*hook_var, function);
+ Py_XSETREF(*hook_var, Py_NewRef(function));
}
else {
PyErr_Format(PyExc_TypeError,
@@ -524,8 +523,7 @@ static PyObject *
readline_get_begidx_impl(PyObject *module)
/*[clinic end generated code: output=362616ee8ed1b2b1 input=e083b81c8eb4bac3]*/
{
- Py_INCREF(readlinestate_global->begidx);
- return readlinestate_global->begidx;
+ return Py_NewRef(readlinestate_global->begidx);
}
/* Get the ending index for the scope of the tab-completion */
@@ -540,8 +538,7 @@ static PyObject *
readline_get_endidx_impl(PyObject *module)
/*[clinic end generated code: output=7f763350b12d7517 input=d4c7e34a625fd770]*/
{
- Py_INCREF(readlinestate_global->endidx);
- return readlinestate_global->endidx;
+ return Py_NewRef(readlinestate_global->endidx);
}
/* Set the tab-completion word-delimiters that readline uses */
@@ -784,8 +781,7 @@ readline_get_completer_impl(PyObject *module)
if (readlinestate_global->completer == NULL) {
Py_RETURN_NONE;
}
- Py_INCREF(readlinestate_global->completer);
- return readlinestate_global->completer;
+ return Py_NewRef(readlinestate_global->completer);
}
/* Private function to get current length of history. XXX It may be
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index e99dfc6..4ecb88c 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -4110,8 +4110,7 @@ makeval_recvmsg(ssize_t received, void *data)
if (received < PyBytes_GET_SIZE(*buf))
_PyBytes_Resize(buf, received);
- Py_XINCREF(*buf);
- return *buf;
+ return Py_XNewRef(*buf);
}
/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
@@ -4390,8 +4389,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args)
} while (len > 0);
PyBuffer_Release(&pbuf);
- Py_INCREF(Py_None);
- res = Py_None;
+ res = Py_NewRef(Py_None);
done:
PyBuffer_Release(&pbuf);
@@ -7346,29 +7344,22 @@ PyInit__socket(void)
if (m == NULL)
return NULL;
- Py_INCREF(PyExc_OSError);
- PyModule_AddObject(m, "error", PyExc_OSError);
+ PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError));
socket_herror = PyErr_NewException("socket.herror",
PyExc_OSError, NULL);
if (socket_herror == NULL)
return NULL;
- Py_INCREF(socket_herror);
- PyModule_AddObject(m, "herror", socket_herror);
+ PyModule_AddObject(m, "herror", Py_NewRef(socket_herror));
socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
NULL);
if (socket_gaierror == NULL)
return NULL;
- Py_INCREF(socket_gaierror);
- PyModule_AddObject(m, "gaierror", socket_gaierror);
+ PyModule_AddObject(m, "gaierror", Py_NewRef(socket_gaierror));
PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError);
- Py_INCREF((PyObject *)&sock_type);
- if (PyModule_AddObject(m, "SocketType",
- (PyObject *)&sock_type) != 0)
+ if (PyModule_AddObject(m, "SocketType", Py_NewRef(&sock_type)) != 0)
return NULL;
- Py_INCREF((PyObject *)&sock_type);
- if (PyModule_AddObject(m, "socket",
- (PyObject *)&sock_type) != 0)
+ if (PyModule_AddObject(m, "socket", Py_NewRef(&sock_type)) != 0)
return NULL;
#ifdef ENABLE_IPV6
@@ -7376,8 +7367,7 @@ PyInit__socket(void)
#else
has_ipv6 = Py_False;
#endif
- Py_INCREF(has_ipv6);
- PyModule_AddObject(m, "has_ipv6", has_ipv6);
+ PyModule_AddObject(m, "has_ipv6", Py_NewRef(has_ipv6));
/* Export C API */
PySocketModule_APIObject *capi = sock_get_api();
diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
index c25ecc2..4ef1d8c 100644
--- a/Modules/symtablemodule.c
+++ b/Modules/symtablemodule.c
@@ -56,8 +56,7 @@ _symtable_symtable_impl(PyObject *module, PyObject *source,
if (st == NULL) {
return NULL;
}
- t = (PyObject *)st->st_top;
- Py_INCREF(t);
+ t = Py_NewRef(st->st_top);
_PySymtable_Free(st);
return t;
}
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 3201470..59fccd4 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -159,8 +159,7 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr,
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyLong_FromLong(rc);
@@ -194,8 +193,7 @@ unicodedata_UCD_digit_impl(PyObject *self, int chr, PyObject *default_value)
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyLong_FromLong(rc);
@@ -246,8 +244,7 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr,
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
return PyFloat_FromDouble(rc);
@@ -917,8 +914,7 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form,
result = (m == YES) ? Py_True : Py_False;
}
- Py_INCREF(result);
- return result;
+ return Py_NewRef(result);
}
@@ -943,39 +939,34 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form,
if (PyUnicode_GET_LENGTH(input) == 0) {
/* Special case empty input strings, since resizing
them later would cause internal errors. */
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
if (PyUnicode_CompareWithASCIIString(form, "NFC") == 0) {
if (is_normalized_quickcheck(self, input,
true, false, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfc_nfkc(self, input, 0);
}
if (PyUnicode_CompareWithASCIIString(form, "NFKC") == 0) {
if (is_normalized_quickcheck(self, input,
true, true, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfc_nfkc(self, input, 1);
}
if (PyUnicode_CompareWithASCIIString(form, "NFD") == 0) {
if (is_normalized_quickcheck(self, input,
false, false, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfd_nfkd(self, input, 0);
}
if (PyUnicode_CompareWithASCIIString(form, "NFKD") == 0) {
if (is_normalized_quickcheck(self, input,
false, true, true) == YES) {
- Py_INCREF(input);
- return input;
+ return Py_NewRef(input);
}
return nfd_nfkd(self, input, 1);
}
@@ -1370,8 +1361,7 @@ unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value)
return NULL;
}
else {
- Py_INCREF(default_value);
- return default_value;
+ return Py_NewRef(default_value);
}
}
diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c
index e234504..5f5297b 100644
--- a/Modules/xxlimited.c
+++ b/Modules/xxlimited.c
@@ -155,8 +155,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -210,18 +209,15 @@ Xxo_demo(XxoObject *self, PyTypeObject *defining_class,
/* Test if the argument is "str" */
if (PyUnicode_Check(o)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
/* test if the argument is of the Xxo class */
if (PyObject_TypeCheck(o, defining_class)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
diff --git a/Modules/xxlimited_35.c b/Modules/xxlimited_35.c
index 8d29c71..361c7e7 100644
--- a/Modules/xxlimited_35.c
+++ b/Modules/xxlimited_35.c
@@ -64,11 +64,9 @@ Xxo_demo(XxoObject *self, PyObject *args)
return NULL;
/* Test availability of fast type checks */
if (o != NULL && PyUnicode_Check(o)) {
- Py_INCREF(o);
- return o;
+ return Py_NewRef(o);
}
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
@@ -83,8 +81,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -176,8 +173,7 @@ xx_roj(PyObject *self, PyObject *args)
long b;
if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c
index a6e5071..a676fdb 100644
--- a/Modules/xxmodule.c
+++ b/Modules/xxmodule.c
@@ -52,8 +52,7 @@ Xxo_demo(XxoObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":demo"))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef Xxo_methods[] = {
@@ -68,8 +67,7 @@ Xxo_getattro(XxoObject *self, PyObject *name)
if (self->x_attr != NULL) {
PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
if (v != NULL) {
- Py_INCREF(v);
- return v;
+ return Py_NewRef(v);
}
else if (PyErr_Occurred()) {
return NULL;
@@ -195,8 +193,7 @@ xx_bug(PyObject *self, PyObject *args)
printf("\n");
/* Py_DECREF(item); */
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
/* Test bad format character */
@@ -208,8 +205,7 @@ xx_roj(PyObject *self, PyObject *args)
long b;
if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
return NULL;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
@@ -266,8 +262,7 @@ static PyTypeObject Str_Type = {
static PyObject *
null_richcompare(PyObject *self, PyObject *other, int op)
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ return Py_NewRef(Py_NotImplemented);
}
static PyTypeObject Null_Type = {
diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c
index 12306f2..8512baf 100644
--- a/Modules/xxsubtype.c
+++ b/Modules/xxsubtype.c
@@ -39,8 +39,7 @@ spamlist_setstate(spamlistobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "i:setstate", &state))
return NULL;
self->state = state;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyObject *
@@ -53,12 +52,9 @@ spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw)
self = Py_None;
if (kw == NULL)
kw = Py_None;
- Py_INCREF(self);
- PyTuple_SET_ITEM(result, 0, self);
- Py_INCREF(args);
- PyTuple_SET_ITEM(result, 1, args);
- Py_INCREF(kw);
- PyTuple_SET_ITEM(result, 2, kw);
+ PyTuple_SET_ITEM(result, 0, Py_NewRef(self));
+ PyTuple_SET_ITEM(result, 1, Py_NewRef(args));
+ PyTuple_SET_ITEM(result, 2, Py_NewRef(kw));
}
return result;
}
@@ -164,8 +160,7 @@ spamdict_setstate(spamdictobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "i:setstate", &state))
return NULL;
self->state = state;
- Py_INCREF(Py_None);
- return Py_None;
+ return Py_NewRef(Py_None);
}
static PyMethodDef spamdict_methods[] = {
@@ -279,14 +274,12 @@ xxsubtype_exec(PyObject* m)
if (PyType_Ready(&spamdict_type) < 0)
return -1;
- Py_INCREF(&spamlist_type);
if (PyModule_AddObject(m, "spamlist",
- (PyObject *) &spamlist_type) < 0)
+ Py_NewRef(&spamlist_type)) < 0)
return -1;
- Py_INCREF(&spamdict_type);
if (PyModule_AddObject(m, "spamdict",
- (PyObject *) &spamdict_type) < 0)
+ Py_NewRef(&spamdict_type)) < 0)
return -1;
return 0;
}
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 30c2515..1cdfd01 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -671,8 +671,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
self->zst.next_in = NULL;
self->zst.avail_in = 0;
if (zdict != NULL) {
- Py_INCREF(zdict);
- self->zdict = zdict;
+ self->zdict = Py_NewRef(zdict);
}
int err = inflateInit2(&self->zst, wbits);
switch (err) {
@@ -1089,12 +1088,9 @@ zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls)
zlib_error(state, self->zst, err, "while copying compression object");
goto error;
}
- Py_INCREF(self->unused_data);
- Py_XSETREF(return_value->unused_data, self->unused_data);
- Py_INCREF(self->unconsumed_tail);
- Py_XSETREF(return_value->unconsumed_tail, self->unconsumed_tail);
- Py_XINCREF(self->zdict);
- Py_XSETREF(return_value->zdict, self->zdict);
+ Py_XSETREF(return_value->unused_data, Py_NewRef(self->unused_data));
+ Py_XSETREF(return_value->unconsumed_tail, Py_NewRef(self->unconsumed_tail));
+ Py_XSETREF(return_value->zdict, Py_XNewRef(self->zdict));
return_value->eof = self->eof;
/* Mark it as being initialized */
@@ -1177,12 +1173,9 @@ zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls)
goto error;
}
- Py_INCREF(self->unused_data);
- Py_XSETREF(return_value->unused_data, self->unused_data);
- Py_INCREF(self->unconsumed_tail);
- Py_XSETREF(return_value->unconsumed_tail, self->unconsumed_tail);
- Py_XINCREF(self->zdict);
- Py_XSETREF(return_value->zdict, self->zdict);
+ Py_XSETREF(return_value->unused_data, Py_NewRef(self->unused_data));
+ Py_XSETREF(return_value->unconsumed_tail, Py_NewRef(self->unconsumed_tail));
+ Py_XSETREF(return_value->zdict, Py_XNewRef(self->zdict));
return_value->eof = self->eof;
/* Mark it as being initialized */
@@ -1440,11 +1433,11 @@ arrange_output_buffer_with_maximum(uint32_t *avail_out,
return length;
}
-/* Decompress data of length self->avail_in_real in self->state.next_in. The
- output buffer is allocated dynamically and returned. If the max_length is
- of sufficiently low size, max_length is allocated immediately. At most
- max_length bytes are returned, so some of the input may not be consumed.
- self->state.next_in and self->avail_in_real are updated to reflect the
+/* Decompress data of length self->avail_in_real in self->state.next_in. The
+ output buffer is allocated dynamically and returned. If the max_length is
+ of sufficiently low size, max_length is allocated immediately. At most
+ max_length bytes are returned, so some of the input may not be consumed.
+ self->state.next_in and self->avail_in_real are updated to reflect the
consumed input. */
static PyObject*
decompress_buf(ZlibDecompressor *self, Py_ssize_t max_length)
@@ -1456,11 +1449,11 @@ decompress_buf(ZlibDecompressor *self, Py_ssize_t max_length)
Py_ssize_t hard_limit;
Py_ssize_t obuflen;
zlibstate *state = PyType_GetModuleState(Py_TYPE(self));
-
+
int err = Z_OK;
- /* When sys.maxsize is passed as default use DEF_BUF_SIZE as start buffer.
- In this particular case the data may not necessarily be very big, so
+ /* When sys.maxsize is passed as default use DEF_BUF_SIZE as start buffer.
+ In this particular case the data may not necessarily be very big, so
it is better to grow dynamically.*/
if ((max_length < 0) || max_length == PY_SSIZE_T_MAX) {
hard_limit = PY_SSIZE_T_MAX;
@@ -1544,7 +1537,7 @@ success:
static PyObject *
-decompress(ZlibDecompressor *self, uint8_t *data,
+decompress(ZlibDecompressor *self, uint8_t *data,
size_t len, Py_ssize_t max_length)
{
bool input_buffer_in_use;
@@ -1713,8 +1706,8 @@ PyDoc_STRVAR(ZlibDecompressor__new____doc__,
"\n");
static PyObject *
-ZlibDecompressor__new__(PyTypeObject *cls,
- PyObject *args,
+ZlibDecompressor__new__(PyTypeObject *cls,
+ PyObject *args,
PyObject *kwargs)
{
static char *keywords[] = {"wbits", "zdict", NULL};
@@ -1727,16 +1720,13 @@ ZlibDecompressor__new__(PyTypeObject *cls,
args, kwargs, format, keywords, &wbits, &zdict)) {
return NULL;
}
- ZlibDecompressor *self = PyObject_New(ZlibDecompressor, cls);
+ ZlibDecompressor *self = PyObject_New(ZlibDecompressor, cls);
self->eof = 0;
self->needs_input = 1;
self->avail_in_real = 0;
self->input_buffer = NULL;
self->input_buffer_size = 0;
- if (zdict != NULL) {
- Py_INCREF(zdict);
- }
- self->zdict = zdict;
+ self->zdict = Py_XNewRef(zdict);
self->zst.opaque = NULL;
self->zst.zalloc = PyZlib_Malloc;
self->zst.zfree = PyZlib_Free;
@@ -2042,14 +2032,12 @@ zlib_exec(PyObject *mod)
return -1;
}
- Py_INCREF(state->ZlibError);
- if (PyModule_AddObject(mod, "error", state->ZlibError) < 0) {
+ if (PyModule_AddObject(mod, "error", Py_NewRef(state->ZlibError)) < 0) {
Py_DECREF(state->ZlibError);
return -1;
}
- Py_INCREF(state->ZlibDecompressorType);
- if (PyModule_AddObject(mod, "_ZlibDecompressor",
- (PyObject *)state->ZlibDecompressorType) < 0) {
+ if (PyModule_AddObject(mod, "_ZlibDecompressor",
+ Py_NewRef(state->ZlibDecompressorType)) < 0) {
Py_DECREF(state->ZlibDecompressorType);
return -1;
}