type_prepare uses METH_FASTCALL

refer python/cpython@d526cfe546
refer python/cpython@80ab22fa2c

the prepare-related test still fails.  It's just related to the error
message format though.
This commit is contained in:
ahgamut 2021-11-04 22:43:49 +05:30
parent ebc20796b4
commit f1f2a3ec6d
2 changed files with 23 additions and 45 deletions

View file

@ -3216,7 +3216,8 @@ type_subclasses(PyTypeObject *type, PyObject *args_ignored)
} }
static PyObject * static PyObject *
type_prepare(PyObject *self, PyObject *args, PyObject *kwds) type_prepare(PyObject *self, PyObject **args, Py_ssize_t nargs,
PyObject *kwnames)
{ {
return PyDict_New(); return PyDict_New();
} }
@ -3320,7 +3321,7 @@ static PyMethodDef type_methods[] = {
{"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS, {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
PyDoc_STR("__subclasses__() -> list of immediate subclasses")}, PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
{"__prepare__", (PyCFunction)type_prepare, {"__prepare__", (PyCFunction)type_prepare,
METH_VARARGS | METH_KEYWORDS | METH_CLASS, METH_FASTCALL | METH_CLASS,
PyDoc_STR("__prepare__() -> dict\n" PyDoc_STR("__prepare__() -> dict\n"
"used to create the namespace for the class statement")}, "used to create the namespace for the class statement")},
{"__instancecheck__", type___instancecheck__, METH_O, {"__instancecheck__", type___instancecheck__, METH_O,

View file

@ -1379,13 +1379,7 @@ _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
{ {
int retval; int retval;
va_list va; va_list va;
if ((args == NULL || !PyTuple_Check(args)) ||
(keywords != NULL && !PyDict_Check(keywords)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_start(va, parser); va_start(va, parser);
retval = vgetargskeywordsfast(args, keywords, parser, &va, 0); retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
va_end(va); va_end(va);
@ -1398,13 +1392,7 @@ _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
{ {
int retval; int retval;
va_list va; va_list va;
if ((args == NULL || !PyTuple_Check(args)) ||
(keywords != NULL && !PyDict_Check(keywords)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_start(va, parser); va_start(va, parser);
retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T); retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T);
va_end(va); va_end(va);
@ -1417,12 +1405,7 @@ _PyArg_ParseStack(PyObject **args, Py_ssize_t nargs, PyObject *kwnames,
{ {
int retval; int retval;
va_list va; va_list va;
if ((kwnames != NULL && !PyTuple_Check(kwnames)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_start(va, parser); va_start(va, parser);
retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0); retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
va_end(va); va_end(va);
@ -1435,12 +1418,7 @@ _PyArg_ParseStack_SizeT(PyObject **args, Py_ssize_t nargs, PyObject *kwnames,
{ {
int retval; int retval;
va_list va; va_list va;
if ((kwnames != NULL && !PyTuple_Check(kwnames)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_start(va, parser); va_start(va, parser);
retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T); retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T);
va_end(va); va_end(va);
@ -1453,13 +1431,7 @@ _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
{ {
int retval; int retval;
va_list lva; va_list lva;
if ((args == NULL || !PyTuple_Check(args)) ||
(keywords != NULL && !PyDict_Check(keywords)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_copy(lva, va); va_copy(lva, va);
retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0); retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0);
va_end(lva); va_end(lva);
@ -1472,13 +1444,7 @@ _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
{ {
int retval; int retval;
va_list lva; va_list lva;
if ((args == NULL || !PyTuple_Check(args)) ||
(keywords != NULL && !PyDict_Check(keywords)) ||
parser == NULL)
{
PyErr_BadInternalCall();
return 0;
}
va_copy(lva, va); va_copy(lva, va);
retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T); retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T);
va_end(lva); va_end(lva);
@ -1922,12 +1888,17 @@ vgetargskeywordsfast_impl(PyObject **args, Py_ssize_t nargs,
freelist.entries_malloced = 0; freelist.entries_malloced = 0;
assert(keywords == NULL || PyDict_Check(keywords)); assert(keywords == NULL || PyDict_Check(keywords));
assert(kwnames == NULL || PyTuple_Check(kwnames));
assert((keywords != NULL || kwnames != NULL) assert((keywords != NULL || kwnames != NULL)
|| (keywords == NULL && kwnames == NULL)); || (keywords == NULL && kwnames == NULL));
assert(parser != NULL);
assert(p_va != NULL); assert(p_va != NULL);
if (parser == NULL
|| (kwnames != NULL && !PyTuple_Check(kwnames)))
{
PyErr_BadInternalCall();
return 0;
}
if (!parser_init(parser)) { if (!parser_init(parser)) {
return 0; return 0;
} }
@ -2116,7 +2087,13 @@ vgetargskeywordsfast(PyObject *args, PyObject *keywords,
PyObject **stack; PyObject **stack;
Py_ssize_t nargs; Py_ssize_t nargs;
assert(args != NULL && PyTuple_Check(args)); if(args == NULL
|| !PyTuple_Check(args)
|| (keywords != NULL && !PyDict_Check(keywords)))
{
PyErr_BadInternalCall();
return 0;
}
stack = &PyTuple_GET_ITEM(args, 0); stack = &PyTuple_GET_ITEM(args, 0);
nargs = PyTuple_GET_SIZE(args); nargs = PyTuple_GET_SIZE(args);