summaryrefslogtreecommitdiffstats
path: root/Objects/object.c
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2005-04-26 03:45:26 (GMT)
committerBrett Cannon <bcannon@gmail.com>2005-04-26 03:45:26 (GMT)
commitc3647ac93e2a38762de8a23b1d94a6380e9ad468 (patch)
treea7e00a7e8f70ee226fdeb3d229b9734d5b17a344 /Objects/object.c
parentd7c795e72966f7c72b94b919f3539be66495e6c3 (diff)
downloadcpython-c3647ac93e2a38762de8a23b1d94a6380e9ad468.zip
cpython-c3647ac93e2a38762de8a23b1d94a6380e9ad468.tar.gz
cpython-c3647ac93e2a38762de8a23b1d94a6380e9ad468.tar.bz2
Make subclasses of int, long, complex, float, and unicode perform type
conversion using the proper magic slot (e.g., __int__()). Also move conversion code out of PyNumber_*() functions in the C API into the nb_* function. Applied patch #1109424. Thanks Walter Doewald.
Diffstat (limited to 'Objects/object.c')
-rw-r--r--Objects/object.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/Objects/object.c b/Objects/object.c
index d86d74f..975c967 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -373,6 +373,8 @@ PyObject *
PyObject_Unicode(PyObject *v)
{
PyObject *res;
+ PyObject *func;
+ static PyObject *unicodestr;
if (v == NULL)
res = PyString_FromString("<NULL>");
@@ -380,35 +382,32 @@ PyObject_Unicode(PyObject *v)
Py_INCREF(v);
return v;
}
- if (PyUnicode_Check(v)) {
- /* For a Unicode subtype that's not a Unicode object,
- return a true Unicode object with the same data. */
- return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(v),
- PyUnicode_GET_SIZE(v));
+ /* XXX As soon as we have a tp_unicode slot, we should
+ check this before trying the __unicode__
+ method. */
+ if (unicodestr == NULL) {
+ unicodestr= PyString_InternFromString("__unicode__");
+ if (unicodestr == NULL)
+ return NULL;
+ }
+ func = PyObject_GetAttr(v, unicodestr);
+ if (func != NULL) {
+ res = PyEval_CallObject(func, (PyObject *)NULL);
+ Py_DECREF(func);
}
- if (PyString_Check(v)) {
- Py_INCREF(v);
- res = v;
- }
else {
- PyObject *func;
- static PyObject *unicodestr;
- /* XXX As soon as we have a tp_unicode slot, we should
- check this before trying the __unicode__
- method. */
- if (unicodestr == NULL) {
- unicodestr= PyString_InternFromString(
- "__unicode__");
- if (unicodestr == NULL)
- return NULL;
+ PyErr_Clear();
+ if (PyUnicode_Check(v)) {
+ /* For a Unicode subtype that's didn't overwrite __unicode__,
+ return a true Unicode object with the same data. */
+ return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(v),
+ PyUnicode_GET_SIZE(v));
}
- func = PyObject_GetAttr(v, unicodestr);
- if (func != NULL) {
- res = PyEval_CallObject(func, (PyObject *)NULL);
- Py_DECREF(func);
+ if (PyString_CheckExact(v)) {
+ Py_INCREF(v);
+ res = v;
}
else {
- PyErr_Clear();
if (v->ob_type->tp_str != NULL)
res = (*v->ob_type->tp_str)(v);
else
@@ -424,7 +423,7 @@ PyObject_Unicode(PyObject *v)
if (str)
res = str;
else
- return NULL;
+ return NULL;
}
return res;
}