188 lines
4.9 KiB
Text
188 lines
4.9 KiB
Text
|
backout https://github.com/vim/vim/commit/bd4614f43d0eac4aff743132bab8e53b015ac801.patch
|
||
|
segfaults seen, at least when using vim-airline
|
||
|
|
||
|
Index: src/eval.c
|
||
|
--- src/eval.c.orig
|
||
|
+++ src/eval.c
|
||
|
@@ -377,12 +377,14 @@ eval_expr_typval(
|
||
|
{
|
||
|
if (expr->v_type == VAR_PARTIAL)
|
||
|
return eval_expr_partial(expr, argv, argc, fc_arg, rettv);
|
||
|
- if (expr->v_type == VAR_INSTR)
|
||
|
+ else if (expr->v_type == VAR_INSTR)
|
||
|
return exe_typval_instr(expr, rettv);
|
||
|
- if (expr->v_type == VAR_FUNC || want_func)
|
||
|
+ else if (expr->v_type == VAR_FUNC || want_func)
|
||
|
return eval_expr_func(expr, argv, argc, rettv);
|
||
|
+ else
|
||
|
+ return eval_expr_string(expr, rettv);
|
||
|
|
||
|
- return eval_expr_string(expr, rettv);
|
||
|
+ return OK;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
@@ -2261,7 +2263,7 @@ set_var_lval(
|
||
|
|
||
|
// handle +=, -=, *=, /=, %= and .=
|
||
|
di = NULL;
|
||
|
- if (eval_variable(lp->ll_name, (int)(lp->ll_name_end - lp->ll_name),
|
||
|
+ if (eval_variable(lp->ll_name, (int)STRLEN(lp->ll_name),
|
||
|
lp->ll_sid, &tv, &di, EVAL_VAR_VERBOSE) == OK)
|
||
|
{
|
||
|
if (di != NULL && check_typval_is_value(&di->di_tv) == FAIL)
|
||
|
@@ -6167,34 +6169,19 @@ jobchan_tv2string(
|
||
|
class_tv2string(typval_T *tv, char_u **tofree)
|
||
|
{
|
||
|
char_u *r = NULL;
|
||
|
- size_t rsize;
|
||
|
class_T *cl = tv->vval.v_class;
|
||
|
- char_u *class_name = (char_u *)"[unknown]";
|
||
|
- size_t class_namelen = 9;
|
||
|
char *s = "class";
|
||
|
- size_t slen = 5;
|
||
|
|
||
|
- if (cl != NULL)
|
||
|
- {
|
||
|
- class_name = cl->class_name;
|
||
|
- class_namelen = STRLEN(cl->class_name);
|
||
|
- if (IS_INTERFACE(cl))
|
||
|
- {
|
||
|
- s = "interface";
|
||
|
- slen = 9;
|
||
|
- }
|
||
|
- else if (IS_ENUM(cl))
|
||
|
- {
|
||
|
- s = "enum";
|
||
|
- slen = 4;
|
||
|
- }
|
||
|
- }
|
||
|
+ if (cl != NULL && IS_INTERFACE(cl))
|
||
|
+ s = "interface";
|
||
|
+ else if (cl != NULL && IS_ENUM(cl))
|
||
|
+ s = "enum";
|
||
|
+ size_t len = STRLEN(s) + 1 +
|
||
|
+ (cl == NULL ? 9 : STRLEN(cl->class_name)) + 1;
|
||
|
+ r = *tofree = alloc(len);
|
||
|
+ vim_snprintf((char *)r, len, "%s %s", s,
|
||
|
+ cl == NULL ? "[unknown]" : (char *)cl->class_name);
|
||
|
|
||
|
- rsize = slen + 1 + class_namelen + 1;
|
||
|
- r = *tofree = alloc(rsize);
|
||
|
- if (r != NULL)
|
||
|
- vim_snprintf((char *)r, rsize, "%s %s", s, (char *)class_name);
|
||
|
-
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
@@ -6226,7 +6213,7 @@ object_tv2string(
|
||
|
else if (copyID != 0 && obj->obj_copyID == copyID
|
||
|
&& obj->obj_class->class_obj_member_count != 0)
|
||
|
{
|
||
|
- size_t n = 25 + STRLEN((char *)obj->obj_class->class_name);
|
||
|
+ size_t n = 25 + strlen((char *)obj->obj_class->class_name);
|
||
|
r = alloc(n);
|
||
|
if (r != NULL)
|
||
|
(void)vim_snprintf((char *)r, n, "object of %s {...}",
|
||
|
@@ -6940,14 +6927,14 @@ make_expanded_name(
|
||
|
temp_result = eval_to_string(expr_start + 1, FALSE, FALSE);
|
||
|
if (temp_result != NULL)
|
||
|
{
|
||
|
- size_t retvalsize = (size_t)(expr_start - in_start)
|
||
|
- + STRLEN(temp_result)
|
||
|
- + (size_t)(in_end - expr_end) + 1;
|
||
|
-
|
||
|
- retval = alloc(retvalsize);
|
||
|
+ retval = alloc(STRLEN(temp_result) + (expr_start - in_start)
|
||
|
+ + (in_end - expr_end) + 1);
|
||
|
if (retval != NULL)
|
||
|
- vim_snprintf((char *)retval, retvalsize, "%s%s%s",
|
||
|
- in_start, temp_result, expr_end + 1);
|
||
|
+ {
|
||
|
+ STRCPY(retval, in_start);
|
||
|
+ STRCAT(retval, temp_result);
|
||
|
+ STRCAT(retval, expr_end + 1);
|
||
|
+ }
|
||
|
}
|
||
|
vim_free(temp_result);
|
||
|
|
||
|
@@ -7639,17 +7626,21 @@ last_set_msg(sctx_T script_ctx)
|
||
|
char_u *
|
||
|
do_string_sub(
|
||
|
char_u *str,
|
||
|
- size_t len,
|
||
|
char_u *pat,
|
||
|
char_u *sub,
|
||
|
typval_T *expr,
|
||
|
- char_u *flags,
|
||
|
- size_t *ret_len) // length of returned buffer
|
||
|
+ char_u *flags)
|
||
|
{
|
||
|
+ int sublen;
|
||
|
regmatch_T regmatch;
|
||
|
+ int i;
|
||
|
+ int do_all;
|
||
|
+ char_u *tail;
|
||
|
+ char_u *end;
|
||
|
garray_T ga;
|
||
|
char_u *ret;
|
||
|
char_u *save_cpo;
|
||
|
+ char_u *zero_width = NULL;
|
||
|
|
||
|
// Make 'cpoptions' empty, so that the 'l' flag doesn't work here
|
||
|
save_cpo = p_cpo;
|
||
|
@@ -7657,17 +7648,14 @@ do_string_sub(
|
||
|
|
||
|
ga_init2(&ga, 1, 200);
|
||
|
|
||
|
+ do_all = (flags[0] == 'g');
|
||
|
+
|
||
|
regmatch.rm_ic = p_ic;
|
||
|
regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
|
||
|
if (regmatch.regprog != NULL)
|
||
|
{
|
||
|
- char_u *tail = str;
|
||
|
- char_u *end = str + len;
|
||
|
- int do_all = (flags[0] == 'g');
|
||
|
- int sublen;
|
||
|
- int i;
|
||
|
- char_u *zero_width = NULL;
|
||
|
-
|
||
|
+ tail = str;
|
||
|
+ end = str + STRLEN(str);
|
||
|
while (vim_regexec_nl(®match, str, (colnr_T)(tail - str)))
|
||
|
{
|
||
|
// Skip empty match except for first match.
|
||
|
@@ -7722,20 +7710,12 @@ do_string_sub(
|
||
|
}
|
||
|
|
||
|
if (ga.ga_data != NULL)
|
||
|
- {
|
||
|
STRCPY((char *)ga.ga_data + ga.ga_len, tail);
|
||
|
- ga.ga_len += (int)(end - tail);
|
||
|
- }
|
||
|
|
||
|
vim_regfree(regmatch.regprog);
|
||
|
}
|
||
|
|
||
|
- if (ga.ga_data != NULL)
|
||
|
- {
|
||
|
- str = (char_u *)ga.ga_data;
|
||
|
- len = (size_t)ga.ga_len;
|
||
|
- }
|
||
|
- ret = vim_strnsave(str, len);
|
||
|
+ ret = vim_strsave(ga.ga_data == NULL ? str : (char_u *)ga.ga_data);
|
||
|
ga_clear(&ga);
|
||
|
if (p_cpo == empty_option)
|
||
|
p_cpo = save_cpo;
|
||
|
@@ -7748,9 +7728,6 @@ do_string_sub(
|
||
|
set_option_value_give_err((char_u *)"cpo", 0L, save_cpo, 0);
|
||
|
free_string_option(save_cpo);
|
||
|
}
|
||
|
-
|
||
|
- if (ret_len != NULL)
|
||
|
- *ret_len = len;
|
||
|
|
||
|
return ret;
|
||
|
}
|