Mercurial > vim
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". |