diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-01-12 06:25:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-12 06:25:41 (GMT) |
commit | 793426687509be24a42663a27e568cc92dcc07f6 (patch) | |
tree | 905154eb18d4d654b3c0d295f571b96e6250c75b /Python/bltinmodule.c | |
parent | cb08a71c5c534f33d9486677534dafb087c30e8c (diff) | |
download | cpython-793426687509be24a42663a27e568cc92dcc07f6.zip cpython-793426687509be24a42663a27e568cc92dcc07f6.tar.gz cpython-793426687509be24a42663a27e568cc92dcc07f6.tar.bz2 |
bpo-35582: Inline arguments tuple unpacking in handwritten code. (GH-11524)
Inline PyArg_UnpackTuple() and _PyArg_UnpackStack() in performance
sensitive code in the builtins and operator modules.
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r-- | Python/bltinmodule.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index e19bc56..332142f 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1067,19 +1067,21 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, static PyObject * builtin_getattr(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - PyObject *v, *result, *dflt = NULL; - PyObject *name; + PyObject *v, *name, *result; - if (!_PyArg_UnpackStack(args, nargs, "getattr", 2, 3, &v, &name, &dflt)) + if (!_PyArg_CheckPositional("getattr", nargs, 2, 3)) return NULL; + v = args[0]; + name = args[1]; if (!PyUnicode_Check(name)) { PyErr_SetString(PyExc_TypeError, "getattr(): attribute name must be string"); return NULL; } - if (dflt != NULL) { + if (nargs > 2) { if (_PyObject_LookupAttr(v, name, &result) == 0) { + PyObject *dflt = args[2]; Py_INCREF(dflt); return dflt; } @@ -1372,11 +1374,11 @@ static PyObject * builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { PyObject *it, *res; - PyObject *def = NULL; - if (!_PyArg_UnpackStack(args, nargs, "next", 1, 2, &it, &def)) + if (!_PyArg_CheckPositional("next", nargs, 1, 2)) return NULL; + it = args[0]; if (!PyIter_Check(it)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not an iterator", @@ -1387,7 +1389,8 @@ builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs) res = (*it->ob_type->tp_iternext)(it); if (res != NULL) { return res; - } else if (def != NULL) { + } else if (nargs > 1) { + PyObject *def = args[1]; if (PyErr_Occurred()) { if(!PyErr_ExceptionMatches(PyExc_StopIteration)) return NULL; @@ -1503,20 +1506,22 @@ builtin_hex(PyObject *module, PyObject *number) /* AC: cannot convert yet, as needs PEP 457 group support in inspect */ static PyObject * -builtin_iter(PyObject *self, PyObject *args) +builtin_iter(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - PyObject *v, *w = NULL; + PyObject *v; - if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w)) + if (!_PyArg_CheckPositional("iter", nargs, 1, 2)) return NULL; - if (w == NULL) + v = args[0]; + if (nargs == 1) return PyObject_GetIter(v); if (!PyCallable_Check(v)) { PyErr_SetString(PyExc_TypeError, "iter(v, w): v must be callable"); return NULL; } - return PyCallIter_New(v, w); + PyObject *sentinel = args[1]; + return PyCallIter_New(v, sentinel); } PyDoc_STRVAR(iter_doc, @@ -2718,7 +2723,7 @@ static PyMethodDef builtin_methods[] = { BUILTIN_INPUT_METHODDEF BUILTIN_ISINSTANCE_METHODDEF BUILTIN_ISSUBCLASS_METHODDEF - {"iter", builtin_iter, METH_VARARGS, iter_doc}, + {"iter", (PyCFunction)(void(*)(void))builtin_iter, METH_FASTCALL, iter_doc}, BUILTIN_LEN_METHODDEF BUILTIN_LOCALS_METHODDEF {"max", (PyCFunction)(void(*)(void))builtin_max, METH_VARARGS | METH_KEYWORDS, max_doc}, |