mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-07 10:20:29 +00:00
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:
parent
ebc20796b4
commit
f1f2a3ec6d
2 changed files with 23 additions and 45 deletions
5
third_party/python/Objects/typeobject.c
vendored
5
third_party/python/Objects/typeobject.c
vendored
|
@ -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,
|
||||||
|
|
63
third_party/python/Python/getargs.c
vendored
63
third_party/python/Python/getargs.c
vendored
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue