diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-09-10 20:52:51 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-09-10 20:52:51 (GMT) |
commit | 64b5ce3a69569b203a39f74c5c03348ba0a67583 (patch) | |
tree | 87f71bc6ef25a7b7e11087afb1d7827bbcc4d474 /Objects/longobject.c | |
parent | 8b4e43e768f3f49513f6f32f20ecb6478c1ad840 (diff) | |
download | cpython-64b5ce3a69569b203a39f74c5c03348ba0a67583.zip cpython-64b5ce3a69569b203a39f74c5c03348ba0a67583.tar.gz cpython-64b5ce3a69569b203a39f74c5c03348ba0a67583.tar.bz2 |
SF bug #460020: bug or feature: unicode() and subclasses.
Given an immutable type M, and an instance I of a subclass of M, the
constructor call M(I) was just returning I as-is; but it should return a
new instance of M. This fixes it for M in {int, long}. Strings, floats
and tuples remain to be done.
Added new macros PyInt_CheckExact and PyLong_CheckExact, to more easily
distinguish between "is" and "is a" (i.e., only an int passes
PyInt_CheckExact, while any sublass of int passes PyInt_Check).
Added private API function _PyLong_Copy.
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index c7608aa..b9271e6 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -51,6 +51,25 @@ _PyLong_New(int size) return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size); } +PyObject * +_PyLong_Copy(PyLongObject *src) +{ + PyLongObject *result; + int i; + + assert(src != NULL); + i = src->ob_size; + if (i < 0) + i = -(i); + result = _PyLong_New(i); + if (result != NULL) { + result->ob_size = i; + while (--i >= 0) + result->ob_digit[i] = src->ob_digit[i]; + } + return (PyObject *)result; +} + /* Create a new long int object from a C long int */ PyObject * @@ -2205,7 +2224,7 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds); if (tmp == NULL) return NULL; - assert(PyLong_Check(tmp)); + assert(PyLong_CheckExact(tmp)); n = tmp->ob_size; if (n < 0) n = -n; |