# HG changeset patch # User Filip Gruszczyński # Date 1299444591 -3600 # Node ID d2b40c9883ddf587354c552042704194e484d48a # Parent c6a8e7debbe5a761718a693a08b2c356008177e2 early draft of patch for issue #1559549 diff -r c6a8e7debbe5 -r d2b40c9883dd Include/pyerrors.h --- a/Include/pyerrors.h Sun Mar 06 09:06:34 2011 -0600 +++ b/Include/pyerrors.h Sun Mar 06 21:49:51 2011 +0100 @@ -47,6 +47,12 @@ PyObject *filename; } PyEnvironmentErrorObject; +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *module; +} PyImportErrorObject; + #ifdef MS_WINDOWS typedef struct { PyException_HEAD diff -r c6a8e7debbe5 -r d2b40c9883dd Objects/exceptions.c --- a/Objects/exceptions.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Objects/exceptions.c Sun Mar 06 21:49:51 2011 +0100 @@ -544,11 +544,91 @@ "Program interrupted by user."); + + /* * ImportError extends Exception */ -SimpleExtendsException(PyExc_Exception, ImportError, - "Import can't find module, or can't find name in module."); + +static int +ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *msg = NULL; + PyObject *module = NULL; + + if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) + return -1; + + if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) { + return 0; + } + + if (!PyArg_UnpackTuple(args, "ImportError", 2, 2, + &msg, &module)) { + return -1; + } + + Py_CLEAR(self->module); /* replacing */ + self->module = module; + Py_INCREF(self->module); + + Py_CLEAR(self->msg); /* replacing */ + self->msg = msg; + Py_INCREF(self->msg); + + return 0; +} + +static int +ImportError_clear(PyImportErrorObject *self) +{ + Py_CLEAR(self->module); + return BaseException_clear((PyBaseExceptionObject *)self); +} + +static void +ImportError_dealloc(PyImportErrorObject *self) +{ + _PyObject_GC_UNTRACK(self); + ImportError_clear(self); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static int +ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->module); + return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); +} + +static PyObject * +ImportError_str(PyImportErrorObject *self) +{ + if (self->msg) + return self->msg; + else + return BaseException_str((PyBaseExceptionObject *)self); +} + +static PyMemberDef ImportError_members[] = { + {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0, + PyDoc_STR("exception message")}, + {"module", T_OBJECT, offsetof(PyImportErrorObject, module), 0, + PyDoc_STR("exception module")}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef ImportError_methods[] = { + {NULL} +}; + + +ComplexExtendsException(PyExc_Exception, ImportError, + ImportError, ImportError_dealloc, + ImportError_methods, ImportError_members, + ImportError_str, + "Import can't find module, or can't find name in " + "module."); /* diff -r c6a8e7debbe5 -r d2b40c9883dd Python/import.c --- a/Python/import.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Python/import.c Sun Mar 06 21:49:51 2011 +0100 @@ -2768,8 +2768,14 @@ if (result == Py_None) { Py_DECREF(result); - PyErr_Format(PyExc_ImportError, - "No module named %.200s", name); + PyObject *message = PyUnicode_FromFormat("No module named %.200s", name); + PyObject *module = PyUnicode_DecodeASCII(name, strlen(name), "strict"); + PyObject *value = Py_BuildValue("(OO)", message, module); + Py_DECREF(message); + Py_DECREF(module); + + PyErr_SetObject(PyExc_ImportError, value); + Py_DECREF(value); return NULL; } # HG changeset patch # User Filip Gruszczyński # Date 1299444591 -3600 # Node ID d2b40c9883ddf587354c552042704194e484d48a # Parent c6a8e7debbe5a761718a693a08b2c356008177e2 early draft of patch for issue #1559549 diff -r c6a8e7debbe5 -r d2b40c9883dd Include/pyerrors.h --- a/Include/pyerrors.h Sun Mar 06 09:06:34 2011 -0600 +++ b/Include/pyerrors.h Sun Mar 06 21:49:51 2011 +0100 @@ -47,6 +47,12 @@ PyObject *filename; } PyEnvironmentErrorObject; +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *module; +} PyImportErrorObject; + #ifdef MS_WINDOWS typedef struct { PyException_HEAD diff -r c6a8e7debbe5 -r d2b40c9883dd Objects/exceptions.c --- a/Objects/exceptions.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Objects/exceptions.c Sun Mar 06 21:49:51 2011 +0100 @@ -544,11 +544,91 @@ "Program interrupted by user."); + + /* * ImportError extends Exception */ -SimpleExtendsException(PyExc_Exception, ImportError, - "Import can't find module, or can't find name in module."); + +static int +ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *msg = NULL; + PyObject *module = NULL; + + if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) + return -1; + + if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) { + return 0; + } + + if (!PyArg_UnpackTuple(args, "ImportError", 2, 2, + &msg, &module)) { + return -1; + } + + Py_CLEAR(self->module); /* replacing */ + self->module = module; + Py_INCREF(self->module); + + Py_CLEAR(self->msg); /* replacing */ + self->msg = msg; + Py_INCREF(self->msg); + + return 0; +} + +static int +ImportError_clear(PyImportErrorObject *self) +{ + Py_CLEAR(self->module); + return BaseException_clear((PyBaseExceptionObject *)self); +} + +static void +ImportError_dealloc(PyImportErrorObject *self) +{ + _PyObject_GC_UNTRACK(self); + ImportError_clear(self); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static int +ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->module); + return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); +} + +static PyObject * +ImportError_str(PyImportErrorObject *self) +{ + if (self->msg) + return self->msg; + else + return BaseException_str((PyBaseExceptionObject *)self); +} + +static PyMemberDef ImportError_members[] = { + {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0, + PyDoc_STR("exception message")}, + {"module", T_OBJECT, offsetof(PyImportErrorObject, module), 0, + PyDoc_STR("exception module")}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef ImportError_methods[] = { + {NULL} +}; + + +ComplexExtendsException(PyExc_Exception, ImportError, + ImportError, ImportError_dealloc, + ImportError_methods, ImportError_members, + ImportError_str, + "Import can't find module, or can't find name in " + "module."); /* diff -r c6a8e7debbe5 -r d2b40c9883dd Python/import.c --- a/Python/import.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Python/import.c Sun Mar 06 21:49:51 2011 +0100 @@ -2768,8 +2768,14 @@ if (result == Py_None) { Py_DECREF(result); - PyErr_Format(PyExc_ImportError, - "No module named %.200s", name); + PyObject *message = PyUnicode_FromFormat("No module named %.200s", name); + PyObject *module = PyUnicode_DecodeASCII(name, strlen(name), "strict"); + PyObject *value = Py_BuildValue("(OO)", message, module); + Py_DECREF(message); + Py_DECREF(module); + + PyErr_SetObject(PyExc_ImportError, value); + Py_DECREF(value); return NULL; } # HG changeset patch # User Filip Gruszczyński # Date 1299444689 -3600 # Node ID 029cddd2e12b50395a5f20eb5aa402bfaf537794 # Parent c6a8e7debbe5a761718a693a08b2c356008177e2 early draft of patch for issue #1559549 diff -r c6a8e7debbe5 -r 029cddd2e12b Include/pyerrors.h --- a/Include/pyerrors.h Sun Mar 06 09:06:34 2011 -0600 +++ b/Include/pyerrors.h Sun Mar 06 21:51:29 2011 +0100 @@ -47,6 +47,12 @@ PyObject *filename; } PyEnvironmentErrorObject; +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *module; +} PyImportErrorObject; + #ifdef MS_WINDOWS typedef struct { PyException_HEAD diff -r c6a8e7debbe5 -r 029cddd2e12b Objects/exceptions.c --- a/Objects/exceptions.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Objects/exceptions.c Sun Mar 06 21:51:29 2011 +0100 @@ -544,11 +544,92 @@ "Program interrupted by user."); + + /* * ImportError extends Exception */ -SimpleExtendsException(PyExc_Exception, ImportError, - "Import can't find module, or can't find name in module."); + +static int +ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *msg = NULL; + PyObject *module = NULL; + + if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) + return -1; + + if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) { + return 0; + } + + if (!PyArg_UnpackTuple(args, "ImportError", 2, 2, + &msg, &module)) { + return -1; + } + + Py_CLEAR(self->module); /* replacing */ + self->module = module; + Py_INCREF(self->module); + + Py_CLEAR(self->msg); /* replacing */ + self->msg = msg; + Py_INCREF(self->msg); + + return 0; +} + +static int +ImportError_clear(PyImportErrorObject *self) +{ + Py_CLEAR(self->module); + return BaseException_clear((PyBaseExceptionObject *)self); +} + +static void +ImportError_dealloc(PyImportErrorObject *self) +{ + _PyObject_GC_UNTRACK(self); + ImportError_clear(self); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static int +ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->msg); + Py_VISIT(self->module); + return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); +} + +static PyObject * +ImportError_str(PyImportErrorObject *self) +{ + if (self->msg) + return self->msg; + else + return BaseException_str((PyBaseExceptionObject *)self); +} + +static PyMemberDef ImportError_members[] = { + {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0, + PyDoc_STR("exception message")}, + {"module", T_OBJECT, offsetof(PyImportErrorObject, module), 0, + PyDoc_STR("exception module")}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef ImportError_methods[] = { + {NULL} +}; + + +ComplexExtendsException(PyExc_Exception, ImportError, + ImportError, ImportError_dealloc, + ImportError_methods, ImportError_members, + ImportError_str, + "Import can't find module, or can't find name in " + "module."); /* diff -r c6a8e7debbe5 -r 029cddd2e12b Python/import.c --- a/Python/import.c Sun Mar 06 09:06:34 2011 -0600 +++ b/Python/import.c Sun Mar 06 21:51:29 2011 +0100 @@ -2768,8 +2768,14 @@ if (result == Py_None) { Py_DECREF(result); - PyErr_Format(PyExc_ImportError, - "No module named %.200s", name); + PyObject *message = PyUnicode_FromFormat("No module named %.200s", name); + PyObject *module = PyUnicode_DecodeASCII(name, strlen(name), "strict"); + PyObject *value = Py_BuildValue("(OO)", message, module); + Py_DECREF(message); + Py_DECREF(module); + + PyErr_SetObject(PyExc_ImportError, value); + Py_DECREF(value); return NULL; }