Mercurial > vim
comparison src/vim9class.c @ 33088:667a17904f64 v9.0.1829
patch 9.0.1829: Vim9 missing access-checks for private vars
Commit: https://github.com/vim/vim/commit/eb91e24d5eca99ad902924911e78f292e9ca0971
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Thu Aug 31 18:10:46 2023 +0200
patch 9.0.1829: Vim9 missing access-checks for private vars
Problem: Vim9 missing access-checks for private vars
Solution: Use the proper check for private/readonly variable. Access
level for a member cannot be changed in a class implementing an
interface. Update the code indentation
closes: #12978
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Co-authored-by: Ernie Rael <errael@raelity.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 31 Aug 2023 18:15:10 +0200 |
parents | 8362975375a4 |
children | d994ba4bd9ca |
comparison
equal
deleted
inserted
replaced
33087:fd188704bc4c | 33088:667a17904f64 |
---|---|
28 * "init_expr" is set to the initialisation expression (allocated), if there is | 28 * "init_expr" is set to the initialisation expression (allocated), if there is |
29 * one. For an interface "init_expr" is NULL. | 29 * one. For an interface "init_expr" is NULL. |
30 */ | 30 */ |
31 static int | 31 static int |
32 parse_member( | 32 parse_member( |
33 exarg_T *eap, | 33 exarg_T *eap, |
34 char_u *line, | 34 char_u *line, |
35 char_u *varname, | 35 char_u *varname, |
36 int has_public, // TRUE if "public" seen before "varname" | 36 int has_public, // TRUE if "public" seen before "varname" |
37 char_u **varname_end, | 37 char_u **varname_end, |
38 garray_T *type_list, | 38 garray_T *type_list, |
39 type_T **type_ret, | 39 type_T **type_ret, |
40 char_u **init_expr) | 40 char_u **init_expr) |
41 { | 41 { |
42 *varname_end = to_name_end(varname, FALSE); | 42 *varname_end = to_name_end(varname, FALSE); |
43 if (*varname == '_' && has_public) | 43 if (*varname == '_' && has_public) |
44 { | 44 { |
45 semsg(_(e_public_member_name_cannot_start_with_underscore_str), line); | 45 semsg(_(e_public_member_name_cannot_start_with_underscore_str), line); |
117 * Returns OK when successful, "init_expr" will be consumed then. | 117 * Returns OK when successful, "init_expr" will be consumed then. |
118 * Returns FAIL otherwise, caller might need to free "init_expr". | 118 * Returns FAIL otherwise, caller might need to free "init_expr". |
119 */ | 119 */ |
120 static int | 120 static int |
121 add_member( | 121 add_member( |
122 garray_T *gap, | 122 garray_T *gap, |
123 char_u *varname, | 123 char_u *varname, |
124 char_u *varname_end, | 124 char_u *varname_end, |
125 int has_public, | 125 int has_public, |
126 type_T *type, | 126 type_T *type, |
127 char_u *init_expr) | 127 char_u *init_expr) |
128 { | 128 { |
129 if (ga_grow(gap, 1) == FAIL) | 129 if (ga_grow(gap, 1) == FAIL) |
130 return FAIL; | 130 return FAIL; |
131 ocmember_T *m = ((ocmember_T *)gap->ga_data) + gap->ga_len; | 131 ocmember_T *m = ((ocmember_T *)gap->ga_data) + gap->ga_len; |
132 m->ocm_name = vim_strnsave(varname, varname_end - varname); | 132 m->ocm_name = vim_strnsave(varname, varname_end - varname); |
355 where.wt_kind = WT_MEMBER; | 355 where.wt_kind = WT_MEMBER; |
356 if (check_type(if_ms[if_i].ocm_type, m->ocm_type, TRUE, | 356 if (check_type(if_ms[if_i].ocm_type, m->ocm_type, TRUE, |
357 where) == FAIL) | 357 where) == FAIL) |
358 return FALSE; | 358 return FALSE; |
359 | 359 |
360 if (if_ms[if_i].ocm_access != m->ocm_access) | |
361 { | |
362 semsg(_(e_member_str_of_interface_str_has_different_access), | |
363 if_ms[if_i].ocm_name, intf_class_name); | |
364 return FALSE; | |
365 } | |
366 | |
360 break; | 367 break; |
361 } | 368 } |
362 if (cl_i == cl_count) | 369 if (cl_i == cl_count) |
363 { | 370 { |
364 semsg(_(e_member_str_of_interface_str_not_implemented), | 371 semsg(_(e_member_str_of_interface_str_not_implemented), |
620 * This is also used for updating the lookup table for the extended class | 627 * This is also used for updating the lookup table for the extended class |
621 * hierarchy. | 628 * hierarchy. |
622 */ | 629 */ |
623 static int | 630 static int |
624 update_member_method_lookup_table( | 631 update_member_method_lookup_table( |
625 class_T *ifcl, | 632 class_T *ifcl, |
626 class_T *cl, | 633 class_T *cl, |
627 garray_T *objmethods, | 634 garray_T *objmethods, |
628 int pobj_method_offset, | 635 int pobj_method_offset, |
629 int is_interface) | 636 int is_interface) |
630 { | 637 { |
631 if (ifcl == NULL) | 638 if (ifcl == NULL) |
632 return OK; | 639 return OK; |
633 | 640 |
634 // Table for members. | 641 // Table for members. |
1548 * return its type. | 1555 * return its type. |
1549 * When not found "member_idx" is set to -1 and t_any is returned. | 1556 * When not found "member_idx" is set to -1 and t_any is returned. |
1550 */ | 1557 */ |
1551 type_T * | 1558 type_T * |
1552 class_member_type( | 1559 class_member_type( |
1553 class_T *cl, | 1560 class_T *cl, |
1554 char_u *name, | 1561 char_u *name, |
1555 char_u *name_end, | 1562 char_u *name_end, |
1556 int *member_idx) | 1563 int *member_idx, |
1564 omacc_T *access) | |
1557 { | 1565 { |
1558 *member_idx = -1; // not found (yet) | 1566 *member_idx = -1; // not found (yet) |
1559 size_t len = name_end - name; | 1567 size_t len = name_end - name; |
1560 | 1568 |
1561 for (int i = 0; i < cl->class_obj_member_count; ++i) | 1569 for (int i = 0; i < cl->class_obj_member_count; ++i) |
1562 { | 1570 { |
1563 ocmember_T *m = cl->class_obj_members + i; | 1571 ocmember_T *m = cl->class_obj_members + i; |
1564 if (STRNCMP(m->ocm_name, name, len) == 0 && m->ocm_name[len] == NUL) | 1572 if (STRNCMP(m->ocm_name, name, len) == 0 && m->ocm_name[len] == NUL) |
1565 { | 1573 { |
1566 *member_idx = i; | 1574 *member_idx = i; |
1575 *access = m->ocm_access; | |
1567 return m->ocm_type; | 1576 return m->ocm_type; |
1568 } | 1577 } |
1569 } | 1578 } |
1570 | 1579 |
1571 semsg(_(e_unknown_variable_str), name); | 1580 semsg(_(e_unknown_variable_str), name); |