summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-01-16 22:46:26 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2017-01-16 22:46:26 (GMT)
commit773dc6dd064be72d725851245d25d0b25c6aa0fa (patch)
tree2968fdaddbe583ea9db9fa32c80b08d372cfb6e7 /Python
parent69de71b2557509d6b3f914a36596fee833d0594b (diff)
downloadcpython-773dc6dd064be72d725851245d25d0b25c6aa0fa.zip
cpython-773dc6dd064be72d725851245d25d0b25c6aa0fa.tar.gz
cpython-773dc6dd064be72d725851245d25d0b25c6aa0fa.tar.bz2
__build_class__() builtin uses METH_FASTCALL
Diffstat (limited to 'Python')
-rw-r--r--Python/bltinmodule.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 292a7bc..31538c6 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -52,51 +52,45 @@ _Py_IDENTIFIER(stderr);
/* AC: cannot convert yet, waiting for *args support */
static PyObject *
-builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
+builtin___build_class__(PyObject *self, PyObject **args, Py_ssize_t nargs,
+ PyObject *kwnames)
{
PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns;
PyObject *cls = NULL, *cell = NULL;
- Py_ssize_t nargs;
int isclass = 0; /* initialize to prevent gcc warning */
- assert(args != NULL);
- if (!PyTuple_Check(args)) {
- PyErr_SetString(PyExc_TypeError,
- "__build_class__: args is not a tuple");
- return NULL;
- }
- nargs = PyTuple_GET_SIZE(args);
if (nargs < 2) {
PyErr_SetString(PyExc_TypeError,
"__build_class__: not enough arguments");
return NULL;
}
- func = PyTuple_GET_ITEM(args, 0); /* Better be callable */
+ func = args[0]; /* Better be callable */
if (!PyFunction_Check(func)) {
PyErr_SetString(PyExc_TypeError,
"__build_class__: func must be a function");
return NULL;
}
- name = PyTuple_GET_ITEM(args, 1);
+ name = args[1];
if (!PyUnicode_Check(name)) {
PyErr_SetString(PyExc_TypeError,
"__build_class__: name is not a string");
return NULL;
}
- bases = PyTuple_GetSlice(args, 2, nargs);
+ bases = _PyStack_AsTupleSlice(args, nargs, 2, nargs);
if (bases == NULL)
return NULL;
- if (kwds == NULL) {
+ if (kwnames == NULL) {
meta = NULL;
mkw = NULL;
}
else {
- mkw = PyDict_Copy(kwds); /* Don't modify kwds passed in! */
+ mkw = _PyStack_AsDict(args + nargs, kwnames);
if (mkw == NULL) {
Py_DECREF(bases);
return NULL;
}
+
meta = _PyDict_GetItemId(mkw, &PyId_metaclass);
if (meta != NULL) {
Py_INCREF(meta);
@@ -2612,7 +2606,7 @@ PyTypeObject PyZip_Type = {
static PyMethodDef builtin_methods[] = {
{"__build_class__", (PyCFunction)builtin___build_class__,
- METH_VARARGS | METH_KEYWORDS, build_class_doc},
+ METH_FASTCALL, build_class_doc},
{"__import__", (PyCFunction)builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc},
BUILTIN_ABS_METHODDEF
BUILTIN_ALL_METHODDEF