annotate src/vim9class.c @ 33879:d418c82f02a4 v9.0.2149

patch 9.0.2149: [security]: use-after-free in exec_instructions() Commit: https://github.com/vim/vim/commit/5dd41d4b6370b7b7d09d691f9252b3899c66102a Author: Christian Brabandt <cb@256bit.org> Date: Mon Dec 4 22:52:23 2023 +0100 patch 9.0.2149: [security]: use-after-free in exec_instructions() Problem: [security]: use-after-free in exec_instructions() Solution: get tv pointer again [security]: use-after-free in exec_instructions() exec_instructions may access freed memory, if the GA_GROWS_FAILS() re-allocates memory. When this happens, the typval tv may still point to now already freed memory. So let's get that pointer again and compare it with tv. If those two pointers differ, tv is now invalid and we have to refresh the tv pointer. closes: #13621 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Dec 2023 15:16:17 +0100
parents 354e92c641ba
children ccdb948c7273
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 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
559 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
560 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
561 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
562 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
563
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
564 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
565 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
566 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
567 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
568
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
569 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
570 continue;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
571
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
572 // 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
573 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
574 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
575 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
576 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
577 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
578 }
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 // 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
581 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
582 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
583 // 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
584 // interface.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
585 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
586 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
587 else
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
588 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
589 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
590 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
591 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
592 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
593 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
594 }
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 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
597 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
598 }
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 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
601 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
602 int ext_cl_count = extends_cl->class_obj_member_count;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
603 ocmember_T *ext_cl_mt = extends_cl->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
604 return intf_variable_present(intf_class_name, if_var,
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
605 ext_cl_mt, ext_cl_count,
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
606 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
607 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
608
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 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
610 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
611
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
612 /*
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
613 * Check the variables of the interface class "ifcl" match object variables
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
614 * ("objmembers_gap") of a class.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
615 * Returns TRUE if the object variables names are valid.
33278
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 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
618 validate_interface_variables(
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
619 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
620 class_T *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
621 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
622 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
623 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
624 int if_count = ifcl->class_obj_member_count;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
625 if (if_count == 0)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
626 return TRUE;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
627
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
628 ocmember_T *if_ms = ifcl->class_obj_members;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
629 ocmember_T *cl_ms = (ocmember_T *)(objmembers_gap->ga_data);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
630 int cl_count = objmembers_gap->ga_len;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
631 for (int if_i = 0; if_i < if_count; ++if_i)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
632 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
633 if (!intf_variable_present(intf_class_name, &if_ms[if_i], cl_ms,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
634 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
635 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
636 semsg(_(e_variable_str_of_interface_str_not_implemented),
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
637 if_ms[if_i].ocm_name, intf_class_name);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
638 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
639 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
640 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
641
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
642 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
643 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
644
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
645 /*
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
646 * 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
647 */
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
648 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
649 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
650 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
651 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
652
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
653 // 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
654 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
655 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
656 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
657 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
658 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
659
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
660 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
661 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
662
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
663 /*
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
664 * 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
665 * 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
666 * 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
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 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
669 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
670 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
671 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
672 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
673 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
674 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
675 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
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 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
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 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
680 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
681 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
682 // 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
683 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
684 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
685 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
686 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
687 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
688 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
689
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
690 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
691 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
692 ufunc_T **ext_cl_fp = (ufunc_T **)(extends_cl->class_obj_methods);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
693 int ext_cl_count = extends_cl->class_obj_method_count;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
694 return intf_method_present(if_ufunc, ext_cl_fp, ext_cl_count,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
695 extends_cl->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
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
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
698 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
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
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
701 /*
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
702 * 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
703 * 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
704 * 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
705 * types.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
706 * 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
707 * the new class.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
708 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
709 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
710 validate_interface_methods(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
711 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
712 class_T *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
713 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
714 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
715 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
716 int if_count = ifcl->class_obj_method_count;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
717 if (if_count == 0)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
718 return TRUE;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
719
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
720 ufunc_T **if_fp = ifcl->class_obj_methods;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
721 ufunc_T **cl_fp = (ufunc_T **)(objmethods_gap->ga_data);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
722 int cl_count = objmethods_gap->ga_len;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
723 for (int if_i = 0; if_i < if_count; ++if_i)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
724 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
725 char_u *if_name = if_fp[if_i]->uf_name;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
726
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
727 if (!intf_method_present(if_fp[if_i], cl_fp, 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
728 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
729 semsg(_(e_method_str_of_interface_str_not_implemented),
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
730 if_name, intf_class_name);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
731 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
732 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
733 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
734
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
735 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
736 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
737
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
738 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
739 * 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
740 * 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
741 * 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
742 * "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
743 * "objmembers_gap" respectively.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
744 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
745 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
746 validate_implements_classes(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
747 garray_T *impl_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
748 class_T **intf_classes,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
749 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
750 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
751 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
752 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
753 int success = TRUE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
754
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
755 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
756 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
757 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
758 typval_T tv;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
759 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
760 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
761 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
762 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
763 success = FALSE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
764 break;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
765 }
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 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
768 || 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
769 || (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
770 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
771 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
772 success = FALSE;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
773 clear_tv(&tv);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
774 break;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
775 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
776
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
777 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
778 intf_classes[i] = ifcl;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
779 ++ifcl->class_refcount;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
780
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
781 // check the variables of the interface match the members of the class
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
782 success = validate_interface_variables(impl, ifcl, objmembers_gap,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
783 extends_cl);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
784
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
785 // 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
786 // 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
787 if (success)
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
788 success = validate_interface_methods(impl, ifcl, objmethods_gap,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
789 extends_cl);
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
790 clear_tv(&tv);
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
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
793 return success;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
794 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
795
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
796 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
797 * 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
798 * (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
799 * to check them.)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
800 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
801 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
802 check_func_arg_names(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
803 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
804 garray_T *objmethods_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
805 garray_T *classmembers_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
806 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
807 // 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
808 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
809 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
810 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
811
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
812 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
813 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
814 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
815
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
816 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
817 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
818 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
819 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
820
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
821 // 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
822 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
823 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
824 char_u *mname =
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
825 ((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
826 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
827 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
828 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
829 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
830
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
831 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
832 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
833
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
834 return FALSE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
835 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
836 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
837 }
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 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
840
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
841 return TRUE;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
842 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
843
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
844 /*
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
845 * 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
846 */
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
847 static int
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
848 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
849 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
850 int reserved = FALSE;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
851 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
852 *varname_end = NUL;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
853
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
854 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
855
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
856 *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
857
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
858 return reserved;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
859 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
860
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
861 /*
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
862 * 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
863 * 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
864 */
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
865 static int
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
866 is_duplicate_variable(
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
867 garray_T *class_members,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
868 garray_T *obj_members,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
869 char_u *varname,
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
870 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
871 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
872 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
873 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
874 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
875
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
876 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
877 {
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
878 // 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
879 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
880 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
881 {
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
882 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
883 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
884 : m->ocm_name;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
885 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
886 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
887 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
888 dup = TRUE;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
889 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
890 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
891 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
892 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
893
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
894 vim_free(name);
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
895 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
896 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
897
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
898 /*
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
899 * 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
900 */
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
901 static int
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
902 is_duplicate_method(
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
903 garray_T *classmethods_gap,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
904 garray_T *objmethods_gap,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
905 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
906 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
907 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
908
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
909 // 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
910 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
911 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
912 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
913 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
914 {
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
915 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
916 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
917 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
918 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
919 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
920 return TRUE;
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
921 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
922 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
923 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
924
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
925 return FALSE;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
926 }
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
927
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
928 /*
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
929 * 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
930 */
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
931 static int
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
932 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
933 {
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
934 // 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
935 if (is_abstract)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
936 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
937 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
938 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
939 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
940 // 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
941 if (has_static)
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
942 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
943 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
944 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
945 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
946 // 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
947 // constructor method.
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
948 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
949 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
950 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
951 return FALSE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
952 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
953 return TRUE;
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
954 }
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
955
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
956 /*
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
957 * 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
958 * 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
959 * 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
960 * 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
961 * 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
962 * 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
963 */
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
964 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
965 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
966 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
967 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
968 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
969 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
970 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
971 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
972 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
973
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
974 // 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
975 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
976 + 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
977 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
978 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
979 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
980 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
981 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
982 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
983
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
984 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
985 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
986 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
987 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
988 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
989 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
990 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
991 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
992 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
993 }
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
994 }
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
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 // 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
997 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
998 + 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
999 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
1000 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
1001 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
1002 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
1003 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
1004 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
1005
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1006 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
1007 {
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 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
1009 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
1010 {
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 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
1012 ((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
1013 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1014 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
1015 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
1016 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
1017 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
1018 }
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 }
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
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 // 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
1022 // 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
1023 // 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
1024 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
1025 {
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1026 // 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
1027 // 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
1028 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
1029 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1030 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
1031 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
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 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
1034 {
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
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1036 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
1037 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
1038 {
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 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
1040 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
1041 == 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
1042 {
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 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
1044 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
1045 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
1046 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
1047 }
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 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
1050 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
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 }
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
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 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
1055 {
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 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
1057 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
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 }
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 }
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
5fd9fe58c791 patch 9.0.1737: Calling a base class method through an extended class fails
Christian Brabandt <cb@256bit.org>
parents: 32812
diff changeset
1062 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
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
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 /*
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1066 * 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
1067 * interface class.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1068 * 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
1069 * 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
1070 * 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
1071 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1072 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1073 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
1074 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1075 // 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
1076 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
1077 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1078 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
1079
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1080 // 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
1081 // interfaces.
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1082 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
1083 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1084 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
1085 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
1086 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
1087 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
1088 }
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1089 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1090
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1091 // 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
1092 if (extends_cl != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1093 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1094 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
1095 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
1096
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1097 // 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
1098 while (pclass != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1099 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1100 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
1101 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
1102 return FAIL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1103
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1104 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
1105 pclass = pclass->class_extends;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1106 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1107 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1108
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1109 return OK;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1110 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1111
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1112 /*
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1113 * 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
1114 * and initialize it.
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 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
1117 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
1118 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1119 // 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
1120 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
1121 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
1122 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
1123 return;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1124
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1125 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
1126 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1127 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
1128 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
1129 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
1130 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1131 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
1132 if (etv != NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1133 {
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1134 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
1135 && !m->ocm_has_type
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1136 && 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
1137 // 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
1138 // 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
1139 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
1140 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
1141 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
1142 *tv = *etv;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1143 vim_free(etv);
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 else
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1147 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1148 // TODO: proper default value
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1149 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
1150 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
1151 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1152 }
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
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1155 /*
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1156 * 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
1157 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1158 static void
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1159 add_default_constructor(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1160 class_T *cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1161 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1162 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
1163 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1164 garray_T fga;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1165
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1166 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
1167 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
1168 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
1169 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1170 if (i > 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1171 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
1172 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
1173 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
1174 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
1175 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
1176 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1177 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
1178 ga_append(&fga, NUL);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1179
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1180 exarg_T fea;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1181 CLEAR_FIELD(fea);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1182 fea.cmdidx = CMD_def;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1183 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
1184
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1185 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
1186 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
1187
33326
4e531adb3fac patch 9.0.1928: Vim9: constructor type checking bug
Christian Brabandt <cb@256bit.org>
parents: 33297
diff changeset
1188 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
1189 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
1190
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1191 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
1192 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
1193
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1194 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
1195 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1196 ((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
1197 = nf;
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1198 ++classfunctions_gap->ga_len;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1199
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1200 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
1201 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
1202 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
1203 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1204 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
1205 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
1206 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
1207 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
1208 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1209 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1210 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1211
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1212 /*
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1213 * 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
1214 * 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
1215 * parent class also.
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1216 */
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1217 static int
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1218 add_classfuncs_objmethods(
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1219 class_T *cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1220 class_T *extends_cl,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1221 garray_T *classfunctions_gap,
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1222 garray_T *objmethods_gap)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1223 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1224 // 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
1225 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
1226 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1227 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
1228 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
1229 : &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
1230 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
1231 : &cl->class_obj_methods;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1232
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1233 int parent_count = 0;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1234 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
1235 // 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
1236 // 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
1237 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
1238 ? 0
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1239 : 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
1240
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1241 *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
1242 if (*fcount == 0)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1243 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1244 *fup = NULL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1245 continue;
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 *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
1248 if (*fup == NULL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1249 return FAIL;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1250
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1251 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
1252 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
1253 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
1254 if (loop == 1)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1255 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
1256 else
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1257 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
1258
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1259 if (loop == 2)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1260 {
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1261 // 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
1262
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1263 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
1264 {
33268
e231b9af0f44 patch 9.0.1902: Vim9: Coverity complains about dead code
Christian Brabandt <cb@256bit.org>
parents: 33260
diff changeset
1265 // 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
1266 // 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
1267 // 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
1268 // 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
1269 // 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
1270 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
1271 (*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
1272
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1273 // 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
1274 // 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
1275 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
1276 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
1277 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1278 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
1279 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
1280 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
1281 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1282 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
1283 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
1284 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
1285 (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
1286 TRUE, where);
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1287 }
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 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1290 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1291
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1292 // 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
1293 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
1294 {
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1295 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
1296 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
1297 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
1298 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
1299 if (loop == 2)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1300 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
1301 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1302 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1303
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1304 return OK;
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1305 }
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1306
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1307 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1308 * Handle ":class" and ":abstract class" up to ":endclass".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1309 * Handle ":interface" up to ":endinterface".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1310 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1311 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1312 ex_class(exarg_T *eap)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1313 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1314 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
1315 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
1316 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
1317 int is_abstract = eap->cmdidx == CMD_abstract;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1318
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1319 if (is_abstract)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1320 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1321 if (STRNCMP(arg, "class", 5) != 0 || !VIM_ISWHITE(arg[5]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1322 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1323 semsg(_(e_invalid_argument_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1324 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1325 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1326 arg = skipwhite(arg + 5);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1327 is_class = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1328 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1329
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1330 if (!current_script_is_vim9()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1331 || (cmdmod.cmod_flags & CMOD_LEGACY)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1332 || !getline_equal(eap->getline, eap->cookie, getsourceline))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1333 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1334 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1335 emsg(_(e_class_can_only_be_defined_in_vim9_script));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1336 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1337 emsg(_(e_interface_can_only_be_defined_in_vim9_script));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1338 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1339 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1340
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1341 if (!ASCII_ISUPPER(*arg))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1342 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1343 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1344 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
1345 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1346 semsg(_(e_interface_name_must_start_with_uppercase_letter_str),
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1347 arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1348 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1349 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1350 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
1351 if (!IS_WHITE_OR_NUL(*name_end))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1352 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1353 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1354 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1355 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1356 char_u *name_start = arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1357
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1358 // "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
1359 // for the items inside the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1360 int class_export = is_export;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1361 is_export = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1362
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1363 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1364 // generics: <Tkey, Tentry>
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1365
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1366 // Name for "extends BaseClass"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1367 char_u *extends = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1368
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1369 // Names for "implements SomeInterface"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1370 garray_T ga_impl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1371 ga_init2(&ga_impl, sizeof(char_u *), 5);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1372
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1373 arg = skipwhite(name_end);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1374 while (*arg != NUL && *arg != '#' && *arg != '\n')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1375 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1376 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1377 // specifies SomeInterface
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1378 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
1379 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1380 if (extends != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1381 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1382 emsg(_(e_duplicate_extends));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1383 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1384 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1385 arg = skipwhite(arg + 7);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1386 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
1387 if (!IS_WHITE_OR_NUL(*end))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1388 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1389 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1390 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1391 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1392 extends = vim_strnsave(arg, end - arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1393 if (extends == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1394 goto early_ret;
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 arg = skipwhite(end + 1);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1397 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1398 else if (STRNCMP(arg, "implements", 10) == 0
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1399 && IS_WHITE_OR_NUL(arg[10]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1400 {
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1401 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
1402 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1403 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
1404 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
1405 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1406
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1407 if (ga_impl.ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1408 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1409 emsg(_(e_duplicate_implements));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1410 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1411 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1412 arg = skipwhite(arg + 10);
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 for (;;)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1415 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1416 char_u *impl_end = find_name_end(arg, NULL, NULL,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1417 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
1418 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
1419 || (*impl_end == ','
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1420 && !IS_WHITE_OR_NUL(*(impl_end + 1))))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1421 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1422 semsg(_(e_white_space_required_after_name_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1423 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1424 }
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1425 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
1426 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1427 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
1428 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
1429 }
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1430
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1431 char_u *iname = vim_strnsave(arg, impl_end - arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1432 if (iname == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1433 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1434 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1435 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
1436 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1437 semsg(_(e_duplicate_interface_after_implements_str),
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1438 iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1439 vim_free(iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1440 goto early_ret;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1441 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1442 if (ga_add_string(&ga_impl, iname) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1443 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1444 vim_free(iname);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1445 goto early_ret;
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 if (*impl_end != ',')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1448 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1449 arg = skipwhite(impl_end);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1450 break;
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 arg = skipwhite(impl_end + 1);
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 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1455 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1456 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1457 semsg(_(e_trailing_characters_str), arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1458 early_ret:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1459 vim_free(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1460 ga_clear_strings(&ga_impl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1461 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1462 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1463 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1464
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1465 garray_T type_list; // list of pointers to allocated types
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1466 ga_init2(&type_list, sizeof(type_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1467
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1468 // Growarray with class members declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1469 garray_T classmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1470 ga_init2(&classmembers, sizeof(ocmember_T), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1471
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1472 // Growarray with functions declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1473 garray_T classfunctions;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1474 ga_init2(&classfunctions, sizeof(ufunc_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1475
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1476 // Growarray with object members declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1477 garray_T objmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1478 ga_init2(&objmembers, sizeof(ocmember_T), 10);
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 // Growarray with object methods declared in the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1481 garray_T objmethods;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1482 ga_init2(&objmethods, sizeof(ufunc_T *), 10);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1483
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 * 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
1486 * "endinterface" is found.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1487 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1488 char_u *theline = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1489 int success = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1490 for (;;)
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 vim_free(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1493 theline = eap->getline(':', eap->cookie, 0, GETLINE_CONCAT_ALL);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1494 if (theline == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1495 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1496 char_u *line = skipwhite(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1497
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1498 // Skip empty and comment lines.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1499 if (*line == NUL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1500 continue;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1501 if (*line == '#')
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 if (vim9_bad_comment(line))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1504 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1505 continue;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1506 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1507
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1508 char_u *p = line;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1509 char *end_name = is_class ? "endclass" : "endinterface";
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1510 if (checkforcmd(&p, end_name, is_class ? 4 : 5))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1511 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1512 if (STRNCMP(line, end_name, is_class ? 8 : 12) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1513 semsg(_(e_command_cannot_be_shortened_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1514 else if (*p == '|' || !ends_excmd2(line, p))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1515 semsg(_(e_trailing_characters_str), p);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1516 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1517 success = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1518 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1519 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1520 char *wrong_name = is_class ? "endinterface" : "endclass";
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1521 if (checkforcmd(&p, wrong_name, is_class ? 5 : 4))
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 semsg(_(e_invalid_command_str_expected_str), line, end_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1524 break;
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
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1527 int has_public = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1528 if (checkforcmd(&p, "public", 3))
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 if (STRNCMP(line, "public", 6) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1531 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1532 semsg(_(e_command_cannot_be_shortened_str), line);
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 }
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1535 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
1536 {
33385
b5ad84fdc702 patch 9.0.1951: Vim9: hard to debug vim9_class errors from CI
Christian Brabandt <cb@256bit.org>
parents: 33381
diff changeset
1537 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
1538 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1539 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1540 has_public = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1541 p = skipwhite(line + 6);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1542
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1543 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
1544 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1545 emsg(_(e_public_must_be_followed_by_this_or_static));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1546 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1547 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1548 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1549
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1550 int abstract_method = FALSE;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1551 char_u *pa = p;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1552 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
1553 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1554 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
1555 {
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1556 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
1557 break;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1558 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1559
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1560 if (!is_class)
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1561 {
33700
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1562 // "abstract" not supported in an interface
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1563 emsg(_(e_abstract_cannot_be_used_in_interface));
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1564 break;
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1565 }
33700
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1566
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1567 if (!is_abstract)
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1568 {
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1569 semsg(_(e_abstract_method_in_concrete_class), pa);
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1570 break;
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1571 }
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1572
33708
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1573 p = skipwhite(pa + 8);
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1574 if (STRNCMP(p, "def", 3) != 0)
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1575 {
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1576 emsg(_(e_abstract_must_be_followed_by_def));
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1577 break;
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1578 }
b076a133faf9 patch 9.0.2088: Vim9: still allows abstract static methods
Christian Brabandt <cb@256bit.org>
parents: 33704
diff changeset
1579
33700
275617cdd99f patch 9.0.2085: Vim9: abstract can be used in interface
Christian Brabandt <cb@256bit.org>
parents: 33698
diff changeset
1580 abstract_method = TRUE;
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1581 }
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1582
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1583 int has_static = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1584 char_u *ps = p;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1585 if (checkforcmd(&p, "static", 4))
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 if (STRNCMP(ps, "static", 6) != 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1588 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1589 semsg(_(e_command_cannot_be_shortened_str), ps);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1590 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1591 }
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1592
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1593 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
1594 {
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1595 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
1596 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1597 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1598 has_static = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1599 p = skipwhite(ps + 6);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1600 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1601
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1602 // object members (public, read access, private):
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1603 // "this._varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1604 // "this.varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1605 // "public this.varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1606 if (STRNCMP(p, "this", 4) == 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1607 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1608 if (p[4] != '.' || !eval_isnamec1(p[5]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1609 {
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
1610 semsg(_(e_invalid_object_variable_declaration_str), p);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1611 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1612 }
33047
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1613 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
1614 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1615 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
1616 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1617 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1618 char_u *varname = p + 5;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1619 char_u *varname_end = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1620 type_T *type = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1621 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
1622 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
1623
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1624 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
1625 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1626 // private variables are not supported in an interface
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
1627 semsg(_(e_protected_variable_not_supported_in_interface),
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1628 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
1629 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1630 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1631
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1632 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
1633 &varname_end, &has_type, &type_list, &type,
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1634 is_class ? &init_expr: NULL) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1635 break;
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1636 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
1637 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1638 vim_free(init_expr);
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1639 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1640 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1641 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
1642 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
1643 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1644 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
1645 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1646 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1647 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
1648 has_public, has_type, type, init_expr) == FAIL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1649 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1650 vim_free(init_expr);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1651 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1652 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1653 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1654
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1655 // constructors:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1656 // def new()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1657 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1658 // def newOther()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1659 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1660 // object methods and class functions:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1661 // def SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1662 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1663 // static def ClassFunction()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1664 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1665 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1666 // def <Tval> someMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1667 // enddef
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1668 else if (checkforcmd(&p, "def", 3))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1669 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1670 exarg_T ea;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1671 garray_T lines_to_free;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1672
33372
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1673 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
1674 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1675 // "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
1676 // class method
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1677 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
1678 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1679 }
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1680
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1681 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
1682 {
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1683 // 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
1684 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
1685 break;
3e9a91624b40 patch 9.0.1945: Vim9: missing support for ro-vars in interface
Christian Brabandt <cb@256bit.org>
parents: 33343
diff changeset
1686 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1687
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1688 CLEAR_FIELD(ea);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1689 ea.cmd = line;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1690 ea.arg = p;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1691 ea.cmdidx = CMD_def;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1692 ea.getline = eap->getline;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1693 ea.cookie = eap->cookie;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1694
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1695 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
1696 int class_flags;
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1697 if (is_class)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1698 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
1699 else
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1700 class_flags = CF_INTERFACE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1701 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
1702 class_flags, objmembers.ga_data, objmembers.ga_len);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1703 ga_clear_strings(&lines_to_free);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1704
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1705 if (uf != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1706 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
1707 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
1708 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
1709
33278
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1710 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
1711 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1712 // private variables are not supported in an interface
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
1713 semsg(_(e_protected_method_not_supported_in_interface),
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
1714 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
1715 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
1716 break;
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1717 }
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1718 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
1719 has_static))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1720 {
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
1721 func_clear_free(uf, FALSE);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1722 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1723 }
33068
d42927c6e556 patch 9.0.1821: Vim9 constructors are always static
Christian Brabandt <cb@256bit.org>
parents: 33047
diff changeset
1724
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1725 // 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
1726 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
1727 {
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1728 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
1729 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
1730 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
1731 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1732
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1733 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
1734 ? &classfunctions : &objmethods;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1735 if (ga_grow(fgap, 1) == OK)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1736 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1737 if (is_new)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1738 uf->uf_flags |= FC_NEW;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1739
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1740 if (abstract_method)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1741 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
1742
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1743 ((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1744 ++fgap->ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1745 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1746 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1747 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1748
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1749 // class members
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1750 else if (has_static)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1751 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1752 // class members (public, read access, private):
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1753 // "static _varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1754 // "static varname"
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1755 // "public static varname"
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1756 char_u *varname = p;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1757 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
1758 int has_type = FALSE;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1759 type_T *type = NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
1760 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
1761
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1762 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
1763 &varname_end, &has_type, &type_list, &type,
33806
354e92c641ba patch 9.0.2119: remove dead-condition in ex_class
Christian Brabandt <cb@256bit.org>
parents: 33738
diff changeset
1764 &init_expr) == FAIL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1765 break;
33381
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1766 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
1767 {
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1768 vim_free(init_expr);
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1769 break;
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1770 }
17301c641749 patch 9.0.1949: Vim9: allows reserved keywords as members
Christian Brabandt <cb@256bit.org>
parents: 33372
diff changeset
1771 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
1772 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
1773 {
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1774 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
1775 break;
9ef43d02dd8f patch 9.0.1814: Vim9 no error on duplicate object member var
Christian Brabandt <cb@256bit.org>
parents: 33025
diff changeset
1776 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1777 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
1778 has_public, has_type, type, init_expr) == FAIL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1779 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1780 vim_free(init_expr);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1781 break;
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 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1786 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1787 if (is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1788 semsg(_(e_not_valid_command_in_class_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1789 else
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1790 semsg(_(e_not_valid_command_in_interface_str), line);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1791 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1792 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1793 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1794 vim_free(theline);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1795
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1796 class_T *extends_cl = NULL; // class from "extends" argument
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1797
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1798 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1799 * Check a few things before defining the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1800 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1801
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1802 // Check the "extends" class is valid.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1803 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
1804 success = validate_extends_class(extends, &extends_cl, is_class);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1805 VIM_CLEAR(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1806
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1807 // 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
1808 // 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
1809 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
1810 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
1811
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1812 // 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
1813 // 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
1814 // 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
1815 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
1816 {
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1817 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
1818 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
1819 else
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
1820 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
1821 }
33070
8362975375a4 patch 9.0.1822: Vim9: no check for duplicate members in extended classes
Christian Brabandt <cb@256bit.org>
parents: 33068
diff changeset
1822
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1823 // 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
1824 // 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
1825 // 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
1826 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
1827 && (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
1828 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
1829 &objmethods, extends_cl);
33217
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1830
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1831 class_T **intf_classes = NULL;
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 // Check all "implements" entries are valid.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1834 if (success && ga_impl.ga_len > 0)
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 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
1837
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1838 success = validate_implements_classes(&ga_impl, intf_classes,
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
1839 &objmethods, &objmembers, extends_cl);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1840 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1841
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1842 // 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
1843 if (success)
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1844 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
1845 &classmembers);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1846
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1847 class_T *cl = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1848 if (success)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1849 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1850 // "endclass" encountered without failures: Create the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1851
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1852 cl = ALLOC_CLEAR_ONE(class_T);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1853 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1854 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1855 if (!is_class)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1856 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
1857 else if (is_abstract)
499ba27ba0f6 patch 9.0.1885: Vim9: no support for abstract methods
Christian Brabandt <cb@256bit.org>
parents: 33211
diff changeset
1858 cl->class_flags = CLASS_ABSTRACT;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1859
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1860 cl->class_refcount = 1;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1861 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
1862 if (cl->class_name == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1863 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1864
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1865 if (extends_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1866 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1867 cl->class_extends = extends_cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1868 extends_cl->class_flags |= CLASS_EXTENDED;
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
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1871 // Add class and object variables to "cl".
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1872 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
1873 NULL,
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
1874 0,
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1875 &cl->class_class_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1876 &cl->class_class_member_count) == FAIL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1877 || add_members_to_class(&objmembers,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1878 extends_cl == NULL ? NULL
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1879 : extends_cl->class_obj_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1880 extends_cl == NULL ? 0
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1881 : extends_cl->class_obj_member_count,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1882 &cl->class_obj_members,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1883 &cl->class_obj_member_count) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1884 goto cleanup;
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 if (ga_impl.ga_len > 0)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1887 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1888 // Move the "implements" names into the class.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1889 cl->class_interface_count = ga_impl.ga_len;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1890 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
1891 if (cl->class_interfaces == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1892 goto cleanup;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1893 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1894 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
1895 VIM_CLEAR(ga_impl.ga_data);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1896 ga_impl.ga_len = 0;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1897
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1898 cl->class_interfaces_cl = intf_classes;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1899 intf_classes = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1900 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1901
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1902 if (cl->class_interface_count > 0 || extends_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1903 {
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1904 // 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
1905 // classes.
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1906 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
1907 goto cleanup;
32670
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
32896
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1910 // 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
1911 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
1912 add_class_members(cl, eap, &type_list);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1913
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1914 int have_new = FALSE;
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1915 ufunc_T *class_func = NULL;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1916 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
1917 {
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1918 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
1919 if (STRCMP(class_func->uf_name, "new") == 0)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1920 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1921 have_new = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1922 break;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1923 }
32903
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1924 }
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1925
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1926 if (have_new)
54c01bb98b8e patch 9.0.1760: vim9 class problem with new() constructor
Christian Brabandt <cb@256bit.org>
parents: 32896
diff changeset
1927 // 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
1928 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
1929 else if (is_class && !is_abstract && !have_new)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1930 // 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
1931 add_default_constructor(cl, &classfunctions, &type_list);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1932
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1933 // 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
1934 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
1935 &objmethods) == FAIL)
223765c87ea9 patch 9.0.1757: ex_class() function is too long
Christian Brabandt <cb@256bit.org>
parents: 32874
diff changeset
1936 goto cleanup;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1937
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1938 cl->class_type.tt_type = VAR_CLASS;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1939 cl->class_type.tt_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1940 cl->class_object_type.tt_type = VAR_OBJECT;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1941 cl->class_object_type.tt_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1942 cl->class_type_list = type_list;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1943
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
1944 class_created(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
1945
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1946 // TODO:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1947 // - Fill hashtab with object members and methods ?
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1948
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1949 // Add the class to the script-local variables.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1950 // 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
1951 // TODO: does uf_hash need to be cleared?
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1952 typval_T tv;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1953 tv.v_type = VAR_CLASS;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1954 tv.vval.v_class = cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1955 is_export = class_export;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1956 SOURCING_LNUM = start_lnum;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1957 set_var_const(cl->class_name, current_sctx.sc_sid,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1958 NULL, &tv, FALSE, 0, 0);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1959 return;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1960 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1961
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1962 cleanup:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1963 if (cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1964 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1965 vim_free(cl->class_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1966 vim_free(cl->class_class_functions);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1967 if (cl->class_interfaces != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1968 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1969 for (int i = 0; i < cl->class_interface_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1970 vim_free(cl->class_interfaces[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1971 vim_free(cl->class_interfaces);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1972 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1973 if (cl->class_interfaces_cl != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1974 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1975 for (int i = 0; i < cl->class_interface_count; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1976 class_unref(cl->class_interfaces_cl[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1977 vim_free(cl->class_interfaces_cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1978 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1979 vim_free(cl->class_obj_members);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1980 vim_free(cl->class_obj_methods);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1981 vim_free(cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1982 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1983
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1984 vim_free(extends);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1985 class_unref(extends_cl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1986
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1987 if (intf_classes != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1988 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1989 for (int i = 0; i < ga_impl.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1990 class_unref(intf_classes[i]);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1991 vim_free(intf_classes);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1992 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1993 ga_clear_strings(&ga_impl);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1994
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1995 for (int round = 1; round <= 2; ++round)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1996 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1997 garray_T *gap = round == 1 ? &classmembers : &objmembers;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1998 if (gap->ga_len == 0 || gap->ga_data == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
1999 continue;
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 for (int i = 0; i < gap->ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2002 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2003 ocmember_T *m = ((ocmember_T *)gap->ga_data) + i;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2004 vim_free(m->ocm_name);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2005 vim_free(m->ocm_init);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2006 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2007 ga_clear(gap);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2008 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2009
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2010 for (int i = 0; i < objmethods.ga_len; ++i)
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 ufunc_T *uf = ((ufunc_T **)objmethods.ga_data)[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2013 func_clear_free(uf, FALSE);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2014 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2015 ga_clear(&objmethods);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2016
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2017 for (int i = 0; i < classfunctions.ga_len; ++i)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2018 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2019 ufunc_T *uf = ((ufunc_T **)classfunctions.ga_data)[i];
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2020 func_clear_free(uf, FALSE);
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 ga_clear(&classfunctions);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2023
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2024 clear_type_list(&type_list);
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
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 * 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
2029 * 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
2030 * 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
2031 * class members.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2032 * 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
2033 * Set *p_m ocmmember_T if not NULL
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2034 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2035 type_T *
33534
c8bd88bdb630 patch 9.0.2016: Vim9: assignment operators don't work for class vars
Christian Brabandt <cb@256bit.org>
parents: 33506
diff changeset
2036 oc_member_type(
33088
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
2037 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
2038 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
2039 char_u *name,
667a17904f64 patch 9.0.1829: Vim9 missing access-checks for private vars
Christian Brabandt <cb@256bit.org>
parents: 33070
diff changeset
2040 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
2041 int *member_idx)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2042 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2043 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
2044 ocmember_T *m;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2045
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2046 *member_idx = -1; // not found (yet)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2047
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2048 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
2049 member_idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2050 if (m == NULL)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2051 {
33286
0c3553cfe22e patch 9.0.1909: Vim9: problem calling class method from other class
Christian Brabandt <cb@256bit.org>
parents: 33278
diff changeset
2052 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
2053 len);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2054 return &t_any;
32670
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
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2057 return m->ocm_type;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2058 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2059
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2060 /*
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2061 * 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
2062 */
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2063 type_T *
33534
c8bd88bdb630 patch 9.0.2016: Vim9: assignment operators don't work for class vars
Christian Brabandt <cb@256bit.org>
parents: 33506
diff changeset
2064 oc_member_type_by_idx(
33446
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2065 class_T *cl,
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2066 int is_object,
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2067 int member_idx)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2068 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2069 ocmember_T *m;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2070 int member_count;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2071
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2072 if (is_object)
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2073 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2074 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
2075 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
2076 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2077 else
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2078 {
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2079 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
2080 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
2081 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2082
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2083 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
2084 return NULL;
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2085
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2086 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
2087 }
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2088
508dfc0c261c patch 9.0.1977: Vim9: object members can change type
Christian Brabandt <cb@256bit.org>
parents: 33432
diff changeset
2089 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2090 * Handle ":enum" up to ":endenum".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2091 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2092 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2093 ex_enum(exarg_T *eap UNUSED)
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 // TODO
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2096 }
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 /*
33678
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2099 * Type aliases (:type)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2100 */
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2101
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2102 void
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2103 typealias_free(typealias_T *ta)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2104 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2105 // ta->ta_type is freed in clear_type_list()
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2106 vim_free(ta->ta_name);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2107 vim_free(ta);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2108 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2109
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2110 void
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2111 typealias_unref(typealias_T *ta)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2112 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2113 if (ta != NULL && --ta->ta_refcount <= 0)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2114 typealias_free(ta);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2115 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2116
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2117 /*
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2118 * Handle ":type". Create an alias for a type specification.
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2119 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2120 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2121 ex_type(exarg_T *eap UNUSED)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2122 {
33678
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2123 char_u *arg = eap->arg;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2124
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2125 if (!current_script_is_vim9()
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2126 || (cmdmod.cmod_flags & CMOD_LEGACY)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2127 || !getline_equal(eap->getline, eap->cookie, getsourceline))
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2128 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2129 emsg(_(e_type_can_only_be_defined_in_vim9_script));
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2130 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2131 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2132
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2133 if (*arg == NUL)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2134 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2135 emsg(_(e_missing_typealias_name));
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2136 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2137 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2138
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2139 if (!ASCII_ISUPPER(*arg))
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2140 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2141 semsg(_(e_type_name_must_start_with_uppercase_letter_str), arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2142 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2143 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2144
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2145 char_u *name_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2146 if (!IS_WHITE_OR_NUL(*name_end))
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2147 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2148 semsg(_(e_white_space_required_after_name_str), arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2149 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2150 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2151 char_u *name_start = arg;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2152
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2153 arg = skipwhite(name_end);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2154 if (*arg != '=')
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2155 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2156 semsg(_(e_missing_equal_str), arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2157 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2158 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2159 if (!IS_WHITE_OR_NUL(*(arg + 1)))
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2160 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2161 semsg(_(e_white_space_required_after_str_str), "=", arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2162 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2163 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2164 arg++;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2165 arg = skipwhite(arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2166
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2167 if (*arg == NUL)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2168 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2169 emsg(_(e_missing_typealias_type));
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2170 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2171 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2172
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2173 scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2174 type_T *type = parse_type(&arg, &si->sn_type_list, TRUE);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2175 if (type == NULL)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2176 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2177
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2178 if (*arg != NUL)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2179 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2180 // some text after the type
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2181 semsg(_(e_trailing_characters_str), arg);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2182 return;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2183 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2184
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2185 int cc = *name_end;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2186 *name_end = NUL;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2187
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2188 typval_T tv;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2189 tv.v_type = VAR_UNKNOWN;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2190 if (eval_variable_import(name_start, &tv) == OK)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2191 {
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2192 if (tv.v_type == VAR_TYPEALIAS)
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2193 semsg(_(e_typealias_already_exists_for_str), name_start);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2194 else
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2195 semsg(_(e_redefining_script_item_str), name_start);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2196 clear_tv(&tv);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2197 goto done;
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2198 }
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2199
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2200 // Create a script-local variable for the type alias.
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2201 if (type->tt_type != VAR_OBJECT)
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2202 {
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2203 tv.v_type = VAR_TYPEALIAS;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2204 tv.v_lock = 0;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2205 tv.vval.v_typealias = ALLOC_CLEAR_ONE(typealias_T);
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2206 ++tv.vval.v_typealias->ta_refcount;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2207 tv.vval.v_typealias->ta_name = vim_strsave(name_start);
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2208 tv.vval.v_typealias->ta_type = type;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2209 }
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2210 else
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2211 {
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2212 // When creating a type alias for a class, use the class type itself to
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2213 // create the type alias variable. This is needed to use the type
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2214 // alias to invoke class methods (e.g. new()) and use class variables.
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2215 tv.v_type = VAR_CLASS;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2216 tv.v_lock = 0;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2217 tv.vval.v_class = type->tt_class;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2218 ++tv.vval.v_class->class_refcount;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
2219 }
33678
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2220 set_var_const(name_start, current_sctx.sc_sid, NULL, &tv, FALSE,
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2221 ASSIGN_CONST | ASSIGN_FINAL, 0);
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2222
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2223 done:
7d9d2404a3d4 patch 9.0.2076: Vim9: No support for type aliases
Christian Brabandt <cb@256bit.org>
parents: 33636
diff changeset
2224 *name_end = cc;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2225 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2226
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2227 /*
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2228 * 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
2229 * 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
2230 * "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
2231 * 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
2232 */
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2233 static int
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2234 get_member_tv(
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2235 class_T *cl,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2236 int is_object,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2237 char_u *name,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2238 size_t namelen,
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2239 typval_T *rettv)
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2240 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2241 ocmember_T *m;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2242 int m_idx;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2243
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2244 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
2245 &m_idx);
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2246 if (m == NULL)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2247 return FAIL;
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2248
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2249 if (*name == '_')
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2250 {
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
2251 emsg_var_cl_define(e_cannot_access_protected_variable_str,
33498
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2252 m->ocm_name, 0, cl);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2253 return FAIL;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2254 }
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2255
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2256 if (is_object)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2257 {
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2258 // The object only contains a pointer to the class, the member values
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2259 // array follows right after that.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2260 object_T *obj = rettv->vval.v_object;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2261 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
2262 copy_tv(tv, rettv);
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2263 object_unref(obj);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2264 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2265 else
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2266 {
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2267 copy_tv(&cl->class_members_tv[m_idx], rettv);
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2268 class_unref(cl);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2269 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2270
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2271 return OK;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2272 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2273
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2274 /*
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2275 * Call an object or class method "name" in class "cl". The method return
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2276 * value is returned in "rettv".
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2277 */
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2278 static int
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2279 call_oc_method(
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2280 class_T *cl,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2281 char_u *name,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2282 size_t len,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2283 char_u *name_end,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2284 evalarg_T *evalarg,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2285 char_u **arg,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2286 typval_T *rettv)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2287 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2288 ufunc_T *fp;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2289 typval_T argvars[MAX_FUNC_ARGS + 1];
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2290 int argcount = 0;
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2291 ocmember_T *ocm = NULL;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2292 int m_idx;
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2293
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2294 fp = method_lookup(cl, rettv->v_type, name, len, NULL);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2295 if (fp == NULL)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2296 {
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2297 // could be an object or class funcref variable
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2298 ocm = member_lookup(cl, rettv->v_type, name, len, &m_idx);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2299 if (ocm == NULL || ocm->ocm_type->tt_type != VAR_FUNC)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2300 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2301 method_not_found_msg(cl, rettv->v_type, name, len);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2302 return FAIL;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2303 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2304
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2305 if (rettv->v_type == VAR_OBJECT)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2306 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2307 // funcref object variable
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2308 object_T *obj = rettv->vval.v_object;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2309 typval_T *tv = (typval_T *)(obj + 1) + m_idx;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2310 copy_tv(tv, rettv);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2311 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2312 else
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2313 // funcref class variable
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2314 copy_tv(&cl->class_members_tv[m_idx], rettv);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2315 *arg = name_end;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2316 return OK;
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
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
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2319 if (ocm == NULL && *fp->uf_name == '_')
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2320 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2321 // Cannot access a private method outside of a class
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
2322 semsg(_(e_cannot_access_protected_method_str), fp->uf_name);
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2323 return FAIL;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2324 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2325
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2326 char_u *argp = name_end;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2327 int ret = get_func_arguments(&argp, evalarg, 0, argvars, &argcount);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2328 if (ret == FAIL)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2329 return FAIL;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2330
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2331 funcexe_T funcexe;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2332 CLEAR_FIELD(funcexe);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2333 funcexe.fe_evaluate = TRUE;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2334 if (rettv->v_type == VAR_OBJECT)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2335 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2336 funcexe.fe_object = rettv->vval.v_object;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2337 ++funcexe.fe_object->obj_refcount;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2338 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2339
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2340 // Clear the class or object after calling the function, in
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2341 // case the refcount is one.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2342 typval_T tv_tofree = *rettv;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2343 rettv->v_type = VAR_UNKNOWN;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2344
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2345 // Call the user function. Result goes into rettv;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2346 int error = call_user_func_check(fp, argcount, argvars, rettv, &funcexe,
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2347 NULL);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2348
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2349 // Clear the previous rettv and the arguments.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2350 clear_tv(&tv_tofree);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2351 for (int idx = 0; idx < argcount; ++idx)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2352 clear_tv(&argvars[idx]);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2353
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2354 if (error != FCERR_NONE)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2355 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2356 user_func_error(error, printable_func_name(fp), funcexe.fe_found_var);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2357 return FAIL;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2358 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2359 *arg = argp;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2360
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2361 return OK;
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2362 }
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2363
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2364 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2365 * Evaluate what comes after a class:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2366 * - class member: SomeClass.varname
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2367 * - class function: SomeClass.SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2368 * - class constructor: SomeClass.new()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2369 * - object member: someObject.varname
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2370 * - object method: someObject.SomeMethod()
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2371 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2372 * "*arg" points to the '.'.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2373 * "*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
2374 *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2375 * Returns FAIL or OK.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2376 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2377 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2378 class_object_index(
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2379 char_u **arg,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2380 typval_T *rettv,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2381 evalarg_T *evalarg,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2382 int verbose UNUSED) // give error messages
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 if (VIM_ISWHITE((*arg)[1]))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2385 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2386 semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg);
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2387 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2388 }
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 ++*arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2391 char_u *name = *arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2392 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
2393 if (name_end == name)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2394 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2395 size_t len = name_end - name;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2396
33473
156d07bea2ac patch 9.0.1989: Vim9: double error message given
Christian Brabandt <cb@256bit.org>
parents: 33471
diff changeset
2397 int did_emsg_save = did_emsg;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2398 class_T *cl;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2399 if (rettv->v_type == VAR_CLASS)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2400 cl = rettv->vval.v_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2401 else // VAR_OBJECT
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2402 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2403 if (rettv->vval.v_object == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2404 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2405 emsg(_(e_using_null_object));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2406 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2407 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2408 cl = rettv->vval.v_object->obj_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2409 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2410
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2411 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2412 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2413 emsg(_(e_incomplete_type));
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2414 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2415 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2416
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2417 if (*name_end == '(')
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2418 // Invoke the class or object method
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2419 return call_oc_method(cl, name, len, name_end, evalarg, arg, rettv);
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2420
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2421 else if (rettv->v_type == VAR_OBJECT || rettv->v_type == VAR_CLASS)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2422 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2423 // 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
2424 // variable table.
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2425 int is_object = rettv->v_type == VAR_OBJECT;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2426 if (get_member_tv(cl, is_object, name, len, rettv) == OK)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2427 {
33201
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2428 *arg = name_end;
36c13b964eb3 patch 9.0.1879: Vim9: incorrect duplicate class member detection
Christian Brabandt <cb@256bit.org>
parents: 33173
diff changeset
2429 return OK;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2430 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2431
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2432 // could be a class method or an object method
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2433 int fidx;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2434 ufunc_T *fp = method_lookup(cl, rettv->v_type, name, len, &fidx);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2435 if (fp != NULL)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2436 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2437 // Private methods are not accessible outside the class
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2438 if (*name == '_')
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2439 {
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
2440 semsg(_(e_cannot_access_protected_method_str), fp->uf_name);
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2441 return FAIL;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2442 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2443
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2444 partial_T *pt = ALLOC_CLEAR_ONE(partial_T);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2445 if (pt == NULL)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2446 return FAIL;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2447
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2448 pt->pt_refcount = 1;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2449 if (is_object)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2450 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2451 pt->pt_obj = rettv->vval.v_object;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2452 ++pt->pt_obj->obj_refcount;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2453 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2454 pt->pt_auto = TRUE;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2455 pt->pt_func = fp;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2456 func_ptr_ref(pt->pt_func);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2457 rettv->v_type = VAR_PARTIAL;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2458 rettv->vval.v_partial = pt;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2459 *arg = name_end;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2460 return OK;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2461 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2462
33473
156d07bea2ac patch 9.0.1989: Vim9: double error message given
Christian Brabandt <cb@256bit.org>
parents: 33471
diff changeset
2463 if (did_emsg == did_emsg_save)
33636
53416c49a7ab patch 9.0.2059: outstanding exceptions may be skipped
Christian Brabandt <cb@256bit.org>
parents: 33627
diff changeset
2464 member_not_found_msg(cl, rettv->v_type, name, len);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2465 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2466
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2467 return FAIL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2468 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2469
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2470 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2471 * 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
2472 * Otherwise return NULL.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2473 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2474 ufunc_T *
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2475 find_class_func(char_u **arg)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2476 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2477 char_u *name = *arg;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2478 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
2479 if (name_end == name || *name_end != '.')
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2480 return NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2481
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2482 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
2483 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
2484 typval_T tv;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2485 tv.v_type = VAR_UNKNOWN;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2486 if (eval_variable(name, (int)len,
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2487 0, &tv, NULL, EVAL_VAR_NOAUTOLOAD) == FAIL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2488 return NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2489 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
2490 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2491
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2492 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
2493 : tv.vval.v_object->obj_class;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2494 if (cl == NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2495 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2496 char_u *fname = name_end + 1;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2497 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
2498 if (fname_end == fname)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2499 goto fail_after_eval;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2500 len = fname_end - fname;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2501
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2502 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
2503
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2504 fail_after_eval:
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2505 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
2506 return fp;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2507 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2508
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2509 /*
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
2510 * 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
2511 * 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
2512 * 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
2513 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2514 int
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2515 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
2516 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2517 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2518 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
2519 return idx;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2520 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2521
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2522 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2523 * 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
2524 * 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
2525 * 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
2526 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2527 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2528 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
2529 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2530 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
2531 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
2532 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
2533 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2534 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
2535 if (namelen)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2536 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2537 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
2538 && 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
2539 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2540 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2541 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2542 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2543 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2544 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2545 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
2546 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2547 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2548 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2549 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2550 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2551 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2552 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2553 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2554 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
2555 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2556
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 * 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
2559 * 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
2560 * 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
2561 */
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2562 static ufunc_T *
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2563 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
2564 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2565 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
2566 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
2567 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
2568 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2569 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
2570 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
2571 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
2572 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2573 ret_fp = fp;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2574 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2575 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2576 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2577 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2578 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2579 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2580 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
2581 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2582
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2583 /*
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2584 * Returns the index of class method "name" in the class "cl".
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2585 * Returns -1, if the method is not found.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2586 */
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2587 int
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2588 class_method_idx(class_T *cl, char_u *name, size_t namelen)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2589 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2590 int idx;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2591 class_method_lookup(cl, name, namelen, &idx);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2592 return idx;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2593 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2594
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2595 /*
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2596 * 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
2597 * 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
2598 * 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
2599 */
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2600 static int
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2601 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
2602 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2603 int idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2604 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
2605 return idx;
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2606 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2607
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2608 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2609 * 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
2610 * 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
2611 * 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
2612 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2613 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2614 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
2615 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2616 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
2617 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
2618 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
2619 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2620 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
2621 if (namelen)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2622 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2623 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
2624 && 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
2625 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2626 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2627 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2628 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2629 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2630 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2631 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
2632 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2633 ret_m = m;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2634 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2635 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2636 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2637 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2638 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2639 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2640 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
2641 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2642
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2643 /*
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2644 * 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
2645 * 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
2646 * 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
2647 */
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2648 static ufunc_T *
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2649 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
2650 {
33246
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2651 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
2652 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
2653 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
2654 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2655 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
2656 // 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
2657 // 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
2658 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
2659 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
2660 {
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2661 ret_fp = fp;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2662 ret_idx = i;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2663 break;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2664 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2665 }
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2666 if (idx != NULL)
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2667 *idx = ret_idx;
877dddec681f patch 9.0.1895: Vim9: finding object method/member is inefficient
Christian Brabandt <cb@256bit.org>
parents: 33233
diff changeset
2668 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
2669 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2670
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2671 /*
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2672 * Returns the index of object method "name" in the class "cl".
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2673 * Returns -1, if the method is not found.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2674 */
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2675 int
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2676 object_method_idx(class_T *cl, char_u *name, size_t namelen)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2677 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2678 int idx;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2679 object_method_lookup(cl, name, namelen, &idx);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2680 return idx;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2681 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2682
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2683 /*
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2684 * 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
2685 * 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
2686 * object member variable.
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2687 *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2688 * 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
2689 * 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
2690 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2691 ocmember_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2692 member_lookup(
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2693 class_T *cl,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2694 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
2695 char_u *name,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2696 size_t namelen,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2697 int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2698 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2699 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
2700 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
2701 else
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2702 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
2703 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2704
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2705 /*
33498
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2706 * Find the class that defines the named member. Look up the hierarchy
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2707 * starting at "cl".
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2708 *
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2709 * Return the class that defines the member "name", else NULL.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2710 * Fill in "p_m", if specified, for ocmember_T in found class.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2711 */
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2712 // NOTE: if useful for something could also indirectly return vartype and idx.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2713 static class_T *
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2714 class_defining_member(class_T *cl, char_u *name, size_t len, ocmember_T **p_m)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2715 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2716 class_T *cl_found = NULL;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2717 vartype_T vartype = VAR_UNKNOWN;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2718 ocmember_T *m_found = NULL;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2719
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2720 len = len != 0 ? len : STRLEN(name);
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2721
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2722 // Loop assumes if member is not defined in "cl", then it is not
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2723 // defined in any super class; the last class where it's found is the
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2724 // class where it is defined. Once the vartype is found, the other
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2725 // type is no longer checked.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2726 for (class_T *super = cl; super != NULL; super = super->class_extends)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2727 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2728 class_T *cl_tmp = NULL;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2729 ocmember_T *m = NULL;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2730 if (vartype == VAR_UNKNOWN || vartype == VAR_OBJECT)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2731 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2732 if ((m = object_member_lookup(super, name, len, NULL)) != NULL)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2733 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2734 cl_tmp = super;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2735 vartype = VAR_OBJECT;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2736 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2737 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2738 if (vartype == VAR_UNKNOWN || vartype == VAR_CLASS)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2739 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2740 if (( m = class_member_lookup(super, name, len, NULL)) != NULL)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2741 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2742 cl_tmp = super;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2743 vartype = VAR_OBJECT;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2744 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2745 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2746 if (cl_tmp == NULL)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2747 break; // member is not in this or any super class.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2748 cl_found = cl_tmp;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2749 m_found = m;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2750 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2751 if (p_m != NULL)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2752 *p_m = m_found;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2753 return cl_found;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2754 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2755
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
2756 /*
33233
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2757 * 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
2758 * 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
2759 *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2760 * 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
2761 * 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
2762 */
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2763 ufunc_T *
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2764 method_lookup(
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2765 class_T *cl,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2766 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
2767 char_u *name,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2768 size_t namelen,
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2769 int *idx)
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2770 {
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2771 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
2772 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
2773 else
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2774 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
2775 }
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2776
108d890d887f patch 9.0.1890: Vim9: lookup code for class/object repaeated
Christian Brabandt <cb@256bit.org>
parents: 33227
diff changeset
2777 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2778 * 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
2779 * Return FALSE if not.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2780 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2781 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2782 inside_class(cctx_T *cctx_arg, class_T *cl)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2783 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2784 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
2785 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
2786 && class_instance_of(cctx->ctx_ufunc->uf_class, cl))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2787 return TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2788 return FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2789 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2790
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 * Make a copy of an object.
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2793 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2794 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2795 copy_object(typval_T *from, typval_T *to)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2796 {
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2797 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
2798 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
2799 else
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2800 {
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2801 to->vval.v_object = from->vval.v_object;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2802 ++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
2803 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2804 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2805
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 * Make a copy of a class.
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 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2810 copy_class(typval_T *from, typval_T *to)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2811 {
32960
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2812 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
2813 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
2814 else
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2815 {
d5c05e15cf81 patch 9.0.1780: Vim9 type not defined during object creation
Christian Brabandt <cb@256bit.org>
parents: 32903
diff changeset
2816 to->vval.v_class = from->vval.v_class;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2817 ++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
2818 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2819 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2820
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2821 /*
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2822 * 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
2823 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2824 static void
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2825 class_free(class_T *cl)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2826 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2827 // 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
2828 // 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
2829 // be freed.
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2830 VIM_CLEAR(cl->class_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2831
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2832 class_unref(cl->class_extends);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2833
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2834 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
2835 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2836 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
2837 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
2838 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
2839 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2840 vim_free(cl->class_interfaces);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2841 vim_free(cl->class_interfaces_cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2842
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2843 itf2class_T *next;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2844 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
2845 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2846 next = i2c->i2c_next;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2847 vim_free(i2c);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2848 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2849
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2850 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
2851 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2852 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
2853 vim_free(m->ocm_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2854 vim_free(m->ocm_init);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2855 if (cl->class_members_tv != NULL)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2856 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
2857 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2858 vim_free(cl->class_class_members);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2859 vim_free(cl->class_members_tv);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2860
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2861 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
2862 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2863 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
2864 vim_free(m->ocm_name);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2865 vim_free(m->ocm_init);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2866 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2867 vim_free(cl->class_obj_members);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2868
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2869 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
2870 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2871 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
2872 func_clear_free(uf, FALSE);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2873 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2874 vim_free(cl->class_class_functions);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2875
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2876 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
2877 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2878 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
2879 func_clear_free(uf, FALSE);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2880 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2881 vim_free(cl->class_obj_methods);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2882
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2883 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
2884
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2885 class_cleared(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2886
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2887 vim_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2888 }
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2889
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2890 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2891 * 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
2892 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2893 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2894 class_unref(class_T *cl)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2895 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2896 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
2897 class_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2898 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2899
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2900 /*
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2901 * 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
2902 */
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2903 int
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2904 class_free_nonref(int copyID)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2905 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2906 int did_free = FALSE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2907
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2908 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
2909 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2910 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
2911 if ((cl->class_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2912 {
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2913 // 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
2914 class_free(cl);
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2915 did_free = TRUE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2916 }
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2917 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2918
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2919 next_nonref_class = NULL;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2920 return did_free;
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2921 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2922
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2923 int
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2924 set_ref_in_classes(int copyID)
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2925 {
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2926 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
2927 set_ref_in_item_class(cl, copyID, NULL, NULL);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2928
33160
4ecf54d709b3 patch 9.0.1862: Vim9 Garbage Collection issues
Christian Brabandt <cb@256bit.org>
parents: 33119
diff changeset
2929 return FALSE;
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2930 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2931
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2932 static object_T *first_object = NULL;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2933
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2934 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2935 * 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
2936 * list headed by "first_object".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2937 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2938 void
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2939 object_created(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2940 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2941 if (first_object != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2942 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2943 obj->obj_next_used = first_object;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2944 first_object->obj_prev_used = obj;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2945 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2946 first_object = obj;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2947 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2948
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2949 /*
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2950 * 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
2951 * It is removed from the list headed by "first_object".
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2952 */
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2953 static void
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2954 object_cleared(object_T *obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2955 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2956 if (obj->obj_next_used != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2957 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
2958 if (obj->obj_prev_used != NULL)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2959 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
2960 else if (first_object == obj)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2961 first_object = obj->obj_next_used;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2962 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2963
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
2964 /*
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2965 * Free the contents of an object ignoring the reference count.
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2966 */
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2967 static void
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2968 object_free_contents(object_T *obj)
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2969 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2970 class_T *cl = obj->obj_class;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2971
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2972 if (!cl)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2973 return;
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2974
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2975 // Avoid a recursive call, it can happen if "obj" has a circular reference.
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2976 obj->obj_refcount = INT_MAX;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2977
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2978 // the member values are just after the object structure
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2979 typval_T *tv = (typval_T *)(obj + 1);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2980 for (int i = 0; i < cl->class_obj_member_count; ++i)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2981 clear_tv(tv + i);
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2982 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2983
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2984 static void
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2985 object_free_object(object_T *obj)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2986 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2987 class_T *cl = obj->obj_class;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2988
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2989 if (!cl)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2990 return;
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2991
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2992 // Remove from the list headed by "first_object".
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2993 object_cleared(obj);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2994
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2995 vim_free(obj);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2996 class_unref(cl);
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2997 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
2998
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
2999 static void
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3000 object_free(object_T *obj)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3001 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3002 if (in_free_unref_items)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3003 return;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3004
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3005 object_free_contents(obj);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3006 object_free_object(obj);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3007 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3008
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3009 /*
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3010 * Unreference an object.
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3011 */
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3012 void
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3013 object_unref(object_T *obj)
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3014 {
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3015 if (obj != NULL && --obj->obj_refcount <= 0)
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3016 object_free(obj);
33506
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3017 }
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3018
f61713271934 patch 9.0.2002: Vim9: need cleanup of class related interface code
Christian Brabandt <cb@256bit.org>
parents: 33498
diff changeset
3019 /*
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3020 * 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
3021 */
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3022 int
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3023 object_free_nonref(int copyID)
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3024 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3025 int did_free = FALSE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3026
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3027 for (object_T *obj = first_object; obj != NULL; obj = obj->obj_next_used)
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3028 {
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3029 if ((obj->obj_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3030 {
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3031 // Free the object contents. Object itself will be freed later.
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3032 object_free_contents(obj);
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3033 did_free = TRUE;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3034 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3035 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3036
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3037 return did_free;
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3038 }
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3039
33540
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3040 void
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3041 object_free_items(int copyID)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3042 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3043 object_T *obj_next;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3044
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3045 for (object_T *obj = first_object; obj != NULL; obj = obj_next)
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3046 {
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3047 obj_next = obj->obj_next_used;
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3048 if ((obj->obj_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3049 object_free_object(obj);
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3050 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3051 }
86dbcbb94fdb patch 9.0.2019: Vim9: no support for funcrefs
Christian Brabandt <cb@256bit.org>
parents: 33534
diff changeset
3052
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3053 /*
33498
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3054 * Output message which takes a variable name and the class that defines it.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3055 * "cl" is that class where the name was found. Search "cl"'s hierarchy to
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3056 * find the defining class.
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3057 */
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3058 void
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3059 emsg_var_cl_define(char *msg, char_u *name, size_t len, class_T *cl)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3060 {
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3061 ocmember_T *m;
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3062 class_T *cl_def = class_defining_member(cl, name, len, &m);
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3063 if (cl_def != NULL)
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3064 semsg(_(msg), m->ocm_name, cl_def->class_name);
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3065 else
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3066 emsg(_(e_internal_error_please_report_a_bug));
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3067 }
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3068
bff8ac203a22 patch 9.0.1999: Vim9: some error messages can be improved
Christian Brabandt <cb@256bit.org>
parents: 33473
diff changeset
3069 /*
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3070 * 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
3071 */
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3072 void
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3073 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
3074 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3075 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
3076 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
3077 && (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
3078 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3079 // 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
3080 if (*name == '_')
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
3081 semsg(_(e_cannot_access_protected_method_str), method_name);
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3082 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
3083 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
3084 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
3085 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3086 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
3087 && (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
3088 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3089 // 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
3090 if (*name == '_')
33738
2172872dfbcd patch 9.0.2096: Vim9: confusing usage of private
Christian Brabandt <cb@256bit.org>
parents: 33708
diff changeset
3091 semsg(_(e_cannot_access_protected_method_str), method_name);
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3092 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
3093 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
3094 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
3095 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3096 else
33627
41c64cb748c1 patch 9.0.2055: Vim9: non-consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33618
diff changeset
3097 semsg(_(e_method_not_found_on_class_str_str), method_name,
41c64cb748c1 patch 9.0.2055: Vim9: non-consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33618
diff changeset
3098 cl->class_name);
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3099 vim_free(method_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3100 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3101
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3102 /*
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3103 * 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
3104 */
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3105 void
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3106 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
3107 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3108 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
3109
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3110 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
3111 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3112 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
3113 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
3114 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3115 else
33627
41c64cb748c1 patch 9.0.2055: Vim9: non-consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33618
diff changeset
3116 semsg(_(e_variable_not_found_on_object_str_str), varname,
41c64cb748c1 patch 9.0.2055: Vim9: non-consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33618
diff changeset
3117 cl->class_name);
33260
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3118 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3119 else
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3120 {
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3121 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
3122 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
3123 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3124 else
33343
41b50abddeea patch 9.0.1935: Vim9: not consistent error messages
Christian Brabandt <cb@256bit.org>
parents: 33326
diff changeset
3125 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
3126 varname, cl->class_name);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3127 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3128 vim_free(varname);
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3129 }
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3130
aba1fa2b7d1e patch 9.0.1898: Vim9: restrict access to static vars
Christian Brabandt <cb@256bit.org>
parents: 33246
diff changeset
3131 /*
33006
29b2193466e0 patch 9.0.1795: Indentation issues
Christian Brabandt <cb@256bit.org>
parents: 32972
diff changeset
3132 * 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
3133 * 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
3134 */
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3135 int
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3136 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
3137 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3138 if (cl == other_cl)
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3139 return TRUE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3140
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3141 // 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
3142 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
3143 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3144 if (cl == other_cl)
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3145 return TRUE;
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3146 // 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
3147 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
3148 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3149 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
3150 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
3151 {
33432
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3152 if (intf == other_cl)
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3153 return TRUE;
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3154 // check the super interfaces
97ceabebaeaf patch 9.0.1974: vim9: using contra-variant type-checks
Christian Brabandt <cb@256bit.org>
parents: 33401
diff changeset
3155 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
3156 }
b5ed566262d3 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables
Christian Brabandt <cb@256bit.org>
parents: 33268
diff changeset
3157 }
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3158 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3159
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3160 return FALSE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3161 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3162
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3163 /*
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3164 * "instanceof(object, classinfo)" function
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3165 */
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3166 void
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3167 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
3168 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3169 typval_T *object_tv = &argvars[0];
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3170 typval_T *classinfo_tv = &argvars[1];
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3171 listitem_T *li;
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3172 class_T *c;
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3173
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3174 rettv->vval.v_number = VVAL_FALSE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3175
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3176 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
3177 || 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
3178 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3179
33291
4cb421ba3385 patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents: 33286
diff changeset
3180 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
3181 return;
4cb421ba3385 patch 9.0.1911: Vim9: segfault with null object and instanceof()
Christian Brabandt <cb@256bit.org>
parents: 33286
diff changeset
3182
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3183 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
3184 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3185 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
3186 {
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3187 if (li->li_tv.v_type != VAR_CLASS && !tv_class_alias(&li->li_tv))
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3188 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3189 emsg(_(e_class_required));
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3190 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3191 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3192
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3193 if (li->li_tv.v_type == VAR_TYPEALIAS)
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3194 c = li->li_tv.vval.v_typealias->ta_type->tt_class;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3195 else
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3196 c = li->li_tv.vval.v_class;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3197
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3198 if (class_instance_of(object_tv->vval.v_object->obj_class, c)
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3199 == TRUE)
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3200 {
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3201 rettv->vval.v_number = VVAL_TRUE;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3202 return;
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3203 }
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3204 }
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3205
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3206 return;
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3207 }
33682
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3208
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3209 if (classinfo_tv->v_type == VAR_TYPEALIAS)
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3210 c = classinfo_tv->vval.v_typealias->ta_type->tt_class;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3211 else
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3212 c = classinfo_tv->vval.v_class;
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3213
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3214 rettv->vval.v_number =
f126ffc85f7c patch 9.0.2078: several problems with type aliases
Christian Brabandt <cb@256bit.org>
parents: 33678
diff changeset
3215 class_instance_of(object_tv->vval.v_object->obj_class, c);
32972
e4851934751a patch 9.0.1786: Vim9: need instanceof() function
Christian Brabandt <cb@256bit.org>
parents: 32960
diff changeset
3216 }
32670
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3217
695b50472e85 Fix line endings issue
Christian Brabandt <cb@256bit.org>
parents: 32669
diff changeset
3218 #endif // FEAT_EVAL