4 From: Bram Moolenaar <Bram@moolenaar.net>
6 Content-Type: text/plain; charset=ISO-8859-1
7 Content-Transfer-Encoding: 8bit
11 Problem: Using return value of function that doesn't return a value results
12 in reading uninitialized memory.
13 Solution: Set the default to return zero. Make cursor() return -1 on
14 failure. Let complete() return an empty string in case of an
15 error. (partly by Dominique Pelle)
16 Files: runtime/doc/eval.txt, src/eval.c
19 *** ../vim-7.2.148/runtime/doc/eval.txt Tue Dec 9 10:56:50 2008
20 --- runtime/doc/eval.txt Sun Mar 22 14:28:49 2009
24 When 'virtualedit' is used {off} specifies the offset in
25 screen columns from the start of the character. E.g., a
26 position within a <Tab> or after the last character.
27 + Returns 0 when the position could be set, -1 otherwise.
30 deepcopy({expr}[, {noref}]) *deepcopy()* *E698*
34 should also work to move files across file systems. The
35 result is a Number, which is 0 if the file was renamed
36 successfully, and non-zero when the renaming failed.
37 + NOTE: If {to} exists it is overwritten without warning.
38 This function is not available in the |sandbox|.
40 repeat({expr}, {count}) *repeat()*
41 *** ../vim-7.2.148/src/eval.c Wed Feb 4 16:25:53 2009
42 --- src/eval.c Sun Mar 22 20:45:18 2009
50 char_u numbuf[NUMBUFLEN];
53 if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
57 /* execute the function if no errors detected and executing */
58 if (evaluate && error == ERROR_NONE)
60 ! rettv->v_type = VAR_NUMBER; /* default is number rettv */
61 error = ERROR_UNKNOWN;
63 if (!builtin_function(fname))
65 /* execute the function if no errors detected and executing */
66 if (evaluate && error == ERROR_NONE)
68 ! rettv->v_type = VAR_NUMBER; /* default rettv is number zero */
69 ! rettv->vval.v_number = 0;
70 error = ERROR_UNKNOWN;
72 if (!builtin_function(fname))
78 - rettv->vval.v_number = 0; /* Default: Success */
86 dict_T *selfdict = NULL;
88 - rettv->vval.v_number = 0;
89 if (argvars[1].v_type != VAR_LIST)
95 if (buttons == NULL || *buttons == NUL)
96 buttons = (char_u *)_("&Ok");
99 ! rettv->vval.v_number = 0;
101 rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
104 - rettv->vval.v_number = 0;
109 if (buttons == NULL || *buttons == NUL)
110 buttons = (char_u *)_("&Ok");
113 rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
122 rettv->vval.v_number = cs_connection(num, dbpath, prepend);
124 - rettv->vval.v_number = 0;
129 * "cursor(lnum, col)" function
131 ! * Moves the cursor to the specified line and column
138 rettv->vval.v_number = cs_connection(num, dbpath, prepend);
143 * "cursor(lnum, col)" function
145 ! * Moves the cursor to the specified line and column.
146 ! * Returns 0 when the position could be set, -1 otherwise.
156 + rettv->vval.v_number = -1;
157 if (argvars[1].v_type == VAR_UNKNOWN)
165 curwin->w_set_curswant = TRUE;
166 + rettv->vval.v_number = 0;
174 rettv->vval.v_number = did_filetype;
176 - rettv->vval.v_number = 0;
186 - rettv->vval.v_number = 0;
187 if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
196 - rettv->vval.v_number = 0;
197 keys = get_tv_string(&argvars[0]);
203 char_u *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()";
206 - rettv->vval.v_number = 0;
207 if (argvars[0].v_type == VAR_LIST)
209 if ((l = argvars[0].vval.v_list) == NULL
214 rettv->vval.v_number = (varnumber_T)f;
217 - rettv->vval.v_number = 0;
224 lnum = get_tv_lnum(argvars);
225 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
226 rettv->vval.v_number = foldLevel(lnum);
229 - rettv->vval.v_number = 0;
239 - rettv->vval.v_number = 0;
242 gui_mch_set_foreground();
249 - rettv->vval.v_number = 0;
250 s = get_tv_string(&argvars[0]);
251 if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
252 EMSG2(_(e_invarg2), s);
259 ! if (argvars[2].v_type == VAR_UNKNOWN)
260 ! rettv->vval.v_number = 0;
262 copy_tv(&argvars[2], rettv);
269 ! if (argvars[2].v_type != VAR_UNKNOWN)
270 copy_tv(&argvars[2], rettv);
280 ! if (rettv_list_alloc(rettv) == FAIL)
284 ! rettv->vval.v_number = 0;
286 if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0)
292 ! if (retlist && rettv_list_alloc(rettv) == FAIL)
295 if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0)
300 matchitem_T *cur = curwin->w_match_head;
302 - rettv->vval.v_number = 0;
304 if (rettv_list_alloc(rettv) == OK)
313 - rettv->vval.v_number = 0;
315 if (rettv_list_alloc(rettv) == OK)
323 - rettv->vval.v_number = 0;
324 if (argvars[0].v_type != VAR_DICT)
330 n = del_history_entry(get_histtype(str),
331 get_tv_string_buf(&argvars[1], buf));
332 rettv->vval.v_number = n;
334 - rettv->vval.v_number = 0;
344 - rettv->vval.v_number = 0;
345 #ifdef NO_CONSOLE_INPUT
346 /* While starting up, there is no place to enter text. */
347 if (no_console_input())
351 --ga_userinput.ga_len;
352 restore_typeahead((tasave_T *)(ga_userinput.ga_data)
353 + ga_userinput.ga_len);
354 ! rettv->vval.v_number = 0; /* OK */
356 else if (p_verbose > 1)
359 --ga_userinput.ga_len;
360 restore_typeahead((tasave_T *)(ga_userinput.ga_data)
361 + ga_userinput.ga_len);
362 ! /* default return is zero == OK */
364 else if (p_verbose > 1)
368 save_typeahead((tasave_T *)(ga_userinput.ga_data)
369 + ga_userinput.ga_len);
370 ++ga_userinput.ga_len;
371 ! rettv->vval.v_number = 0; /* OK */
374 rettv->vval.v_number = 1; /* Failed */
376 save_typeahead((tasave_T *)(ga_userinput.ga_data)
377 + ga_userinput.ga_len);
378 ++ga_userinput.ga_len;
379 ! /* default return is zero == OK */
382 rettv->vval.v_number = 1; /* Failed */
388 - rettv->vval.v_number = 0;
389 if (argvars[0].v_type != VAR_LIST)
390 EMSG2(_(e_listarg), "insert()");
391 else if ((l = argvars[0].vval.v_list) != NULL
398 - rettv->vval.v_number = 0;
399 if (argvars[0].v_type != VAR_DICT)
408 - rettv->vval.v_number = 0;
409 if (argvars[0].v_type != VAR_LIST)
417 rettv->v_type = type;
418 ! if (type == VAR_NUMBER)
419 ! rettv->vval.v_number = 0;
421 rettv->vval.v_string = NULL;
423 if (check_restricted() || check_secure())
427 rettv->v_type = type;
428 ! if (type != VAR_NUMBER)
429 rettv->vval.v_string = NULL;
431 if (check_restricted() || check_secure())
437 - rettv->vval.v_number = 0;
438 #ifdef FEAT_INS_EXPAND
440 rettv->vval.v_number = 1;
444 stride = get_tv_number_chk(&argvars[2], &error);
447 - rettv->vval.v_number = 0;
449 return; /* type error; errmsg already given */
457 - rettv->vval.v_number = 0;
458 #ifdef FEAT_CLIENTSERVER
460 /* On Win32 it's done in this application. */
464 rettv->vval.v_number = (s != NULL);
467 - rettv->vval.v_number = 0;
468 if (check_connection() == FAIL)
477 - rettv->vval.v_number = 0;
478 if (argvars[0].v_type == VAR_DICT)
480 if (argvars[2].v_type != VAR_UNKNOWN)
487 - rettv->vval.v_number = 0;
488 if (argvars[0].v_type != VAR_LIST)
489 EMSG2(_(e_listarg), "reverse()");
490 else if ((l = argvars[0].vval.v_list) != NULL
497 - rettv->vval.v_number = 0;
499 if (rettv_list_alloc(rettv) == FAIL)
508 - rettv->vval.v_number = 0;
510 if (rettv_list_alloc(rettv) == FAIL)
517 char_u nbuf[NUMBUFLEN];
519 - rettv->vval.v_number = 0;
521 if (check_restricted() || check_secure())
523 (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
528 line = get_tv_string_chk(&argvars[1]);
530 ! rettv->vval.v_number = 0; /* OK */
536 line = get_tv_string_chk(&argvars[1]);
538 ! /* default result is zero == OK */
546 * "setwinvar()" and "settabwinvar()" functions
550 setwinvar(argvars, rettv, off)
554 char_u nbuf[NUMBUFLEN];
557 - rettv->vval.v_number = 0;
559 if (check_restricted() || check_secure())
568 - rettv->vval.v_number = 0;
569 if (argvars[0].v_type != VAR_LIST)
570 EMSG2(_(e_listarg), "sort()");
578 ! #ifndef FEAT_WINDOWS
579 ! rettv->vval.v_number = 0;
588 ! #ifdef FEAT_WINDOWS
595 wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
598 ! rettv->vval.v_number = 0;
601 ! if (rettv_list_alloc(rettv) == FAIL)
602 ! rettv->vval.v_number = 0;
605 ! for (; wp != NULL; wp = wp->w_next)
606 ! if (list_append_number(rettv->vval.v_list,
607 wp->w_buffer->b_fnum) == FAIL)
615 wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
617 ! if (wp != NULL && rettv_list_alloc(rettv) != FAIL)
619 ! for (; wp != NULL; wp = wp->w_next)
620 ! if (list_append_number(rettv->vval.v_list,
621 wp->w_buffer->b_fnum) == FAIL)
630 if (rettv_list_alloc(rettv) == FAIL)
632 - rettv->vval.v_number = 0;
636 for (first = TRUE; ; first = FALSE)
637 if (get_tagfname(&tn, first, fname) == FAIL
641 /* A non-zero number or non-empty string argument: reset mode. */
642 if (non_zero_arg(&argvars[0]))
643 curbuf->b_visual_mode_eval = NUL;
645 - rettv->vval.v_number = 0; /* return anything, it won't work anyway */
650 *** ../vim-7.2.148/src/version.c Wed Mar 18 19:07:09 2009
651 --- src/version.c Wed Apr 22 12:44:05 2009
655 { /* Add new patch number below this line */
662 WOMAN: Well, 'ow did you become king then?
663 ARTHUR: The Lady of the Lake, [angels sing] her arm clad in the purest
664 shimmering samite, held aloft Excalibur from the bosom of the water
665 signifying by Divine Providence that I, Arthur, was to carry
666 Excalibur. [singing stops] That is why I am your king!
667 The Quest for the Holy Grail (Monty Python)
669 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
670 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
671 \\\ download, build and distribute -- http://www.A-A-P.org ///
672 \\\ help me help AIDS victims -- http://ICCF-Holland.org ///