# HG changeset patch # User Bram Moolenaar # Date 1687631404 -7200 # Node ID 9ae1bdff84574f5f8c15392d495d27998ba7b949 # Parent 14298ba478dc6c7ffc6708417af76b53fb086aac patch 9.0.1662: crash when using a class member twice Commit: https://github.com/vim/vim/commit/4e2406c7a9d5f7f03faec8c42fac15c192fb59b0 Author: Bram Moolenaar Date: Sat Jun 24 19:22:21 2023 +0100 patch 9.0.1662: crash when using a class member twice Problem: Crash when using a class member twice. (Christian J. Robinson) Solution: Make a copy of the value. diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -838,6 +838,23 @@ def Test_class_member() END v9.CheckScriptSuccess(lines) + # using static class member twice + lines =<< trim END + vim9script + + class HTML + static author: string = 'John Doe' + + static def MacroSubstitute(s: string): string + return substitute(s, '{{author}}', author, 'gi') + enddef + endclass + + assert_equal('some text', HTML.MacroSubstitute('some text')) + assert_equal('some text', HTML.MacroSubstitute('some text')) + END + v9.CheckScriptSuccess(lines) + # access private member in lambda lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1662, +/**/ 1661, /**/ 1660, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -3967,8 +3967,8 @@ exec_instructions(ectx_T *ectx) if (GA_GROW_FAILS(&ectx->ec_stack, 1)) goto theend; classmember_T *cm = &iptr->isn_arg.classmember; - *STACK_TV_BOT(0) = - cm->cm_class->class_members_tv[cm->cm_idx]; + copy_tv(cm->cm_class->class_members_tv + cm->cm_idx, + STACK_TV_BOT(0)); ++ectx->ec_stack.ga_len; } break;