To: vim_dev@googlegroups.com Subject: Patch 7.3.951 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.3.950/src/if_py_both.h 2013-05-15 15:35:05.000000000 +0200 --- src/if_py_both.h 2013-05-15 15:38:57.000000000 +0200 *************** *** 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; *** ../vim-7.3.950/src/if_python3.c 2013-05-15 15:35:05.000000000 +0200 --- src/if_python3.c 2013-05-15 15:38:57.000000000 +0200 *************** *** 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; } } *** ../vim-7.3.950/src/if_python.c 2013-05-15 15:35:05.000000000 +0200 --- src/if_python.c 2013-05-15 15:38:57.000000000 +0200 *************** *** 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 */ *** ../vim-7.3.950/src/testdir/test86.ok 2013-05-15 14:51:31.000000000 +0200 --- src/testdir/test86.ok 2013-05-15 15:38:57.000000000 +0200 *************** *** 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:'.' *** ../vim-7.3.950/src/testdir/test87.ok 2013-05-15 14:51:31.000000000 +0200 --- src/testdir/test87.ok 2013-05-15 15:38:57.000000000 +0200 *************** *** 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:'.' *** ../vim-7.3.950/src/version.c 2013-05-15 15:35:05.000000000 +0200 --- src/version.c 2013-05-15 15:38:34.000000000 +0200 *************** *** 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 ///