# HG changeset patch # User Bram Moolenaar # Date 1623178803 -7200 # Node ID 3c8bd1d392d1c526ebf679641ae8fd892cf699a2 # Parent 528e605caece931597626b3644a620fc5b9ba36e patch 8.2.2964: Vim9: hang when using space after -> Commit: https://github.com/vim/vim/commit/a733042b124357225e4081e10ef28591236c6077 Author: Bram Moolenaar Date: Tue Jun 8 20:46:45 2021 +0200 patch 8.2.2964: Vim9: hang when using space after -> Problem: Vim9: hang when using space after ->. (Naohiro Ono) Solution: Skip over white space to find the function name. (closes https://github.com/vim/vim/issues/8341) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -5786,8 +5786,9 @@ handle_subscript( p = eval_next_non_blank(*arg, evalarg, &getnext); if (getnext && ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1])) - || (p[0] == '-' && p[1] == '>' - && (p[2] == '{' || ASCII_ISALPHA(p[2]))))) + || (p[0] == '-' && p[1] == '>' && (p[2] == '{' + || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2) + : p[2]))))) { *arg = eval_next_line(evalarg); p = *arg; diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2961,6 +2961,10 @@ def Test_expr7_method_call() var Join = (l) => join(l, 'x') assert_equal('axb', ['a', 'b']->(Join)()) + + var sorted = [3, 1, 2] + -> sort() + assert_equal([1, 2, 3], sorted) END CheckDefAndScriptSuccess(lines) enddef diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2964, +/**/ 2963, /**/ 2962, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4108,7 +4108,8 @@ compile_subscript( // Also if a following line starts with ".x". if (next != NULL && ((next[0] == '-' && next[1] == '>' - && (next[2] == '{' || ASCII_ISALPHA(next[2]))) + && (next[2] == '{' + || ASCII_ISALPHA(*skipwhite(next + 2)))) || (next[0] == '.' && eval_isdictc(next[1])))) { next = next_line_from_context(cctx, TRUE);