mirror of
https://github.com/python/cpython.git
synced 2025-10-12 09:53:19 +00:00
bpo-35059: Cleanup usage of Python macros (GH-10648)
Don't pass complex expressions but regular variables to Python macros. * _datetimemodule.c: split single large "if" into two "if" in date_new(), time_new() and datetime_new(). * _pickle.c, load_extension(): flatten complex "if" expression into more regular C code. * _ssl.c: addbool() now uses a temporary bool_obj to only evaluate the value once. * weakrefobject.c: replace "Py_INCREF(result = proxy);" with "result = proxy; Py_INCREF(result);"
This commit is contained in:
parent
2ff8fb7639
commit
b37672daf6
4 changed files with 109 additions and 85 deletions
|
@ -2798,8 +2798,9 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
int day;
|
||||
|
||||
/* Check for invocation from pickle with __getstate__ state */
|
||||
if (PyTuple_GET_SIZE(args) == 1 &&
|
||||
PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
|
||||
if (PyTuple_GET_SIZE(args) == 1) {
|
||||
state = PyTuple_GET_ITEM(args, 0);
|
||||
if (PyBytes_Check(state) &&
|
||||
PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE &&
|
||||
MONTH_IS_SANE(PyBytes_AS_STRING(state)[2]))
|
||||
{
|
||||
|
@ -2813,6 +2814,7 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
}
|
||||
return (PyObject *)me;
|
||||
}
|
||||
}
|
||||
|
||||
if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws,
|
||||
&year, &month, &day)) {
|
||||
|
@ -3913,8 +3915,10 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
|
||||
/* Check for invocation from pickle with __getstate__ state */
|
||||
if (PyTuple_GET_SIZE(args) >= 1 &&
|
||||
PyTuple_GET_SIZE(args) <= 2 &&
|
||||
PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
|
||||
PyTuple_GET_SIZE(args) <= 2)
|
||||
{
|
||||
state = PyTuple_GET_ITEM(args, 0);
|
||||
if (PyBytes_Check(state) &&
|
||||
PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE &&
|
||||
(0x7F & ((unsigned char) (PyBytes_AS_STRING(state)[0]))) < 24)
|
||||
{
|
||||
|
@ -3951,6 +3955,7 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
}
|
||||
return (PyObject *)me;
|
||||
}
|
||||
}
|
||||
|
||||
if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO$i", time_kws,
|
||||
&hour, &minute, &second, &usecond,
|
||||
|
@ -4552,8 +4557,10 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
|
||||
/* Check for invocation from pickle with __getstate__ state */
|
||||
if (PyTuple_GET_SIZE(args) >= 1 &&
|
||||
PyTuple_GET_SIZE(args) <= 2 &&
|
||||
PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
|
||||
PyTuple_GET_SIZE(args) <= 2)
|
||||
{
|
||||
state = PyTuple_GET_ITEM(args, 0);
|
||||
if (PyBytes_Check(state) &&
|
||||
PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE &&
|
||||
MONTH_IS_SANE(PyBytes_AS_STRING(state)[2] & 0x7F))
|
||||
{
|
||||
|
@ -4590,6 +4597,7 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
}
|
||||
return (PyObject *)me;
|
||||
}
|
||||
}
|
||||
|
||||
if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO$i", datetime_kws,
|
||||
&year, &month, &day, &hour, &minute,
|
||||
|
|
|
@ -5858,14 +5858,20 @@ load_extension(UnpicklerObject *self, int nbytes)
|
|||
/* Since the extension registry is manipulable via Python code,
|
||||
* confirm that pair is really a 2-tuple of strings.
|
||||
*/
|
||||
if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
|
||||
!PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
|
||||
!PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
|
||||
Py_DECREF(py_code);
|
||||
PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
|
||||
"isn't a 2-tuple of strings", code);
|
||||
return -1;
|
||||
if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
module_name = PyTuple_GET_ITEM(pair, 0);
|
||||
if (!PyUnicode_Check(module_name)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
class_name = PyTuple_GET_ITEM(pair, 1);
|
||||
if (!PyUnicode_Check(class_name)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Load the object. */
|
||||
obj = find_class(self, module_name, class_name);
|
||||
if (obj == NULL) {
|
||||
|
@ -5881,6 +5887,12 @@ load_extension(UnpicklerObject *self, int nbytes)
|
|||
}
|
||||
PDATA_PUSH(self->stack, obj, -1);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
Py_DECREF(py_code);
|
||||
PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
|
||||
"isn't a 2-tuple of strings", code);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -5983,9 +5983,12 @@ PyInit__ssl(void)
|
|||
PyModule_AddIntConstant(m, "PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
|
||||
PyModule_AddIntConstant(m, "PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
|
||||
|
||||
#define addbool(m, v, b) \
|
||||
Py_INCREF((b) ? Py_True : Py_False); \
|
||||
PyModule_AddObject((m), (v), (b) ? Py_True : Py_False);
|
||||
#define addbool(m, key, value) \
|
||||
do { \
|
||||
PyObject *bool_obj = (value) ? Py_True : Py_False; \
|
||||
Py_INCREF(bool_obj); \
|
||||
PyModule_AddObject((m), (key), bool_obj); \
|
||||
} while (0)
|
||||
|
||||
#if HAVE_SNI
|
||||
addbool(m, "HAS_SNI", 1);
|
||||
|
|
|
@ -833,7 +833,8 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
|
|||
to avoid violating the invariants of the list
|
||||
of weakrefs for ob. */
|
||||
Py_DECREF(result);
|
||||
Py_INCREF(result = proxy);
|
||||
result = proxy;
|
||||
Py_INCREF(result);
|
||||
goto skip_insert;
|
||||
}
|
||||
prev = ref;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue