diff options
author | Georg Brandl <georg@python.org> | 2009-09-16 20:34:51 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-09-16 20:34:51 (GMT) |
commit | 8997103be0a63962cb8a4b4ccff8575d205f44c6 (patch) | |
tree | 3c3d6077c5ad1b5921f6999ea04fa903aae5f98a /Objects | |
parent | 6bb97a2ec4e9cdfb8e234c3613ceae79ddce1351 (diff) | |
download | cpython-8997103be0a63962cb8a4b4ccff8575d205f44c6.zip cpython-8997103be0a63962cb8a4b4ccff8575d205f44c6.tar.gz cpython-8997103be0a63962cb8a4b4ccff8575d205f44c6.tar.bz2 |
Merged revisions 74845 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r74845 | georg.brandl | 2009-09-16 22:30:09 +0200 (Mi, 16 Sep 2009) | 5 lines
#6844: do not emit DeprecationWarnings on access if Exception.message has been set by the user.
This works by always setting it in __dict__, except when it's implicitly set in __init__.
........
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/exceptions.c | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c index eeebb5c..0a52820 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -301,30 +301,51 @@ BaseException_set_args(PyBaseExceptionObject *self, PyObject *val) static PyObject * BaseException_get_message(PyBaseExceptionObject *self) { - int ret; - ret = PyErr_WarnEx(PyExc_DeprecationWarning, - "BaseException.message has been deprecated as " - "of Python 2.6", 1); - if (ret < 0) - return NULL; + PyObject *msg; + + /* if "message" is in self->dict, accessing a user-set message attribute */ + if (self->dict && + (msg = PyDict_GetItemString(self->dict, "message"))) { + Py_INCREF(msg); + return msg; + } + + if (self->message == NULL) { + PyErr_SetString(PyExc_AttributeError, "message attribute was deleted"); + return NULL; + } - Py_INCREF(self->message); - return self->message; + /* accessing the deprecated "builtin" message attribute of Exception */ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "BaseException.message has been deprecated as " + "of Python 2.6", 1) < 0) + return NULL; + + Py_INCREF(self->message); + return self->message; } static int BaseException_set_message(PyBaseExceptionObject *self, PyObject *val) { - int ret; - ret = PyErr_WarnEx(PyExc_DeprecationWarning, - "BaseException.message has been deprecated as " - "of Python 2.6", 1); - if (ret < 0) - return -1; - Py_INCREF(val); - Py_DECREF(self->message); - self->message = val; - return 0; + /* if val is NULL, delete the message attribute */ + if (val == NULL) { + if (self->dict && PyDict_GetItemString(self->dict, "message")) { + if (PyDict_DelItemString(self->dict, "message") < 0) + return -1; + } + Py_XDECREF(self->message); + self->message = NULL; + return 0; + } + + /* else set it in __dict__, but may need to create the dict first */ + if (self->dict == NULL) { + self->dict = PyDict_New(); + if (!self->dict) + return -1; + } + return PyDict_SetItemString(self->dict, "message", val); } static PyGetSetDef BaseException_getset[] = { |