patch 9.1.0252: Vim9: segfault with static in super class Commit: https://github.com/vim/vim/commit/2ed5a11b1a84c86b5392110a81302ae038b5c554 Author: Yegappan Lakshmanan <yegap...@yahoo.com> Date: Mon Apr 1 14:50:41 2024 +0200
patch 9.1.0252: Vim9: segfault with static in super class Problem: Vim9: segfault with static in super class (Ernie Rael) Solution: When initializing lhs, use the correct class where a class variable is defined (Yegappan Lakshmanan) fixes: #14352 closes: #14372 Signed-off-by: Yegappan Lakshmanan <yegap...@yahoo.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index f0c6f0cd0..0bc363930 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -10463,4 +10463,32 @@ def Test_current_class_object_class_member() v9.CheckScriptSuccess(lines) enddef +" Test for updating a base class variable from a base class method without the +" class name. This used to crash Vim (Github issue #14352). +def Test_use_base_class_variable_from_base_class_method() + var lines =<< trim END + vim9script + + class DictKeyClass + static var _obj_id_count = 1 + def _GenerateKey() + _obj_id_count += 1 + enddef + static def GetIdCount(): number + return _obj_id_count + enddef + endclass + + class C extends DictKeyClass + def F() + this._GenerateKey() + enddef + endclass + + C.new().F() + assert_equal(2, DictKeyClass.GetIdCount()) + END + v9.CheckScriptSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index ee7c3ec86..e927c0b01 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 252, /**/ 251, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 0a2b0689d..c6b02478c 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1790,10 +1790,11 @@ compile_lhs( return FAIL; lhs->lhs_dest = dest_class_member; - lhs->lhs_class = cctx->ctx_ufunc->uf_class; - lhs->lhs_type = - oc_member_type_by_idx(cctx->ctx_ufunc->uf_class, - FALSE, lhs->lhs_classmember_idx); + // The class variable is defined either in the current class or + // in one of the parent class in the hierarchy. + lhs->lhs_class = defcl; + lhs->lhs_type = oc_member_type_by_idx(defcl, FALSE, + lhs->lhs_classmember_idx); } else { -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1rrHGj-001vBF-5G%40256bit.org.