annotate src/vim9class.c @ 33471:baa62f464436 v9.0.1988

patch 9.0.1988: Vim9: potential use-after-free for class members Commit: https://github.com/vim/vim/commit/d2f4800099733216e28d59e1a5710f624b0d9ec1 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Thu Oct 5 20:24:18 2023 +0200 patch 9.0.1988: Vim9: potential use-after-free for class members Problem: Vim9: potential use-after-free for class members Solution: Use the class-related grow array for storing the member type instead of using a temporary type list grow array Use the type list grow array associated with the class than using a temporary type list grow array to allocate the class member type. For simple types, a predefined type is used. For complex types, the type is dynamically allocated from a grow array. For class variables, the type grow array in the class should be used. So that the lifetime of the type is same as the lifetime of the class. closes: #13279 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author Christian Brabandt <cb@256bit.org>
date Thu, 05 Oct 2023 20:30:11 +0200
parents 4a62e78803db
children 156d07bea2ac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
4 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
7 * See README.txt for an overview of the Vim source code.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
8 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
9
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
10 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
11 * vim9class.c: Vim9 script class support
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
12 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
13
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
14 #define USING_FLOAT_STUFF
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
15 #include "vim.h"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
16
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
17 #if defined(FEAT_EVAL) || defined(PROTO)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
18
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
19 // When not generating protos this is included in proto.h
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
20 #ifdef PROTO
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
21 # include "vim9.h"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
22 #endif
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
23
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
24 static class_T *first_class = NULL;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
25 static class_T *next_nonref_class = NULL;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
26
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
27 /*
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
28 * Call this function when a class has been created. It will be added to the
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
29 * list headed by "first_class".
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
30 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
31 static void
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
32 class_created(class_T *cl)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
33 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
34 if (first_class != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
35 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
36 cl->class_next_used = first_class;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
37 first_class->class_prev_used = cl;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
38 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
39 first_class = cl;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
40 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
41
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
42 /*
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
43 * Call this function when a class has been cleared and is about to be freed.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
44 * It is removed from the list headed by "first_class".
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
45 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
46 static void
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
47 class_cleared(class_T *cl)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
48 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
49 if (cl->class_next_used != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
50 cl->class_next_used->class_prev_used = cl->class_prev_used;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
51 if (cl->class_prev_used != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
52 cl->class_prev_used->class_next_used = cl->class_next_used;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
53 else if (first_class == cl)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
54 first_class = cl->class_next_used;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
55
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
56 // update the next class to check if needed
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
57 if (cl == next_nonref_class)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
58 next_nonref_class = cl->class_next_used;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
59 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
60
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
61 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
62 * Parse a member declaration, both object and class member.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
63 * Returns OK or FAIL. When OK then "varname_end" is set to just after the
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
64 * variable name and "type_ret" is set to the declared or detected type.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
65 * "init_expr" is set to the initialisation expression (allocated), if there is
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
66 * one. For an interface "init_expr" is NULL.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
67 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
68 static int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
69 parse_member(
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
70 exarg_T *eap,
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
71 char_u *line,
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
72 char_u *varname,
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
73 int has_public, // TRUE if "public" seen before "varname"
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
74 char_u **varname_end,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
75 int *has_type,
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
76 garray_T *type_list,
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
77 type_T **type_ret,
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
78 char_u **init_expr)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
79 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
80 *varname_end = to_name_end(varname, FALSE);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
81 if (*varname == '_' && has_public)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
82 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
83 semsg(_(e_public_variable_name_cannot_start_with_underscore_str), line);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
84 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
85 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
86
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
87 char_u *colon = skipwhite(*varname_end);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
88 char_u *type_arg = colon;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
89 type_T *type = NULL;
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
90 *has_type = FALSE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
91 if (*colon == ':')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
92 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
93 if (VIM_ISWHITE(**varname_end))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
94 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
95 semsg(_(e_no_white_space_allowed_before_colon_str), varname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
96 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
97 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
98 if (!VIM_ISWHITE(colon[1]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
99 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
100 semsg(_(e_white_space_required_after_str_str), ":", varname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
101 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
102 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
103 type_arg = skipwhite(colon + 1);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
104 type = parse_type(&type_arg, type_list, TRUE);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
105 if (type == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
106 return FAIL;
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
107 *has_type = TRUE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
108 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
109
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
110 char_u *init_arg = skipwhite(type_arg);
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
111 if (type == NULL && *init_arg != '=')
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
112 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
113 emsg(_(e_type_or_initialization_required));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
114 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
115 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
116
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
117 if (init_expr == NULL && *init_arg == '=')
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
118 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
119 emsg(_(e_cannot_initialize_variable_in_interface));
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
120 return FAIL;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
121 }
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
122
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
123 if (*init_arg == '=')
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
124 {
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
125 evalarg_T evalarg;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
126 char_u *expr_start, *expr_end;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
127
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
128 if (!VIM_ISWHITE(init_arg[-1]) || !VIM_ISWHITE(init_arg[1]))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
129 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
130 semsg(_(e_white_space_required_before_and_after_str_at_str),
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
131 "=", type_arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
132 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
133 }
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
134 init_arg = skipwhite(init_arg + 1);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
135
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
136 fill_evalarg_from_eap(&evalarg, eap, FALSE);
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
137 (void)skip_expr_concatenate(&init_arg, &expr_start, &expr_end, &evalarg);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
138
33006
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
139 // No type specified for the member. Set it to "any" and the correct
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
140 // type will be set when the object is instantiated.
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
141 if (type == NULL)
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
142 type = &t_any;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
143
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
144 *init_expr = vim_strnsave(expr_start, expr_end - expr_start);
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
145 // Free the memory pointed by expr_start.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
146 clear_evalarg(&evalarg, NULL);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
147 }
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
148 else if (!valid_declaration_type(type))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
149 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
150
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
151 *type_ret = type;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
152 return OK;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
153 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
154
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
155 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
156 * Add a member to an object or a class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
157 * Returns OK when successful, "init_expr" will be consumed then.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
158 * Returns FAIL otherwise, caller might need to free "init_expr".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
159 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
160 static int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
161 add_member(
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
162 garray_T *gap,
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
163 char_u *varname,
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
164 char_u *varname_end,
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
165 int has_public,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
166 int has_type,
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
167 type_T *type,
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
168 char_u *init_expr)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
169 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
170 if (ga_grow(gap, 1) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
171 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
172 ocmember_T *m = ((ocmember_T *)gap->ga_data) + gap->ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
173 m->ocm_name = vim_strnsave(varname, varname_end - varname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
174 m->ocm_access = has_public ? VIM_ACCESS_ALL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
175 : *varname == '_' ? VIM_ACCESS_PRIVATE : VIM_ACCESS_READ;
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
176 m->ocm_has_type = has_type;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
177 m->ocm_type = type;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
178 if (init_expr != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
179 m->ocm_init = init_expr;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
180 ++gap->ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
181 return OK;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
182 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
183
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
184 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
185 * Move the class or object members found while parsing a class into the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
186 * "gap" contains the found members.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
187 * "parent_members" points to the members in the parent class (if any)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
188 * "parent_count" is the number of members in the parent class
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
189 * "members" will be set to the newly allocated array of members and
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
190 * "member_count" set to the number of members.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
191 * Returns OK or FAIL.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
192 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
193 static int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
194 add_members_to_class(
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
195 garray_T *gap,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
196 ocmember_T *parent_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
197 int parent_count,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
198 ocmember_T **members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
199 int *member_count)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
200 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
201 *member_count = parent_count + gap->ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
202 *members = *member_count == 0 ? NULL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
203 : ALLOC_MULT(ocmember_T, *member_count);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
204 if (*member_count > 0 && *members == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
205 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
206 for (int i = 0; i < parent_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
207 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
208 // parent members need to be copied
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
209 ocmember_T *m = *members + i;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
210 *m = parent_members[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
211 m->ocm_name = vim_strsave(m->ocm_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
212 if (m->ocm_init != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
213 m->ocm_init = vim_strsave(m->ocm_init);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
214 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
215 if (gap->ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
216 // new members are moved
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
217 mch_memmove(*members + parent_count,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
218 gap->ga_data, sizeof(ocmember_T) * gap->ga_len);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
219 VIM_CLEAR(gap->ga_data);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
220 return OK;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
221 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
222
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
223 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
224 * Convert a member index "idx" of interface "itf" to the member index of class
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
225 * "cl" implementing that interface.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
226 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
227 int
33387
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
228 object_index_from_itf_index(class_T *itf, int is_method, int idx, class_T *cl)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
229 {
33173
9efd99a717c1 patch 9.0.1867: Vim9: access to interface statics possible
Christian Brabandt <cb@256bit.org>
parents: 33160
diff changeset
230 if (idx >= (is_method ? itf->class_obj_method_count
33387
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
231 : itf->class_obj_member_count))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
232 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
233 siemsg("index %d out of range for interface %s", idx, itf->class_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
234 return 0;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
235 }
32772
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
236
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
237 // If "cl" is the interface or the class that is extended, then the method
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
238 // index can be used directly and there is no need to search for the method
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
239 // index in one of the child classes.
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
240 if (cl == itf)
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
241 return idx;
0dc750a24875 patch 9.0.1703: Vim9 Calling a method in an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32764
diff changeset
242
33211
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
243 itf2class_T *i2c = NULL;
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
244 int searching = TRUE;
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
245 int method_offset = 0;
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
246
33204
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
247 for (class_T *super = cl; super != NULL && searching;
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
248 super = super->class_extends)
33211
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
249 {
33204
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
250 for (i2c = itf->class_itf2class; i2c != NULL; i2c = i2c->i2c_next)
33211
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
251 {
33204
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
252 if (i2c->i2c_class == super && i2c->i2c_is_method == is_method)
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
253 {
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
254 searching = FALSE;
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
255 break;
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
256 }
33211
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
257 }
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
258 if (searching && is_method)
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
259 // The parent class methods are stored after the current class
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
260 // methods.
33387
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
261 method_offset += super->class_obj_method_count_child;
33211
71a097aab64d patch 9.0.1883: Vim9: Calling an interface method using a child object fails
Christian Brabandt <cb@256bit.org>
parents: 33204
diff changeset
262 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
263 if (i2c == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
264 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
265 siemsg("class %s not found on interface %s",
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
266 cl->class_name, itf->class_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
267 return 0;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
268 }
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
269
33387
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
270 // A table follows the i2c for the class
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
271 int *table = (int *)(i2c + 1);
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
272 // "method_offset" is 0, if method is in the current class. If method
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
273 // is in a parent class, then it is non-zero.
577ef266309d patch 9.0.1952: Vim9: unused static field
Christian Brabandt <cb@256bit.org>
parents: 33385
diff changeset
274 return table[idx] + method_offset;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
275 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
276
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
277 /*
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
278 * Check whether a class named "extends_name" is present. If the class is
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
279 * valid, then "extends_clp" is set with the class pointer.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
280 * Returns TRUE if the class name "extends_names" is a valid class.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
281 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
282 static int
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
283 validate_extends_class(
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
284 char_u *extends_name,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
285 class_T **extends_clp,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
286 int is_class)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
287 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
288 typval_T tv;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
289 int success = FALSE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
290
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
291 tv.v_type = VAR_UNKNOWN;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
292 if (eval_variable_import(extends_name, &tv) == FAIL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
293 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
294 semsg(_(e_class_name_not_found_str), extends_name);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
295 return success;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
296 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
297
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
298 if (tv.v_type != VAR_CLASS || tv.vval.v_class == NULL
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
299 || (is_class
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
300 && (tv.vval.v_class->class_flags & CLASS_INTERFACE) != 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
301 || (!is_class
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
302 && (tv.vval.v_class->class_flags & CLASS_INTERFACE) == 0))
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
303 // a interface cannot extend a class and a class cannot extend an
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
304 // interface.
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
305 semsg(_(e_cannot_extend_str), extends_name);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
306 else
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
307 {
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
308 class_T *extends_cl = tv.vval.v_class;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
309 ++extends_cl->class_refcount;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
310 *extends_clp = extends_cl;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
311 success = TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
312 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
313 clear_tv(&tv);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
314
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
315 return success;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
316 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
317
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
318 /*
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
319 * Check method names in the parent class lineage to make sure the access is
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
320 * the same for overridden methods.
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
321 */
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
322 static int
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
323 validate_extends_methods(
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
324 garray_T *objmethods_gap,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
325 class_T *extends_cl)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
326 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
327 class_T *super = extends_cl;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
328 int method_count = objmethods_gap->ga_len;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
329 ufunc_T **cl_fp = (ufunc_T **)(objmethods_gap->ga_data);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
330
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
331 while (super != NULL)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
332 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
333 int extends_method_count = super->class_obj_method_count_child;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
334 if (extends_method_count == 0)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
335 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
336 super = super->class_extends;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
337 continue;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
338 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
339
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
340 ufunc_T **extends_methods = super->class_obj_methods;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
341
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
342 for (int i = 0; i < extends_method_count; i++)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
343 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
344 char_u *pstr = extends_methods[i]->uf_name;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
345 int extends_private = (*pstr == '_');
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
346 if (extends_private)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
347 pstr++;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
348
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
349 // When comparing the method names, ignore the access type (public
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
350 // and private methods are considered the same).
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
351 for (int j = 0; j < method_count; j++)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
352 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
353 char_u *qstr = cl_fp[j]->uf_name;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
354 int priv_method = (*qstr == '_');
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
355 if (priv_method)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
356 qstr++;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
357 if (STRCMP(pstr, qstr) == 0 && priv_method != extends_private)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
358 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
359 // Method access is different between the super class and
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
360 // the subclass
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
361 semsg(_(e_method_str_of_class_str_has_different_access),
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
362 cl_fp[j]->uf_name, super->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
363 return FALSE;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
364 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
365 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
366 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
367 super = super->class_extends;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
368 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
369
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
370 return TRUE;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
371 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
372
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
373 /*
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
374 * Check whether a object member variable in "objmembers_gap" is a duplicate of
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
375 * a member in any of the extended parent class lineage. Returns TRUE if there
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
376 * are no duplicates.
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
377 */
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
378 static int
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
379 extends_check_dup_members(
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
380 garray_T *objmembers_gap,
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
381 class_T *extends_cl)
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
382 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
383 int member_count = objmembers_gap->ga_len;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
384 if (member_count == 0)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
385 return TRUE;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
386
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
387 ocmember_T *members = (ocmember_T *)(objmembers_gap->ga_data);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
388
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
389 // Validate each member variable
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
390 for (int c_i = 0; c_i < member_count; c_i++)
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
391 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
392 class_T *p_cl = extends_cl;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
393 ocmember_T *c_m = members + c_i;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
394 char_u *pstr = (*c_m->ocm_name == '_')
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
395 ? c_m->ocm_name + 1 : c_m->ocm_name;
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
396
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
397 // Check in all the parent classes in the lineage
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
398 while (p_cl != NULL)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
399 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
400 int p_member_count = p_cl->class_obj_member_count;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
401 if (p_member_count == 0)
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
402 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
403 p_cl = p_cl->class_extends;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
404 continue;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
405 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
406 ocmember_T *p_members = p_cl->class_obj_members;
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
407
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
408 // Compare against all the members in the parent class
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
409 for (int p_i = 0; p_i < p_member_count; p_i++)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
410 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
411 ocmember_T *p_m = p_members + p_i;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
412 char_u *qstr = (*p_m->ocm_name == '_')
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
413 ? p_m->ocm_name + 1 : p_m->ocm_name;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
414 if (STRCMP(pstr, qstr) == 0)
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
415 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
416 semsg(_(e_duplicate_variable_str), c_m->ocm_name);
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
417 return FALSE;
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
418 }
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
419 }
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
420
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
421 p_cl = p_cl->class_extends;
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
422 }
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
423 }
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
424
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
425 return TRUE;
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
426 }
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
427
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
428 /*
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
429 * Compare the variable type of interface variables in "objmembers_gap" against
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
430 * the variable in any of the extended super interface lineage. Used to
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
431 * compare the variable types when extending interfaces. Returns TRUE if the
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
432 * variable types are the same.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
433 */
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
434 static int
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
435 extends_check_intf_var_type(
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
436 garray_T *objmembers_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
437 class_T *extends_cl)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
438 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
439 int member_count = objmembers_gap->ga_len;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
440 if (member_count == 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
441 return TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
442
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
443 ocmember_T *members = (ocmember_T *)(objmembers_gap->ga_data);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
444
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
445 // Validate each member variable
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
446 for (int c_i = 0; c_i < member_count; c_i++)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
447 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
448 class_T *p_cl = extends_cl;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
449 ocmember_T *c_m = members + c_i;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
450 int var_found = FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
451
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
452 // Check in all the parent classes in the lineage
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
453 while (p_cl != NULL && !var_found)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
454 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
455 int p_member_count = p_cl->class_obj_member_count;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
456 if (p_member_count == 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
457 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
458 p_cl = p_cl->class_extends;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
459 continue;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
460 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
461 ocmember_T *p_members = p_cl->class_obj_members;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
462
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
463 // Compare against all the members in the parent class
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
464 for (int p_i = 0; p_i < p_member_count; p_i++)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
465 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
466 where_T where = WHERE_INIT;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
467 ocmember_T *p_m = p_members + p_i;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
468
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
469 if (STRCMP(p_m->ocm_name, c_m->ocm_name) != 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
470 continue;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
471
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
472 // Ensure the type is matching.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
473 where.wt_func_name = (char *)c_m->ocm_name;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
474 where.wt_kind = WT_MEMBER;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
475
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
476 if (check_type(p_m->ocm_type, c_m->ocm_type, TRUE,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
477 where) == FAIL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
478 return FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
479
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
480 var_found = TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
481 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
482
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
483 p_cl = p_cl->class_extends;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
484 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
485 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
486
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
487 return TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
488 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
489
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
490 /*
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
491 * When extending an abstract class, check whether all the abstract methods in
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
492 * the parent class are implemented. Returns TRUE if all the methods are
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
493 * implemented.
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
494 */
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
495 static int
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
496 validate_abstract_class_methods(
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
497 garray_T *classmethods_gap,
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
498 garray_T *objmethods_gap,
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
499 class_T *extends_cl)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
500 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
501 for (int loop = 1; loop <= 2; ++loop)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
502 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
503 // loop == 1: check class methods
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
504 // loop == 2: check object methods
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
505 int extends_method_count = loop == 1
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
506 ? extends_cl->class_class_function_count
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
507 : extends_cl->class_obj_method_count;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
508 if (extends_method_count == 0)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
509 continue;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
510
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
511 ufunc_T **extends_methods = loop == 1
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
512 ? extends_cl->class_class_functions
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
513 : extends_cl->class_obj_methods;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
514
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
515 int method_count = loop == 1 ? classmethods_gap->ga_len
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
516 : objmethods_gap->ga_len;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
517 ufunc_T **cl_fp = (ufunc_T **)(loop == 1
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
518 ? classmethods_gap->ga_data
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
519 : objmethods_gap->ga_data);
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
520
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
521 for (int i = 0; i < extends_method_count; i++)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
522 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
523 ufunc_T *uf = extends_methods[i];
33297
6340c608ca54 patch 9.0.1914: Vim9: few issues when accessing object members
Christian Brabandt <cb@256bit.org>
parents: 33291
diff changeset
524 if (!IS_ABSTRACT_METHOD(uf))
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
525 continue;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
526
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
527 int method_found = FALSE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
528
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
529 for (int j = 0; j < method_count; j++)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
530 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
531 if (STRCMP(uf->uf_name, cl_fp[j]->uf_name) == 0)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
532 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
533 method_found = TRUE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
534 break;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
535 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
536 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
537
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
538 if (!method_found)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
539 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
540 semsg(_(e_abstract_method_str_not_found), uf->uf_name);
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
541 return FALSE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
542 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
543 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
544 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
545
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
546 return TRUE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
547 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
548
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
549 /*
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
550 * Returns TRUE if the interface variable "if_var" is present in the list of
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
551 * variables in "cl_mt" or in the parent lineage of one of the extended classes
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
552 * in "extends_cl". For a class variable, 'is_class_var' is TRUE.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
553 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
554 static int
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
555 intf_variable_present(
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
556 char_u *intf_class_name,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
557 ocmember_T *if_var,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
558 int is_class_var,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
559 ocmember_T *cl_mt,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
560 int cl_member_count,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
561 class_T *extends_cl)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
562 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
563 int variable_present = FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
564
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
565 for (int cl_i = 0; cl_i < cl_member_count; ++cl_i)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
566 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
567 ocmember_T *m = &cl_mt[cl_i];
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
568 where_T where = WHERE_INIT;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
569
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
570 if (STRCMP(if_var->ocm_name, m->ocm_name) != 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
571 continue;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
572
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
573 // Ensure the access type is same
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
574 if (if_var->ocm_access != m->ocm_access)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
575 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
576 semsg(_(e_variable_str_of_interface_str_has_different_access),
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
577 if_var->ocm_name, intf_class_name);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
578 return FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
579 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
580
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
581 // Ensure the type is matching.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
582 if (m->ocm_type == &t_any)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
583 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
584 // variable type is not specified. Use the variable type in the
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
585 // interface.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
586 m->ocm_type = if_var->ocm_type;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
587 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
588 else
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
589 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
590 where.wt_func_name = (char *)m->ocm_name;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
591 where.wt_kind = WT_MEMBER;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
592 if (check_type(if_var->ocm_type, m->ocm_type, TRUE,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
593 where) == FAIL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
594 return FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
595 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
596
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
597 variable_present = TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
598 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
599 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
600
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
601 if (!variable_present && extends_cl != NULL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
602 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
603 int ext_cl_count = is_class_var
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
604 ? extends_cl->class_class_member_count
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
605 : extends_cl->class_obj_member_count;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
606 ocmember_T *ext_cl_mt = is_class_var
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
607 ? extends_cl->class_class_members
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
608 : extends_cl->class_obj_members;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
609 return intf_variable_present(intf_class_name, if_var,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
610 is_class_var, ext_cl_mt,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
611 ext_cl_count,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
612 extends_cl->class_extends);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
613 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
614
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
615 return variable_present;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
616 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
617
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
618 /*
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
619 * Check the variables of the interface class "ifcl" match the class variables
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
620 * ("classmembers_gap") and object variables ("objmembers_gap") of a class.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
621 * Returns TRUE if the class and object variables names are valid.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
622 */
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
623 static int
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
624 validate_interface_variables(
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
625 char_u *intf_class_name,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
626 class_T *ifcl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
627 garray_T *classmembers_gap,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
628 garray_T *objmembers_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
629 class_T *extends_cl)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
630 {
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
631 for (int loop = 1; loop <= 2; ++loop)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
632 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
633 // loop == 1: check class variables
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
634 // loop == 2: check object variables
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
635 int is_class_var = (loop == 1);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
636 int if_count = is_class_var ? ifcl->class_class_member_count
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
637 : ifcl->class_obj_member_count;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
638 if (if_count == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
639 continue;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
640 ocmember_T *if_ms = is_class_var ? ifcl->class_class_members
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
641 : ifcl->class_obj_members;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
642 ocmember_T *cl_ms = (ocmember_T *)(is_class_var
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
643 ? classmembers_gap->ga_data
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
644 : objmembers_gap->ga_data);
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
645 int cl_count = is_class_var ? classmembers_gap->ga_len
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
646 : objmembers_gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
647 for (int if_i = 0; if_i < if_count; ++if_i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
648 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
649 if (!intf_variable_present(intf_class_name, &if_ms[if_i],
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
650 is_class_var, cl_ms, cl_count, extends_cl))
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
651 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
652 semsg(_(e_variable_str_of_interface_str_not_implemented),
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
653 if_ms[if_i].ocm_name, intf_class_name);
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
654 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
655 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
656 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
657 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
658
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
659 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
660 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
661
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
662 /*
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
663 * Returns TRUE if the method signature of "if_method" and "cl_method" matches.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
664 */
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
665 static int
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
666 intf_method_type_matches(ufunc_T *if_method, ufunc_T *cl_method)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
667 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
668 where_T where = WHERE_INIT;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
669
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
670 // Ensure the type is matching.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
671 where.wt_func_name = (char *)if_method->uf_name;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
672 where.wt_kind = WT_METHOD;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
673 if (check_type(if_method->uf_func_type, cl_method->uf_func_type, TRUE,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
674 where) == FAIL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
675 return FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
676
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
677 return TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
678 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
679
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
680 /*
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
681 * Returns TRUE if the interface method "if_ufunc" is present in the list of
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
682 * methods in "cl_fp" or in the parent lineage of one of the extended classes
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
683 * in "extends_cl". For a class method, 'is_class_method' is TRUE.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
684 */
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
685 static int
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
686 intf_method_present(
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
687 ufunc_T *if_ufunc,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
688 int is_class_method,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
689 ufunc_T **cl_fp,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
690 int cl_count,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
691 class_T *extends_cl)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
692 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
693 int method_present = FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
694
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
695 for (int cl_i = 0; cl_i < cl_count; ++cl_i)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
696 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
697 char_u *cl_name = cl_fp[cl_i]->uf_name;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
698 if (STRCMP(if_ufunc->uf_name, cl_name) == 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
699 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
700 // Ensure the type is matching.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
701 if (!intf_method_type_matches(if_ufunc, cl_fp[cl_i]))
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
702 return FALSE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
703 method_present = TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
704 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
705 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
706 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
707
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
708 if (!method_present && extends_cl != NULL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
709 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
710 ufunc_T **ext_cl_fp = (ufunc_T **)(is_class_method
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
711 ? extends_cl->class_class_functions
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
712 : extends_cl->class_obj_methods);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
713 int ext_cl_count = is_class_method
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
714 ? extends_cl->class_class_function_count
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
715 : extends_cl->class_obj_method_count;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
716 return intf_method_present(if_ufunc, is_class_method, ext_cl_fp,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
717 ext_cl_count,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
718 extends_cl->class_extends);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
719 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
720
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
721 return method_present;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
722 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
723
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
724 /*
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
725 * Validate that a new class implements all the class/instance methods in the
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
726 * interface "ifcl". The new class methods are in "classfunctions_gap" and the
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
727 * new object methods are in "objmemthods_gap". Also validates the method
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
728 * types.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
729 * Returns TRUE if all the interface class/object methods are implemented in
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
730 * the new class.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
731 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
732 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
733 validate_interface_methods(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
734 char_u *intf_class_name,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
735 class_T *ifcl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
736 garray_T *classfunctions_gap,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
737 garray_T *objmethods_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
738 class_T *extends_cl)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
739 {
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
740 for (int loop = 1; loop <= 2; ++loop)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
741 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
742 // loop == 1: check class methods
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
743 // loop == 2: check object methods
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
744 int is_class_method = (loop == 1);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
745 int if_count = is_class_method ? ifcl->class_class_function_count
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
746 : ifcl->class_obj_method_count;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
747 if (if_count == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
748 continue;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
749 ufunc_T **if_fp = is_class_method ? ifcl->class_class_functions
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
750 : ifcl->class_obj_methods;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
751 ufunc_T **cl_fp = (ufunc_T **)(is_class_method
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
752 ? classfunctions_gap->ga_data
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
753 : objmethods_gap->ga_data);
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
754 int cl_count = is_class_method ? classfunctions_gap->ga_len
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
755 : objmethods_gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
756 for (int if_i = 0; if_i < if_count; ++if_i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
757 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
758 char_u *if_name = if_fp[if_i]->uf_name;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
759
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
760 if (!intf_method_present(if_fp[if_i], is_class_method, cl_fp,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
761 cl_count, extends_cl))
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
762 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
763 semsg(_(e_method_str_of_interface_str_not_implemented),
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
764 if_name, intf_class_name);
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
765 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
766 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
767 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
768 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
769
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
770 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
771 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
772
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
773 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
774 * Validate all the "implements" classes when creating a new class. The
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
775 * classes are returned in "intf_classes". The class functions, class members,
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
776 * object methods and object members in the new class are in
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
777 * "classfunctions_gap", "classmembers_gap", "objmethods_gap", and
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
778 * "objmembers_gap" respectively.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
779 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
780 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
781 validate_implements_classes(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
782 garray_T *impl_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
783 class_T **intf_classes,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
784 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
785 garray_T *classmembers_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
786 garray_T *objmethods_gap,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
787 garray_T *objmembers_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
788 class_T *extends_cl)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
789 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
790 int success = TRUE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
791
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
792 for (int i = 0; i < impl_gap->ga_len && success; ++i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
793 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
794 char_u *impl = ((char_u **)impl_gap->ga_data)[i];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
795 typval_T tv;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
796 tv.v_type = VAR_UNKNOWN;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
797 if (eval_variable_import(impl, &tv) == FAIL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
798 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
799 semsg(_(e_interface_name_not_found_str), impl);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
800 success = FALSE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
801 break;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
802 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
803
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
804 if (tv.v_type != VAR_CLASS
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
805 || tv.vval.v_class == NULL
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
806 || (tv.vval.v_class->class_flags & CLASS_INTERFACE) == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
807 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
808 semsg(_(e_not_valid_interface_str), impl);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
809 success = FALSE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
810 clear_tv(&tv);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
811 break;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
812 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
813
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
814 class_T *ifcl = tv.vval.v_class;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
815 intf_classes[i] = ifcl;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
816 ++ifcl->class_refcount;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
817
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
818 // check the variables of the interface match the members of the class
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
819 success = validate_interface_variables(impl, ifcl, classmembers_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
820 objmembers_gap, extends_cl);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
821
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
822 // check the functions/methods of the interface match the
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
823 // functions/methods of the class
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
824 if (success)
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
825 success = validate_interface_methods(impl, ifcl,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
826 classfunctions_gap, objmethods_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
827 extends_cl);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
828 clear_tv(&tv);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
829 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
830
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
831 return success;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
832 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
833
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
834 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
835 * Check no function argument name is used as a class member.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
836 * (Object members are always accessed with "this." prefix, so no need
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
837 * to check them.)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
838 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
839 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
840 check_func_arg_names(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
841 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
842 garray_T *objmethods_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
843 garray_T *classmembers_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
844 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
845 // loop 1: class functions, loop 2: object methods
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
846 for (int loop = 1; loop <= 2; ++loop)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
847 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
848 garray_T *gap = loop == 1 ? classfunctions_gap : objmethods_gap;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
849
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
850 for (int fi = 0; fi < gap->ga_len; ++fi)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
851 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
852 ufunc_T *uf = ((ufunc_T **)gap->ga_data)[fi];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
853
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
854 for (int i = 0; i < uf->uf_args.ga_len; ++i)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
855 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
856 char_u *aname = ((char_u **)uf->uf_args.ga_data)[i];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
857 garray_T *mgap = classmembers_gap;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
858
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
859 // Check all the class member names
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
860 for (int mi = 0; mi < mgap->ga_len; ++mi)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
861 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
862 char_u *mname =
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
863 ((ocmember_T *)mgap->ga_data + mi)->ocm_name;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
864 if (STRCMP(aname, mname) == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
865 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
866 if (uf->uf_script_ctx.sc_sid > 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
867 SOURCING_LNUM = uf->uf_script_ctx.sc_lnum;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
868
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
869 semsg(_(e_argument_already_declared_in_class_str),
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
870 aname);
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
871
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
872 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
873 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
874 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
875 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
876 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
877 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
878
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
879 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
880 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
881
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
882 /*
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
883 * Returns TRUE if 'varname' is a reserved keyword name
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
884 */
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
885 static int
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
886 is_reserved_varname(char_u *varname, char_u *varname_end)
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
887 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
888 int reserved = FALSE;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
889 char_u save_varname_end = *varname_end;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
890 *varname_end = NUL;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
891
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
892 reserved = check_reserved_name(varname, FALSE) == FAIL;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
893
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
894 *varname_end = save_varname_end;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
895
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
896 return reserved;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
897 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
898
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
899 /*
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
900 * Returns TRUE if the variable "varname" is already defined either as a class
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
901 * variable or as an object variable.
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
902 */
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
903 static int
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
904 is_duplicate_variable(
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
905 garray_T *class_members,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
906 garray_T *obj_members,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
907 char_u *varname,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
908 char_u *varname_end)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
909 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
910 char_u *name = vim_strnsave(varname, varname_end - varname);
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
911 char_u *pstr = (*name == '_') ? name + 1 : name;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
912 int dup = FALSE;
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
913
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
914 for (int loop = 1; loop <= 2; loop++)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
915 {
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
916 // loop == 1: class variables, loop == 2: object variables
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
917 garray_T *vgap = (loop == 1) ? class_members : obj_members;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
918 for (int i = 0; i < vgap->ga_len; ++i)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
919 {
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
920 ocmember_T *m = ((ocmember_T *)vgap->ga_data) + i;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
921 char_u *qstr = *m->ocm_name == '_' ? m->ocm_name + 1
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
922 : m->ocm_name;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
923 if (STRCMP(pstr, qstr) == 0)
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
924 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
925 semsg(_(e_duplicate_variable_str), name);
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
926 dup = TRUE;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
927 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
928 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
929 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
930 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
931
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
932 vim_free(name);
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
933 return dup;
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
934 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
935
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
936 /*
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
937 * Returns TRUE if the method "name" is already defined.
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
938 */
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
939 static int
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
940 is_duplicate_method(
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
941 garray_T *classmethods_gap,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
942 garray_T *objmethods_gap,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
943 char_u *name)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
944 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
945 char_u *pstr = (*name == '_') ? name + 1 : name;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
946
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
947 // loop 1: class methods, loop 2: object methods
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
948 for (int loop = 1; loop <= 2; loop++)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
949 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
950 garray_T *fgap = (loop == 1) ? classmethods_gap : objmethods_gap;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
951 for (int i = 0; i < fgap->ga_len; ++i)
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
952 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
953 char_u *n = ((ufunc_T **)fgap->ga_data)[i]->uf_name;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
954 char_u *qstr = *n == '_' ? n + 1 : n;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
955 if (STRCMP(pstr, qstr) == 0)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
956 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
957 semsg(_(e_duplicate_function_str), name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
958 return TRUE;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
959 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
960 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
961 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
962
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
963 return FALSE;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
964 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
965
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
966 /*
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
967 * Returns TRUE if the constructor is valid.
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
968 */
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
969 static int
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
970 is_valid_constructor(ufunc_T *uf, int is_abstract, int has_static)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
971 {
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
972 // Constructors are not allowed in abstract classes.
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
973 if (is_abstract)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
974 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
975 emsg(_(e_cannot_define_new_method_in_abstract_class));
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
976 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
977 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
978 // A constructor is always static, no need to define it so.
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
979 if (has_static)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
980 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
981 emsg(_(e_cannot_define_new_method_as_static));
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
982 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
983 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
984 // A return type should not be specified for the new()
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
985 // constructor method.
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
986 if (uf->uf_ret_type->tt_type != VAR_VOID)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
987 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
988 emsg(_(e_cannot_use_a_return_type_with_new_method));
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
989 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
990 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
991 return TRUE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
992 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
993
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
994 /*
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
995 * Update the interface class lookup table for the member index on the
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
996 * interface to the member index in the class implementing the interface.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
997 * And a lookup table for the object method index on the interface
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
998 * to the object method index in the class implementing the interface.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
999 * This is also used for updating the lookup table for the extended class
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1000 * hierarchy.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1001 */
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1002 static int
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1003 update_member_method_lookup_table(
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
1004 class_T *ifcl,
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
1005 class_T *cl,
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
1006 garray_T *objmethods,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1007 int pobj_method_offset)
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1008 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1009 if (ifcl == NULL)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1010 return OK;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1011
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1012 // Table for members.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1013 itf2class_T *if2cl = alloc_clear(sizeof(itf2class_T)
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1014 + ifcl->class_obj_member_count * sizeof(int));
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1015 if (if2cl == NULL)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1016 return FAIL;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1017 if2cl->i2c_next = ifcl->class_itf2class;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1018 ifcl->class_itf2class = if2cl;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1019 if2cl->i2c_class = cl;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1020 if2cl->i2c_is_method = FALSE;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1021
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1022 for (int if_i = 0; if_i < ifcl->class_obj_member_count; ++if_i)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1023 for (int cl_i = 0; cl_i < cl->class_obj_member_count; ++cl_i)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1024 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1025 if (STRCMP(ifcl->class_obj_members[if_i].ocm_name,
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1026 cl->class_obj_members[cl_i].ocm_name) == 0)
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1027 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1028 int *table = (int *)(if2cl + 1);
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1029 table[if_i] = cl_i;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1030 break;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1031 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1032 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1033
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1034 // Table for methods.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1035 if2cl = alloc_clear(sizeof(itf2class_T)
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1036 + ifcl->class_obj_method_count * sizeof(int));
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1037 if (if2cl == NULL)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1038 return FAIL;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1039 if2cl->i2c_next = ifcl->class_itf2class;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1040 ifcl->class_itf2class = if2cl;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1041 if2cl->i2c_class = cl;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1042 if2cl->i2c_is_method = TRUE;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1043
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1044 for (int if_i = 0; if_i < ifcl->class_obj_method_count; ++if_i)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1045 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1046 int done = FALSE;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1047 for (int cl_i = 0; cl_i < objmethods->ga_len; ++cl_i)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1048 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1049 if (STRCMP(ifcl->class_obj_methods[if_i]->uf_name,
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1050 ((ufunc_T **)objmethods->ga_data)[cl_i]->uf_name) == 0)
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1051 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1052 int *table = (int *)(if2cl + 1);
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1053 table[if_i] = cl_i;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1054 done = TRUE;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1055 break;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1056 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1057 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1058
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1059 // extended class object method is not overridden by the child class.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1060 // Keep the method declared in one of the parent classes in the
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1061 // lineage.
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1062 if (!done)
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1063 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1064 // If "ifcl" is not the immediate parent of "cl", then search in
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1065 // the intermediate parent classes.
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1066 if (cl->class_extends != ifcl)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1067 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1068 class_T *parent = cl->class_extends;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1069 int method_offset = objmethods->ga_len;
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1070
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1071 while (!done && parent != NULL && parent != ifcl)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1072 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1073
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1074 for (int cl_i = 0;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1075 cl_i < parent->class_obj_method_count_child; ++cl_i)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1076 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1077 if (STRCMP(ifcl->class_obj_methods[if_i]->uf_name,
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1078 parent->class_obj_methods[cl_i]->uf_name)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1079 == 0)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1080 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1081 int *table = (int *)(if2cl + 1);
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1082 table[if_i] = method_offset + cl_i;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1083 done = TRUE;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1084 break;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1085 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1086 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1087 method_offset += parent->class_obj_method_count_child;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1088 parent = parent->class_extends;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1089 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1090 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1091
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1092 if (!done)
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1093 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1094 int *table = (int *)(if2cl + 1);
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1095 table[if_i] = pobj_method_offset + if_i;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1096 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1097 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1098 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1099
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1100 return OK;
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1101 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1102
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1103 /*
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1104 * Update the member and object method lookup tables for a new class in the
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1105 * interface class.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1106 * For each interface add a lookup table for the member index on the interface
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1107 * to the member index in the new class. And a lookup table for the object
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1108 * method index on the interface to the object method index in the new class.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1109 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1110 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1111 add_lookup_tables(class_T *cl, class_T *extends_cl, garray_T *objmethods_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1112 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1113 // update the lookup table for all the implemented interfaces
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1114 for (int i = 0; i < cl->class_interface_count; ++i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1115 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1116 class_T *ifcl = cl->class_interfaces_cl[i];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1117
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1118 // update the lookup table for this interface and all its super
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1119 // interfaces.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1120 while (ifcl != NULL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1121 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1122 if (update_member_method_lookup_table(ifcl, cl, objmethods_gap,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1123 0) == FAIL)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1124 return FAIL;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1125 ifcl = ifcl->class_extends;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1126 }
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1127 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1128
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1129 // Update the lookup table for the extended class, if any
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1130 if (extends_cl != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1131 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1132 class_T *pclass = extends_cl;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1133 int pobj_method_offset = objmethods_gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1134
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1135 // Update the entire lineage of extended classes.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1136 while (pclass != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1137 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1138 if (update_member_method_lookup_table(pclass, cl,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1139 objmethods_gap, pobj_method_offset) == FAIL)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1140 return FAIL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1141
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1142 pobj_method_offset += pclass->class_obj_method_count_child;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1143 pclass = pclass->class_extends;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1144 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1145 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1146
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1147 return OK;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1148 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1149
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1150 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1151 * Add class members to a new class. Allocate a typval for each class member
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1152 * and initialize it.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1153 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1154 static void
33471
baa62f464436 patch 9.0.1988: Vim9: potential use-after-free for class members
Christian Brabandt <cb@256bit.org>
parents: 33456
diff changeset
1155 add_class_members(class_T *cl, exarg_T *eap, garray_T *type_list_gap)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1156 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1157 // Allocate a typval for each class member and initialize it.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1158 cl->class_members_tv = ALLOC_CLEAR_MULT(typval_T,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1159 cl->class_class_member_count);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1160 if (cl->class_members_tv == NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1161 return;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1162
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1163 for (int i = 0; i < cl->class_class_member_count; ++i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1164 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1165 ocmember_T *m = &cl->class_class_members[i];
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1166 typval_T *tv = &cl->class_members_tv[i];
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1167 if (m->ocm_init != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1168 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1169 typval_T *etv = eval_expr(m->ocm_init, eap);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1170 if (etv != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1171 {
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1172 if (m->ocm_type->tt_type == VAR_ANY
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1173 && !m->ocm_has_type
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1174 && etv->v_type != VAR_SPECIAL)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1175 // If the member variable type is not yet set, then use
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1176 // the initialization expression type.
33471
baa62f464436 patch 9.0.1988: Vim9: potential use-after-free for class members
Christian Brabandt <cb@256bit.org>
parents: 33456
diff changeset
1177 m->ocm_type = typval2type(etv, get_copyID(),
baa62f464436 patch 9.0.1988: Vim9: potential use-after-free for class members
Christian Brabandt <cb@256bit.org>
parents: 33456
diff changeset
1178 type_list_gap,
baa62f464436 patch 9.0.1988: Vim9: potential use-after-free for class members
Christian Brabandt <cb@256bit.org>
parents: 33456
diff changeset
1179 TVTT_DO_MEMBER|TVTT_MORE_SPECIFIC);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1180 *tv = *etv;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1181 vim_free(etv);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1182 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1183 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1184 else
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1185 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1186 // TODO: proper default value
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1187 tv->v_type = m->ocm_type->tt_type;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1188 tv->vval.v_string = NULL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1189 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1190 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1191 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1192
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1193 /*
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1194 * Add a default constructor method (new()) to the class "cl".
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1195 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1196 static void
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1197 add_default_constructor(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1198 class_T *cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1199 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1200 garray_T *type_list_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1201 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1202 garray_T fga;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1203
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1204 ga_init2(&fga, 1, 1000);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1205 ga_concat(&fga, (char_u *)"new(");
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1206 for (int i = 0; i < cl->class_obj_member_count; ++i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1207 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1208 if (i > 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1209 ga_concat(&fga, (char_u *)", ");
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1210 ga_concat(&fga, (char_u *)"this.");
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1211 ocmember_T *m = cl->class_obj_members + i;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1212 ga_concat(&fga, (char_u *)m->ocm_name);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1213 ga_concat(&fga, (char_u *)" = v:none");
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1214 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1215 ga_concat(&fga, (char_u *)")\nenddef\n");
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1216 ga_append(&fga, NUL);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1217
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1218 exarg_T fea;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1219 CLEAR_FIELD(fea);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1220 fea.cmdidx = CMD_def;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1221 fea.cmd = fea.arg = fga.ga_data;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1222
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1223 garray_T lines_to_free;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1224 ga_init2(&lines_to_free, sizeof(char_u *), 50);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1225
33326
4e531adb3fac patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents: 33297
diff changeset
1226 ufunc_T *nf = define_function(&fea, NULL, &lines_to_free, CF_CLASS,
4e531adb3fac patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents: 33297
diff changeset
1227 cl->class_obj_members, cl->class_obj_member_count);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1228
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1229 ga_clear_strings(&lines_to_free);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1230 vim_free(fga.ga_data);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1231
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1232 if (nf != NULL && ga_grow(classfunctions_gap, 1) == OK)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1233 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1234 ((ufunc_T **)classfunctions_gap->ga_data)[classfunctions_gap->ga_len]
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1235 = nf;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1236 ++classfunctions_gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1237
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1238 nf->uf_flags |= FC_NEW;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1239 nf->uf_ret_type = get_type_ptr(type_list_gap);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1240 if (nf->uf_ret_type != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1241 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1242 nf->uf_ret_type->tt_type = VAR_OBJECT;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1243 nf->uf_ret_type->tt_class = cl;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1244 nf->uf_ret_type->tt_argcount = 0;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1245 nf->uf_ret_type->tt_args = NULL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1246 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1247 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1248 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1249
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1250 /*
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1251 * Add the class methods and object methods to the new class "cl".
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1252 * When extending a class "extends_cl", add the instance methods from the
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1253 * parent class also.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1254 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1255 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1256 add_classfuncs_objmethods(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1257 class_T *cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1258 class_T *extends_cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1259 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1260 garray_T *objmethods_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1261 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1262 // loop 1: class functions, loop 2: object methods
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1263 for (int loop = 1; loop <= 2; ++loop)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1264 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1265 garray_T *gap = loop == 1 ? classfunctions_gap : objmethods_gap;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1266 int *fcount = loop == 1 ? &cl->class_class_function_count
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1267 : &cl->class_obj_method_count;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1268 ufunc_T ***fup = loop == 1 ? &cl->class_class_functions
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1269 : &cl->class_obj_methods;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1270
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1271 int parent_count = 0;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1272 if (extends_cl != NULL)
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1273 // Include object methods from the parent.
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1274 // Don't include the parent class methods.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1275 parent_count = loop == 1
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1276 ? 0
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1277 : extends_cl->class_obj_method_count;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1278
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1279 *fcount = parent_count + gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1280 if (*fcount == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1281 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1282 *fup = NULL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1283 continue;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1284 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1285 *fup = ALLOC_MULT(ufunc_T *, *fcount);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1286 if (*fup == NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1287 return FAIL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1288
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1289 if (gap->ga_len != 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1290 mch_memmove(*fup, gap->ga_data, sizeof(ufunc_T *) * gap->ga_len);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1291 vim_free(gap->ga_data);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1292 if (loop == 1)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1293 cl->class_class_function_count_child = gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1294 else
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1295 cl->class_obj_method_count_child = gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1296
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1297 if (loop == 2)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1298 {
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1299 // Copy instance methods from the parent.
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1300
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1301 for (int i = 0; i < parent_count; ++i)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1302 {
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1303 // Can't use the same parent function, because "uf_class" is
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1304 // different and compilation will have a different result.
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1305 // Put them after the functions in the current class, object
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1306 // methods may be overruled, then "super.Method()" is used to
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1307 // find a method from the parent.
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1308 ufunc_T *pf = (extends_cl->class_obj_methods)[i];
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1309 (*fup)[gap->ga_len + i] = copy_function(pf);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1310
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1311 // If the child class overrides a function from the parent
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1312 // the signature must be equal.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1313 char_u *pname = pf->uf_name;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1314 for (int ci = 0; ci < gap->ga_len; ++ci)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1315 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1316 ufunc_T *cf = (*fup)[ci];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1317 char_u *cname = cf->uf_name;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1318 if (STRCMP(pname, cname) == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1319 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1320 where_T where = WHERE_INIT;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1321 where.wt_func_name = (char *)pname;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1322 where.wt_kind = WT_METHOD;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1323 (void)check_type(pf->uf_func_type, cf->uf_func_type,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1324 TRUE, where);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1325 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1326 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1327 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1328 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1329
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1330 // Set the class pointer on all the functions and object methods.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1331 for (int i = 0; i < *fcount; ++i)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1332 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1333 ufunc_T *fp = (*fup)[i];
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1334 fp->uf_class = cl;
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1335 if (i < gap->ga_len)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1336 fp->uf_defclass = cl;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1337 if (loop == 2)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1338 fp->uf_flags |= FC_OBJECT;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1339 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1340 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1341
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1342 return OK;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1343 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1344
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1345 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1346 * Handle ":class" and ":abstract class" up to ":endclass".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1347 * Handle ":interface" up to ":endinterface".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1348 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1349 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1350 ex_class(exarg_T *eap)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1351 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1352 int is_class = eap->cmdidx == CMD_class; // FALSE for :interface
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1353 long start_lnum = SOURCING_LNUM;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1354 char_u *arg = eap->arg;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1355 int is_abstract = eap->cmdidx == CMD_abstract;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1356
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1357 if (is_abstract)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1358 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1359 if (STRNCMP(arg, "class", 5) != 0 || !VIM_ISWHITE(arg[5]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1360 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1361 semsg(_(e_invalid_argument_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1362 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1363 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1364 arg = skipwhite(arg + 5);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1365 is_class = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1366 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1367
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1368 if (!current_script_is_vim9()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1369 || (cmdmod.cmod_flags & CMOD_LEGACY)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1370 || !getline_equal(eap->getline, eap->cookie, getsourceline))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1371 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1372 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1373 emsg(_(e_class_can_only_be_defined_in_vim9_script));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1374 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1375 emsg(_(e_interface_can_only_be_defined_in_vim9_script));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1376 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1377 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1378
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1379 if (!ASCII_ISUPPER(*arg))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1380 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1381 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1382 semsg(_(e_class_name_must_start_with_uppercase_letter_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1383 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1384 semsg(_(e_interface_name_must_start_with_uppercase_letter_str),
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1385 arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1386 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1387 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1388 char_u *name_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1389 if (!IS_WHITE_OR_NUL(*name_end))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1390 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1391 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1392 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1393 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1394 char_u *name_start = arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1395
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1396 // "export class" gets used when creating the class, don't use "is_export"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1397 // for the items inside the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1398 int class_export = is_export;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1399 is_export = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1400
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1401 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1402 // generics: <Tkey, Tentry>
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1403
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1404 // Name for "extends BaseClass"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1405 char_u *extends = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1406
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1407 // Names for "implements SomeInterface"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1408 garray_T ga_impl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1409 ga_init2(&ga_impl, sizeof(char_u *), 5);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1410
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1411 arg = skipwhite(name_end);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1412 while (*arg != NUL && *arg != '#' && *arg != '\n')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1413 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1414 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1415 // specifies SomeInterface
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1416 if (STRNCMP(arg, "extends", 7) == 0 && IS_WHITE_OR_NUL(arg[7]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1417 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1418 if (extends != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1419 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1420 emsg(_(e_duplicate_extends));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1421 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1422 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1423 arg = skipwhite(arg + 7);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1424 char_u *end = find_name_end(arg, NULL, NULL, FNE_CHECK_START);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1425 if (!IS_WHITE_OR_NUL(*end))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1426 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1427 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1428 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1429 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1430 extends = vim_strnsave(arg, end - arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1431 if (extends == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1432 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1433
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1434 arg = skipwhite(end + 1);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1435 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1436 else if (STRNCMP(arg, "implements", 10) == 0
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1437 && IS_WHITE_OR_NUL(arg[10]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1438 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1439 if (!is_class)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1440 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1441 emsg(_(e_interface_cannot_use_implements));
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1442 goto early_ret;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1443 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1444
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1445 if (ga_impl.ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1446 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1447 emsg(_(e_duplicate_implements));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1448 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1449 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1450 arg = skipwhite(arg + 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1451
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1452 for (;;)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1453 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1454 char_u *impl_end = find_name_end(arg, NULL, NULL,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1455 FNE_CHECK_START);
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1456 if ((!IS_WHITE_OR_NUL(*impl_end) && *impl_end != ',')
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1457 || (*impl_end == ','
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1458 && !IS_WHITE_OR_NUL(*(impl_end + 1))))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1459 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1460 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1461 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1462 }
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1463 if (impl_end - arg == 0)
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1464 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1465 emsg(_(e_missing_name_after_implements));
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1466 goto early_ret;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1467 }
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1468
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1469 char_u *iname = vim_strnsave(arg, impl_end - arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1470 if (iname == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1471 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1472 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1473 if (STRCMP(((char_u **)ga_impl.ga_data)[i], iname) == 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1474 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1475 semsg(_(e_duplicate_interface_after_implements_str),
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1476 iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1477 vim_free(iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1478 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1479 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1480 if (ga_add_string(&ga_impl, iname) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1481 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1482 vim_free(iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1483 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1484 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1485 if (*impl_end != ',')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1486 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1487 arg = skipwhite(impl_end);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1488 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1489 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1490 arg = skipwhite(impl_end + 1);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1491 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1492 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1493 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1494 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1495 semsg(_(e_trailing_characters_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1496 early_ret:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1497 vim_free(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1498 ga_clear_strings(&ga_impl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1499 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1500 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1501 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1502
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1503 garray_T type_list; // list of pointers to allocated types
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1504 ga_init2(&type_list, sizeof(type_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1505
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1506 // Growarray with class members declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1507 garray_T classmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1508 ga_init2(&classmembers, sizeof(ocmember_T), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1509
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1510 // Growarray with functions declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1511 garray_T classfunctions;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1512 ga_init2(&classfunctions, sizeof(ufunc_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1513
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1514 // Growarray with object members declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1515 garray_T objmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1516 ga_init2(&objmembers, sizeof(ocmember_T), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1517
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1518 // Growarray with object methods declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1519 garray_T objmethods;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1520 ga_init2(&objmethods, sizeof(ufunc_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1521
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1522 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1523 * Go over the body of the class/interface until "endclass" or
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1524 * "endinterface" is found.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1525 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1526 char_u *theline = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1527 int success = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1528 for (;;)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1529 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1530 vim_free(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1531 theline = eap->getline(':', eap->cookie, 0, GETLINE_CONCAT_ALL);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1532 if (theline == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1533 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1534 char_u *line = skipwhite(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1535
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1536 // Skip empty and comment lines.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1537 if (*line == NUL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1538 continue;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1539 if (*line == '#')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1540 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1541 if (vim9_bad_comment(line))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1542 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1543 continue;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1544 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1545
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1546 char_u *p = line;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1547 char *end_name = is_class ? "endclass" : "endinterface";
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1548 if (checkforcmd(&p, end_name, is_class ? 4 : 5))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1549 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1550 if (STRNCMP(line, end_name, is_class ? 8 : 12) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1551 semsg(_(e_command_cannot_be_shortened_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1552 else if (*p == '|' || !ends_excmd2(line, p))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1553 semsg(_(e_trailing_characters_str), p);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1554 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1555 success = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1556 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1557 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1558 char *wrong_name = is_class ? "endinterface" : "endclass";
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1559 if (checkforcmd(&p, wrong_name, is_class ? 5 : 4))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1560 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1561 semsg(_(e_invalid_command_str_expected_str), line, end_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1562 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1563 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1564
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1565 int has_public = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1566 if (checkforcmd(&p, "public", 3))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1567 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1568 if (STRNCMP(line, "public", 6) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1569 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1570 semsg(_(e_command_cannot_be_shortened_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1571 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1572 }
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1573 if (!is_class)
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1574 {
33385
b5ad84fdc702 patch 9.0.1951: Vim9: hard to debug vim9_class errors from CI
Christian Brabandt <cb@256bit.org>
parents: 33381
diff changeset
1575 emsg(_(e_public_variable_not_supported_in_interface));
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1576 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1577 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1578 has_public = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1579 p = skipwhite(line + 6);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1580
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1581 if (STRNCMP(p, "this", 4) != 0 && STRNCMP(p, "static", 6) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1582 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1583 emsg(_(e_public_must_be_followed_by_this_or_static));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1584 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1585 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1586 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1587
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1588 int abstract_method = FALSE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1589 char_u *pa = p;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1590 if (checkforcmd(&p, "abstract", 3))
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1591 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1592 if (STRNCMP(pa, "abstract", 8) != 0)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1593 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1594 semsg(_(e_command_cannot_be_shortened_str), pa);
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1595 break;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1596 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1597
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1598 if (!is_class)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1599 // ignore "abstract" in an interface (as all the methods in an
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1600 // interface are abstract.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1601 p = skipwhite(pa + 8);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1602 else
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1603 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1604 if (!is_abstract)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1605 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1606 semsg(_(e_abstract_method_in_concrete_class), pa);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1607 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1608 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1609
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1610 abstract_method = TRUE;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1611 p = skipwhite(pa + 8);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1612 if (STRNCMP(p, "def", 3) != 0 && STRNCMP(p, "static", 6) != 0)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1613 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1614 emsg(_(e_abstract_must_be_followed_by_def_or_static));
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1615 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1616 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1617 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1618 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1619
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1620 int has_static = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1621 char_u *ps = p;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1622 if (checkforcmd(&p, "static", 4))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1623 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1624 if (STRNCMP(ps, "static", 6) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1625 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1626 semsg(_(e_command_cannot_be_shortened_str), ps);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1627 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1628 }
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1629
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1630 if (!is_class)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1631 {
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1632 emsg(_(e_static_member_not_supported_in_interface));
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1633 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1634 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1635 has_static = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1636 p = skipwhite(ps + 6);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1637 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1638
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1639 // object members (public, read access, private):
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1640 // "this._varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1641 // "this.varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1642 // "public this.varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1643 if (STRNCMP(p, "this", 4) == 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1644 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1645 if (p[4] != '.' || !eval_isnamec1(p[5]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1646 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
1647 semsg(_(e_invalid_object_variable_declaration_str), p);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1648 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1649 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1650 if (has_static)
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1651 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1652 emsg(_(e_static_cannot_be_followed_by_this));
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1653 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1654 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1655 char_u *varname = p + 5;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1656 char_u *varname_end = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1657 type_T *type = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1658 char_u *init_expr = NULL;
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1659 int has_type = FALSE;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1660
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1661 if (!is_class && *varname == '_')
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1662 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1663 // private variables are not supported in an interface
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1664 semsg(_(e_private_variable_not_supported_in_interface),
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1665 varname);
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1666 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1667 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1668
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1669 if (parse_member(eap, line, varname, has_public,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1670 &varname_end, &has_type, &type_list, &type,
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1671 is_class ? &init_expr: NULL) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1672 break;
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1673 if (is_reserved_varname(varname, varname_end))
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1674 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1675 vim_free(init_expr);
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1676 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1677 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1678 if (is_duplicate_variable(&classmembers, &objmembers, varname,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1679 varname_end))
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1680 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1681 vim_free(init_expr);
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1682 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1683 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1684 if (add_member(&objmembers, varname, varname_end,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1685 has_public, has_type, type, init_expr) == FAIL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1686 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1687 vim_free(init_expr);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1688 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1689 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1690 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1691
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1692 // constructors:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1693 // def new()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1694 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1695 // def newOther()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1696 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1697 // object methods and class functions:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1698 // def SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1699 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1700 // static def ClassFunction()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1701 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1702 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1703 // def <Tval> someMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1704 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1705 else if (checkforcmd(&p, "def", 3))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1706 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1707 exarg_T ea;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1708 garray_T lines_to_free;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1709
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1710 if (has_public)
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1711 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1712 // "public" keyword is not supported when defining an object or
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1713 // class method
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1714 emsg(_(e_public_keyword_not_supported_for_method));
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1715 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1716 }
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1717
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1718 if (*p == NUL)
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1719 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1720 // No method name following def
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1721 semsg(_(e_not_valid_command_in_class_str), line);
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1722 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1723 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1724
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1725 CLEAR_FIELD(ea);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1726 ea.cmd = line;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1727 ea.arg = p;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1728 ea.cmdidx = CMD_def;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1729 ea.getline = eap->getline;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1730 ea.cookie = eap->cookie;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1731
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1732 ga_init2(&lines_to_free, sizeof(char_u *), 50);
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1733 int class_flags;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1734 if (is_class)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1735 class_flags = abstract_method ? CF_ABSTRACT_METHOD : CF_CLASS;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1736 else
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1737 class_flags = CF_INTERFACE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1738 ufunc_T *uf = define_function(&ea, NULL, &lines_to_free,
33326
4e531adb3fac patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents: 33297
diff changeset
1739 class_flags, objmembers.ga_data, objmembers.ga_len);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1740 ga_clear_strings(&lines_to_free);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1741
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1742 if (uf != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1743 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1744 char_u *name = uf->uf_name;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1745 int is_new = STRNCMP(name, "new", 3) == 0;
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
1746
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1747 if (!is_class && *name == '_')
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1748 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1749 // private variables are not supported in an interface
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1750 semsg(_(e_private_method_not_supported_in_interface),
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1751 name);
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1752 func_clear_free(uf, FALSE);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1753 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1754 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1755 if (is_new && !is_valid_constructor(uf, is_abstract,
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1756 has_static))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1757 {
32854
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1758 func_clear_free(uf, FALSE);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1759 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1760 }
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
1761
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1762 // Check the name isn't used already.
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1763 if (is_duplicate_method(&classfunctions, &objmethods, name))
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1764 {
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1765 success = FALSE;
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1766 func_clear_free(uf, FALSE);
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1767 break;
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1768 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1769
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1770 garray_T *fgap = has_static || is_new
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1771 ? &classfunctions : &objmethods;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1772 if (ga_grow(fgap, 1) == OK)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1773 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1774 if (is_new)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1775 uf->uf_flags |= FC_NEW;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1776
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1777 if (abstract_method)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1778 uf->uf_flags |= FC_ABSTRACT;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1779
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1780 ((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1781 ++fgap->ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1782 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1783 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1784 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1785
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1786 // class members
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1787 else if (has_static)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1788 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1789 // class members (public, read access, private):
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1790 // "static _varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1791 // "static varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1792 // "public static varname"
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1793 char_u *varname = p;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1794 char_u *varname_end = NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1795 int has_type = FALSE;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1796 type_T *type = NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1797 char_u *init_expr = NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1798
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1799 if (parse_member(eap, line, varname, has_public,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1800 &varname_end, &has_type, &type_list, &type,
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1801 is_class ? &init_expr : NULL) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1802 break;
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1803 if (is_reserved_varname(varname, varname_end))
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1804 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1805 vim_free(init_expr);
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1806 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1807 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1808 if (is_duplicate_variable(&classmembers, &objmembers, varname,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1809 varname_end))
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1810 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1811 vim_free(init_expr);
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1812 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1813 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1814 if (add_member(&classmembers, varname, varname_end,
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1815 has_public, has_type, type, init_expr) == FAIL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1816 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1817 vim_free(init_expr);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1818 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1819 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1820 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1821
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1822 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1823 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1824 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1825 semsg(_(e_not_valid_command_in_class_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1826 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1827 semsg(_(e_not_valid_command_in_interface_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1828 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1829 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1830 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1831 vim_free(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1832
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1833 class_T *extends_cl = NULL; // class from "extends" argument
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1834
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1835 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1836 * Check a few things before defining the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1837 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1838
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1839 // Check the "extends" class is valid.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1840 if (success && extends != NULL)
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1841 success = validate_extends_class(extends, &extends_cl, is_class);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1842 VIM_CLEAR(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1843
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1844 // Check the new object methods to make sure their access (public or
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1845 // private) is the same as that in the extended class lineage.
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1846 if (success && extends_cl != NULL)
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1847 success = validate_extends_methods(&objmethods, extends_cl);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1848
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1849 // Check the new class and object variables are not duplicates of the
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1850 // variables in the extended class lineage. If an interface is extending
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1851 // another interface, then it can duplicate the member variables.
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1852 if (success && extends_cl != NULL)
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1853 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1854 if (is_class)
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1855 success = extends_check_dup_members(&objmembers, extends_cl);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1856 else
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1857 success = extends_check_intf_var_type(&objmembers, extends_cl);
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1858 }
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1859
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1860 // When extending an abstract class, make sure all the abstract methods in
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1861 // the parent class are implemented. If the current class is an abstract
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1862 // class, then there is no need for this check.
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1863 if (success && !is_abstract && extends_cl != NULL
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1864 && (extends_cl->class_flags & CLASS_ABSTRACT))
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1865 success = validate_abstract_class_methods(&classfunctions,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1866 &objmethods, extends_cl);
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1867
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1868 class_T **intf_classes = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1869
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1870 // Check all "implements" entries are valid.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1871 if (success && ga_impl.ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1872 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1873 intf_classes = ALLOC_CLEAR_MULT(class_T *, ga_impl.ga_len);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1874
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1875 success = validate_implements_classes(&ga_impl, intf_classes,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1876 &classfunctions, &classmembers,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1877 &objmethods, &objmembers,
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1878 extends_cl);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1879 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1880
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1881 // Check no function argument name is used as a class member.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1882 if (success)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1883 success = check_func_arg_names(&classfunctions, &objmethods,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1884 &classmembers);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1885
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1886 class_T *cl = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1887 if (success)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1888 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1889 // "endclass" encountered without failures: Create the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1890
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1891 cl = ALLOC_CLEAR_ONE(class_T);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1892 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1893 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1894 if (!is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1895 cl->class_flags = CLASS_INTERFACE;
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1896 else if (is_abstract)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1897 cl->class_flags = CLASS_ABSTRACT;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1898
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1899 cl->class_refcount = 1;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1900 cl->class_name = vim_strnsave(name_start, name_end - name_start);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1901 if (cl->class_name == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1902 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1903
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1904 if (extends_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1905 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1906 cl->class_extends = extends_cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1907 extends_cl->class_flags |= CLASS_EXTENDED;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1908 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1909
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1910 // Add class and object variables to "cl".
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1911 if (add_members_to_class(&classmembers,
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1912 NULL,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1913 0,
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1914 &cl->class_class_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1915 &cl->class_class_member_count) == FAIL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1916 || add_members_to_class(&objmembers,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1917 extends_cl == NULL ? NULL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1918 : extends_cl->class_obj_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1919 extends_cl == NULL ? 0
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1920 : extends_cl->class_obj_member_count,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1921 &cl->class_obj_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1922 &cl->class_obj_member_count) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1923 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1924
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1925 if (ga_impl.ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1926 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1927 // Move the "implements" names into the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1928 cl->class_interface_count = ga_impl.ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1929 cl->class_interfaces = ALLOC_MULT(char_u *, ga_impl.ga_len);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1930 if (cl->class_interfaces == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1931 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1932 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1933 cl->class_interfaces[i] = ((char_u **)ga_impl.ga_data)[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1934 VIM_CLEAR(ga_impl.ga_data);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1935 ga_impl.ga_len = 0;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1936
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1937 cl->class_interfaces_cl = intf_classes;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1938 intf_classes = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1939 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1940
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1941 if (cl->class_interface_count > 0 || extends_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1942 {
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1943 // Add a method and member lookup table to each of the interface
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1944 // classes.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1945 if (add_lookup_tables(cl, extends_cl, &objmethods) == FAIL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1946 goto cleanup;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1947 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1948
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1949 // Allocate a typval for each class member and initialize it.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1950 if (is_class && cl->class_class_member_count > 0)
33471
baa62f464436 patch 9.0.1988: Vim9: potential use-after-free for class members
Christian Brabandt <cb@256bit.org>
parents: 33456
diff changeset
1951 add_class_members(cl, eap, &type_list);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1952
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1953 int have_new = FALSE;
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1954 ufunc_T *class_func = NULL;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1955 for (int i = 0; i < classfunctions.ga_len; ++i)
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1956 {
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1957 class_func = ((ufunc_T **)classfunctions.ga_data)[i];
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1958 if (STRCMP(class_func->uf_name, "new") == 0)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1959 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1960 have_new = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1961 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1962 }
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1963 }
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1964
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1965 if (have_new)
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1966 // The return type of new() is an object of class "cl"
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1967 class_func->uf_ret_type->tt_class = cl;
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1968 else if (is_class && !is_abstract && !have_new)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1969 // No new() method was defined, add the default constructor.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1970 add_default_constructor(cl, &classfunctions, &type_list);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1971
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1972 // Move all the functions into the created class.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1973 if (add_classfuncs_objmethods(cl, extends_cl, &classfunctions,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1974 &objmethods) == FAIL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1975 goto cleanup;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1976
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1977 cl->class_type.tt_type = VAR_CLASS;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1978 cl->class_type.tt_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1979 cl->class_object_type.tt_type = VAR_OBJECT;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1980 cl->class_object_type.tt_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1981 cl->class_type_list = type_list;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1982
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
1983 class_created(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
1984
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1985 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1986 // - Fill hashtab with object members and methods ?
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1987
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1988 // Add the class to the script-local variables.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1989 // TODO: handle other context, e.g. in a function
33119
bede81965821 patch 9.0.1842: Need more accurate profiling
Christian Brabandt <cb@256bit.org>
parents: 33109
diff changeset
1990 // TODO: does uf_hash need to be cleared?
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1991 typval_T tv;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1992 tv.v_type = VAR_CLASS;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1993 tv.vval.v_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1994 is_export = class_export;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1995 SOURCING_LNUM = start_lnum;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1996 set_var_const(cl->class_name, current_sctx.sc_sid,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1997 NULL, &tv, FALSE, 0, 0);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1998 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1999 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2000
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2001 cleanup:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2002 if (cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2003 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2004 vim_free(cl->class_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2005 vim_free(cl->class_class_functions);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2006 if (cl->class_interfaces != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2007 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2008 for (int i = 0; i < cl->class_interface_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2009 vim_free(cl->class_interfaces[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2010 vim_free(cl->class_interfaces);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2011 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2012 if (cl->class_interfaces_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2013 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2014 for (int i = 0; i < cl->class_interface_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2015 class_unref(cl->class_interfaces_cl[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2016 vim_free(cl->class_interfaces_cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2017 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2018 vim_free(cl->class_obj_members);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2019 vim_free(cl->class_obj_methods);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2020 vim_free(cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2021 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2022
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2023 vim_free(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2024 class_unref(extends_cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2025
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2026 if (intf_classes != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2027 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2028 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2029 class_unref(intf_classes[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2030 vim_free(intf_classes);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2031 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2032 ga_clear_strings(&ga_impl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2033
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2034 for (int round = 1; round <= 2; ++round)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2035 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2036 garray_T *gap = round == 1 ? &classmembers : &objmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2037 if (gap->ga_len == 0 || gap->ga_data == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2038 continue;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2039
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2040 for (int i = 0; i < gap->ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2041 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2042 ocmember_T *m = ((ocmember_T *)gap->ga_data) + i;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2043 vim_free(m->ocm_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2044 vim_free(m->ocm_init);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2045 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2046 ga_clear(gap);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2047 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2048
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2049 for (int i = 0; i < objmethods.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2050 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2051 ufunc_T *uf = ((ufunc_T **)objmethods.ga_data)[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2052 func_clear_free(uf, FALSE);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2053 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2054 ga_clear(&objmethods);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2055
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2056 for (int i = 0; i < classfunctions.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2057 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2058 ufunc_T *uf = ((ufunc_T **)classfunctions.ga_data)[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2059 func_clear_free(uf, FALSE);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2060 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2061 ga_clear(&classfunctions);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2062
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2063 clear_type_list(&type_list);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2064 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2065
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2066 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2067 * Find member "name" in class "cl", set "member_idx" to the member index and
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2068 * return its type.
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
2069 * When "is_object" is TRUE, then look for object members. Otherwise look for
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
2070 * class members.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2071 * When not found "member_idx" is set to -1 and t_any is returned.
33106
d994ba4bd9ca patch 9.0.1837: Vim9: class_member_type() can be optimized
Christian Brabandt <cb@256bit.org>
parents: 33088
diff changeset
2072 * Set *p_m ocmmember_T if not NULL
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2073 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2074 type_T *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2075 class_member_type(
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
2076 class_T *cl,
33109
2b5cc29b0a0e patch 9.0.1838: Vim9: Cannot modify class member vars from def function
Christian Brabandt <cb@256bit.org>
parents: 33106
diff changeset
2077 int is_object,
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
2078 char_u *name,
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
2079 char_u *name_end,
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
2080 int *member_idx)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2081 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2082 size_t len = name_end - name;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2083 ocmember_T *m;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2084
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2085 *member_idx = -1; // not found (yet)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2086
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2087 m = member_lookup(cl, is_object ? VAR_OBJECT : VAR_CLASS, name, len,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2088 member_idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2089 if (m == NULL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2090 {
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
2091 member_not_found_msg(cl, is_object ? VAR_OBJECT : VAR_CLASS, name,
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
2092 len);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2093 return &t_any;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2094 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2095
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2096 return m->ocm_type;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2097 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2098
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2099 /*
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2100 * Given a class or object variable index, return the variable type
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2101 */
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2102 type_T *
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2103 class_member_type_by_idx(
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2104 class_T *cl,
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2105 int is_object,
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2106 int member_idx)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2107 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2108 ocmember_T *m;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2109 int member_count;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2110
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2111 if (is_object)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2112 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2113 m = cl->class_obj_members;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2114 member_count = cl->class_obj_member_count;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2115 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2116 else
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2117 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2118 m = cl->class_class_members;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2119 member_count = cl->class_class_member_count;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2120 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2121
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2122 if (member_idx >= member_count)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2123 return NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2124
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2125 return m[member_idx].ocm_type;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2126 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2127
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2128 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2129 * Handle ":enum" up to ":endenum".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2130 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2131 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2132 ex_enum(exarg_T *eap UNUSED)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2133 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2134 // TODO
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2135 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2136
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2137 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2138 * Handle ":type".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2139 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2140 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2141 ex_type(exarg_T *eap UNUSED)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2142 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2143 // TODO
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2144 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2145
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2146 /*
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2147 * Returns OK if a member variable named "name" is present in the class "cl".
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2148 * Otherwise returns FAIL. If found, the member variable typval is set in
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2149 * "rettv". If "is_object" is TRUE, then the object member variable table is
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2150 * searched. Otherwise the class member variable table is searched.
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2151 */
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2152 static int
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2153 get_member_tv(
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2154 class_T *cl,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2155 int is_object,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2156 char_u *name,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2157 size_t namelen,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2158 typval_T *rettv)
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2159 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2160 ocmember_T *m;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2161 int m_idx;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2162
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2163 m = member_lookup(cl, is_object ? VAR_OBJECT : VAR_CLASS, name, namelen,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2164 &m_idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2165 if (m == NULL)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2166 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2167
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2168 if (*name == '_')
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2169 {
33456
4a62e78803db patch 9.0.1982: vim9: clean up from v9.0.1955
Christian Brabandt <cb@256bit.org>
parents: 33446
diff changeset
2170 semsg(_(e_cannot_access_private_variable_str), m->ocm_name,
4a62e78803db patch 9.0.1982: vim9: clean up from v9.0.1955
Christian Brabandt <cb@256bit.org>
parents: 33446
diff changeset
2171 cl->class_name);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2172 return FAIL;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2173 }
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2174
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2175 // The object only contains a pointer to the class, the member
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2176 // values array follows right after that.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2177 object_T *obj = rettv->vval.v_object;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2178 if (is_object)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2179 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2180 typval_T *tv = (typval_T *)(obj + 1) + m_idx;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2181 copy_tv(tv, rettv);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2182 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2183 else
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2184 copy_tv(&cl->class_members_tv[m_idx], rettv);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2185
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2186 object_unref(obj);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2187
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2188 return OK;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2189 }
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2190
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2191 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2192 * Evaluate what comes after a class:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2193 * - class member: SomeClass.varname
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2194 * - class function: SomeClass.SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2195 * - class constructor: SomeClass.new()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2196 * - object member: someObject.varname
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2197 * - object method: someObject.SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2198 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2199 * "*arg" points to the '.'.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2200 * "*arg" is advanced to after the member name or method call.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2201 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2202 * Returns FAIL or OK.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2203 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2204 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2205 class_object_index(
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2206 char_u **arg,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2207 typval_T *rettv,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2208 evalarg_T *evalarg,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2209 int verbose UNUSED) // give error messages
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2210 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2211 if (VIM_ISWHITE((*arg)[1]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2212 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2213 semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2214 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2215 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2216
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2217 ++*arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2218 char_u *name = *arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2219 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2220 if (name_end == name)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2221 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2222 size_t len = name_end - name;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2223
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2224 class_T *cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2225 if (rettv->v_type == VAR_CLASS)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2226 cl = rettv->vval.v_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2227 else // VAR_OBJECT
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2228 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2229 if (rettv->vval.v_object == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2230 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2231 emsg(_(e_using_null_object));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2232 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2233 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2234 cl = rettv->vval.v_object->obj_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2235 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2236
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2237 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2238 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2239 emsg(_(e_incomplete_type));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2240 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2241 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2242
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2243 if (*name_end == '(')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2244 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2245 ufunc_T *fp;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2246
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2247 fp = method_lookup(cl, rettv->v_type, name, len, NULL);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2248 if (fp == NULL)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2249 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2250 method_not_found_msg(cl, rettv->v_type, name, len);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2251 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2252 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2253
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2254 typval_T argvars[MAX_FUNC_ARGS + 1];
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2255 int argcount = 0;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2256
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2257 if (*fp->uf_name == '_')
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2258 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2259 // Cannot access a private method outside of a class
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2260 semsg(_(e_cannot_access_private_method_str), name);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2261 return FAIL;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2262 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2263
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2264 char_u *argp = name_end;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2265 int ret = get_func_arguments(&argp, evalarg, 0,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2266 argvars, &argcount);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2267 if (ret == FAIL)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2268 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2269
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2270 funcexe_T funcexe;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2271 CLEAR_FIELD(funcexe);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2272 funcexe.fe_evaluate = TRUE;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2273 if (rettv->v_type == VAR_OBJECT)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2274 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2275 funcexe.fe_object = rettv->vval.v_object;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2276 ++funcexe.fe_object->obj_refcount;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2277 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2278
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2279 // Clear the class or object after calling the function, in
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2280 // case the refcount is one.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2281 typval_T tv_tofree = *rettv;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2282 rettv->v_type = VAR_UNKNOWN;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2283
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2284 // Call the user function. Result goes into rettv;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2285 int error = call_user_func_check(fp, argcount, argvars,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2286 rettv, &funcexe, NULL);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2287
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2288 // Clear the previous rettv and the arguments.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2289 clear_tv(&tv_tofree);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2290 for (int idx = 0; idx < argcount; ++idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2291 clear_tv(&argvars[idx]);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2292
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2293 if (error != FCERR_NONE)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2294 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2295 user_func_error(error, printable_func_name(fp),
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2296 funcexe.fe_found_var);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2297 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2298 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2299 *arg = argp;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2300 return OK;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2301 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2302
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2303 else if (rettv->v_type == VAR_OBJECT)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2304 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2305 // Search in the object member variable table and the class member
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2306 // variable table.
33225
52b121d4feb5 patch 9.0.1887: Vim9: class members are accessible via object
Christian Brabandt <cb@256bit.org>
parents: 33217
diff changeset
2307 if (get_member_tv(cl, TRUE, name, len, rettv) == OK)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2308 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2309 *arg = name_end;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2310 return OK;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2311 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2312
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2313 member_not_found_msg(cl, VAR_OBJECT, name, len);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2314 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2315
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2316 else if (rettv->v_type == VAR_CLASS)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2317 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2318 int m_idx;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2319
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2320 // class member
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2321 ocmember_T *m = class_member_lookup(cl, name, len, &m_idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2322 if (m == NULL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2323 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2324 member_not_found_msg(cl, VAR_CLASS, name, len);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2325 return FAIL;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2326 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2327
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2328 if (*name == '_')
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2329 {
33456
4a62e78803db patch 9.0.1982: vim9: clean up from v9.0.1955
Christian Brabandt <cb@256bit.org>
parents: 33446
diff changeset
2330 semsg(_(e_cannot_access_private_variable_str), m->ocm_name,
4a62e78803db patch 9.0.1982: vim9: clean up from v9.0.1955
Christian Brabandt <cb@256bit.org>
parents: 33446
diff changeset
2331 cl->class_name);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2332 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2333 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2334
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2335 typval_T *tv = &cl->class_members_tv[m_idx];
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2336 copy_tv(tv, rettv);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2337 class_unref(cl);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2338
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2339 *arg = name_end;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2340 return OK;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2341 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2342
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2343 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2344 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2345
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2346 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2347 * If "arg" points to a class or object method, return it.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2348 * Otherwise return NULL.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2349 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2350 ufunc_T *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2351 find_class_func(char_u **arg)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2352 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2353 char_u *name = *arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2354 char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2355 if (name_end == name || *name_end != '.')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2356 return NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2357
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2358 ufunc_T *fp = NULL;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2359 size_t len = name_end - name;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2360 typval_T tv;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2361 tv.v_type = VAR_UNKNOWN;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2362 if (eval_variable(name, (int)len,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2363 0, &tv, NULL, EVAL_VAR_NOAUTOLOAD) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2364 return NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2365 if (tv.v_type != VAR_CLASS && tv.v_type != VAR_OBJECT)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2366 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2367
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2368 class_T *cl = tv.v_type == VAR_CLASS ? tv.vval.v_class
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2369 : tv.vval.v_object->obj_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2370 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2371 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2372 char_u *fname = name_end + 1;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2373 char_u *fname_end = find_name_end(fname, NULL, NULL, FNE_CHECK_START);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2374 if (fname_end == fname)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2375 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2376 len = fname_end - fname;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2377
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2378 fp = method_lookup(cl, tv.v_type, fname, len, NULL);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2379
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2380 fail_after_eval:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2381 clear_tv(&tv);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2382 return fp;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2383 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2384
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2385 /*
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2386 * Returns the index of class variable "name" in the class "cl".
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2387 * Returns -1, if the variable is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2388 * If "namelen" is zero, then it is assumed that "name" is NUL terminated.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2389 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2390 int
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2391 class_member_idx(class_T *cl, char_u *name, size_t namelen)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2392 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2393 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2394 class_member_lookup(cl, name, namelen, &idx);
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2395 return idx;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2396 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2397
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2398 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2399 * Returns a pointer to the class member variable "name" in the class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2400 * Returns NULL if the variable is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2401 * The member variable index is set in "idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2402 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2403 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2404 class_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2405 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2406 ocmember_T *ret_m = NULL;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2407 int ret_idx = -1;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2408 for (int i = 0; i < cl->class_class_member_count; ++i)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2409 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2410 ocmember_T *m = &cl->class_class_members[i];
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2411 if (namelen)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2412 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2413 if (STRNCMP(name, m->ocm_name, namelen) == 0
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2414 && m->ocm_name[namelen] == NUL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2415 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2416 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2417 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2418 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2419 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2420 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2421 else if (STRCMP(name, m->ocm_name) == 0)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2422 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2423 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2424 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2425 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2426 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2427 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2428 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2429 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2430 return ret_m;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2431 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2432
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2433 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2434 * Returns the index of class method "name" in the class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2435 * Returns -1, if the method is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2436 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2437 int
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2438 class_method_idx(class_T *cl, char_u *name, size_t namelen)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2439 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2440 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2441 class_method_lookup(cl, name, namelen, &idx);
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2442 return idx;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2443 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2444
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2445 /*
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2446 * Returns a pointer to the class method "name" in class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2447 * Returns NULL if the method is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2448 * The method index is set in "idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2449 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2450 ufunc_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2451 class_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2452 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2453 ufunc_T *ret_fp = NULL;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2454 int ret_idx = -1;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2455 for (int i = 0; i < cl->class_class_function_count; ++i)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2456 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2457 ufunc_T *fp = cl->class_class_functions[i];
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2458 char_u *ufname = (char_u *)fp->uf_name;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2459 if (STRNCMP(name, ufname, namelen) == 0 && ufname[namelen] == NUL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2460 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2461 ret_fp = fp;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2462 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2463 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2464 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2465 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2466 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2467 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2468 return ret_fp;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2469 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2470
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2471 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2472 * Returns the index of object member variable "name" in the class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2473 * Returns -1, if the variable is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2474 * If "namelen" is zero, then it is assumed that "name" is NUL terminated.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2475 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2476 int
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2477 object_member_idx(class_T *cl, char_u *name, size_t namelen)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2478 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2479 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2480 object_member_lookup(cl, name, namelen, &idx);
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2481 return idx;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2482 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2483
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2484 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2485 * Returns a pointer to the object member variable "name" in the class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2486 * Returns NULL if the variable is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2487 * The object member variable index is set in "idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2488 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2489 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2490 object_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2491 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2492 ocmember_T *ret_m = NULL;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2493 int ret_idx = -1;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2494 for (int i = 0; i < cl->class_obj_member_count; ++i)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2495 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2496 ocmember_T *m = &cl->class_obj_members[i];
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2497 if (namelen)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2498 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2499 if (STRNCMP(name, m->ocm_name, namelen) == 0
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2500 && m->ocm_name[namelen] == NUL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2501 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2502 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2503 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2504 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2505 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2506 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2507 else if (STRCMP(name, m->ocm_name) == 0)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2508 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2509 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2510 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2511 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2512 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2513 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2514 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2515 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2516 return ret_m;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2517 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2518
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2519 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2520 * Returns the index of object method "name" in the class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2521 * Returns -1, if the method is not found.
33227
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2522 */
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2523 int
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2524 object_method_idx(class_T *cl, char_u *name, size_t namelen)
33227
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2525 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2526 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2527 object_method_lookup(cl, name, namelen, &idx);
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2528 return idx;
33227
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2529 }
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2530
3672d3d13524 patch 9.0.1888: Vim9: Problem trying to invoke class method
Christian Brabandt <cb@256bit.org>
parents: 33225
diff changeset
2531 /*
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2532 * Returns a pointer to the object method "name" in class "cl".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2533 * Returns NULL if the method is not found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2534 * The object method index is set in "idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2535 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2536 ufunc_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2537 object_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2538 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2539 ufunc_T *ret_fp = NULL;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2540 int ret_idx = -1;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2541 for (int i = 0; i < cl->class_obj_method_count; ++i)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2542 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2543 ufunc_T *fp = cl->class_obj_methods[i];
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2544 // Use a separate pointer to avoid that ASAN complains about
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2545 // uf_name[] only being 4 characters.
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2546 char_u *ufname = (char_u *)fp->uf_name;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2547 if (STRNCMP(name, ufname, namelen) == 0 && ufname[namelen] == NUL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2548 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2549 ret_fp = fp;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2550 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2551 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2552 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2553 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2554 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2555 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2556 return ret_fp;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2557 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2558
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2559 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2560 * Lookup a class or object member variable by name. If v_type is VAR_CLASS,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2561 * then lookup a class member variable and if it is VAR_OBJECT, then lookup a
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2562 * object member variable.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2563 *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2564 * Returns a pointer to the member variable structure if variable is found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2565 * Otherwise returns NULL. The member variable index is set in "*idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2566 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2567 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2568 member_lookup(
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2569 class_T *cl,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2570 vartype_T v_type,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2571 char_u *name,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2572 size_t namelen,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2573 int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2574 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2575 if (v_type == VAR_CLASS)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2576 return class_member_lookup(cl, name, namelen, idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2577 else
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2578 return object_member_lookup(cl, name, namelen, idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2579 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2580
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2581 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2582 * Lookup a class or object method by name. If v_type is VAR_CLASS, then
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2583 * lookup a class method and if it is VAR_OBJECT, then lookup a object method.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2584 *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2585 * Returns a pointer to the method structure if variable is found.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2586 * Otherwise returns NULL. The method variable index is set in "*idx".
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2587 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2588 ufunc_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2589 method_lookup(
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2590 class_T *cl,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2591 vartype_T v_type,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2592 char_u *name,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2593 size_t namelen,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2594 int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2595 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2596 if (v_type == VAR_CLASS)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2597 return class_method_lookup(cl, name, namelen, idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2598 else
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2599 return object_method_lookup(cl, name, namelen, idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2600 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2601
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2602 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2603 * Return TRUE if current context "cctx_arg" is inside class "cl".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2604 * Return FALSE if not.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2605 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2606 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2607 inside_class(cctx_T *cctx_arg, class_T *cl)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2608 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2609 for (cctx_T *cctx = cctx_arg; cctx != NULL; cctx = cctx->ctx_outer)
33204
36aebbf8389f patch 9.0.1880: Vim9: Need more tests for inheritance
Christian Brabandt <cb@256bit.org>
parents: 33201
diff changeset
2610 if (cctx->ctx_ufunc != NULL
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2611 && class_instance_of(cctx->ctx_ufunc->uf_class, cl))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2612 return TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2613 return FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2614 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2615
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2616 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2617 * Make a copy of an object.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2618 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2619 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2620 copy_object(typval_T *from, typval_T *to)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2621 {
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2622 if (from->vval.v_object == NULL)
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2623 to->vval.v_object = NULL;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2624 else
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2625 {
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2626 to->vval.v_object = from->vval.v_object;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2627 ++to->vval.v_object->obj_refcount;
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2628 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2629 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2630
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2631 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2632 * Free an object.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2633 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2634 static void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2635 object_clear(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2636 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2637 // Avoid a recursive call, it can happen if "obj" has a circular reference.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2638 obj->obj_refcount = INT_MAX;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2639
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2640 class_T *cl = obj->obj_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2641
32792
ba5a67216596 patch 9.0.1712: missing null check in object_clear()
Christian Brabandt <cb@256bit.org>
parents: 32772
diff changeset
2642 if (!cl)
33006
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
2643 return;
32792
ba5a67216596 patch 9.0.1712: missing null check in object_clear()
Christian Brabandt <cb@256bit.org>
parents: 32772
diff changeset
2644
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2645 // the member values are just after the object structure
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2646 typval_T *tv = (typval_T *)(obj + 1);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2647 for (int i = 0; i < cl->class_obj_member_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2648 clear_tv(tv + i);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2649
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2650 // Remove from the list headed by "first_object".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2651 object_cleared(obj);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2652
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2653 vim_free(obj);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2654 class_unref(cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2655 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2656
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2657 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2658 * Unreference an object.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2659 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2660 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2661 object_unref(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2662 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2663 if (obj != NULL && --obj->obj_refcount <= 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2664 object_clear(obj);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2665 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2666
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2667 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2668 * Make a copy of a class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2669 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2670 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2671 copy_class(typval_T *from, typval_T *to)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2672 {
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2673 if (from->vval.v_class == NULL)
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2674 to->vval.v_class = NULL;
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2675 else
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2676 {
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2677 to->vval.v_class = from->vval.v_class;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2678 ++to->vval.v_class->class_refcount;
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2679 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2680 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2681
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2682 /*
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2683 * Free the class "cl" and its contents.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2684 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2685 static void
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2686 class_free(class_T *cl)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2687 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2688 // Freeing what the class contains may recursively come back here.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2689 // Clear "class_name" first, if it is NULL the class does not need to
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2690 // be freed.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2691 VIM_CLEAR(cl->class_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2692
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2693 class_unref(cl->class_extends);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2694
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2695 for (int i = 0; i < cl->class_interface_count; ++i)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2696 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2697 vim_free(((char_u **)cl->class_interfaces)[i]);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2698 if (cl->class_interfaces_cl[i] != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2699 class_unref(cl->class_interfaces_cl[i]);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2700 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2701 vim_free(cl->class_interfaces);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2702 vim_free(cl->class_interfaces_cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2703
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2704 itf2class_T *next;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2705 for (itf2class_T *i2c = cl->class_itf2class; i2c != NULL; i2c = next)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2706 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2707 next = i2c->i2c_next;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2708 vim_free(i2c);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2709 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2710
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2711 for (int i = 0; i < cl->class_class_member_count; ++i)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2712 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2713 ocmember_T *m = &cl->class_class_members[i];
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2714 vim_free(m->ocm_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2715 vim_free(m->ocm_init);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2716 if (cl->class_members_tv != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2717 clear_tv(&cl->class_members_tv[i]);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2718 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2719 vim_free(cl->class_class_members);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2720 vim_free(cl->class_members_tv);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2721
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2722 for (int i = 0; i < cl->class_obj_member_count; ++i)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2723 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2724 ocmember_T *m = &cl->class_obj_members[i];
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2725 vim_free(m->ocm_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2726 vim_free(m->ocm_init);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2727 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2728 vim_free(cl->class_obj_members);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2729
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2730 for (int i = 0; i < cl->class_class_function_count; ++i)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2731 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2732 ufunc_T *uf = cl->class_class_functions[i];
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2733 func_clear_free(uf, FALSE);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2734 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2735 vim_free(cl->class_class_functions);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2736
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2737 for (int i = 0; i < cl->class_obj_method_count; ++i)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2738 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2739 ufunc_T *uf = cl->class_obj_methods[i];
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2740 func_clear_free(uf, FALSE);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2741 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2742 vim_free(cl->class_obj_methods);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2743
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2744 clear_type_list(&cl->class_type_list);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2745
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2746 class_cleared(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2747
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2748 vim_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2749 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2750
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2751 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2752 * Unreference a class. Free it when the reference count goes down to zero.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2753 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2754 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2755 class_unref(class_T *cl)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2756 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2757 if (cl != NULL && --cl->class_refcount <= 0 && cl->class_name != NULL)
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2758 class_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2759 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2760
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2761 /*
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2762 * Go through the list of all classes and free items without "copyID".
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2763 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2764 int
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2765 class_free_nonref(int copyID)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2766 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2767 int did_free = FALSE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2768
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2769 for (class_T *cl = first_class; cl != NULL; cl = next_nonref_class)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2770 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2771 next_nonref_class = cl->class_next_used;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2772 if ((cl->class_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2773 {
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2774 // Free the class and items it contains.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2775 class_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2776 did_free = TRUE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2777 }
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2778 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2779
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2780 next_nonref_class = NULL;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2781 return did_free;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2782 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2783
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2784 int
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2785 set_ref_in_classes(int copyID)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2786 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2787 for (class_T *cl = first_class; cl != NULL; cl = cl->class_next_used)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2788 set_ref_in_item_class(cl, copyID, NULL, NULL);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2789
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2790 return FALSE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2791 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2792
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2793 static object_T *first_object = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2794
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2795 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2796 * Call this function when an object has been created. It will be added to the
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2797 * list headed by "first_object".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2798 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2799 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2800 object_created(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2801 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2802 if (first_object != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2803 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2804 obj->obj_next_used = first_object;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2805 first_object->obj_prev_used = obj;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2806 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2807 first_object = obj;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2808 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2809
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2810 static object_T *next_nonref_obj = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2811
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2812 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2813 * Call this function when an object has been cleared and is about to be freed.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2814 * It is removed from the list headed by "first_object".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2815 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2816 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2817 object_cleared(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2818 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2819 if (obj->obj_next_used != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2820 obj->obj_next_used->obj_prev_used = obj->obj_prev_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2821 if (obj->obj_prev_used != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2822 obj->obj_prev_used->obj_next_used = obj->obj_next_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2823 else if (first_object == obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2824 first_object = obj->obj_next_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2825
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2826 // update the next object to check if needed
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2827 if (obj == next_nonref_obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2828 next_nonref_obj = obj->obj_next_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2829 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2830
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2831 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2832 * Go through the list of all objects and free items without "copyID".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2833 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2834 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2835 object_free_nonref(int copyID)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2836 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2837 int did_free = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2838
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2839 for (object_T *obj = first_object; obj != NULL; obj = next_nonref_obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2840 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2841 next_nonref_obj = obj->obj_next_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2842 if ((obj->obj_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2843 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2844 // Free the object and items it contains.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2845 object_clear(obj);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2846 did_free = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2847 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2848 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2849
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2850 next_nonref_obj = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2851 return did_free;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2852 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2853
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2854 /*
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2855 * Echo a class or object method not found message.
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2856 */
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2857 void
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2858 method_not_found_msg(class_T *cl, vartype_T v_type, char_u *name, size_t len)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2859 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2860 char_u *method_name = vim_strnsave(name, len);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2861 if ((v_type == VAR_OBJECT)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2862 && (class_method_idx(cl, name, len) >= 0))
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2863 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2864 // If this is a class method, then give a different error
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2865 if (*name == '_')
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2866 semsg(_(e_cannot_access_private_method_str), method_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2867 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2868 semsg(_(e_class_method_str_accessible_only_using_class_str),
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2869 method_name, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2870 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2871 else if ((v_type == VAR_CLASS)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2872 && (object_method_idx(cl, name, len) >= 0))
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2873 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2874 // If this is an object method, then give a different error
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2875 if (*name == '_')
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2876 semsg(_(e_cannot_access_private_method_str), method_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2877 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2878 semsg(_(e_object_method_str_accessible_only_using_object_str),
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2879 method_name, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2880 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2881 else
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2882 semsg(_(e_method_not_found_on_class_str_str), cl->class_name,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2883 method_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2884 vim_free(method_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2885 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2886
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2887 /*
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2888 * Echo a class or object member not found message.
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2889 */
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2890 void
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2891 member_not_found_msg(class_T *cl, vartype_T v_type, char_u *name, size_t len)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2892 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2893 char_u *varname = len ? vim_strnsave(name, len) : vim_strsave(name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2894
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2895 if (v_type == VAR_OBJECT)
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2896 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2897 if (class_member_idx(cl, name, len) >= 0)
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2898 semsg(_(e_class_variable_str_accessible_only_using_class_str),
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2899 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2900 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2901 semsg(_(e_variable_not_found_on_object_str_str), cl->class_name,
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2902 varname);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2903 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2904 else
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2905 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2906 if (object_member_idx(cl, name, len) >= 0)
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2907 semsg(_(e_object_variable_str_accessible_only_using_object_str),
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2908 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2909 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
2910 semsg(_(e_class_variable_str_not_found_in_class_str),
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2911 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2912 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2913 vim_free(varname);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2914 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2915
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2916 /*
33006
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
2917 * Return TRUE when the class "cl", its base class or one of the implemented
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
2918 * interfaces matches the class "other_cl".
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2919 */
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2920 int
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2921 class_instance_of(class_T *cl, class_T *other_cl)
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2922 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2923 if (cl == other_cl)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2924 return TRUE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2925
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2926 // Recursively check the base classes.
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2927 for (; cl != NULL; cl = cl->class_extends)
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2928 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2929 if (cl == other_cl)
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2930 return TRUE;
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2931 // Check the implemented interfaces and the super interfaces
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2932 for (int i = cl->class_interface_count - 1; i >= 0; --i)
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
2933 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2934 class_T *intf = cl->class_interfaces_cl[i];
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2935 while (intf != NULL)
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
2936 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2937 if (intf == other_cl)
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2938 return TRUE;
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2939 // check the super interfaces
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2940 intf = intf->class_extends;
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
2941 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
2942 }
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2943 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2944
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2945 return FALSE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2946 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2947
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2948 /*
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2949 * "instanceof(object, classinfo)" function
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2950 */
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2951 void
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2952 f_instanceof(typval_T *argvars, typval_T *rettv)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2953 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2954 typval_T *object_tv = &argvars[0];
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2955 typval_T *classinfo_tv = &argvars[1];
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2956 listitem_T *li;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2957
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2958 rettv->vval.v_number = VVAL_FALSE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2959
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2960 if (check_for_object_arg(argvars, 0) == FAIL
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2961 || check_for_class_or_list_arg(argvars, 1) == FAIL)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2962 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2963
33291
4cb421ba3385 patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents: 33286
diff changeset
2964 if (object_tv->vval.v_object == NULL)
4cb421ba3385 patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents: 33286
diff changeset
2965 return;
4cb421ba3385 patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents: 33286
diff changeset
2966
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2967 if (classinfo_tv->v_type == VAR_LIST)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2968 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2969 FOR_ALL_LIST_ITEMS(classinfo_tv->vval.v_list, li)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2970 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2971 if (li->li_tv.v_type != VAR_CLASS)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2972 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2973 emsg(_(e_class_required));
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2974 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2975 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2976
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2977 if (class_instance_of(object_tv->vval.v_object->obj_class,
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2978 li->li_tv.vval.v_class) == TRUE)
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2979 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2980 rettv->vval.v_number = VVAL_TRUE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2981 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2982 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2983 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2984 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2985 else if (classinfo_tv->v_type == VAR_CLASS)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2986 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2987 rettv->vval.v_number = class_instance_of(object_tv->vval.v_object->obj_class,
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
2988 classinfo_tv->vval.v_class);
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2989 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
2990 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2991
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2992 #endif // FEAT_EVAL