| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
// Copyright (c) 2023 Yuki Kimoto |
|
2
|
|
|
|
|
|
|
// MIT License |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
#include |
|
5
|
|
|
|
|
|
|
#include |
|
6
|
|
|
|
|
|
|
#include |
|
7
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
#include "spvm_compiler.h" |
|
9
|
|
|
|
|
|
|
#include "spvm_basic_type.h" |
|
10
|
|
|
|
|
|
|
#include "spvm_allocator.h" |
|
11
|
|
|
|
|
|
|
#include "spvm_list.h" |
|
12
|
|
|
|
|
|
|
#include "spvm_hash.h" |
|
13
|
|
|
|
|
|
|
#include "spvm_method.h" |
|
14
|
|
|
|
|
|
|
#include "spvm_string_buffer.h" |
|
15
|
|
|
|
|
|
|
#include "spvm_string.h" |
|
16
|
|
|
|
|
|
|
#include "spvm_op.h" |
|
17
|
|
|
|
|
|
|
#include "spvm_type.h" |
|
18
|
|
|
|
|
|
|
#include "spvm_var_decl.h" |
|
19
|
|
|
|
|
|
|
|
|
20
|
100921
|
|
|
|
|
|
const char* const* SPVM_BASIC_TYPE_C_ID_NAMES(void) { |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
static const char* const id_names[] = { |
|
23
|
|
|
|
|
|
|
"unknown", |
|
24
|
|
|
|
|
|
|
"undef", |
|
25
|
|
|
|
|
|
|
"void", |
|
26
|
|
|
|
|
|
|
"byte", |
|
27
|
|
|
|
|
|
|
"short", |
|
28
|
|
|
|
|
|
|
"int", |
|
29
|
|
|
|
|
|
|
"long", |
|
30
|
|
|
|
|
|
|
"float", |
|
31
|
|
|
|
|
|
|
"double", |
|
32
|
|
|
|
|
|
|
"string", |
|
33
|
|
|
|
|
|
|
"object", |
|
34
|
|
|
|
|
|
|
"Byte", |
|
35
|
|
|
|
|
|
|
"Short", |
|
36
|
|
|
|
|
|
|
"Int", |
|
37
|
|
|
|
|
|
|
"Long", |
|
38
|
|
|
|
|
|
|
"Float", |
|
39
|
|
|
|
|
|
|
"Double", |
|
40
|
|
|
|
|
|
|
"Bool", |
|
41
|
|
|
|
|
|
|
"Error", |
|
42
|
|
|
|
|
|
|
"Error::System", |
|
43
|
|
|
|
|
|
|
"Error::NotSupported", |
|
44
|
|
|
|
|
|
|
"CommandInfo", |
|
45
|
|
|
|
|
|
|
"Address", |
|
46
|
|
|
|
|
|
|
}; |
|
47
|
|
|
|
|
|
|
|
|
48
|
100921
|
|
|
|
|
|
return id_names; |
|
49
|
|
|
|
|
|
|
} |
|
50
|
|
|
|
|
|
|
|
|
51
|
0
|
|
|
|
|
|
const char* const* SPVM_BASIC_TYPE_C_CATEGORY_NAMES(void) { |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
static const char* const id_names[] = { |
|
54
|
|
|
|
|
|
|
"unknown" |
|
55
|
|
|
|
|
|
|
"undef" |
|
56
|
|
|
|
|
|
|
"void" |
|
57
|
|
|
|
|
|
|
"numeric" |
|
58
|
|
|
|
|
|
|
"mulnum" |
|
59
|
|
|
|
|
|
|
"string", |
|
60
|
|
|
|
|
|
|
"class", |
|
61
|
|
|
|
|
|
|
"interface", |
|
62
|
|
|
|
|
|
|
"any_obejct", |
|
63
|
|
|
|
|
|
|
}; |
|
64
|
|
|
|
|
|
|
|
|
65
|
0
|
|
|
|
|
|
return id_names; |
|
66
|
|
|
|
|
|
|
} |
|
67
|
|
|
|
|
|
|
|
|
68
|
59596
|
|
|
|
|
|
SPVM_BASIC_TYPE* SPVM_BASIC_TYPE_new(SPVM_COMPILER* compiler) { |
|
69
|
59596
|
|
|
|
|
|
SPVM_BASIC_TYPE* basic_type = SPVM_ALLOCATOR_alloc_memory_block_permanent(compiler->current_each_compile_allocator, sizeof(SPVM_BASIC_TYPE)); |
|
70
|
|
|
|
|
|
|
|
|
71
|
59596
|
|
|
|
|
|
basic_type->constant_strings = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 128); |
|
72
|
59596
|
|
|
|
|
|
basic_type->constant_string_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 128); |
|
73
|
59596
|
|
|
|
|
|
basic_type->string_pool = SPVM_STRING_BUFFER_new(compiler->current_each_compile_allocator, 8192, SPVM_ALLOCATOR_C_ALLOC_TYPE_PERMANENT); |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
// Fields |
|
76
|
59596
|
|
|
|
|
|
basic_type->unmerged_fields = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
77
|
59596
|
|
|
|
|
|
basic_type->unmerged_field_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
78
|
|
|
|
|
|
|
|
|
79
|
59596
|
|
|
|
|
|
basic_type->field_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
// Class variables |
|
82
|
59596
|
|
|
|
|
|
basic_type->class_vars = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
83
|
59596
|
|
|
|
|
|
basic_type->class_var_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
// Methods |
|
86
|
59596
|
|
|
|
|
|
basic_type->methods = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
87
|
59596
|
|
|
|
|
|
basic_type->method_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
// Interfaces |
|
90
|
59596
|
|
|
|
|
|
basic_type->interface_basic_types = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
91
|
59596
|
|
|
|
|
|
basic_type->interface_basic_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
92
|
|
|
|
|
|
|
|
|
93
|
59596
|
|
|
|
|
|
basic_type->allows = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
94
|
59596
|
|
|
|
|
|
basic_type->interface_decls = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
95
|
59596
|
|
|
|
|
|
basic_type->anon_unresolved_basic_type_names = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
96
|
59596
|
|
|
|
|
|
basic_type->anon_basic_types = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
97
|
59596
|
|
|
|
|
|
basic_type->alias_symtable = SPVM_HASH_new_hash_permanent(compiler->current_each_compile_allocator, 0); |
|
98
|
|
|
|
|
|
|
|
|
99
|
59596
|
|
|
|
|
|
basic_type->use_basic_type_names = SPVM_LIST_new_list_permanent(compiler->current_each_compile_allocator, 0); |
|
100
|
|
|
|
|
|
|
|
|
101
|
59596
|
|
|
|
|
|
return basic_type; |
|
102
|
|
|
|
|
|
|
} |
|
103
|
|
|
|
|
|
|
|
|
104
|
100921
|
|
|
|
|
|
const char* SPVM_BASIC_TYPE_get_basic_type_name(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
105
|
100921
|
|
|
|
|
|
return (SPVM_BASIC_TYPE_C_ID_NAMES())[basic_type_id]; |
|
106
|
|
|
|
|
|
|
} |
|
107
|
|
|
|
|
|
|
|
|
108
|
0
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_void_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
109
|
|
|
|
|
|
|
|
|
110
|
0
|
0
|
|
|
|
|
if (basic_type_id == SPVM_NATIVE_C_BASIC_TYPE_ID_VOID) { |
|
111
|
0
|
|
|
|
|
|
return 1; |
|
112
|
|
|
|
|
|
|
} |
|
113
|
|
|
|
|
|
|
else { |
|
114
|
0
|
|
|
|
|
|
return 0; |
|
115
|
|
|
|
|
|
|
} |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
return 1; |
|
118
|
|
|
|
|
|
|
} |
|
119
|
|
|
|
|
|
|
|
|
120
|
18189904
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_numeric_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
121
|
|
|
|
|
|
|
|
|
122
|
18189904
|
100
|
|
|
|
|
if (basic_type_id >= SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE && basic_type_id <= SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE) { |
|
|
|
100
|
|
|
|
|
|
|
123
|
15641824
|
|
|
|
|
|
return 1; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
|
|
|
|
|
|
else { |
|
126
|
2548080
|
|
|
|
|
|
return 0; |
|
127
|
|
|
|
|
|
|
} |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
return 1; |
|
130
|
|
|
|
|
|
|
} |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
|
|
133
|
9081739
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_mulnum_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
134
|
|
|
|
|
|
|
|
|
135
|
9081739
|
|
|
|
|
|
SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); |
|
136
|
|
|
|
|
|
|
|
|
137
|
9081739
|
|
|
|
|
|
int32_t is_mulnum_type = (basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_MULNUM); |
|
138
|
|
|
|
|
|
|
|
|
139
|
9081739
|
|
|
|
|
|
return is_mulnum_type; |
|
140
|
|
|
|
|
|
|
} |
|
141
|
|
|
|
|
|
|
|
|
142
|
156215
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_string_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
143
|
|
|
|
|
|
|
|
|
144
|
156215
|
|
|
|
|
|
return basic_type_id == SPVM_NATIVE_C_BASIC_TYPE_ID_STRING; |
|
145
|
|
|
|
|
|
|
} |
|
146
|
|
|
|
|
|
|
|
|
147
|
8936579
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_class_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
148
|
|
|
|
|
|
|
|
|
149
|
8936579
|
|
|
|
|
|
SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); |
|
150
|
|
|
|
|
|
|
|
|
151
|
8936579
|
|
|
|
|
|
int32_t is_class_type = (basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_CLASS); |
|
152
|
|
|
|
|
|
|
|
|
153
|
8936579
|
|
|
|
|
|
return is_class_type; |
|
154
|
|
|
|
|
|
|
} |
|
155
|
|
|
|
|
|
|
|
|
156
|
7454664
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_interface_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
157
|
7454664
|
|
|
|
|
|
SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); |
|
158
|
|
|
|
|
|
|
|
|
159
|
7454664
|
|
|
|
|
|
int32_t is_interface_type = (basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_INTERFACE); |
|
160
|
|
|
|
|
|
|
|
|
161
|
7454664
|
|
|
|
|
|
return is_interface_type; |
|
162
|
|
|
|
|
|
|
} |
|
163
|
|
|
|
|
|
|
|
|
164
|
0
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_any_object_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
165
|
|
|
|
|
|
|
|
|
166
|
0
|
|
|
|
|
|
return basic_type_id == SPVM_NATIVE_C_BASIC_TYPE_ID_ANY_OBJECT; |
|
167
|
|
|
|
|
|
|
} |
|
168
|
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
|
|
170
|
0
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_undef_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
171
|
|
|
|
|
|
|
|
|
172
|
0
|
0
|
|
|
|
|
if (basic_type_id == SPVM_NATIVE_C_BASIC_TYPE_ID_UNDEF) { |
|
173
|
0
|
|
|
|
|
|
return 1; |
|
174
|
|
|
|
|
|
|
} |
|
175
|
|
|
|
|
|
|
else { |
|
176
|
0
|
|
|
|
|
|
return 0; |
|
177
|
|
|
|
|
|
|
} |
|
178
|
|
|
|
|
|
|
} |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
|
|
181
|
0
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_unknown_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
182
|
|
|
|
|
|
|
|
|
183
|
0
|
0
|
|
|
|
|
if (basic_type_id == SPVM_NATIVE_C_BASIC_TYPE_ID_UNKNOWN) { |
|
184
|
0
|
|
|
|
|
|
return 1; |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
else { |
|
187
|
0
|
|
|
|
|
|
return 0; |
|
188
|
|
|
|
|
|
|
} |
|
189
|
|
|
|
|
|
|
} |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
|
|
192
|
540060
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_numeric_object_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
193
|
|
|
|
|
|
|
|
|
194
|
540060
|
100
|
|
|
|
|
if (basic_type_id >= SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_CLASS && basic_type_id <= SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_CLASS) { |
|
|
|
100
|
|
|
|
|
|
|
195
|
73390
|
|
|
|
|
|
return 1; |
|
196
|
|
|
|
|
|
|
} |
|
197
|
|
|
|
|
|
|
else { |
|
198
|
466670
|
|
|
|
|
|
return 0; |
|
199
|
|
|
|
|
|
|
} |
|
200
|
|
|
|
|
|
|
} |
|
201
|
|
|
|
|
|
|
|
|
202
|
7053
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_integer_type(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
203
|
|
|
|
|
|
|
|
|
204
|
7053
|
50
|
|
|
|
|
if (basic_type_id >= SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE && basic_type_id <= SPVM_NATIVE_C_BASIC_TYPE_ID_LONG) { |
|
|
|
100
|
|
|
|
|
|
|
205
|
7034
|
|
|
|
|
|
return 1; |
|
206
|
|
|
|
|
|
|
} |
|
207
|
|
|
|
|
|
|
else { |
|
208
|
19
|
|
|
|
|
|
return 0; |
|
209
|
|
|
|
|
|
|
} |
|
210
|
|
|
|
|
|
|
} |
|
211
|
|
|
|
|
|
|
|
|
212
|
36258
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_integer_type_within_int(SPVM_COMPILER* compiler, int32_t basic_type_id) { |
|
213
|
|
|
|
|
|
|
|
|
214
|
36258
|
50
|
|
|
|
|
if (basic_type_id >= SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE && basic_type_id <= SPVM_NATIVE_C_BASIC_TYPE_ID_INT) { |
|
|
|
100
|
|
|
|
|
|
|
215
|
36253
|
|
|
|
|
|
return 1; |
|
216
|
|
|
|
|
|
|
} |
|
217
|
|
|
|
|
|
|
else { |
|
218
|
5
|
|
|
|
|
|
return 0; |
|
219
|
|
|
|
|
|
|
} |
|
220
|
|
|
|
|
|
|
} |
|
221
|
|
|
|
|
|
|
|
|
222
|
8208
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_has_interface(SPVM_COMPILER* compiler, int32_t basic_type_id, int32_t interface_basic_type_id) { |
|
223
|
|
|
|
|
|
|
|
|
224
|
8208
|
|
|
|
|
|
SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); |
|
225
|
|
|
|
|
|
|
|
|
226
|
8208
|
|
|
|
|
|
SPVM_BASIC_TYPE* interface_basic_type = SPVM_LIST_get(compiler->basic_types, interface_basic_type_id); |
|
227
|
|
|
|
|
|
|
|
|
228
|
8208
|
50
|
|
|
|
|
if (!(interface_basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_INTERFACE)) { |
|
229
|
0
|
|
|
|
|
|
return 0; |
|
230
|
|
|
|
|
|
|
} |
|
231
|
|
|
|
|
|
|
|
|
232
|
8208
|
100
|
|
|
|
|
if (!(basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_CLASS || basic_type->category == SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_INTERFACE)) { |
|
|
|
50
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
return 0; |
|
234
|
|
|
|
|
|
|
} |
|
235
|
|
|
|
|
|
|
|
|
236
|
16518
|
100
|
|
|
|
|
for (int32_t interface_method_index = 0; interface_method_index < interface_basic_type->methods->length; interface_method_index++) { |
|
237
|
8320
|
|
|
|
|
|
SPVM_METHOD* interface_method = SPVM_LIST_get(interface_basic_type->methods, interface_method_index); |
|
238
|
|
|
|
|
|
|
|
|
239
|
29843
|
100
|
|
|
|
|
for (int32_t method_index = 0; method_index < basic_type->methods->length; method_index++) { |
|
240
|
21533
|
|
|
|
|
|
SPVM_METHOD* method = SPVM_HASH_get(basic_type->method_symtable, interface_method->name, strlen(interface_method->name)); |
|
241
|
|
|
|
|
|
|
|
|
242
|
21533
|
|
|
|
|
|
int32_t method_compatibility = SPVM_BASIC_TYPE_check_method_compatibility(compiler, basic_type, method, interface_basic_type, interface_method, "interface"); |
|
243
|
|
|
|
|
|
|
|
|
244
|
21533
|
100
|
|
|
|
|
if (method_compatibility == 0) { |
|
245
|
10
|
|
|
|
|
|
return 0; |
|
246
|
|
|
|
|
|
|
} |
|
247
|
|
|
|
|
|
|
} |
|
248
|
|
|
|
|
|
|
} |
|
249
|
|
|
|
|
|
|
|
|
250
|
8198
|
|
|
|
|
|
return 1; |
|
251
|
|
|
|
|
|
|
} |
|
252
|
|
|
|
|
|
|
|
|
253
|
23736
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_check_method_compatibility(SPVM_COMPILER* compiler, SPVM_BASIC_TYPE* basic_type, SPVM_METHOD* method, SPVM_BASIC_TYPE* dist_basic_type, SPVM_METHOD* dist_method, const char* type_desc) { |
|
254
|
|
|
|
|
|
|
|
|
255
|
23736
|
100
|
|
|
|
|
if (dist_method->is_required && !method) { |
|
|
|
100
|
|
|
|
|
|
|
256
|
10
|
50
|
|
|
|
|
if (!dist_method->is_class_method) { |
|
257
|
10
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The \"%s\" class must implement the \"%s\" method. This is defined as a required interface method in the \"%s\" %s.\n at %s line %d", basic_type->name, dist_method->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
258
|
10
|
|
|
|
|
|
return 0; |
|
259
|
|
|
|
|
|
|
} |
|
260
|
|
|
|
|
|
|
} |
|
261
|
|
|
|
|
|
|
|
|
262
|
23726
|
100
|
|
|
|
|
if (method) { |
|
263
|
21007
|
100
|
|
|
|
|
if (method->is_class_method) { |
|
264
|
1
|
50
|
|
|
|
|
if (!dist_method->is_class_method) { |
|
265
|
1
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The \"%s\" method in the \"%s\" class must be an instance method. This is defined as an interface method in the \"%s\" %s.\n at %s line %d", method->name, basic_type->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
266
|
1
|
|
|
|
|
|
return 0; |
|
267
|
|
|
|
|
|
|
} |
|
268
|
|
|
|
|
|
|
} |
|
269
|
|
|
|
|
|
|
|
|
270
|
21006
|
|
|
|
|
|
SPVM_LIST* method_var_decls = method->var_decls; |
|
271
|
|
|
|
|
|
|
|
|
272
|
21006
|
|
|
|
|
|
SPVM_LIST* dist_method_var_decls = dist_method->var_decls; |
|
273
|
|
|
|
|
|
|
|
|
274
|
21006
|
100
|
|
|
|
|
if (!(method->required_args_length == dist_method->required_args_length)) { |
|
275
|
|
|
|
|
|
|
|
|
276
|
4
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The length of the required arguments of the \"%s\" method in the \"%s\" class must be equal to the length of the required arguments of the \"%s\" method in the \"%s\" %s.\n at %s line %d", method->name, basic_type->name, dist_method->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
277
|
4
|
|
|
|
|
|
return 0; |
|
278
|
|
|
|
|
|
|
} |
|
279
|
|
|
|
|
|
|
|
|
280
|
21002
|
100
|
|
|
|
|
if (!(method->args_length >= dist_method->args_length)) { |
|
281
|
1
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The length of the arguments of the \"%s\" method in the \"%s\" class must be greather than or equal to the length of the arguments of the \"%s\" method in the \"%s\" %s.\n at %s line %d", method->name, basic_type->name, dist_method->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
282
|
1
|
|
|
|
|
|
return 0; |
|
283
|
|
|
|
|
|
|
} |
|
284
|
|
|
|
|
|
|
|
|
285
|
54297
|
100
|
|
|
|
|
for (int32_t arg_index = 1; arg_index < dist_method->args_length; arg_index++) { |
|
286
|
33298
|
|
|
|
|
|
SPVM_VAR_DECL* method_var_decl = SPVM_LIST_get(method_var_decls, arg_index); |
|
287
|
33298
|
|
|
|
|
|
SPVM_VAR_DECL* dist_method_var_decl = SPVM_LIST_get(dist_method_var_decls, arg_index); |
|
288
|
|
|
|
|
|
|
|
|
289
|
33298
|
|
|
|
|
|
SPVM_TYPE* method_var_decl_type = method_var_decl->type; |
|
290
|
33298
|
|
|
|
|
|
SPVM_TYPE* dist_method_var_decl_type = dist_method_var_decl->type; |
|
291
|
|
|
|
|
|
|
|
|
292
|
33298
|
|
|
|
|
|
int32_t assignability_for_method = SPVM_TYPE_can_assign_for_method_definition(compiler, dist_method_var_decl_type->basic_type->id, dist_method_var_decl_type->dimension, dist_method_var_decl_type->flag, method_var_decl_type->basic_type->id, method_var_decl_type->dimension, method_var_decl_type->flag); |
|
293
|
|
|
|
|
|
|
|
|
294
|
33298
|
100
|
|
|
|
|
if (!assignability_for_method) { |
|
295
|
2
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The type of the %dth argument of the \"%s\" method in the \"%s\" class must be able to be assigned to the type of the %dth argument of the \"%s\" method in the \"%s\" %s.\n at %s line %d", arg_index, method->name, basic_type->name, arg_index, dist_method->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
296
|
2
|
|
|
|
|
|
return 0; |
|
297
|
|
|
|
|
|
|
} |
|
298
|
|
|
|
|
|
|
} |
|
299
|
|
|
|
|
|
|
|
|
300
|
20999
|
|
|
|
|
|
SPVM_TYPE* method_return_type = method->return_type; |
|
301
|
20999
|
|
|
|
|
|
SPVM_TYPE* dist_method_return_type = dist_method->return_type; |
|
302
|
|
|
|
|
|
|
|
|
303
|
20999
|
|
|
|
|
|
int32_t assignability_for_method_definition = SPVM_TYPE_can_assign_for_method_definition( |
|
304
|
|
|
|
|
|
|
compiler, |
|
305
|
20999
|
|
|
|
|
|
dist_method_return_type->basic_type->id, dist_method_return_type->dimension, dist_method_return_type->flag, |
|
306
|
20999
|
|
|
|
|
|
method_return_type->basic_type->id, method_return_type->dimension, method_return_type->flag |
|
307
|
|
|
|
|
|
|
); |
|
308
|
|
|
|
|
|
|
|
|
309
|
20999
|
100
|
|
|
|
|
if (!assignability_for_method_definition) { |
|
310
|
3
|
|
|
|
|
|
SPVM_COMPILER_error(compiler, "The return type of the \"%s\" method in the \"%s\" class must be able to be assigned to the return type of the \"%s\" method in the \"%s\" %s.\n at %s line %d", method->name, basic_type->name, dist_method->name, dist_basic_type->name, type_desc, basic_type->op_class->file, basic_type->op_class->line); |
|
311
|
3
|
|
|
|
|
|
return 0; |
|
312
|
|
|
|
|
|
|
} |
|
313
|
|
|
|
|
|
|
} |
|
314
|
|
|
|
|
|
|
|
|
315
|
23715
|
|
|
|
|
|
return 1; |
|
316
|
|
|
|
|
|
|
} |
|
317
|
|
|
|
|
|
|
|
|
318
|
658
|
|
|
|
|
|
int32_t SPVM_BASIC_TYPE_is_super_class(SPVM_COMPILER* compiler, int32_t super_basic_type_id, int32_t child_basic_type_id) { |
|
319
|
|
|
|
|
|
|
|
|
320
|
658
|
|
|
|
|
|
SPVM_BASIC_TYPE* super_basic_type = SPVM_LIST_get(compiler->basic_types, super_basic_type_id); |
|
321
|
658
|
|
|
|
|
|
SPVM_BASIC_TYPE* child_basic_type = SPVM_LIST_get(compiler->basic_types, child_basic_type_id); |
|
322
|
|
|
|
|
|
|
|
|
323
|
658
|
|
|
|
|
|
const char* current_parent_basic_type_name = child_basic_type->parent_name; |
|
324
|
|
|
|
|
|
|
while (1) { |
|
325
|
660
|
100
|
|
|
|
|
if (current_parent_basic_type_name) { |
|
326
|
594
|
100
|
|
|
|
|
if (strcmp(super_basic_type->name, current_parent_basic_type_name) == 0) { |
|
327
|
592
|
|
|
|
|
|
return 1; |
|
328
|
|
|
|
|
|
|
} |
|
329
|
|
|
|
|
|
|
else { |
|
330
|
2
|
|
|
|
|
|
SPVM_BASIC_TYPE* current_parent_basic_type = SPVM_HASH_get(compiler->basic_type_symtable, current_parent_basic_type_name, strlen(current_parent_basic_type_name)); |
|
331
|
2
|
50
|
|
|
|
|
assert(current_parent_basic_type); |
|
332
|
2
|
|
|
|
|
|
current_parent_basic_type_name = current_parent_basic_type->parent_name; |
|
333
|
|
|
|
|
|
|
} |
|
334
|
|
|
|
|
|
|
} |
|
335
|
|
|
|
|
|
|
else { |
|
336
|
66
|
|
|
|
|
|
return 0; |
|
337
|
|
|
|
|
|
|
} |
|
338
|
2
|
|
|
|
|
|
} |
|
339
|
|
|
|
|
|
|
} |
|
340
|
|
|
|
|
|
|
|
|
341
|
2459103
|
|
|
|
|
|
SPVM_STRING* SPVM_BASIC_TYPE_add_constant_string(SPVM_COMPILER* compiler, SPVM_BASIC_TYPE* basic_type, const char* value, int32_t length) { |
|
342
|
|
|
|
|
|
|
|
|
343
|
2459103
|
|
|
|
|
|
SPVM_STRING* found_string = SPVM_HASH_get(basic_type->constant_string_symtable, value, length); |
|
344
|
2459103
|
100
|
|
|
|
|
if (found_string) { |
|
345
|
1667619
|
|
|
|
|
|
return found_string; |
|
346
|
|
|
|
|
|
|
} |
|
347
|
|
|
|
|
|
|
else { |
|
348
|
791484
|
|
|
|
|
|
int32_t string_pool_index = basic_type->string_pool->length; |
|
349
|
|
|
|
|
|
|
|
|
350
|
791484
|
|
|
|
|
|
SPVM_STRING_BUFFER_add_len_nullstr(basic_type->string_pool, (char*)value, length); |
|
351
|
|
|
|
|
|
|
|
|
352
|
791484
|
|
|
|
|
|
SPVM_STRING* string = SPVM_ALLOCATOR_alloc_memory_block_permanent(compiler->current_each_compile_allocator, sizeof(SPVM_STRING)); |
|
353
|
791484
|
|
|
|
|
|
string->value = value; |
|
354
|
791484
|
|
|
|
|
|
string->length = length; |
|
355
|
791484
|
|
|
|
|
|
string->index = basic_type->constant_strings->length; |
|
356
|
791484
|
|
|
|
|
|
string->string_pool_index = string_pool_index; |
|
357
|
|
|
|
|
|
|
|
|
358
|
791484
|
|
|
|
|
|
SPVM_LIST_push(basic_type->constant_strings, string); |
|
359
|
791484
|
|
|
|
|
|
SPVM_HASH_set(basic_type->constant_string_symtable, string->value, length, string); |
|
360
|
|
|
|
|
|
|
|
|
361
|
791484
|
|
|
|
|
|
return string; |
|
362
|
|
|
|
|
|
|
} |
|
363
|
|
|
|
|
|
|
} |