# HG changeset patch # User Bram Moolenaar # Date 1369168698 -7200 # Node ID cadb57fbb78165c81fe4718a355b5f73c641bb62 # Parent 1faad5feb5f3912656a29f5c10ae866505512d62 updated for version 7.3.1004 Problem: No error when option could not be set. Solution: Report an error. (ZyX) diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -1521,6 +1521,25 @@ OptionsItem(OptionsObject *self, PyObjec } 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,6 +1551,7 @@ set_option_value_for(key, numval, string win_T *save_curwin = NULL; tabpage_T *save_curtab = NULL; buf_T *save_curbuf = NULL; + int r = 0; VimTryStart(); switch (opt_type) @@ -1545,16 +1565,22 @@ set_option_value_for(key, numval, string PyErr_SetVim("Problem while switching windows."); return -1; } - set_option_value(key, numval, stringval, opt_flags); + 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); - set_option_value(key, numval, stringval, opt_flags); + r = set_option_value_err(key, numval, stringval, opt_flags); restore_buffer(save_curbuf); + if (r == FAIL) + return -1; break; case SREQ_GLOBAL: - set_option_value(key, numval, stringval, opt_flags); + r = set_option_value_err(key, numval, stringval, opt_flags); + if (r == FAIL) + return -1; break; } return VimTryEnd(); @@ -1611,6 +1637,7 @@ OptionsAssItem(OptionsObject *self, PyOb if (flags & SOPT_BOOL) { int istrue = PyObject_IsTrue(valObject); + if (istrue == -1) return -1; r = set_option_value_for(key, istrue, NULL, diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -3018,7 +3018,7 @@ static long_u *insecure_flag __ARGS((int # 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 *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,8 +5600,10 @@ set_string_option_global(opt_idx, varp) /* * Set a string option to a new value, and handle the effects. - */ - static void + * + * 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,9 +5612,10 @@ set_string_option(opt_idx, value, opt_fl 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; + return NULL; s = vim_strsave(value); if (s != NULL) @@ -5624,10 +5627,11 @@ set_string_option(opt_idx, value, opt_fl : opt_flags); oldval = *varp; *varp = s; - if (did_set_string_option(opt_idx, varp, TRUE, oldval, NULL, - opt_flags) == NULL) + 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,8 +8973,10 @@ get_option_value_strict(name, numval, st /* * Set the value of option "name". * Use "string" for string options, use "number" for other options. - */ - void + * + * 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,11 +8998,11 @@ set_option_value(name, number, string, o if (sandbox > 0 && (flags & P_SECURE)) { EMSG(_(e_sandbox)); - return; + return NULL; } #endif if (flags & P_STRING) - set_string_option(opt_idx, string, opt_flags); + return set_string_option(opt_idx, string, opt_flags); else { varp = get_varp_scope(&(options[opt_idx]), opt_flags); @@ -9017,19 +9023,20 @@ set_option_value(name, number, string, o * num option using a string. */ EMSG3(_("E521: Number required: &%s = '%s'"), name, string); - return; /* do nothing as we hit an error */ + return NULL; /* do nothing as we hit an error */ } } if (flags & P_NUM) - (void)set_num_option(opt_idx, varp, number, + return set_num_option(opt_idx, varp, number, NULL, 0, opt_flags); else - (void)set_bool_option(opt_idx, varp, (int)number, + return set_bool_option(opt_idx, varp, (int)number, opt_flags); } } } + return NULL; } /* diff --git a/src/proto/option.pro b/src/proto/option.pro --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -23,7 +23,7 @@ char_u *check_colorcolumn __ARGS((win_T 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 *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)); diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok --- a/src/testdir/test86.ok +++ b/src/testdir/test86.ok @@ -166,6 +166,7 @@ jkl inv: -100! KeyError gopts1! KeyError p/wopts1: 8 + inv: -100! error p/bopts1! KeyError inv: -100! KeyError bopts1! KeyError @@ -184,6 +185,7 @@ jkl inv: 'abc'! KeyError gopts1! KeyError p/wopts1: '' + inv: 'abc'! error p/bopts1! KeyError inv: 'abc'! KeyError bopts1! KeyError diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok --- a/src/testdir/test87.ok +++ b/src/testdir/test87.ok @@ -155,6 +155,7 @@ jkl inv: -100! KeyError gopts1! KeyError p/wopts1: 8 + inv: -100! error p/bopts1! KeyError inv: -100! KeyError bopts1! KeyError @@ -173,6 +174,7 @@ jkl inv: 'abc'! KeyError gopts1! KeyError p/wopts1: b'' + inv: 'abc'! error p/bopts1! KeyError inv: 'abc'! KeyError bopts1! KeyError diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1004, +/**/ 1003, /**/ 1002,