| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.951 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.951 |
| Problem: Python exceptions have problems. |
| Solution: Change some IndexErrors to TypeErrors. Make “line number out of |
| range” an IndexError. Make “unable to get option value” a |
| RuntimeError. Make all PyErr_SetString messages start with |
| lowercase letter and use _(). (ZyX) |
| Files: src/if_py_both.h, src/if_python3.c, src/if_python.c, |
| src/testdir/test86.ok, src/testdir/test87.ok |
| |
| |
| |
| |
| |
| *** 71,77 **** |
| { |
| if (val == NULL) |
| { |
| ! PyErr_SetString(PyExc_AttributeError, _("can't delete OutputObject attributes")); |
| return -1; |
| } |
| |
| --- 71,78 ---- |
| { |
| if (val == NULL) |
| { |
| ! PyErr_SetString(PyExc_AttributeError, |
| ! _("can't delete OutputObject attributes")); |
| return -1; |
| } |
| |
| |
| *** 919,925 **** |
| |
| if (index>=ListLength(self)) |
| { |
| ! PyErr_SetString(PyExc_IndexError, "list index out of range"); |
| return NULL; |
| } |
| li = list_find(((ListObject *) (self))->list, (long) index); |
| --- 920,926 ---- |
| |
| if (index>=ListLength(self)) |
| { |
| ! PyErr_SetString(PyExc_IndexError, _("list index out of range")); |
| return NULL; |
| } |
| li = list_find(((ListObject *) (self))->list, (long) index); |
| |
| *** 1047,1053 **** |
| } |
| if (index>length || (index==length && obj==NULL)) |
| { |
| ! PyErr_SetString(PyExc_IndexError, "list index out of range"); |
| return -1; |
| } |
| |
| --- 1048,1054 ---- |
| } |
| if (index>length || (index==length && obj==NULL)) |
| { |
| ! PyErr_SetString(PyExc_IndexError, _("list index out of range")); |
| return -1; |
| } |
| |
| |
| *** 1186,1192 **** |
| |
| if (val == NULL) |
| { |
| ! PyErr_SetString(PyExc_AttributeError, _("Cannot delete DictionaryObject attributes")); |
| return -1; |
| } |
| |
| --- 1187,1194 ---- |
| |
| if (val == NULL) |
| { |
| ! PyErr_SetString(PyExc_AttributeError, |
| ! _("cannot delete vim.dictionary attributes")); |
| return -1; |
| } |
| |
| |
| *** 1194,1200 **** |
| { |
| if (this->list->lv_lock == VAR_FIXED) |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("Cannot modify fixed list")); |
| return -1; |
| } |
| else |
| --- 1196,1202 ---- |
| { |
| if (this->list->lv_lock == VAR_FIXED) |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("cannot modify fixed list")); |
| return -1; |
| } |
| else |
| |
| *** 1208,1214 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_AttributeError, _("Cannot set this attribute")); |
| return -1; |
| } |
| } |
| --- 1210,1216 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_AttributeError, _("cannot set this attribute")); |
| return -1; |
| } |
| } |
| |
| *** 1377,1383 **** |
| return PyBytes_FromString((char *) stringval); |
| else |
| { |
| ! PyErr_SetString(PyExc_ValueError, "Unable to get option value"); |
| return NULL; |
| } |
| } |
| --- 1379,1386 ---- |
| return PyBytes_FromString((char *) stringval); |
| else |
| { |
| ! PyErr_SetString(PyExc_RuntimeError, |
| ! _("unable to get option value")); |
| return NULL; |
| } |
| } |
| |
| *** 1455,1467 **** |
| { |
| if (this->opt_type == SREQ_GLOBAL) |
| { |
| ! PyErr_SetString(PyExc_ValueError, "Unable to unset global option"); |
| return -1; |
| } |
| else if (!(flags & SOPT_GLOBAL)) |
| { |
| ! PyErr_SetString(PyExc_ValueError, "Unable to unset option without " |
| ! "global value"); |
| return -1; |
| } |
| else |
| --- 1458,1471 ---- |
| { |
| if (this->opt_type == SREQ_GLOBAL) |
| { |
| ! PyErr_SetString(PyExc_ValueError, |
| ! _("unable to unset global option")); |
| return -1; |
| } |
| else if (!(flags & SOPT_GLOBAL)) |
| { |
| ! PyErr_SetString(PyExc_ValueError, _("unable to unset option " |
| ! "without global value")); |
| return -1; |
| } |
| else |
| |
| *** 1491,1497 **** |
| val = PyLong_AsLong(valObject); |
| else |
| { |
| ! PyErr_SetString(PyExc_ValueError, "Object must be integer"); |
| return -1; |
| } |
| |
| --- 1495,1501 ---- |
| val = PyLong_AsLong(valObject); |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("object must be integer")); |
| return -1; |
| } |
| |
| |
| *** 1529,1535 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_ValueError, "Object must be string"); |
| return -1; |
| } |
| |
| --- 1533,1539 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("object must be string")); |
| return -1; |
| } |
| |
| |
| *** 2766,2772 **** |
| |
| if (n < 0 || n > max) |
| { |
| ! PyErr_SetString(PyExc_ValueError, _("line number out of range")); |
| return NULL; |
| } |
| |
| --- 2770,2776 ---- |
| |
| if (n < 0 || n > max) |
| { |
| ! PyErr_SetString(PyExc_IndexError, _("line number out of range")); |
| return NULL; |
| } |
| |
| |
| *** 3135,3141 **** |
| bnr = PyLong_AsLong(keyObject); |
| else |
| { |
| ! PyErr_SetString(PyExc_ValueError, _("key must be integer")); |
| return NULL; |
| } |
| |
| --- 3139,3145 ---- |
| bnr = PyLong_AsLong(keyObject); |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("key must be integer")); |
| return NULL; |
| } |
| |
| |
| *** 3654,3660 **** |
| return convert_dl(obj, tv, pymap_to_tv, lookupDict); |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("unable to convert to vim structure")); |
| return -1; |
| } |
| return 0; |
| --- 3658,3665 ---- |
| return convert_dl(obj, tv, pymap_to_tv, lookupDict); |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, |
| ! _("unable to convert to vim structure")); |
| return -1; |
| } |
| return 0; |
| |
| |
| |
| *** 336,341 **** |
| --- 336,342 ---- |
| static PyObject *p3imp_PyExc_KeyboardInterrupt; |
| static PyObject *p3imp_PyExc_TypeError; |
| static PyObject *p3imp_PyExc_ValueError; |
| + static PyObject *p3imp_PyExc_RuntimeError; |
| |
| # define PyExc_AttributeError p3imp_PyExc_AttributeError |
| # define PyExc_IndexError p3imp_PyExc_IndexError |
| |
| *** 343,348 **** |
| --- 344,350 ---- |
| # define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt |
| # define PyExc_TypeError p3imp_PyExc_TypeError |
| # define PyExc_ValueError p3imp_PyExc_ValueError |
| + # define PyExc_RuntimeError p3imp_PyExc_RuntimeError |
| |
| /* |
| * Table of name to function pointer of python. |
| |
| *** 580,591 **** |
| --- 582,595 ---- |
| p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); |
| p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError"); |
| p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError"); |
| + p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); |
| Py_XINCREF(p3imp_PyExc_AttributeError); |
| Py_XINCREF(p3imp_PyExc_IndexError); |
| Py_XINCREF(p3imp_PyExc_KeyError); |
| Py_XINCREF(p3imp_PyExc_KeyboardInterrupt); |
| Py_XINCREF(p3imp_PyExc_TypeError); |
| Py_XINCREF(p3imp_PyExc_ValueError); |
| + Py_XINCREF(p3imp_PyExc_RuntimeError); |
| Py_XDECREF(exmod); |
| } |
| #endif /* DYNAMIC_PYTHON3 */ |
| |
| *** 1132,1138 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| } |
| } |
| --- 1136,1142 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return NULL; |
| } |
| } |
| |
| *** 1166,1172 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return -1; |
| } |
| } |
| --- 1170,1176 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return -1; |
| } |
| } |
| |
| *** 1248,1254 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| } |
| } |
| --- 1252,1258 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return NULL; |
| } |
| } |
| |
| *** 1275,1281 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return -1; |
| } |
| } |
| --- 1279,1285 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return -1; |
| } |
| } |
| |
| *** 1450,1456 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| } |
| } |
| --- 1454,1460 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return NULL; |
| } |
| } |
| |
| *** 1474,1480 **** |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return -1; |
| } |
| } |
| --- 1478,1484 ---- |
| } |
| else |
| { |
| ! PyErr_SetString(PyExc_TypeError, _("index must be int or slice")); |
| return -1; |
| } |
| } |
| |
| |
| |
| *** 358,363 **** |
| --- 358,364 ---- |
| static PyObject *imp_PyExc_KeyboardInterrupt; |
| static PyObject *imp_PyExc_TypeError; |
| static PyObject *imp_PyExc_ValueError; |
| + static PyObject *imp_PyExc_RuntimeError; |
| |
| # define PyExc_AttributeError imp_PyExc_AttributeError |
| # define PyExc_IndexError imp_PyExc_IndexError |
| |
| *** 365,370 **** |
| --- 366,372 ---- |
| # define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt |
| # define PyExc_TypeError imp_PyExc_TypeError |
| # define PyExc_ValueError imp_PyExc_ValueError |
| + # define PyExc_RuntimeError imp_PyExc_RuntimeError |
| |
| /* |
| * Table of name to function pointer of python. |
| |
| *** 593,604 **** |
| --- 595,608 ---- |
| imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); |
| imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError"); |
| imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError"); |
| + imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); |
| Py_XINCREF(imp_PyExc_AttributeError); |
| Py_XINCREF(imp_PyExc_IndexError); |
| Py_XINCREF(imp_PyExc_KeyError); |
| Py_XINCREF(imp_PyExc_KeyboardInterrupt); |
| Py_XINCREF(imp_PyExc_TypeError); |
| Py_XINCREF(imp_PyExc_ValueError); |
| + Py_XINCREF(imp_PyExc_RuntimeError); |
| Py_XDECREF(exmod); |
| } |
| #endif /* DYNAMIC_PYTHON */ |
| |
| |
| |
| *** 102,108 **** |
| B: 1:1 2:1 3:1 4:1 |
| >>> previewheight |
| p/gopts1: 12 |
| ! inv: 'a'! ValueError |
| p/wopts1! KeyError |
| inv: 'a'! KeyError |
| wopts1! KeyError |
| --- 102,108 ---- |
| B: 1:1 2:1 3:1 4:1 |
| >>> previewheight |
| p/gopts1: 12 |
| ! inv: 'a'! TypeError |
| p/wopts1! KeyError |
| inv: 'a'! KeyError |
| wopts1! KeyError |
| |
| *** 123,129 **** |
| B: 1:5 2:5 3:5 4:5 |
| >>> operatorfunc |
| p/gopts1: '' |
| ! inv: 2! ValueError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| --- 123,129 ---- |
| B: 1:5 2:5 3:5 4:5 |
| >>> operatorfunc |
| p/gopts1: '' |
| ! inv: 2! TypeError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| |
| *** 198,206 **** |
| B: 1:'+2' 2:'+3' 3:'+1' 4:'' |
| >>> statusline |
| p/gopts1: '' |
| ! inv: 0! ValueError |
| p/wopts1: None |
| ! inv: 0! ValueError |
| p/bopts1! KeyError |
| inv: 0! KeyError |
| bopts1! KeyError |
| --- 198,206 ---- |
| B: 1:'+2' 2:'+3' 3:'+1' 4:'' |
| >>> statusline |
| p/gopts1: '' |
| ! inv: 0! TypeError |
| p/wopts1: None |
| ! inv: 0! TypeError |
| p/bopts1! KeyError |
| inv: 0! KeyError |
| bopts1! KeyError |
| |
| *** 259,265 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: '' |
| ! inv: 1! ValueError |
| G: '' |
| W: 1:'A' 2:'B' 3:'' 4:'C' |
| B: 1:'A' 2:'B' 3:'' 4:'C' |
| --- 259,265 ---- |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: '' |
| ! inv: 1! TypeError |
| G: '' |
| W: 1:'A' 2:'B' 3:'' 4:'C' |
| B: 1:'A' 2:'B' 3:'' 4:'C' |
| |
| *** 288,301 **** |
| B: 1:0 2:1 3:0 4:1 |
| >>> path |
| p/gopts1: '.,/usr/include,,' |
| ! inv: 0! ValueError |
| p/wopts1! KeyError |
| inv: 0! KeyError |
| wopts1! KeyError |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: None |
| ! inv: 0! ValueError |
| G: '.,,' |
| W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| --- 288,301 ---- |
| B: 1:0 2:1 3:0 4:1 |
| >>> path |
| p/gopts1: '.,/usr/include,,' |
| ! inv: 0! TypeError |
| p/wopts1! KeyError |
| inv: 0! KeyError |
| wopts1! KeyError |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: None |
| ! inv: 0! TypeError |
| G: '.,,' |
| W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| |
| |
| |
| *** 91,97 **** |
| B: 1:1 2:1 3:1 4:1 |
| >>> previewheight |
| p/gopts1: 12 |
| ! inv: 'a'! ValueError |
| p/wopts1! KeyError |
| inv: 'a'! KeyError |
| wopts1! KeyError |
| --- 91,97 ---- |
| B: 1:1 2:1 3:1 4:1 |
| >>> previewheight |
| p/gopts1: 12 |
| ! inv: 'a'! TypeError |
| p/wopts1! KeyError |
| inv: 'a'! KeyError |
| wopts1! KeyError |
| |
| *** 112,118 **** |
| B: 1:5 2:5 3:5 4:5 |
| >>> operatorfunc |
| p/gopts1: b'' |
| ! inv: 2! ValueError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| --- 112,118 ---- |
| B: 1:5 2:5 3:5 4:5 |
| >>> operatorfunc |
| p/gopts1: b'' |
| ! inv: 2! TypeError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| |
| *** 187,195 **** |
| B: 1:'+2' 2:'+3' 3:'+1' 4:'' |
| >>> statusline |
| p/gopts1: b'' |
| ! inv: 0! ValueError |
| p/wopts1: None |
| ! inv: 0! ValueError |
| p/bopts1! KeyError |
| inv: 0! KeyError |
| bopts1! KeyError |
| --- 187,195 ---- |
| B: 1:'+2' 2:'+3' 3:'+1' 4:'' |
| >>> statusline |
| p/gopts1: b'' |
| ! inv: 0! TypeError |
| p/wopts1: None |
| ! inv: 0! TypeError |
| p/bopts1! KeyError |
| inv: 0! KeyError |
| bopts1! KeyError |
| |
| *** 248,254 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: b'' |
| ! inv: 1! ValueError |
| G: '' |
| W: 1:'A' 2:'B' 3:'' 4:'C' |
| B: 1:'A' 2:'B' 3:'' 4:'C' |
| --- 248,254 ---- |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: b'' |
| ! inv: 1! TypeError |
| G: '' |
| W: 1:'A' 2:'B' 3:'' 4:'C' |
| B: 1:'A' 2:'B' 3:'' 4:'C' |
| |
| *** 277,290 **** |
| B: 1:0 2:1 3:0 4:1 |
| >>> path |
| p/gopts1: b'.,/usr/include,,' |
| ! inv: 0! ValueError |
| p/wopts1! KeyError |
| inv: 0! KeyError |
| wopts1! KeyError |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: None |
| ! inv: 0! ValueError |
| G: '.,,' |
| W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| --- 277,290 ---- |
| B: 1:0 2:1 3:0 4:1 |
| >>> path |
| p/gopts1: b'.,/usr/include,,' |
| ! inv: 0! TypeError |
| p/wopts1! KeyError |
| inv: 0! KeyError |
| wopts1! KeyError |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: None |
| ! inv: 0! TypeError |
| G: '.,,' |
| W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 951, |
| /**/ |
| |
| -- |
| 5 out of 4 people have trouble with fractions. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |