diff options
author | Guido van Rossum <guido@python.org> | 2001-08-29 15:47:46 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-08-29 15:47:46 (GMT) |
commit | bef1417f9f31fdf0f7b7bdb458c1c1f17c5cfada (patch) | |
tree | 23a3648e6c25e55c0d1b1df836f0a29623b94155 /Objects/longobject.c | |
parent | e705ef1bced126819d7568b1d4e0ac6944b987e0 (diff) | |
download | cpython-bef1417f9f31fdf0f7b7bdb458c1c1f17c5cfada.zip cpython-bef1417f9f31fdf0f7b7bdb458c1c1f17c5cfada.tar.gz cpython-bef1417f9f31fdf0f7b7bdb458c1c1f17c5cfada.tar.bz2 |
Make int, long and float subclassable.
This uses a slightly wimpy and wasteful approach, but it works. :-)
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index 01a7276..ea0685e 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -2038,6 +2038,8 @@ long_hex(PyObject *v) { return long_format(v, 16, 1); } +staticforward PyObject * +long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static PyObject * long_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -2046,7 +2048,8 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds) int base = -909; /* unlikely! */ static char *kwlist[] = {"x", "base", 0}; - assert(type == &PyLong_Type); + if (type != &PyLong_Type) + return long_subtype_new(type, args, kwds); /* Wimp out */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist, &x, &base)) return NULL; @@ -2069,6 +2072,36 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } } +/* Wimpy, slow approach to tp_new calls for subtypes of long: + first create a regular long from whatever arguments we got, + then allocate a subtype instance and initialize it from + the regular long. The regular long is then thrown away. +*/ +static PyObject * +long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyLongObject *tmp, *new; + int i, n; + + assert(PyType_IsSubtype(type, &PyLong_Type)); + tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds); + if (tmp == NULL) + return NULL; + assert(PyLong_Check(tmp)); + n = tmp->ob_size; + if (n < 0) + n = -n; + new = (PyLongObject *)type->tp_alloc(type, n); + if (new == NULL) + return NULL; + assert(PyLong_Check(new)); + new->ob_size = type->ob_size; + for (i = 0; i < n; i++) + new->ob_digit[i] = tmp->ob_digit[i]; + Py_DECREF(tmp); + return (PyObject *)new; +} + static char long_doc[] = "long(x[, base]) -> integer\n\ \n\ @@ -2140,7 +2173,8 @@ PyTypeObject PyLong_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | + Py_TPFLAGS_BASETYPE, /* tp_flags */ long_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ |