To: vim_dev@googlegroups.com Subject: Patch 7.3.1004 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.1004 Problem: No error when option could not be set. Solution: Report an error. (ZyX) Files: src/if_py_both.h, src/option.c, src/proto/option.pro, src/testdir/test86.ok, src/testdir/test87.ok *** ../vim-7.3.1003/src/if_py_both.h 2013-05-21 22:23:50.000000000 +0200 --- src/if_py_both.h 2013-05-21 22:34:04.000000000 +0200 *************** *** 1521,1526 **** --- 1521,1545 ---- } static int + set_option_value_err(key, numval, stringval, opt_flags) + char_u *key; + int numval; + char_u *stringval; + int opt_flags; + { + char_u *errmsg; + + if ((errmsg = set_option_value(key, numval, stringval, opt_flags))) + { + if (VimTryEnd()) + return FAIL; + PyErr_SetVim((char *)errmsg); + return FAIL; + } + return OK; + } + + static int set_option_value_for(key, numval, stringval, opt_flags, opt_type, from) char_u *key; int numval; *************** *** 1532,1537 **** --- 1551,1557 ---- win_T *save_curwin = NULL; tabpage_T *save_curtab = NULL; buf_T *save_curbuf = NULL; + int r = 0; VimTryStart(); switch (opt_type) *************** *** 1545,1560 **** PyErr_SetVim("Problem while switching windows."); return -1; } ! set_option_value(key, numval, stringval, opt_flags); restore_win(save_curwin, save_curtab); break; case SREQ_BUF: switch_buffer(&save_curbuf, (buf_T *)from); ! set_option_value(key, numval, stringval, opt_flags); restore_buffer(save_curbuf); break; case SREQ_GLOBAL: ! set_option_value(key, numval, stringval, opt_flags); break; } return VimTryEnd(); --- 1565,1586 ---- PyErr_SetVim("Problem while switching windows."); return -1; } ! r = set_option_value_err(key, numval, stringval, opt_flags); restore_win(save_curwin, save_curtab); + if (r == FAIL) + return -1; break; case SREQ_BUF: switch_buffer(&save_curbuf, (buf_T *)from); ! r = set_option_value_err(key, numval, stringval, opt_flags); restore_buffer(save_curbuf); + if (r == FAIL) + return -1; break; case SREQ_GLOBAL: ! r = set_option_value_err(key, numval, stringval, opt_flags); ! if (r == FAIL) ! return -1; break; } return VimTryEnd(); *************** *** 1611,1616 **** --- 1637,1643 ---- if (flags & SOPT_BOOL) { int istrue = PyObject_IsTrue(valObject); + if (istrue == -1) return -1; r = set_option_value_for(key, istrue, NULL, *** ../vim-7.3.1003/src/option.c 2013-05-19 19:16:25.000000000 +0200 --- src/option.c 2013-05-21 22:34:41.000000000 +0200 *************** *** 3018,3024 **** # define insecure_flag(opt_idx, opt_flags) (&options[opt_idx].flags) #endif static void set_string_option_global __ARGS((int opt_idx, char_u **varp)); ! static void set_string_option __ARGS((int opt_idx, char_u *value, int opt_flags)); static char_u *did_set_string_option __ARGS((int opt_idx, char_u **varp, int new_value_alloced, char_u *oldval, char_u *errbuf, int opt_flags)); static char_u *set_chars_option __ARGS((char_u **varp)); #ifdef FEAT_SYN_HL --- 3018,3024 ---- # define insecure_flag(opt_idx, opt_flags) (&options[opt_idx].flags) #endif static void set_string_option_global __ARGS((int opt_idx, char_u **varp)); ! static char_u *set_string_option __ARGS((int opt_idx, char_u *value, int opt_flags)); static char_u *did_set_string_option __ARGS((int opt_idx, char_u **varp, int new_value_alloced, char_u *oldval, char_u *errbuf, int opt_flags)); static char_u *set_chars_option __ARGS((char_u **varp)); #ifdef FEAT_SYN_HL *************** *** 5600,5607 **** /* * Set a string option to a new value, and handle the effects. */ ! static void set_string_option(opt_idx, value, opt_flags) int opt_idx; char_u *value; --- 5600,5609 ---- /* * Set a string option to a new value, and handle the effects. + * + * Returns NULL on success or error message on error. */ ! static char_u * set_string_option(opt_idx, value, opt_flags) int opt_idx; char_u *value; *************** *** 5610,5618 **** char_u *s; char_u **varp; char_u *oldval; if (options[opt_idx].var == NULL) /* don't set hidden option */ ! return; s = vim_strsave(value); if (s != NULL) --- 5612,5621 ---- char_u *s; char_u **varp; char_u *oldval; + char_u *r = NULL; if (options[opt_idx].var == NULL) /* don't set hidden option */ ! return NULL; s = vim_strsave(value); if (s != NULL) *************** *** 5624,5633 **** : opt_flags); oldval = *varp; *varp = s; ! if (did_set_string_option(opt_idx, varp, TRUE, oldval, NULL, ! opt_flags) == NULL) did_set_option(opt_idx, opt_flags, TRUE); } } /* --- 5627,5637 ---- : opt_flags); oldval = *varp; *varp = s; ! if ((r = did_set_string_option(opt_idx, varp, TRUE, oldval, NULL, ! opt_flags)) == NULL) did_set_option(opt_idx, opt_flags, TRUE); } + return r; } /* *************** *** 8969,8976 **** /* * Set the value of option "name". * Use "string" for string options, use "number" for other options. */ ! void set_option_value(name, number, string, opt_flags) char_u *name; long number; --- 8973,8982 ---- /* * Set the value of option "name". * Use "string" for string options, use "number" for other options. + * + * Returns NULL on success or error message on error. */ ! char_u * set_option_value(name, number, string, opt_flags) char_u *name; long number; *************** *** 8992,9002 **** if (sandbox > 0 && (flags & P_SECURE)) { EMSG(_(e_sandbox)); ! return; } #endif if (flags & P_STRING) ! set_string_option(opt_idx, string, opt_flags); else { varp = get_varp_scope(&(options[opt_idx]), opt_flags); --- 8998,9008 ---- if (sandbox > 0 && (flags & P_SECURE)) { EMSG(_(e_sandbox)); ! return NULL; } #endif if (flags & P_STRING) ! return set_string_option(opt_idx, string, opt_flags); else { varp = get_varp_scope(&(options[opt_idx]), opt_flags); *************** *** 9017,9035 **** * num option using a string. */ EMSG3(_("E521: Number required: &%s = '%s'"), name, string); ! return; /* do nothing as we hit an error */ } } if (flags & P_NUM) ! (void)set_num_option(opt_idx, varp, number, NULL, 0, opt_flags); else ! (void)set_bool_option(opt_idx, varp, (int)number, opt_flags); } } } } /* --- 9023,9042 ---- * num option using a string. */ EMSG3(_("E521: Number required: &%s = '%s'"), name, string); ! return NULL; /* do nothing as we hit an error */ } } if (flags & P_NUM) ! return set_num_option(opt_idx, varp, number, NULL, 0, opt_flags); else ! return set_bool_option(opt_idx, varp, (int)number, opt_flags); } } } + return NULL; } /* *** ../vim-7.3.1003/src/proto/option.pro 2013-05-06 03:52:44.000000000 +0200 --- src/proto/option.pro 2013-05-21 22:27:50.000000000 +0200 *************** *** 23,29 **** char_u *check_stl_option __ARGS((char_u *s)); int get_option_value __ARGS((char_u *name, long *numval, char_u **stringval, int opt_flags)); int get_option_value_strict __ARGS((char_u *name, long *numval, char_u **stringval, int opt_type, void *from)); ! void set_option_value __ARGS((char_u *name, long number, char_u *string, int opt_flags)); char_u *get_term_code __ARGS((char_u *tname)); char_u *get_highlight_default __ARGS((void)); char_u *get_encoding_default __ARGS((void)); --- 23,29 ---- char_u *check_stl_option __ARGS((char_u *s)); int get_option_value __ARGS((char_u *name, long *numval, char_u **stringval, int opt_flags)); int get_option_value_strict __ARGS((char_u *name, long *numval, char_u **stringval, int opt_type, void *from)); ! char_u *set_option_value __ARGS((char_u *name, long number, char_u *string, int opt_flags)); char_u *get_term_code __ARGS((char_u *tname)); char_u *get_highlight_default __ARGS((void)); char_u *get_encoding_default __ARGS((void)); *** ../vim-7.3.1003/src/testdir/test86.ok 2013-05-21 22:23:51.000000000 +0200 --- src/testdir/test86.ok 2013-05-21 22:27:50.000000000 +0200 *************** *** 166,171 **** --- 166,172 ---- inv: -100! KeyError gopts1! KeyError p/wopts1: 8 + inv: -100! error p/bopts1! KeyError inv: -100! KeyError bopts1! KeyError *************** *** 184,189 **** --- 185,191 ---- inv: 'abc'! KeyError gopts1! KeyError p/wopts1: '' + inv: 'abc'! error p/bopts1! KeyError inv: 'abc'! KeyError bopts1! KeyError *** ../vim-7.3.1003/src/testdir/test87.ok 2013-05-21 22:23:51.000000000 +0200 --- src/testdir/test87.ok 2013-05-21 22:27:50.000000000 +0200 *************** *** 155,160 **** --- 155,161 ---- inv: -100! KeyError gopts1! KeyError p/wopts1: 8 + inv: -100! error p/bopts1! KeyError inv: -100! KeyError bopts1! KeyError *************** *** 173,178 **** --- 174,180 ---- inv: 'abc'! KeyError gopts1! KeyError p/wopts1: b'' + inv: 'abc'! error p/bopts1! KeyError inv: 'abc'! KeyError bopts1! KeyError *** ../vim-7.3.1003/src/version.c 2013-05-21 22:23:51.000000000 +0200 --- src/version.c 2013-05-21 22:37:33.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 1004, /**/ -- FIRST SOLDIER: So they wouldn't be able to bring a coconut back anyway. SECOND SOLDIER: Wait a minute! Suppose two swallows carried it together? FIRST SOLDIER: No, they'd have to have it on a line. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// 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 ///