Mercurial > vim
diff src/vim9execute.c @ 33109:2b5cc29b0a0e v9.0.1838
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Commit: https://github.com/vim/vim/commit/3775f777a6add2a8d5060b40414e9c53062c8cd9
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Fri Sep 1 22:05:45 2023 +0200
patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Problem: Vim9: Cannot modify class member vars from def function
Solution: Add support for modifying class member variables from a def
function
closes: #12995
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 01 Sep 2023 22:15:04 +0200 |
parents | 461541d860ac |
children | aecd03679315 |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2144,7 +2144,7 @@ execute_storeindex(isn_T *iptr, ectx_T * // Stack contains: // -3 value to be stored // -2 index - // -1 dict, list, blob or object + // -1 dict, list, blob, object or class tv = STACK_TV_BOT(-3); SOURCING_LNUM = iptr->isn_lnum; @@ -2306,14 +2306,25 @@ execute_storeindex(isn_T *iptr, ectx_T * } else if (dest_type == VAR_CLASS || dest_type == VAR_OBJECT) { - object_T *obj = tv_dest->vval.v_object; - typval_T *otv = (typval_T *)(obj + 1); - - class_T *itf = iptr->isn_arg.storeindex.si_class; - if (itf != NULL) - // convert interface member index to class member index - lidx = object_index_from_itf_index(itf, FALSE, - lidx, obj->obj_class); + typval_T *otv; + + if (dest_type == VAR_OBJECT) + { + object_T *obj = tv_dest->vval.v_object; + + otv = (typval_T *)(obj + 1); + class_T *itf = iptr->isn_arg.storeindex.si_class; + if (itf != NULL) + // convert interface member index to class member index + lidx = object_index_from_itf_index(itf, FALSE, + lidx, obj->obj_class); + } + else + { + // VAR_CLASS + class_T *class = tv_dest->vval.v_class; + otv = class->class_members_tv; + } clear_tv(&otv[lidx]); otv[lidx] = *tv;