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);