comparison src/vim9.h @ 33393:016d8f863230 v9.0.1955

patch 9.0.1955: Vim9: lockvar issues with objects/classes Commit: https://github.com/vim/vim/commit/ee865f37acab6cac2cee6a171d60e1b365f852b0 Author: Ernie Rael <errael@raelity.com> Date: Fri Sep 29 19:53:55 2023 +0200 patch 9.0.1955: Vim9: lockvar issues with objects/classes Problem: Vim9: lockvar issues with objects/classes Solution: fix `get_lhs()` object/class access and avoid `SEGV`, make error messages more accurate. - `get_lval()` detects/returns object/class access - `compile_lock_unlock()` generate code for bare static and obj_arg access - `do_lock_var()` check lval for `ll_object`/`ll_class` and fail if so. Details: - Add `ll_object`/`ll_class`/`ll_oi` to `lval_T`. - Add `lockunlock_T` to `isn_T` for `is_arg` to specify handling of `lval_root` in `get_lval()`. - In `get_lval()`, fill in `ll_object`/`ll_class`/`ll_oi` as needed; when no `[idx] or .key`, check lval_root on the way out. - In `do_lock_var()` check for `ll_object`/`ll_class`; also bullet proof ll_dict case and give `Dictionay required` if problem. (not needed to avoid lockvar crash anymore) - In `compile_lock_unlock()` compile for the class variable and func arg cases. closes: #13174 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Ernie Rael <errael@raelity.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 29 Sep 2023 20:00:07 +0200
parents 577ef266309d
children 4a62e78803db
comparison
equal deleted inserted replaced
33392:3d3d0492824e 33393:016d8f863230
497 // arguments to ISN_STORE_CLASSMEMBER, ISN_LOAD_CLASSMEMBER, ISN_GET_ITF_MEMBER 497 // arguments to ISN_STORE_CLASSMEMBER, ISN_LOAD_CLASSMEMBER, ISN_GET_ITF_MEMBER
498 typedef struct { 498 typedef struct {
499 class_T *cm_class; 499 class_T *cm_class;
500 int cm_idx; 500 int cm_idx;
501 } classmember_T; 501 } classmember_T;
502
502 // arguments to ISN_STOREINDEX 503 // arguments to ISN_STOREINDEX
503 typedef struct { 504 typedef struct {
504 vartype_T si_vartype; 505 vartype_T si_vartype;
505 class_T *si_class; 506 class_T *si_class;
506 } storeindex_T; 507 } storeindex_T;
508
509 // arguments to ISN_LOCKUNLOCK
510 typedef struct {
511 char_u *string; // for exec_command
512 int is_arg; // is lval_root a function arg
513 } lockunlock_T;
507 514
508 /* 515 /*
509 * Instruction 516 * Instruction
510 */ 517 */
511 struct isn_S { 518 struct isn_S {
559 deferins_T defer; 566 deferins_T defer;
560 echowin_T echowin; 567 echowin_T echowin;
561 construct_T construct; 568 construct_T construct;
562 classmember_T classmember; 569 classmember_T classmember;
563 storeindex_T storeindex; 570 storeindex_T storeindex;
571 lockunlock_T lockunlock;
564 } isn_arg; 572 } isn_arg;
565 }; 573 };
566 574
567 /* 575 /*
568 * Info about a function defined with :def. Used in "def_functions". 576 * Info about a function defined with :def. Used in "def_functions".