mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Implement appropriate __getnewargs__ for all immutable subclassable builtin
types. The special handling for these can now be removed from save_newobj(). Add some testing for this. Also add support for setting the 'fast' flag on the Python Pickler class, which suppresses use of the memo.
This commit is contained in:
parent
d3590f937f
commit
5d9113d8be
10 changed files with 133 additions and 19 deletions
|
@ -639,8 +639,15 @@ complex_conjugate(PyObject *self)
|
|||
return PyComplex_FromCComplex(c);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
complex_getnewargs(PyComplexObject *v)
|
||||
{
|
||||
return Py_BuildValue("(D)", v->cval);
|
||||
}
|
||||
|
||||
static PyMethodDef complex_methods[] = {
|
||||
{"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
|
||||
{"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
|
@ -726,6 +726,17 @@ float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return new;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
float_getnewargs(PyFloatObject *v)
|
||||
{
|
||||
return Py_BuildValue("(d)", v->ob_fval);
|
||||
}
|
||||
|
||||
static PyMethodDef float_methods[] = {
|
||||
{"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
PyDoc_STRVAR(float_doc,
|
||||
"float(x) -> floating point number\n\
|
||||
\n\
|
||||
|
@ -803,7 +814,7 @@ PyTypeObject PyFloat_Type = {
|
|||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
float_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
|
|
|
@ -850,6 +850,17 @@ int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return new;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
int_getnewargs(PyIntObject *v)
|
||||
{
|
||||
return Py_BuildValue("(l)", v->ob_ival);
|
||||
}
|
||||
|
||||
static PyMethodDef int_methods[] = {
|
||||
{"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
PyDoc_STRVAR(int_doc,
|
||||
"int(x[, base]) -> integer\n\
|
||||
\n\
|
||||
|
@ -931,7 +942,7 @@ PyTypeObject PyInt_Type = {
|
|||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
int_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
|
|
|
@ -2646,6 +2646,17 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return (PyObject *)new;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
long_getnewargs(PyLongObject *v)
|
||||
{
|
||||
return Py_BuildValue("(N)", _PyLong_Copy(v));
|
||||
}
|
||||
|
||||
static PyMethodDef long_methods[] = {
|
||||
{"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
PyDoc_STRVAR(long_doc,
|
||||
"long(x[, base]) -> integer\n\
|
||||
\n\
|
||||
|
@ -2726,7 +2737,7 @@ PyTypeObject PyLong_Type = {
|
|||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
long_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
|
|
|
@ -3045,6 +3045,12 @@ string_splitlines(PyStringObject *self, PyObject *args)
|
|||
|
||||
#undef SPLIT_APPEND
|
||||
|
||||
static PyObject *
|
||||
string_getnewargs(PyStringObject *v)
|
||||
{
|
||||
return Py_BuildValue("(s#)", v->ob_sval, v->ob_size);
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef
|
||||
string_methods[] = {
|
||||
|
@ -3091,6 +3097,7 @@ string_methods[] = {
|
|||
expandtabs__doc__},
|
||||
{"splitlines", (PyCFunction)string_splitlines, METH_VARARGS,
|
||||
splitlines__doc__},
|
||||
{"__getnewargs__", (PyCFunction)string_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
|
@ -587,6 +587,18 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
|
|||
}
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
tuple_getnewargs(PyTupleObject *v)
|
||||
{
|
||||
return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
|
||||
|
||||
}
|
||||
|
||||
static PyMethodDef tuple_methods[] = {
|
||||
{"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
static PyMappingMethods tuple_as_mapping = {
|
||||
(inquiry)tuplelength,
|
||||
(binaryfunc)tuplesubscript,
|
||||
|
@ -625,7 +637,7 @@ PyTypeObject PyTuple_Type = {
|
|||
0, /* tp_weaklistoffset */
|
||||
tuple_iter, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
tuple_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
|
|
|
@ -5741,6 +5741,14 @@ unicode_endswith(PyUnicodeObject *self,
|
|||
}
|
||||
|
||||
|
||||
|
||||
static PyObject *
|
||||
unicode_getnewargs(PyUnicodeObject *v)
|
||||
{
|
||||
return Py_BuildValue("(u#)", v->str, v->length);
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef unicode_methods[] = {
|
||||
|
||||
/* Order is according to common usage: often used methods should
|
||||
|
@ -5791,6 +5799,7 @@ static PyMethodDef unicode_methods[] = {
|
|||
{"freelistsize", (PyCFunction) unicode_freelistsize, METH_NOARGS},
|
||||
#endif
|
||||
|
||||
{"__getnewargs__", (PyCFunction)unicode_getnewargs, METH_NOARGS},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue