File Coverage

lib/SPVM/Builder/include/spvm_implement.h
Criterion Covered Total %
statement 982 1333 73.6
branch 368 530 69.4
condition n/a
subroutine n/a
pod n/a
total 1350 1863 72.4


line stmt bran cond sub pod time code
1             // Copyright (c) 2023 Yuki Kimoto
2             // MIT License
3              
4             #ifndef SPVM_IMPLEMENT_H
5             #define SPVM_IMPLEMENT_H
6              
7             #include
8              
9             enum {
10             SPVM_IMPLEMENT_C_STRING_CALL_STACK_ALLOCATION_FAILED,
11             SPVM_IMPLEMENT_C_STRING_VALUE_ASSIGN_NON_ASSIGNABLE_TYPE,
12             SPVM_IMPLEMENT_C_STRING_ASSIGN_READ_ONLY_STRING_TO_MUTABLE_TYPE,
13             SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO,
14             SPVM_IMPLEMENT_C_STRING_CONCAT_LEFT_UNDEFINED,
15             SPVM_IMPLEMENT_C_STRING_CONCAT_RIGHT_UNDEFINED,
16             SPVM_IMPLEMENT_C_STRING_NEW_OBJECT_FAILED,
17             SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED,
18             SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL,
19             SPVM_IMPLEMENT_C_STRING_NEW_STRING_FAILED,
20             SPVM_IMPLEMENT_C_STRING_STRING_LENGTH_SMALL,
21             SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED,
22             SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE,
23             SPVM_IMPLEMENT_C_STRING_ELEMENT_ASSIGN_NON_ASSIGNABLE_TYPE,
24             SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED,
25             SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF,
26             SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE,
27             SPVM_IMPLEMENT_C_STRING_WEAKEN_BACK_REFERENCE_ALLOCATION_FAILED,
28             SPVM_IMPLEMENT_C_STRING_COPY_OPERAND_INVALID,
29             SPVM_IMPLEMENT_C_STRING_WARN_AT,
30             SPVM_IMPLEMENT_C_STRING_WARN_UNDEF,
31             SPVM_IMPLEMENT_C_STRING_CALL_INSTANCE_METHOD_IMPLEMENT_NOT_FOUND,
32             SPVM_IMPLEMENT_C_STRING_ERROR_BASIC_TYPE_NOT_FOUND,
33             SPVM_IMPLEMENT_C_STRING_ERROR_FIELD_NOT_FOUND,
34             SPVM_IMPLEMENT_C_STRING_ERROR_CLASS_VAR_NOT_FOUND,
35             SPVM_IMPLEMENT_C_STRING_ERROR_CLASS_NOT_FOUND,
36             SPVM_IMPLEMENT_C_STRING_ERROR_METHOD_NOT_FOUND,
37             SPVM_IMPLEMENT_C_STRING_CALL_INSTANCE_METHOD_INVOCANT_UNDEF,
38             };
39              
40             static const char* SPVM_IMPLEMENT_STRING_LITERALS[] = {
41             "The memory allocation for the call stack failed.",
42             "The value cannnot be cast to the non-assignable type.",
43             "The read-only string cannnot be cast to the mutable string type.",
44             "Integral type values cannnot be divided by 0.",
45             "The left operand of the \".\" operator must be defined.",
46             "The right operand of the \".\" operator must be defined.",
47             "The object creating failed.",
48             "The array creating failed.",
49             "The length of the array must be greater than or equal to 0.",
50             "The string creating failed.",
51             "The length of the string must be greater than or equal to 0.",
52             "The array must be defined.",
53             "The index of the array access must be greater than or equal to 0 and less than the length of the array.",
54             "The element cannnot be assigned to the non-assignable type.",
55             "The invocant of the field access must be defined.",
56             "The unboxing conversion cannnot be performed on the undefined value.",
57             "The source of the unboxing conversion must be the corresponding numeric object type.",
58             "The memory allocation for the weaken back reference failed.",
59             "The operand of the copy operator must be a string type, a numeric type, or a multi numeric type.",
60             "\n at %s%s%s line %d\n",
61             "Warning\n at %s%s%s line %d\n",
62             "The implementation of the \"%s\" method in the \"%s\" interface is not found.",
63             "The %s basic type is not found.",
64             "The %s field is not found.",
65             "The %s class variable in the %s class is not found.",
66             "The %s class is not found.",
67             "The %s method in the %s class is not found.",
68             "The invocant must be defined.",
69             };
70              
71             enum {
72             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ,
73             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE,
74             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT,
75             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE,
76             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT,
77             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE,
78             SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP,
79             };
80              
81             static inline void* SPVM_IMPLEMENT_GET_BASIC_TYPE_BY_NAME(SPVM_ENV* env, SPVM_VALUE* stack, const char* basic_type_name, char* message, int32_t* error_id) {
82              
83             void* basic_type = env->api->runtime->get_basic_type_by_name(env->runtime, basic_type_name);
84              
85             if (!basic_type) {
86             snprintf(message, 256, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ERROR_BASIC_TYPE_NOT_FOUND], basic_type_name);
87             void* exception = env->new_string_nolen_no_mortal(env, stack, message);
88             env->set_exception(env, stack, exception);
89             *error_id = 1;
90             }
91            
92             return basic_type;
93             }
94              
95             static inline void* SPVM_IMPLEMENT_GET_FIELD_STATIC_BY_NAME(SPVM_ENV* env, SPVM_VALUE* stack, const char* basic_type_name, const char* field_name, char* message, int32_t* error_id) {
96            
97             void* field = env->get_field_static(env, stack, basic_type_name, field_name);
98            
99             if (!field) {
100             snprintf(message, 256, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ERROR_FIELD_NOT_FOUND], field_name);
101             void* exception = env->new_string_nolen_no_mortal(env, stack, message);
102             env->set_exception(env, stack, exception);
103             *error_id = 1;
104             }
105            
106             return field;
107             }
108              
109             static inline int32_t SPVM_IMPLEMENT_GET_FIELD_OFFSET_BY_NAME(SPVM_ENV* env, SPVM_VALUE* stack, const char* basic_type_name, const char* field_name, char* message, int32_t* error_id) {
110            
111             void* field = env->get_field_static(env, stack, basic_type_name, field_name);
112            
113             if (!field) {
114             snprintf(message, 256, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ERROR_FIELD_NOT_FOUND], field_name);
115             void* exception = env->new_string_nolen_no_mortal(env, stack, message);
116             env->set_exception(env, stack, exception);
117             *error_id = 1;
118             return -1;
119             }
120            
121             int32_t field_offset = env->api->field->get_offset(env->runtime, field);
122            
123             return field_offset;
124             }
125              
126             static inline void* SPVM_IMPLEMENT_GET_CLASS_VAR_BY_NAME(SPVM_ENV* env, SPVM_VALUE* stack, const char* basic_type_name, const char* class_var_name, char* message, int32_t* error_id) {
127              
128             void* class_var = env->get_class_var(env, stack, basic_type_name, class_var_name);
129            
130             if (!class_var) {
131             snprintf(message, 256, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ERROR_CLASS_VAR_NOT_FOUND], class_var_name);
132             void* exception = env->new_string_nolen_no_mortal(env, stack, message);
133             env->set_exception(env, stack, exception);
134             *error_id = 1;
135             }
136            
137             return class_var;
138             }
139              
140             static inline void* SPVM_IMPLEMENT_GET_METHOD_BY_NAME(SPVM_ENV* env, SPVM_VALUE* stack, const char* basic_type_name, const char* method_name, char* message, int32_t* error_id) {
141              
142             void* method = env->get_method(env, stack, basic_type_name, method_name);
143            
144             if (!method) {
145             snprintf(message, 256, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ERROR_METHOD_NOT_FOUND], method_name);
146             void* exception = env->new_string_nolen_no_mortal(env, stack, message);
147             env->set_exception(env, stack, exception);
148             *error_id = 1;
149             }
150            
151             return method;
152             }
153              
154 1539           static inline void SPVM_IMPLEMENT_MOVE_OBJECT_UNDEF(SPVM_ENV* env, SPVM_VALUE* stack, void** dist_address) {
155 1539           env->assign_object(env, stack, dist_address, NULL);
156 1539           }
157              
158 1203114           static inline void SPVM_IMPLEMENT_LEAVE_SCOPE(SPVM_ENV* env, SPVM_VALUE* stack, void** object_vars, int32_t* mortal_stack, int32_t* mortal_stack_top_ptr, int32_t original_mortal_stack_top) {
159 1203114           env->api->internal->leave_scope_local(env, stack, object_vars, mortal_stack, mortal_stack_top_ptr, original_mortal_stack_top);
160 1203114           }
161              
162             #define SPVM_IMPLEMENT_ADD_INT(out, in1, in2) (out = in1 + in2)
163              
164             #define SPVM_IMPLEMENT_ADD_LONG(out, in1, in2) (out = in1 + in2)
165              
166             #define SPVM_IMPLEMENT_ADD_FLOAT(out, in1, in2) (out = in1 + in2)
167              
168             #define SPVM_IMPLEMENT_ADD_DOUBLE(out, in1, in2) (out = in1 + in2)
169              
170             #define SPVM_IMPLEMENT_SUBTRACT_INT(out, in1, in2) (out = in1 - in2)
171              
172             #define SPVM_IMPLEMENT_SUBTRACT_LONG(out, in1, in2) (out = in1 - in2)
173              
174             #define SPVM_IMPLEMENT_SUBTRACT_FLOAT(out, in1, in2) (out = in1 - in2)
175              
176             #define SPVM_IMPLEMENT_SUBTRACT_DOUBLE(out, in1, in2) (out = in1 - in2)
177              
178             #define SPVM_IMPLEMENT_MULTIPLY_INT(out, in1, in2) (out = in1 * in2)
179              
180             #define SPVM_IMPLEMENT_MULTIPLY_LONG(out, in1, in2) (out = in1 * in2)
181              
182             #define SPVM_IMPLEMENT_MULTIPLY_FLOAT(out, in1, in2) (out = in1 * in2)
183              
184             #define SPVM_IMPLEMENT_MULTIPLY_DOUBLE(out, in1, in2) (out = in1 * in2)
185              
186 531           static inline void SPVM_IMPLEMENT_DIVIDE_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t in1, int32_t in2, int32_t* error_id) {
187 531 100         if (__builtin_expect(in2 == 0, 0)) {
188 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
189 1           env->set_exception(env, stack, exception);
190 1           *error_id = 1;
191             }
192             else {
193 530           *out = in1 / in2;
194             }
195 531           }
196              
197 3           static inline void SPVM_IMPLEMENT_DIVIDE_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t in1, int64_t in2, int32_t* error_id) {
198 3 50         if (__builtin_expect(in2 == 0, 0)) {
199 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
200 0           env->set_exception(env, stack, exception);
201 0           *error_id = 1;
202             }
203             else {
204 3           *out = in1 / in2;
205             }
206 3           }
207              
208             #define SPVM_IMPLEMENT_DIVIDE_FLOAT(out, in1, in2) (out = in1 / in2)
209              
210             #define SPVM_IMPLEMENT_DIVIDE_DOUBLE(out, in1, in2) (out = in1 / in2)
211              
212 1           static inline void SPVM_IMPLEMENT_DIVIDE_UNSIGNED_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t in1, int32_t in2, int32_t* error_id) {
213 1 50         if (__builtin_expect(in2 == 0, 0)) {
214 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
215 0           env->set_exception(env, stack, exception);
216 0           *error_id = 1;
217             }
218             else {
219 1           *out = (uint32_t)in1 / (uint32_t)in2;
220             }
221 1           }
222              
223 1           static inline void SPVM_IMPLEMENT_DIVIDE_UNSIGNED_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t in1, int64_t in2, int32_t* error_id) {
224 1 50         if (__builtin_expect(in2 == 0, 0)) {
225 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
226 0           env->set_exception(env, stack, exception);
227 0           *error_id = 1;
228             }
229             else {
230 1           *out = (uint64_t)in1 / (uint64_t)in2;
231             }
232 1           }
233              
234 100031           static inline void SPVM_IMPLEMENT_REMAINDER_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t in1, int32_t in2, int32_t* error_id) {
235 100031 50         if (__builtin_expect(in2 == 0, 0)) {
236 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
237 0           env->set_exception(env, stack, exception);
238 0           *error_id = 1;
239             }
240             else {
241 100031           *out = in1 % in2;
242             }
243 100031           }
244              
245 7           static inline void SPVM_IMPLEMENT_REMAINDER_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t in1, int64_t in2, int32_t* error_id) {
246 7 50         if (__builtin_expect(in2 == 0, 0)) {
247 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
248 0           env->set_exception(env, stack, exception);
249 0           *error_id = 1;
250             }
251             else {
252 7           *out = in1 % in2;
253             }
254 7           }
255              
256 1           static inline void SPVM_IMPLEMENT_REMAINDER_UNSIGNED_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t in1, int32_t in2, int32_t* error_id) {
257 1 50         if (__builtin_expect(in2 == 0, 0)) {
258 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
259 0           env->set_exception(env, stack, exception);
260 0           *error_id = 1;
261             }
262             else {
263 1           *out = (uint32_t)in1 % (uint32_t)in2;
264             }
265 1           }
266              
267 599           static inline void SPVM_IMPLEMENT_REMAINDER_UNSIGNED_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t in1, int64_t in2, int32_t* error_id) {
268 599 50         if (__builtin_expect(in2 == 0, 0)) {
269 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_DIVIDE_ZERO]);
270 0           env->set_exception(env, stack, exception);
271 0           *error_id = 1;
272             }
273             else {
274 599           *out = (uint64_t)in1 % (uint64_t)in2;
275             }
276 599           }
277              
278             #define SPVM_IMPLEMENT_LEFT_SHIFT_INT(out, in1, in2) (out = in1 << in2)
279             #define SPVM_IMPLEMENT_LEFT_SHIFT_LONG(out, in1, in2) (out = in1 << in2)
280              
281             #define SPVM_IMPLEMENT_RIGHT_ARITHMETIC_SHIFT_INT(out, in1, in2) (out = in1 >> in2)
282             #define SPVM_IMPLEMENT_RIGHT_ARITHMETIC_SHIFT_LONG(out, in1, in2) (out = in1 >> in2)
283              
284             #define SPVM_IMPLEMENT_RIGHT_LOGICAL_SHIFT_INT(out, in1, in2) (out = (int32_t)((uint32_t)in1 >> in2))
285             #define SPVM_IMPLEMENT_RIGHT_LOGICAL_SHIFT_LONG(out, in1, in2) (out = (int64_t)((uint64_t)in1 >> in2))
286              
287             #define SPVM_IMPLEMENT_BIT_AND_INT(out, in1, in2) (out = in1 & in2)
288             #define SPVM_IMPLEMENT_BIT_AND_LONG(out, in1, in2) (out = in1 & in2)
289              
290             #define SPVM_IMPLEMENT_BIT_OR_INT(out, in1, in2) (out = in1 | in2)
291             #define SPVM_IMPLEMENT_BIT_OR_LONG(out, in1, in2) (out = in1 | in2)
292              
293             #define SPVM_IMPLEMENT_BIT_XOR_INT(out, in1, in2) (out = in1 ^ in2)
294             #define SPVM_IMPLEMENT_BIT_XOR_LONG(out, in1, in2) (out = in1 ^ in2)
295              
296             #define SPVM_IMPLEMENT_PUSH_MORTAL(mortal_stack, mortal_stack_top, object_vars_index) (mortal_stack[mortal_stack_top++] = object_vars_index)
297              
298             #define SPVM_IMPLEMENT_MOVE_BYTE_ZERO(out) (out = 0)
299             #define SPVM_IMPLEMENT_MOVE_SHORT_ZERO(out) (out = 0)
300             #define SPVM_IMPLEMENT_MOVE_INT_ZERO(out) (out = 0)
301             #define SPVM_IMPLEMENT_MOVE_LONG_ZERO(out) (out = 0)
302             #define SPVM_IMPLEMENT_MOVE_FLOAT_ZERO(out) (out = 0)
303             #define SPVM_IMPLEMENT_MOVE_DOUBLE_ZERO(out) (out = 0)
304              
305 15           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_BYTE_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, int32_t fields_length) {
306 99 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
307 84           *(out + field_index) = 0;
308             }
309 15           }
310              
311 14           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_SHORT_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, int32_t fields_length) {
312 95 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
313 81           *(out + field_index) = 0;
314             }
315 14           }
316              
317 14           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_INT_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t fields_length) {
318 95 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
319 81           *(out + field_index) = 0;
320             }
321 14           }
322              
323 14           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_LONG_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int32_t fields_length) {
324 95 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
325 81           *(out + field_index) = 0;
326             }
327 14           }
328              
329 14           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_FLOAT_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, float* out, int32_t fields_length) {
330 95 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
331 81           *(out + field_index) = 0;
332             }
333 14           }
334              
335 26           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_DOUBLE_ZERO(SPVM_ENV* env, SPVM_VALUE* stack, double* out, int32_t fields_length) {
336 131 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
337 105           *(out + field_index) = 0;
338             }
339 26           }
340              
341             #define SPVM_IMPLEMENT_MOVE_CONSTANT_BYTE(out, in) (out = in)
342             #define SPVM_IMPLEMENT_MOVE_CONSTANT_INT(out, in) (out = in)
343             #define SPVM_IMPLEMENT_MOVE_CONSTANT_LONG(out, in) (out = in)
344             #define SPVM_IMPLEMENT_MOVE_CONSTANT_FLOAT(out, in) (out = in)
345             #define SPVM_IMPLEMENT_MOVE_CONSTANT_DOUBLE(out, in) (out = in)
346              
347             #define SPVM_IMPLEMENT_MOVE_BYTE(out, in) (out = in)
348             #define SPVM_IMPLEMENT_MOVE_SHORT(out, in) (out = in)
349             #define SPVM_IMPLEMENT_MOVE_INT(out, in) (out = in)
350             #define SPVM_IMPLEMENT_MOVE_LONG(out, in) (out = in)
351             #define SPVM_IMPLEMENT_MOVE_FLOAT(out, in) (out = in)
352             #define SPVM_IMPLEMENT_MOVE_DOUBLE(out, in) (out = in)
353             #define SPVM_IMPLEMENT_MOVE_OBJECT(env, stack, out, in) (env->assign_object(env, stack, out, in))
354              
355 328           static inline void SPVM_IMPLEMENT_MOVE_OBJECT_WITH_TYPE_CHECKING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* in, void* cast_basic_type, int32_t cast_type_dimension, int32_t* error_id) {
356 328           void* object = in;
357 328           int32_t isa = env->isa(env, stack, object, cast_basic_type, cast_type_dimension);
358 328 100         if (isa) {
359 322           env->assign_object(env, stack, out, in);
360             }
361             else {
362 6           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_VALUE_ASSIGN_NON_ASSIGNABLE_TYPE]);
363 6           env->set_exception(env, stack, exception);
364 6           *error_id = 1;
365             }
366 328           }
367              
368 2269           static inline void SPVM_IMPLEMENT_MOVE_OBJECT_CHECK_READ_ONLY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* in, int32_t* error_id) {
369 2269           void* string = in;
370 2269 100         if (env->is_read_only(env, stack, string)) {
371 3           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ASSIGN_READ_ONLY_STRING_TO_MUTABLE_TYPE]);
372 3           env->set_exception(env, stack, exception);
373 3           *error_id = 1;
374             }
375             else {
376 2266           env->assign_object(env, stack, out, string);
377             }
378 2269           }
379              
380             #define SPVM_IMPLEMENT_MOVE_REF(out, in) (out = in)
381              
382             #define SPVM_IMPLEMENT_BIT_NOT_INT(out, in) (out = ~in)
383             #define SPVM_IMPLEMENT_BIT_NOT_LONG(out, in) (out = ~in)
384             #define SPVM_IMPLEMENT_NEGATE_INT(out, in) (out = -in)
385             #define SPVM_IMPLEMENT_NEGATE_LONG(out, in) (out = -in)
386             #define SPVM_IMPLEMENT_NEGATE_FLOAT(out, in) (out = -in)
387             #define SPVM_IMPLEMENT_NEGATE_DOUBLE(out, in) (out = -in)
388              
389 695           static inline void SPVM_IMPLEMENT_CONCAT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* in1, void* in2, int32_t* error_id) {
390 695           void* string1 = in1;
391 695           void* string2 = in2;
392 695 100         if (string1 == NULL) {
393 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_CONCAT_LEFT_UNDEFINED]);
394 1           env->set_exception(env, stack, exception);
395 1           *error_id = 1;
396             }
397 694 100         else if (string2 == NULL) {
398 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_CONCAT_RIGHT_UNDEFINED]);
399 1           env->set_exception(env, stack, exception);
400 1           *error_id = 1;
401             }
402             else {
403 693           void* string3 = env->concat_no_mortal(env, stack, string1, string2);
404 693           env->assign_object(env, stack, out, string3);
405             }
406 695           }
407              
408             #define SPVM_IMPLEMENT_BOOL_CONVERSION_INT(out, in) (out = in)
409             #define SPVM_IMPLEMENT_BOOL_CONVERSION_LONG(out, in) (out = !!in)
410             #define SPVM_IMPLEMENT_BOOL_CONVERSION_FLOAT(out, in) (out = !!in)
411             #define SPVM_IMPLEMENT_BOOL_CONVERSION_DOUBLE(out, in) (out = !!in)
412             #define SPVM_IMPLEMENT_BOOL_CONVERSION_OBJECT(out, in) (out = !!in)
413             #define SPVM_IMPLEMENT_BOOL_CONVERSION_REF(out, in) (out = !!in)
414             #define SPVM_IMPLEMENT_BOOL_CONVERSION_BOOL_OBJECT(env, stack, out, in) (out = !!env->get_bool_object_value(env, stack, in))
415              
416             #define SPVM_IMPLEMENT_EQ_INT(out, in1, in2) (out = (in1 == in2))
417             #define SPVM_IMPLEMENT_EQ_LONG(out, in1, in2) (out = (in1 == in2))
418             #define SPVM_IMPLEMENT_EQ_FLOAT(out, in1, in2) (out = (in1 == in2))
419             #define SPVM_IMPLEMENT_EQ_DOUBLE(out, in1, in2) (out = (in1 == in2))
420             #define SPVM_IMPLEMENT_EQ_OBJECT(out, in1, in2) (out = (in1 == in2))
421             #define SPVM_IMPLEMENT_EQ_REF(out, in1, in2) (out = (in1 == in2))
422              
423             #define SPVM_IMPLEMENT_NE_INT(out, in1, in2) (out = (in1 != in2))
424             #define SPVM_IMPLEMENT_NE_LONG(out, in1, in2) (out = (in1 != in2))
425             #define SPVM_IMPLEMENT_NE_FLOAT(out, in1, in2) (out = (in1 != in2))
426             #define SPVM_IMPLEMENT_NE_DOUBLE(out, in1, in2) (out = (in1 != in2))
427             #define SPVM_IMPLEMENT_NE_OBJECT(out, in1, in2) (out = (in1 != in2))
428             #define SPVM_IMPLEMENT_NE_REF(out, in1, in2) (out = (in1 != in2))
429              
430             #define SPVM_IMPLEMENT_GT_INT(out, in1, in2) (out = (in1 > in2))
431             #define SPVM_IMPLEMENT_GT_LONG(out, in1, in2) (out = (in1 > in2))
432             #define SPVM_IMPLEMENT_GT_FLOAT(out, in1, in2) (out = (in1 > in2))
433             #define SPVM_IMPLEMENT_GT_DOUBLE(out, in1, in2) (out = (in1 > in2))
434              
435             #define SPVM_IMPLEMENT_GE_INT(out, in1, in2) (out = (in1 >= in2))
436             #define SPVM_IMPLEMENT_GE_LONG(out, in1, in2) (out = (in1 >= in2))
437             #define SPVM_IMPLEMENT_GE_FLOAT(out, in1, in2) (out = (in1 >= in2))
438             #define SPVM_IMPLEMENT_GE_DOUBLE(out, in1, in2) (out = (in1 >= in2))
439              
440             #define SPVM_IMPLEMENT_LT_INT(out, in1, in2) (out = (in1 < in2))
441             #define SPVM_IMPLEMENT_LT_LONG(out, in1, in2) (out = (in1 < in2))
442             #define SPVM_IMPLEMENT_LT_FLOAT(out, in1, in2) (out = (in1 < in2))
443             #define SPVM_IMPLEMENT_LT_DOUBLE(out, in1, in2) (out = (in1 < in2))
444              
445             #define SPVM_IMPLEMENT_LE_INT(out, in1, in2) (out = (in1 <= in2))
446             #define SPVM_IMPLEMENT_LE_LONG(out, in1, in2) (out = (in1 <= in2))
447             #define SPVM_IMPLEMENT_LE_FLOAT(out, in1, in2) (out = (in1 <= in2))
448             #define SPVM_IMPLEMENT_LE_DOUBLE(out, in1, in2) (out = (in1 <= in2))
449              
450             #define SPVM_IMPLEMENT_CMP_INT(out, in1, in2) (out = in1 > in2 ? 1 : in1 < in2 ? -1 : 0)
451             #define SPVM_IMPLEMENT_CMP_LONG(out, in1, in2) (out = in1 > in2 ? 1 : in1 < in2 ? -1 : 0)
452             #define SPVM_IMPLEMENT_CMP_FLOAT(out, in1, in2) (out = in1 > in2 ? 1 : in1 < in2 ? -1 : 0)
453             #define SPVM_IMPLEMENT_CMP_DOUBLE(out, in1, in2) (out = in1 > in2 ? 1 : in1 < in2 ? -1 : 0)
454              
455             #define SPVM_IMPLEMENT_IS_UNDEF(out, in) (out = in == NULL)
456             #define SPVM_IMPLEMENT_IS_NOT_UNDEF(out, in) (out = in != NULL)
457              
458 839           static inline void SPVM_IMPLEMENT_STRING_COMPARISON_OP(SPVM_ENV* env, SPVM_VALUE* stack, int32_t comparison_op_id, int32_t* out, void* in1, void* in2, int32_t object_length_offset) {
459 839           void* object1 = in1;
460 839           void* object2 = in2;
461            
462 839           int32_t flag = 0;
463 839 100         if (object1 == NULL && object2 == NULL) {
    100          
464 6           switch (comparison_op_id) {
465             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ: {
466 1           flag = 1;
467 1           break;
468             }
469             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE: {
470 1           flag = 0;
471 1           break;
472             }
473             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT: {
474 1           flag = 0;
475 1           break;
476             }
477             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE: {
478 1           flag = 1;
479 1           break;
480             }
481             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT: {
482 0           flag = 0;
483 0           break;
484             }
485             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE: {
486 1           flag = 1;
487 1           break;
488             }
489             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP: {
490 1           flag = 0;
491 1           break;
492             }
493             }
494 6           }
495 833 100         else if (object1 != NULL && object2 == NULL) {
    100          
496 7           switch (comparison_op_id) {
497             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ: {
498 1           flag = 0;
499 1           break;
500             }
501             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE: {
502 1           flag = 1;
503 1           break;
504             }
505             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT: {
506 1           flag = 1;
507 1           break;
508             }
509             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE: {
510 1           flag = 1;
511 1           break;
512             }
513             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT: {
514 0           flag = 0;
515 0           break;
516             }
517             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE: {
518 1           flag = 0;
519 1           break;
520             }
521             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP: {
522 2           flag = 1;
523 2           break;
524             }
525             }
526 7           }
527 826 100         else if (object1 == NULL && object2 != NULL) {
    50          
528 7           switch (comparison_op_id) {
529             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ: {
530 1           flag = 0;
531 1           break;
532             }
533             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE: {
534 1           flag = 1;
535 1           break;
536             }
537             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT: {
538 1           flag = 0;
539 1           break;
540             }
541             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE: {
542 1           flag = 0;
543 1           break;
544             }
545             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT: {
546 0           flag = 1;
547 0           break;
548             }
549             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE: {
550 1           flag = 1;
551 1           break;
552             }
553             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP: {
554 2           flag = -1;
555 2           break;
556             }
557             }
558 7           }
559             else {
560 819           int32_t length1 = *(int32_t*)((intptr_t)object1 + object_length_offset);
561 819           int32_t length2 = *(int32_t*)((intptr_t)object2 + object_length_offset);
562            
563 819           const char* bytes1 = env->get_chars(env, stack, object1);
564 819           const char* bytes2 = env->get_chars(env, stack, object2);
565            
566 819           int32_t short_string_length = length1 < length2 ? length1 : length2;
567 819           int32_t retval = memcmp(bytes1, bytes2, short_string_length);
568             int32_t cmp;
569 819 100         if (retval) {
570 132 100         cmp = retval < 0 ? -1 : 1;
571 687 100         } else if (length1 == length2) {
572 667           cmp = 0;
573             } else {
574 20 100         cmp = length1 < length2 ? -1 : 1;
575             }
576            
577 819           switch (comparison_op_id) {
578             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ: {
579 669           flag = (cmp == 0);
580 669           break;
581             }
582             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE: {
583 8           flag = (cmp != 0);
584 8           break;
585             }
586             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT: {
587 8           flag = (cmp == 1);
588 8           break;
589             }
590             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE: {
591 8           flag = (cmp >= 0);
592 8           break;
593             }
594             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT: {
595 1           flag = (cmp == -1);
596 1           break;
597             }
598             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE: {
599 8           flag = (cmp <= 0);
600 8           break;
601             }
602             case SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP: {
603 117           flag = cmp;
604 117           break;
605             }
606             }
607             }
608            
609 839           *out = flag;
610 839           }
611              
612             #define SPVM_IMPLEMENT_STRING_EQ(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_EQ, out, in1, in2, object_length_offset))
613             #define SPVM_IMPLEMENT_STRING_NE(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_NE, out, in1, in2, object_length_offset))
614             #define SPVM_IMPLEMENT_STRING_GT(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GT, out, in1, in2, object_length_offset))
615             #define SPVM_IMPLEMENT_STRING_GE(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_GE, out, in1, in2, object_length_offset))
616             #define SPVM_IMPLEMENT_STRING_LT(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LT, out, in1, in2, object_length_offset))
617             #define SPVM_IMPLEMENT_STRING_LE(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_LE, out, in1, in2, object_length_offset))
618             #define SPVM_IMPLEMENT_STRING_CMP(env, stack, out, in1, in2) (SPVM_IMPLEMENT_STRING_COMPARISON_OP(env, stack, SPVM_IMPLEMENT_C_COMPARISON_OP_STRING_CMP, out, in1, in2, object_length_offset))
619              
620 35330           static inline void SPVM_IMPLEMENT_NEW_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* basic_type, int32_t* error_id) {
621 35330           void* object = env->new_object_no_mortal(env, stack, basic_type);
622 35330 50         if (object == NULL) {
623 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_OBJECT_FAILED]);
624 0           env->set_exception(env, stack, exception);
625 0           *error_id = 1;
626             }
627             else {
628             // Push object
629 35330           env->assign_object(env, stack, out, object);
630             }
631 35330           }
632              
633 35666           static inline void SPVM_IMPLEMENT_NEW_OBJECT_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* basic_type, int32_t length, int32_t* error_id) {
634 35666 100         if (length >= 0) {
635 35665           void* object = env->new_object_array_no_mortal(env, stack, basic_type, length);
636 35665 50         if (object == NULL) {
637 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
638 0           env->set_exception(env, stack, exception);
639 0           *error_id = 1;
640             }
641             else {
642 35665           env->assign_object(env, stack, out, object);
643             }
644             }
645             else {
646 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
647 1           env->set_exception(env, stack, exception);
648 1           *error_id = 1;
649             }
650 35666           }
651              
652 25           static inline void SPVM_IMPLEMENT_NEW_MULDIM_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* basic_type, int32_t type_dimension, int32_t length, int32_t* error_id) {
653 25 100         if (length >= 0) {
654 24           void* object = env->new_muldim_array_no_mortal(env, stack, basic_type, type_dimension, length);
655 24 50         if (object == NULL) {
656 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
657 0           env->set_exception(env, stack, exception);
658 0           *error_id = 1;
659             }
660             else {
661 24           env->assign_object(env, stack, out, object);
662             }
663             }
664             else {
665 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
666 1           env->set_exception(env, stack, exception);
667 1           *error_id = 1;
668             }
669 25           }
670              
671 85           static inline void SPVM_IMPLEMENT_NEW_MULNUM_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* basic_type, int32_t length, int32_t* error_id) {
672 85 100         if (length >= 0) {
673 84           void* object = env->new_mulnum_array_no_mortal(env, stack, basic_type, length);
674 84 50         if (object == NULL) {
675 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
676 0           env->set_exception(env, stack, exception);
677 0           *error_id = 1;
678             }
679             else {
680 84           env->assign_object(env, stack, out, object);
681             }
682             }
683             else {
684 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
685 1           env->set_exception(env, stack, exception);
686 1           *error_id = 1;
687             }
688 85           }
689              
690 479           static inline void SPVM_IMPLEMENT_NEW_BYTE_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
691 479 100         if (length >= 0) {
692 478           void* object = env->new_byte_array_no_mortal(env, stack, length);
693 478 50         if (object == NULL) {
694 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
695 0           env->set_exception(env, stack, exception);
696 0           *error_id = 1;
697             }
698             else {
699 478           env->assign_object(env, stack, out, object);
700             }
701             }
702             else {
703 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
704 1           env->set_exception(env, stack, exception);
705 1           *error_id = 1;
706             }
707 479           }
708              
709 441           static inline void SPVM_IMPLEMENT_NEW_SHORT_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
710 441 100         if (length >= 0) {
711 440           void* object = env->new_short_array_no_mortal(env, stack, length);
712 440 50         if (object == NULL) {
713 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
714 0           env->set_exception(env, stack, exception);
715 0           *error_id = 1;
716             }
717             else {
718 440           env->assign_object(env, stack, out, object);
719             }
720             }
721             else {
722 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
723 1           env->set_exception(env, stack, exception);
724 1           *error_id = 1;
725             }
726 441           }
727              
728 529           static inline void SPVM_IMPLEMENT_NEW_INT_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
729 529 100         if (length >= 0) {
730 528           void* object = env->new_int_array_no_mortal(env, stack, length);
731 528 50         if (object == NULL) {
732 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
733 0           env->set_exception(env, stack, exception);
734 0           *error_id = 1;
735             }
736             else {
737 528           env->assign_object(env, stack, out, object);
738             }
739             }
740             else {
741 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
742 1           env->set_exception(env, stack, exception);
743 1           *error_id = 1;
744             }
745 529           }
746              
747 434           static inline void SPVM_IMPLEMENT_NEW_LONG_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
748 434 100         if (length >= 0) {
749 433           void* object = env->new_long_array_no_mortal(env, stack, length);
750 433 50         if (object == NULL) {
751 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
752 0           env->set_exception(env, stack, exception);
753 0           *error_id = 1;
754             }
755             else {
756 433           env->assign_object(env, stack, out, object);
757             }
758             }
759             else {
760 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
761 1           env->set_exception(env, stack, exception);
762 1           *error_id = 1;
763             }
764 434           }
765              
766 438           static inline void SPVM_IMPLEMENT_NEW_FLOAT_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
767 438 100         if (length >= 0) {
768 437           void* object = env->new_float_array_no_mortal(env, stack, length);
769 437 50         if (object == NULL) {
770 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
771 0           env->set_exception(env, stack, exception);
772 0           *error_id = 1;
773             }
774             else {
775 437           env->assign_object(env, stack, out, object);
776             }
777             }
778             else {
779 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
780 1           env->set_exception(env, stack, exception);
781 1           *error_id = 1;
782             }
783 438           }
784              
785 445           static inline void SPVM_IMPLEMENT_NEW_DOUBLE_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
786 445 100         if (length >= 0) {
787 444           void* object = env->new_double_array_no_mortal(env, stack, length);
788 444 50         if (object == NULL) {
789 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_ARRAY_FAILED]);
790 0           env->set_exception(env, stack, exception);
791 0           *error_id = 1;
792             }
793             else {
794 444           env->assign_object(env, stack, out, object);
795             }
796             }
797             else {
798 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRRAY_LENGTH_SMALL]);
799 1           env->set_exception(env, stack, exception);
800 1           *error_id = 1;
801             }
802 445           }
803              
804 4585           static inline void SPVM_IMPLEMENT_NEW_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, const char* constant_string, int32_t constant_string_length, int32_t* error_id) {
805 4585           void* string = env->new_string_no_mortal(env, stack, constant_string, constant_string_length);
806 4585 50         if (string == NULL) {
807 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_STRING_FAILED]);
808 0           env->set_exception(env, stack, exception);
809 0           *error_id = 1;
810             }
811             else {
812 4585           env->make_read_only(env, stack, string);
813 4585           env->assign_object(env, stack, out , string);
814             }
815 4585           }
816              
817 2221           static inline void SPVM_IMPLEMENT_NEW_STRING_LEN(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t length, int32_t* error_id) {
818 2221 100         if (length >= 0) {
819 2219           void* string = env->new_string_no_mortal(env, stack, NULL, length);
820 2219 50         if (string == NULL) {
821 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_NEW_STRING_FAILED]);
822 0           env->set_exception(env, stack, exception);
823 0           *error_id = 1;
824             }
825             else {
826 2219           env->assign_object(env, stack, out, string);
827             }
828             }
829             else {
830 2           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_STRING_LENGTH_SMALL]);
831 2           env->set_exception(env, stack, exception);
832 2           *error_id = 1;
833             }
834 2221           }
835              
836             #define SPVM_IMPLEMENT_IS_READ_ONLY(env, stack, out, in) (out = env->is_read_only(env, stack, in))
837              
838             #define SPVM_IMPLEMENT_MAKE_READ_ONLY(env, stack, in) (env->make_read_only(env, stack, in))
839              
840 3569           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
841            
842 3569           int8_t element = 0;
843            
844 3569 50         if (__builtin_expect(array == NULL, 0)) {
845 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
846 0           *error_id = 1;
847             }
848             else {
849 3569 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
850 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
851 1           *error_id = 1;
852             }
853             else {
854 3568           *out = ((int8_t*)((intptr_t)array + object_data_offset))[index];
855             }
856             }
857 3569           }
858              
859 559           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
860            
861 559           int16_t element = 0;
862            
863 559 50         if (__builtin_expect(array == NULL, 0)) {
864 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
865 0           *error_id = 1;
866             }
867             else {
868 559 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
869 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
870 1           *error_id = 1;
871             }
872             else {
873 558           *out = ((int16_t*)((intptr_t)array + object_data_offset))[index];
874             }
875             }
876 559           }
877              
878 617           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
879            
880 617           int32_t element = 0;
881            
882 617 50         if (__builtin_expect(array == NULL, 0)) {
883 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
884 0           *error_id = 1;
885             }
886             else {
887 617 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
888 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
889 1           *error_id = 1;
890             }
891             else {
892 616           *out = ((int32_t*)((intptr_t)array + object_data_offset))[index];
893             }
894             }
895 617           }
896              
897 568           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
898            
899 568           int64_t element = 0;
900            
901 568 50         if (__builtin_expect(array == NULL, 0)) {
902 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
903 0           *error_id = 1;
904             }
905             else {
906 568 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
907 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
908 1           *error_id = 1;
909             }
910             else {
911 567           *out = ((int64_t*)((intptr_t)array + object_data_offset))[index];
912             }
913             }
914 568           }
915              
916 559           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
917            
918 559           float element = 0;
919            
920 559 50         if (__builtin_expect(array == NULL, 0)) {
921 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
922 0           *error_id = 1;
923             }
924             else {
925 559 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
926 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
927 1           *error_id = 1;
928             }
929             else {
930 558           *out = ((float*)((intptr_t)array + object_data_offset))[index];
931             }
932             }
933 559           }
934              
935 559           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
936            
937 559           double element = 0;
938            
939 559 50         if (__builtin_expect(array == NULL, 0)) {
940 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
941 0           *error_id = 1;
942             }
943             else {
944 559 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
945 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
946 1           *error_id = 1;
947             }
948             else {
949 558           *out = ((double*)((intptr_t)array + object_data_offset))[index];
950             }
951             }
952 559           }
953              
954 73226           static inline void SPVM_IMPLEMENT_GET_ARRAY_ELEMENT_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
955            
956 73226           void* element = NULL;
957            
958 73226 50         if (__builtin_expect(array == NULL, 0)) {
959 0           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]));
960 0           *error_id = 1;
961             }
962             else {
963 73226 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    100          
964 1           env->set_exception(env, stack, env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]));
965 1           *error_id = 1;
966             }
967             else {
968 73225           env->assign_object(env, stack, out, ((void**)((intptr_t)array + object_data_offset))[index]);
969             }
970             }
971 73226           }
972              
973 4703           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, int8_t in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
974 4703 50         if (__builtin_expect(!array, 0)) {
975 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
976 0           env->set_exception(env, stack, exception);
977 0           *error_id = 1;
978             }
979             else {
980 4703 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
981 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
982 0           env->set_exception(env, stack, exception);
983 0           *error_id = 1;
984             }
985             else {
986 4703           ((int8_t*)((intptr_t)array + object_data_offset))[index] = in;
987             }
988             }
989 4703           }
990              
991 1094           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, int16_t in, int32_t* error_id, int32_t object_header_short_size, int32_t object_length_offset) {
992 1094 50         if (__builtin_expect(!array, 0)) {
993 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
994 0           env->set_exception(env, stack, exception);
995 0           *error_id = 1;
996             }
997             else {
998 1094 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
999 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1000 0           env->set_exception(env, stack, exception);
1001 0           *error_id = 1;
1002             }
1003             else {
1004 1094           ((int16_t*)((intptr_t)array + object_header_short_size))[index] = in;
1005             }
1006             }
1007 1094           }
1008              
1009 301228           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_INT(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, int32_t in, int32_t* error_id, int32_t object_header_int_size, int32_t object_length_offset) {
1010 301228 50         if (__builtin_expect(!array, 0)) {
1011 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1012 0           env->set_exception(env, stack, exception);
1013 0           *error_id = 1;
1014             }
1015             else {
1016 301228 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1017 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1018 0           env->set_exception(env, stack, exception);
1019 0           *error_id = 1;
1020             }
1021             else {
1022 301228           ((int32_t*)((intptr_t)array + object_header_int_size))[index] = in;
1023             }
1024             }
1025 301228           }
1026              
1027 1087           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_LONG(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, int64_t in, int32_t* error_id, int32_t object_header_long_size, int32_t object_length_offset) {
1028 1087 50         if (__builtin_expect(!array, 0)) {
1029 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1030 0           env->set_exception(env, stack, exception);
1031 0           *error_id = 1;
1032             }
1033             else {
1034 1087 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1035 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1036 0           env->set_exception(env, stack, exception);
1037 0           *error_id = 1;
1038             }
1039             else {
1040 1087           ((int64_t*)((intptr_t)array + object_header_long_size))[index] = in;
1041             }
1042             }
1043 1087           }
1044              
1045 1083           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, float in, int32_t* error_id, int32_t object_header_float_size, int32_t object_length_offset) {
1046 1083 50         if (__builtin_expect(!array, 0)) {
1047 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1048 0           env->set_exception(env, stack, exception);
1049 0           *error_id = 1;
1050             }
1051             else {
1052 1083 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1053 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1054 0           env->set_exception(env, stack, exception);
1055 0           *error_id = 1;
1056             }
1057             else {
1058 1083           ((float*)((intptr_t)array + object_header_float_size))[index] = in;
1059             }
1060             }
1061 1083           }
1062              
1063 1108           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, double in, int32_t* error_id, int32_t object_header_double_size, int32_t object_length_offset) {
1064 1108 50         if (__builtin_expect(!array, 0)) {
1065 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1066 0           env->set_exception(env, stack, exception);
1067 0           *error_id = 1;
1068             }
1069             else {
1070 1108 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1071 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1072 0           env->set_exception(env, stack, exception);
1073 0           *error_id = 1;
1074             }
1075             else {
1076 1108           ((double*)((intptr_t)array + object_header_double_size))[index] = in;
1077             }
1078             }
1079 1108           }
1080              
1081 33802           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, void* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1082 33802 50         if (__builtin_expect(!array, 0)) {
1083 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1084 0           env->set_exception(env, stack, exception);
1085 0           *error_id = 1;
1086             }
1087             else {
1088 33802 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1089 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1090 0           env->set_exception(env, stack, exception);
1091 0           *error_id = 1;
1092             }
1093             else {
1094 33802           void** element_address = &((void**)((intptr_t)array + object_data_offset))[index];
1095 33802           env->assign_object(env, stack, element_address, in);
1096             }
1097             }
1098 33802           }
1099              
1100 72606           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_OBJECT_CHECK_TYPE(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, void* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1101 72606 50         if (__builtin_expect(!array, 0)) {
1102 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1103 0           env->set_exception(env, stack, exception);
1104 0           *error_id = 1;
1105             }
1106             else {
1107 72606 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1108 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1109 0           env->set_exception(env, stack, exception);
1110 0           *error_id = 1;
1111             }
1112             else {
1113 72606           void** element_address = &((void**)((intptr_t)array + object_data_offset))[index];
1114 72606           void* object = in;
1115 72606           int32_t elem_isa = env->elem_isa(env, stack, array, object);
1116 72606 100         if (elem_isa) {
1117 72603           env->assign_object(env, stack, element_address, object);
1118             }
1119             else {
1120 3           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ELEMENT_ASSIGN_NON_ASSIGNABLE_TYPE]);
1121 3           env->set_exception(env, stack, exception);
1122 3           *error_id = 1;
1123             }
1124             }
1125             }
1126 72606           }
1127              
1128 103           static inline void SPVM_IMPLEMENT_SET_ARRAY_ELEMENT_UNDEF(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1129 103 50         if (__builtin_expect(!array, 0)) {
1130 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1131 0           env->set_exception(env, stack, exception);
1132 0           *error_id = 1;
1133             }
1134             else {
1135 103 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1136 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1137 0           env->set_exception(env, stack, exception);
1138 0           *error_id = 1;
1139             }
1140             else {
1141 103           void* object_address = &((void**)((intptr_t)array + object_data_offset))[index];
1142 103           env->assign_object(env, stack, object_address, NULL);
1143             }
1144             }
1145 103           }
1146              
1147 43464           static inline void SPVM_IMPLEMENT_ARRAY_LENGTH(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* array, int32_t* error_id, int32_t object_length_offset) {
1148 43464 100         if (array == NULL) {
1149 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1150 1           env->set_exception(env, stack, exception);
1151 1           *error_id = 1;
1152             }
1153             else {
1154 43463           *out = *(int32_t*)((intptr_t)array + object_length_offset);
1155             }
1156 43464           }
1157              
1158 62           static inline void SPVM_IMPLEMENT_GET_FIELD_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1159            
1160 62 100         if (__builtin_expect(object == NULL, 0)) {
1161 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1162 1           env->set_exception(env, stack, exception);
1163 1           *error_id = 1;
1164             }
1165             else {
1166 61           *out = *(int8_t*)((intptr_t)object + object_data_offset + field_offset);
1167             }
1168 62           }
1169              
1170 37           static inline void SPVM_IMPLEMENT_GET_FIELD_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_header_short_size) {
1171            
1172 37 100         if (__builtin_expect(object == NULL, 0)) {
1173 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1174 1           env->set_exception(env, stack, exception);
1175 1           *error_id = 1;
1176             }
1177             else {
1178 36           *out = *(int16_t*)((intptr_t)object + object_header_short_size + field_offset);
1179             }
1180 37           }
1181              
1182              
1183 115262           static inline void SPVM_IMPLEMENT_GET_FIELD_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_header_int_size) {
1184            
1185 115262 100         if (__builtin_expect(object == NULL, 0)) {
1186 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1187 1           env->set_exception(env, stack, exception);
1188 1           *error_id = 1;
1189             }
1190             else {
1191 115261           *out = *(int32_t*)((intptr_t)object + object_header_int_size + field_offset);
1192             }
1193 115262           }
1194              
1195              
1196 39           static inline void SPVM_IMPLEMENT_GET_FIELD_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_header_long_size) {
1197            
1198 39 100         if (__builtin_expect(object == NULL, 0)) {
1199 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1200 1           env->set_exception(env, stack, exception);
1201 1           *error_id = 1;
1202             }
1203             else {
1204 38           *out = *(int64_t*)((intptr_t)object + object_header_long_size + field_offset);
1205             }
1206 39           }
1207              
1208              
1209 65           static inline void SPVM_IMPLEMENT_GET_FIELD_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_header_float_size) {
1210            
1211 65 100         if (__builtin_expect(object == NULL, 0)) {
1212 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1213 1           env->set_exception(env, stack, exception);
1214 1           *error_id = 1;
1215             }
1216             else {
1217 64           *out = *(float*)((intptr_t)object + object_header_float_size + field_offset);
1218             }
1219 65           }
1220              
1221              
1222 93           static inline void SPVM_IMPLEMENT_GET_FIELD_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_header_double_size) {
1223            
1224 93 100         if (__builtin_expect(object == NULL, 0)) {
1225 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1226 1           env->set_exception(env, stack, exception);
1227 1           *error_id = 1;
1228             }
1229             else {
1230 92           *out = *(double*)((intptr_t)object + object_header_double_size + field_offset);
1231             }
1232 93           }
1233              
1234 68940           static inline void SPVM_IMPLEMENT_GET_FIELD_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1235 68940 100         if (__builtin_expect(object == NULL, 0)) {
1236 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1237 1           env->set_exception(env, stack, exception);
1238 1           *error_id = 1;
1239             }
1240             else {
1241 68939           void** ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1242 68939           void* object = (void*)((intptr_t)*ref & ~(intptr_t)1);
1243 68939           env->assign_object(env, stack, out, object);
1244             }
1245 68940           }
1246              
1247 69           static inline void SPVM_IMPLEMENT_SET_FIELD_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int8_t in, int32_t* error_id, int32_t object_data_offset) {
1248            
1249 69 100         if (__builtin_expect(object == NULL, 0)) {
1250 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1251 1           env->set_exception(env, stack, exception);
1252 1           *error_id = 1;
1253             }
1254             else {
1255 68           *(int8_t*)((intptr_t)object + object_data_offset + field_offset) = in;
1256             }
1257 69           }
1258              
1259 51           static inline void SPVM_IMPLEMENT_SET_FIELD_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int16_t in, int32_t* error_id, int32_t object_data_offset) {
1260            
1261 51 100         if (__builtin_expect(object == NULL, 0)) {
1262 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1263 1           env->set_exception(env, stack, exception);
1264 1           *error_id = 1;
1265             }
1266             else {
1267 50           *(int16_t*)((intptr_t)object + object_data_offset + field_offset) = in;
1268             }
1269 51           }
1270              
1271 97898           static inline void SPVM_IMPLEMENT_SET_FIELD_INT(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int32_t in, int32_t* error_id, int32_t object_data_offset) {
1272            
1273 97898 100         if (__builtin_expect(object == NULL, 0)) {
1274 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1275 1           env->set_exception(env, stack, exception);
1276 1           *error_id = 1;
1277             }
1278             else {
1279 97897           *(int32_t*)((intptr_t)object + object_data_offset + field_offset) = in;
1280             }
1281 97898           }
1282              
1283 207           static inline void SPVM_IMPLEMENT_SET_FIELD_LONG(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int64_t in, int32_t* error_id, int32_t object_data_offset) {
1284            
1285 207 100         if (__builtin_expect(object == NULL, 0)) {
1286 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1287 1           env->set_exception(env, stack, exception);
1288 1           *error_id = 1;
1289             }
1290             else {
1291 206           *(int64_t*)((intptr_t)object + object_data_offset + field_offset) = in;
1292             }
1293 207           }
1294              
1295 75           static inline void SPVM_IMPLEMENT_SET_FIELD_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, float in, int32_t* error_id, int32_t object_data_offset) {
1296            
1297 75 100         if (__builtin_expect(object == NULL, 0)) {
1298 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1299 1           env->set_exception(env, stack, exception);
1300 1           *error_id = 1;
1301             }
1302             else {
1303 74           *(float*)((intptr_t)object + object_data_offset + field_offset) = in;
1304             }
1305 75           }
1306              
1307 79           static inline void SPVM_IMPLEMENT_SET_FIELD_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, double in, int32_t* error_id, int32_t object_data_offset) {
1308            
1309 79 100         if (__builtin_expect(object == NULL, 0)) {
1310 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1311 1           env->set_exception(env, stack, exception);
1312 1           *error_id = 1;
1313             }
1314             else {
1315 78           *(double*)((intptr_t)object + object_data_offset + field_offset) = in;
1316             }
1317 79           }
1318              
1319 21517           static inline void SPVM_IMPLEMENT_SET_FIELD_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, void* in, int32_t* error_id, int32_t object_data_offset) {
1320            
1321 21517 50         if (__builtin_expect(object == NULL, 0)) {
1322 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1323 0           env->set_exception(env, stack, exception);
1324 0           *error_id = 1;
1325             }
1326             else {
1327 21517           void* ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1328 21517           env->assign_object(env, stack, ref, in);
1329             }
1330 21517           }
1331              
1332 6           static inline void SPVM_IMPLEMENT_SET_FIELD_UNDEF(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1333            
1334 6 100         if (__builtin_expect(object == NULL, 0)) {
1335 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1336 1           env->set_exception(env, stack, exception);
1337 1           *error_id = 1;
1338             }
1339             else {
1340 5           void* ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1341 5           env->assign_object(env, stack, ref, NULL);
1342             }
1343 6           }
1344              
1345 19           static inline void SPVM_IMPLEMENT_WEAKEN_FIELD(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1346 19 50         if (object == NULL) {
1347 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1348 0           env->set_exception(env, stack, exception);
1349 0           *error_id = 1;
1350             }
1351             else {
1352 19           void** ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1353 19           int32_t status = env->weaken(env, stack, ref);
1354 19 50         if (status != 0) {
1355 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_WEAKEN_BACK_REFERENCE_ALLOCATION_FAILED]);
1356 0           env->set_exception(env, stack, exception);
1357 0           *error_id = 1;
1358             }
1359             }
1360 19           }
1361              
1362 0           static inline void SPVM_IMPLEMENT_UNWEAKEN_FIELD(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1363 0 0         if (object == NULL) {
1364 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1365 0           env->set_exception(env, stack, exception);
1366 0           *error_id = 1;
1367             }
1368             else {
1369 0           void** ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1370 0           env->unweaken(env, stack, ref);
1371             }
1372 0           }
1373              
1374 2           static inline void SPVM_IMPLEMENT_ISWEAK_FIELD(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* object, int32_t field_offset, int32_t* error_id, int32_t object_data_offset) {
1375 2 50         if (object == NULL) {
1376 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_FIELD_ACCESS_INVOCANT_UNDEFINED]);
1377 0           env->set_exception(env, stack, exception);
1378 0           *error_id = 1;
1379             }
1380             else {
1381 2           void** ref = (void**)((intptr_t)object + object_data_offset + field_offset);
1382 2           *out = env->isweak(env, stack, ref);
1383             }
1384 2           }
1385              
1386             #define SPVM_IMPLEMENT_GET_CLASS_VAR_BYTE(env, stack, out, class_var) (out = env->get_class_var_byte(env, stack, class_var))
1387             #define SPVM_IMPLEMENT_GET_CLASS_VAR_SHORT(env, stack, out, class_var) (out = env->get_class_var_short(env, stack, class_var))
1388             #define SPVM_IMPLEMENT_GET_CLASS_VAR_INT(env, stack, out, class_var) (out = env->get_class_var_int(env, stack, class_var))
1389             #define SPVM_IMPLEMENT_GET_CLASS_VAR_LONG(env, stack, out, class_var) (out = env->get_class_var_long(env, stack, class_var))
1390             #define SPVM_IMPLEMENT_GET_CLASS_VAR_FLOAT(env, stack, out, class_var) (out = env->get_class_var_float(env, stack, class_var))
1391             #define SPVM_IMPLEMENT_GET_CLASS_VAR_DOUBLE(env, stack, out, class_var) (out = env->get_class_var_double(env, stack, class_var))
1392             #define SPVM_IMPLEMENT_GET_CLASS_VAR_OBJECT(env, stack, out, class_var) (env->assign_object(env, stack, out, env->get_class_var_object(env, stack, class_var)))
1393              
1394             #define SPVM_IMPLEMENT_SET_CLASS_VAR_BYTE(env, stack, class_var, in) (env->set_class_var_byte(env, stack, class_var, in))
1395             #define SPVM_IMPLEMENT_SET_CLASS_VAR_SHORT(env, stack, class_var, in) (env->set_class_var_short(env, stack, class_var, in))
1396             #define SPVM_IMPLEMENT_SET_CLASS_VAR_INT(env, stack, class_var, in) (env->set_class_var_int(env, stack, class_var, in))
1397             #define SPVM_IMPLEMENT_SET_CLASS_VAR_LONG(env, stack, class_var, in) (env->set_class_var_long(env, stack, class_var, in))
1398             #define SPVM_IMPLEMENT_SET_CLASS_VAR_FLOAT(env, stack, class_var, in) (env->set_class_var_float(env, stack, class_var, in))
1399             #define SPVM_IMPLEMENT_SET_CLASS_VAR_DOUBLE(env, stack, class_var, in) (env->set_class_var_double(env, stack, class_var, in))
1400             #define SPVM_IMPLEMENT_SET_CLASS_VAR_OBJECT(env, stack, class_var, in) (env->assign_object(env, stack, env->get_class_var_object_ref(env, stack, class_var), in))
1401             #define SPVM_IMPLEMENT_SET_CLASS_VAR_UNDEF(env, stack, class_var) (env->assign_object(env, stack, env->get_class_var_object_ref(env, stack, class_var), NULL))
1402              
1403             #define SPVM_IMPLEMENT_GET_EXCEPTION_VAR(env, stack, out) (env->assign_object(env, stack, out, env->get_exception(env, stack)))
1404             #define SPVM_IMPLEMENT_SET_EXCEPTION_VAR(env, stack, in) (env->set_exception(env, stack, in))
1405             #define SPVM_IMPLEMENT_SET_EXCEPTION_VAR_UNDEF(env, stack) (env->set_exception(env, stack, NULL))
1406              
1407 138           static inline void SPVM_IMPLEMENT_ISA(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* object, void* dist_basic_type, int32_t dist_type_dimension) {
1408 138 100         if (object) {
1409 136           *out = env->isa(env, stack, object, dist_basic_type, dist_type_dimension);
1410             }
1411             else {
1412 2           *out = 0;
1413             }
1414 138           }
1415              
1416 7           static inline void SPVM_IMPLEMENT_ISA_ERROR(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* src_basic_type, void* dist_basic_type, int32_t dist_type_dimension) {
1417 7           *out = env->api->type->can_assign(env->runtime, dist_basic_type, dist_type_dimension, 0, src_basic_type, 0, 0);
1418 7           }
1419              
1420 91           static inline void SPVM_IMPLEMENT_IS_TYPE(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* object, void* dist_basic_type, int32_t dist_type_dimension) {
1421 91 100         if (object) {
1422 90           *out = env->is_type(env, stack, object, dist_basic_type, dist_type_dimension);
1423             }
1424             else {
1425 1           *out = 0;
1426             }
1427 91           }
1428              
1429 6           static inline void SPVM_IMPLEMENT_IS_ERROR(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* src_basic_type, void* dist_basic_type, int32_t dist_type_dimension) {
1430 6 100         *out = (dist_basic_type == src_basic_type && dist_type_dimension == 0);
    50          
1431 6           }
1432              
1433             #define SPVM_IMPLEMENT_CAN(env, stack, out, object, method_name) (out = (env->get_instance_method(env, stack, object, method_name) != NULL))
1434              
1435 8           static inline void SPVM_IMPLEMENT_PRINT(SPVM_ENV* env, SPVM_VALUE* stack, void* string) {
1436 8           env->print(env, stack, string);
1437 8           }
1438              
1439 5           static inline void SPVM_IMPLEMENT_SAY(SPVM_ENV* env, SPVM_VALUE* stack, void* string) {
1440 5           env->say(env, stack, string);
1441 5           }
1442              
1443 10           static inline void SPVM_IMPLEMENT_WARN(SPVM_ENV* env, SPVM_VALUE* stack, void* string, const char* class_dir, const char* class_rel_file, int32_t line) {
1444 10           env->warn(env, stack, string, class_dir, class_rel_file, line);
1445 10           }
1446              
1447             #define SPVM_IMPLEMENT_CLEAR_EVAL_ERROR_ID(eval_error_id) (eval_error_id = 0)
1448              
1449             #define SPVM_IMPLEMENT_GET_EVAL_ERROR_ID(out, eval_error_id) (out = eval_error_id)
1450              
1451             #define SPVM_IMPLEMENT_SET_ERROR_ID(error_id, die_error_basic_type) (error_id = env->api->basic_type->get_id(env->runtime, die_error_basic_type))
1452              
1453             #define SPVM_IMPLEMENT_SET_EVAL_ERROR_ID(eval_error_id, die_error_id) (eval_error_id = die_error_id)
1454              
1455             #define SPVM_IMPLEMENT_ARGS_WIDTH(env, stack, out) (out = env->args_width(env, stack))
1456              
1457             #define SPVM_IMPLEMENT_GET_BASIC_TYPE_ID(env, stack, out, basic_type) (out = env->api->basic_type->get_id(env->runtime, basic_type))
1458              
1459 5           static inline void SPVM_IMPLEMENT_TYPE_NAME(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* object) {
1460 5 100         if (object == NULL) {
1461 1           *out = NULL;
1462             }
1463             else {
1464 4           void* type_name = env->get_type_name_no_mortal(env, stack, object);
1465 4           env->assign_object(env, stack, out, type_name);
1466             }
1467 5           }
1468              
1469 31           static inline void SPVM_IMPLEMENT_DUMP(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* object) {
1470 31           void* dump = env->dump_no_mortal(env, stack, object);
1471 31           env->assign_object(env, stack, out, dump);
1472 31           }
1473              
1474 146           static inline void SPVM_IMPLEMENT_COPY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* object, int32_t* error_id) {
1475 146 100         if (object) {
1476 145 100         if (!(env->is_string(env, stack, object) || env->is_numeric_array(env, stack, object) || env->is_mulnum_array(env, stack, object))) {
    100          
    100          
1477 2           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_COPY_OPERAND_INVALID]);
1478 2           env->set_exception(env, stack, exception);
1479 2           *error_id = 1;
1480             }
1481             else {
1482 141           void* new_object_no_mortal = env->copy_no_mortal(env, stack, object);
1483 143           env->assign_object(env, stack, out, new_object_no_mortal);
1484             }
1485             }
1486             else {
1487 3           env->assign_object(env, stack, out, NULL);
1488             }
1489 146           }
1490              
1491             #define SPVM_IMPLEMENT_REF_BYTE(out, in) (out = in)
1492             #define SPVM_IMPLEMENT_REF_SHORT(out, in) (out = in)
1493             #define SPVM_IMPLEMENT_REF_INT(out, in) (out = in)
1494             #define SPVM_IMPLEMENT_REF_LONG(out, in) (out = in)
1495             #define SPVM_IMPLEMENT_REF_FLOAT(out, in) (out = in)
1496             #define SPVM_IMPLEMENT_REF_DOUBLE(out, in) (out = in)
1497              
1498             #define SPVM_IMPLEMENT_GET_DEREF_BYTE(out, in) (out = *(int8_t*)*(void**)in)
1499             #define SPVM_IMPLEMENT_GET_DEREF_SHORT(out, in) (out = *(int16_t*)*(void**)in)
1500             #define SPVM_IMPLEMENT_GET_DEREF_INT(out, in) (out = *(int32_t*)*(void**)in)
1501             #define SPVM_IMPLEMENT_GET_DEREF_LONG(out, in) (out = *(int64_t*)*(void**)in)
1502             #define SPVM_IMPLEMENT_GET_DEREF_FLOAT(out, in) (out = *(float*)*(void**)in)
1503             #define SPVM_IMPLEMENT_GET_DEREF_DOUBLE(out, in) (out = *(double*)*(void**)in)
1504              
1505             #define SPVM_IMPLEMENT_SET_DEREF_BYTE(out, in) (*(int8_t*)*(void**)out = in)
1506             #define SPVM_IMPLEMENT_SET_DEREF_SHORT(out, in) (*(int16_t*)*(void**)out = in)
1507             #define SPVM_IMPLEMENT_SET_DEREF_INT(out, in) (*(int32_t*)*(void**)out = in)
1508             #define SPVM_IMPLEMENT_SET_DEREF_LONG(out, in) (*(int64_t*)*(void**)out = in)
1509             #define SPVM_IMPLEMENT_SET_DEREF_FLOAT(out, in) (*(float*)*(void**)out = in)
1510             #define SPVM_IMPLEMENT_SET_DEREF_DOUBLE(out, in) (*(double*)*(void**)out = in)
1511              
1512             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_BYTE(out, in, field_index) (out = *(in + field_index))
1513             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_SHORT(out, in, field_index) (out = *(in + field_index))
1514             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_INT(out, in, field_index) (out = *(in + field_index))
1515             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_LONG(out, in, field_index) (out = *(in + field_index))
1516             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_FLOAT(out, in, field_index) (out = *(in + field_index))
1517             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DOUBLE(out, in, field_index) (out = *(in + field_index))
1518              
1519             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_BYTE(out, field_index, in) (*(out + field_index) = in)
1520             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_SHORT(out, field_index, in) (*(out + field_index) = in)
1521             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_INT(out, field_index, in) (*(out + field_index) = in)
1522             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_LONG(out, field_index, in) (*(out + field_index) = in)
1523             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_FLOAT(out, field_index, in) (*(out + field_index) = in)
1524             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DOUBLE(out, field_index, in) (*(out + field_index) = in)
1525              
1526 0           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, int8_t* in, int32_t fields_length) {
1527 0 0         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1528 0           *(out + field_index) = *(in + field_index);
1529             }
1530 0           }
1531              
1532 0           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, int16_t* in, int32_t fields_length) {
1533 0 0         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1534 0           *(out + field_index) = *(in + field_index);
1535             }
1536 0           }
1537              
1538 0           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t* in, int32_t fields_length) {
1539 0 0         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1540 0           *(out + field_index) = *(in + field_index);
1541             }
1542 0           }
1543              
1544 0           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t* in, int32_t fields_length) {
1545 0 0         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1546 0           *(out + field_index) = *(in + field_index);
1547             }
1548 0           }
1549              
1550 0           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, float* in, int32_t fields_length) {
1551 0 0         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1552 0           *(out + field_index) = *(in + field_index);
1553             }
1554 0           }
1555              
1556 3           static inline void SPVM_IMPLEMENT_MOVE_MULNUM_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, double* in, int32_t fields_length) {
1557 9 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
1558 6           *(out + field_index) = *(in + field_index);
1559             }
1560 3           }
1561              
1562 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, int8_t* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1563 1 50         if (__builtin_expect(array == NULL, 0)) {
1564 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1565 0           env->set_exception(env, stack, exception);
1566 0           *error_id = 1;
1567             }
1568             else {
1569 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1570 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1571 0           env->set_exception(env, stack, exception);
1572 0           *error_id = 1;
1573             }
1574             else {
1575             int32_t field_index;
1576 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1577 3           *(out + field_index) = ((int8_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1578             }
1579             }
1580             }
1581 1           }
1582              
1583 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, int16_t* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1584 1 50         if (__builtin_expect(array == NULL, 0)) {
1585 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1586 0           env->set_exception(env, stack, exception);
1587 0           *error_id = 1;
1588             }
1589             else {
1590 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1591 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1592 0           env->set_exception(env, stack, exception);
1593 0           *error_id = 1;
1594             }
1595             else {
1596             int32_t field_index;
1597 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1598 3           *(out + field_index) = ((int16_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1599             }
1600             }
1601             }
1602 1           }
1603              
1604 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1605 1 50         if (__builtin_expect(array == NULL, 0)) {
1606 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1607 0           env->set_exception(env, stack, exception);
1608 0           *error_id = 1;
1609             }
1610             else {
1611 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1612 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1613 0           env->set_exception(env, stack, exception);
1614 0           *error_id = 1;
1615             }
1616             else {
1617             int32_t field_index;
1618 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1619 3           *(out + field_index) = ((int32_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1620             }
1621             }
1622             }
1623 1           }
1624              
1625 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1626 1 50         if (__builtin_expect(array == NULL, 0)) {
1627 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1628 0           env->set_exception(env, stack, exception);
1629 0           *error_id = 1;
1630             }
1631             else {
1632 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1633 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1634 0           env->set_exception(env, stack, exception);
1635 0           *error_id = 1;
1636             }
1637             else {
1638             int32_t field_index;
1639 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1640 3           *(out + field_index) = ((int64_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1641             }
1642             }
1643             }
1644 1           }
1645              
1646 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, float* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1647 1 50         if (__builtin_expect(array == NULL, 0)) {
1648 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1649 0           env->set_exception(env, stack, exception);
1650 0           *error_id = 1;
1651             }
1652             else {
1653 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1654 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1655 0           env->set_exception(env, stack, exception);
1656 0           *error_id = 1;
1657             }
1658             else {
1659             int32_t field_index;
1660 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1661 3           *(out + field_index) = ((float*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1662             }
1663             }
1664             }
1665 1           }
1666              
1667 1           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, double* array, int32_t index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1668 1 50         if (__builtin_expect(array == NULL, 0)) {
1669 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1670 0           env->set_exception(env, stack, exception);
1671 0           *error_id = 1;
1672             }
1673             else {
1674 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1675 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1676 0           env->set_exception(env, stack, exception);
1677 0           *error_id = 1;
1678             }
1679             else {
1680             int32_t field_index;
1681 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1682 3           *(out + field_index) = ((double*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1683             }
1684             }
1685             }
1686 1           }
1687              
1688 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* array, int32_t index, int32_t fields_length, int8_t* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1689 1 50         if (__builtin_expect(!array, 0)) {
1690 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1691 0           env->set_exception(env, stack, exception);
1692 0           *error_id = 1;
1693             }
1694             else {
1695 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1696 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1697 0           env->set_exception(env, stack, exception);
1698 0           *error_id = 1;
1699             }
1700             else {
1701             int32_t field_index;
1702 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1703 3           ((int8_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1704             }
1705             }
1706             }
1707 1           }
1708              
1709 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* array, int32_t index, int32_t fields_length, int16_t* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1710 1 50         if (__builtin_expect(!array, 0)) {
1711 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1712 0           env->set_exception(env, stack, exception);
1713 0           *error_id = 1;
1714             }
1715             else {
1716 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1717 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1718 0           env->set_exception(env, stack, exception);
1719 0           *error_id = 1;
1720             }
1721             else {
1722             int32_t field_index;
1723 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1724 3           ((int16_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1725             }
1726             }
1727             }
1728 1           }
1729              
1730 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* array, int32_t index, int32_t fields_length, int32_t* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1731 1 50         if (__builtin_expect(!array, 0)) {
1732 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1733 0           env->set_exception(env, stack, exception);
1734 0           *error_id = 1;
1735             }
1736             else {
1737 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1738 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1739 0           env->set_exception(env, stack, exception);
1740 0           *error_id = 1;
1741             }
1742             else {
1743             int32_t field_index;
1744 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1745 3           ((int32_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1746             }
1747             }
1748             }
1749 1           }
1750              
1751 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* array, int32_t index, int32_t fields_length, int64_t* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1752 1 50         if (__builtin_expect(!array, 0)) {
1753 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1754 0           env->set_exception(env, stack, exception);
1755 0           *error_id = 1;
1756             }
1757             else {
1758 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1759 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1760 0           env->set_exception(env, stack, exception);
1761 0           *error_id = 1;
1762             }
1763             else {
1764             int32_t field_index;
1765 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1766 3           ((int64_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1767             }
1768             }
1769             }
1770 1           }
1771              
1772 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* array, int32_t index, int32_t fields_length, float* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1773 1 50         if (__builtin_expect(!array, 0)) {
1774 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1775 0           env->set_exception(env, stack, exception);
1776 0           *error_id = 1;
1777             }
1778             else {
1779 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1780 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1781 0           env->set_exception(env, stack, exception);
1782 0           *error_id = 1;
1783             }
1784             else {
1785             int32_t field_index;
1786 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1787 3           ((float*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1788             }
1789             }
1790             }
1791 1           }
1792              
1793 1           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* array, int32_t index, int32_t fields_length, double* in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1794 1 50         if (__builtin_expect(!array, 0)) {
1795 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1796 0           env->set_exception(env, stack, exception);
1797 0           *error_id = 1;
1798             }
1799             else {
1800 1 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1801 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1802 0           env->set_exception(env, stack, exception);
1803 0           *error_id = 1;
1804             }
1805             else {
1806             int32_t field_index;
1807 4 100         for (field_index = 0; field_index < fields_length; field_index++) {
1808 3           ((double*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = *(in + field_index);
1809             }
1810             }
1811             }
1812 1           }
1813              
1814 94           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, int8_t* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1815 94 50         if (__builtin_expect(array == NULL, 0)) {
1816 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1817 0           env->set_exception(env, stack, exception);
1818 0           *error_id = 1;
1819             }
1820             else {
1821 94 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1822 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1823 0           env->set_exception(env, stack, exception);
1824 0           *error_id = 1;
1825             }
1826             else {
1827 94           *out = ((int8_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1828             }
1829             }
1830 94           }
1831              
1832 94           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, int16_t* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1833 94 50         if (__builtin_expect(array == NULL, 0)) {
1834 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1835 0           env->set_exception(env, stack, exception);
1836 0           *error_id = 1;
1837             }
1838             else {
1839 94 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1840 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1841 0           env->set_exception(env, stack, exception);
1842 0           *error_id = 1;
1843             }
1844             else {
1845 94           *out = ((int16_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1846             }
1847             }
1848 94           }
1849              
1850 104           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, int32_t* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1851 104 50         if (__builtin_expect(array == NULL, 0)) {
1852 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1853 0           env->set_exception(env, stack, exception);
1854 0           *error_id = 1;
1855             }
1856             else {
1857 104 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1858 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1859 0           env->set_exception(env, stack, exception);
1860 0           *error_id = 1;
1861             }
1862             else {
1863 104           *out = ((int32_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1864             }
1865             }
1866 104           }
1867              
1868 94           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, int64_t* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1869 94 50         if (__builtin_expect(array == NULL, 0)) {
1870 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1871 0           env->set_exception(env, stack, exception);
1872 0           *error_id = 1;
1873             }
1874             else {
1875 94 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1876 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1877 0           env->set_exception(env, stack, exception);
1878 0           *error_id = 1;
1879             }
1880             else {
1881 94           *out = ((int64_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1882             }
1883             }
1884 94           }
1885              
1886 94           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, float* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1887 94 50         if (__builtin_expect(array == NULL, 0)) {
1888 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1889 0           env->set_exception(env, stack, exception);
1890 0           *error_id = 1;
1891             }
1892             else {
1893 94 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1894 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1895 0           env->set_exception(env, stack, exception);
1896 0           *error_id = 1;
1897             }
1898             else {
1899 94           *out = ((float*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1900             }
1901             }
1902 94           }
1903              
1904 111           static inline void SPVM_IMPLEMENT_GET_MULNUM_ARRAY_FIELD_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, double* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1905 111 50         if (__builtin_expect(array == NULL, 0)) {
1906 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1907 0           env->set_exception(env, stack, exception);
1908 0           *error_id = 1;
1909             }
1910             else {
1911 111 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1912 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1913 0           env->set_exception(env, stack, exception);
1914 0           *error_id = 1;
1915             }
1916             else {
1917 111           *out = ((double*)((intptr_t)array + object_data_offset))[fields_length * index + field_index];
1918             }
1919             }
1920 111           }
1921              
1922 79           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* array, int32_t index, int32_t field_index, int32_t fields_length, int8_t in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1923 79 50         if (__builtin_expect(!array, 0)) {
1924 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1925 0           env->set_exception(env, stack, exception);
1926 0           *error_id = 1;
1927             }
1928             else {
1929 79 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1930 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1931 0           env->set_exception(env, stack, exception);
1932 0           *error_id = 1;
1933             }
1934             else {
1935 79           ((int8_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
1936             }
1937             }
1938 79           }
1939              
1940 79           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* array, int32_t index, int32_t field_index, int32_t fields_length, int16_t in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1941 79 50         if (__builtin_expect(!array, 0)) {
1942 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1943 0           env->set_exception(env, stack, exception);
1944 0           *error_id = 1;
1945             }
1946             else {
1947 79 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1948 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1949 0           env->set_exception(env, stack, exception);
1950 0           *error_id = 1;
1951             }
1952             else {
1953 79           ((int16_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
1954             }
1955             }
1956 79           }
1957              
1958 86           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* array, int32_t index, int32_t field_index, int32_t fields_length, int32_t in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1959 86 50         if (__builtin_expect(!array, 0)) {
1960 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1961 0           env->set_exception(env, stack, exception);
1962 0           *error_id = 1;
1963             }
1964             else {
1965 86 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1966 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1967 0           env->set_exception(env, stack, exception);
1968 0           *error_id = 1;
1969             }
1970             else {
1971 86           ((int32_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
1972             }
1973             }
1974 86           }
1975              
1976 79           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* array, int32_t index, int32_t field_index, int32_t fields_length, int64_t in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1977 79 50         if (__builtin_expect(!array, 0)) {
1978 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1979 0           env->set_exception(env, stack, exception);
1980 0           *error_id = 1;
1981             }
1982             else {
1983 79 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
1984 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
1985 0           env->set_exception(env, stack, exception);
1986 0           *error_id = 1;
1987             }
1988             else {
1989 79           ((int64_t*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
1990             }
1991             }
1992 79           }
1993              
1994 67           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* array, int32_t index, int32_t field_index, int32_t fields_length, float in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
1995 67 50         if (__builtin_expect(!array, 0)) {
1996 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
1997 0           env->set_exception(env, stack, exception);
1998 0           *error_id = 1;
1999             }
2000             else {
2001 67 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
2002 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
2003 0           env->set_exception(env, stack, exception);
2004 0           *error_id = 1;
2005             }
2006             else {
2007 67           ((float*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
2008             }
2009             }
2010 67           }
2011              
2012 79           static inline void SPVM_IMPLEMENT_SET_MULNUM_ARRAY_FIELD_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* array, int32_t index, int32_t field_index, int32_t fields_length, double in, int32_t* error_id, int32_t object_data_offset, int32_t object_length_offset) {
2013 79 50         if (__builtin_expect(!array, 0)) {
2014 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_UNDEFINED]);
2015 0           env->set_exception(env, stack, exception);
2016 0           *error_id = 1;
2017             }
2018             else {
2019 79 50         if (__builtin_expect(index < 0 || index >= *(int32_t*)((intptr_t)array + object_length_offset), 0)) {
    50          
2020 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_ARRAY_ACCESS_INDEX_OUT_OF_RANGE]);
2021 0           env->set_exception(env, stack, exception);
2022 0           *error_id = 1;
2023             }
2024             else {
2025 79           ((double*)((intptr_t)array + object_data_offset))[fields_length * index + field_index] = in;
2026             }
2027             }
2028 79           }
2029              
2030 2           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, void* mulnum_ref, int32_t fields_length) {
2031 8 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2032 6           *(out + field_index) = *((int8_t*)mulnum_ref + field_index);
2033             }
2034 2           }
2035              
2036 1           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, void* mulnum_ref, int32_t fields_length) {
2037 4 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2038 3           *(out + field_index) = *((int16_t*)mulnum_ref + field_index);
2039             }
2040 1           }
2041              
2042 1           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* mulnum_ref, int32_t fields_length) {
2043 4 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2044 3           *(out + field_index) = *((int32_t*)mulnum_ref + field_index);
2045             }
2046 1           }
2047              
2048 1           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, void* mulnum_ref, int32_t fields_length) {
2049 4 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2050 3           *(out + field_index) = *((int64_t*)mulnum_ref + field_index);
2051             }
2052 1           }
2053              
2054 1           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, void* mulnum_ref, int32_t fields_length) {
2055 4 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2056 3           *(out + field_index) = *((float*)mulnum_ref + field_index);
2057             }
2058 1           }
2059              
2060 1           static inline void SPVM_IMPLEMENT_DEREF_MULNUM_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, void* mulnum_ref, int32_t fields_length) {
2061 4 100         for (int32_t field_index = 0; field_index < fields_length; field_index++) {
2062 3           *(out + field_index) = *((double*)mulnum_ref + field_index);
2063             }
2064 1           }
2065              
2066             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_BYTE(out, mulnum_ref, field_index) (out = *((int8_t*)mulnum_ref +field_index))
2067             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_SHORT(out, mulnum_ref, field_index) (out = *((int16_t*)mulnum_ref +field_index))
2068             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_INT(out, mulnum_ref, field_index) (out = *((int32_t*)mulnum_ref +field_index))
2069             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_LONG(out, mulnum_ref, field_index) (out = *((int64_t*)mulnum_ref +field_index))
2070             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_FLOAT(out, mulnum_ref, field_index) (out = *((float*)mulnum_ref +field_index))
2071             #define SPVM_IMPLEMENT_GET_MULNUM_FIELD_DEREF_DOUBLE(out, mulnum_ref, field_index) (out = *((double*)mulnum_ref +field_index))
2072              
2073             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_BYTE(mulnum_ref, field_index, in) (*((int8_t*)mulnum_ref +field_index) = in)
2074             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_SHORT(mulnum_ref, field_index, in) (*((int16_t*)mulnum_ref +field_index) = in)
2075             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_INT(mulnum_ref, field_index, in) (*((int32_t*)mulnum_ref +field_index) = in)
2076             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_LONG(mulnum_ref, field_index, in) (*((int64_t*)mulnum_ref +field_index) = in)
2077             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_FLOAT(mulnum_ref, field_index, in) (*((float*)mulnum_ref +field_index) = in)
2078             #define SPVM_IMPLEMENT_SET_MULNUM_FIELD_DEREF_DOUBLE(mulnum_ref, field_index, in) (*((double*)mulnum_ref +field_index) = in)
2079              
2080             #define SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_SHORT(out, in) (out = (int16_t)in)
2081             #define SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_INT(out, in) (out = (int32_t)in)
2082             #define SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_LONG(out, in) (out = (int64_t)in)
2083             #define SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_FLOAT(out, in) (out = (float)in)
2084             #define SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_DOUBLE(out, in) (out = (double)in)
2085             #define SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_BYTE(out, in) (out = (int8_t)in)
2086             #define SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_INT(out, in) (out = (int32_t)in)
2087             #define SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_LONG(out, in) (out = (int64_t)in)
2088             #define SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_FLOAT(out, in) (out = (float)in)
2089             #define SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_DOUBLE(out, in) (out = (double)in)
2090             #define SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_BYTE(out, in) (out = (int8_t)in)
2091             #define SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_SHORT(out, in) (out = (int16_t)in)
2092             #define SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_LONG(out, in) (out = (int64_t)in)
2093             #define SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_FLOAT(out, in) (out = (float)in)
2094             #define SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_DOUBLE(out, in) (out = (double)in)
2095             #define SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_BYTE(out, in) (out = (int8_t)in)
2096             #define SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_SHORT(out, in) (out = (int16_t)in)
2097             #define SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_INT(out, in) (out = (int32_t)in)
2098             #define SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_FLOAT(out, in) (out = (float)in)
2099             #define SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_DOUBLE(out, in) (out = (double)in)
2100             #define SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_BYTE(out, in) (out = (int8_t)in)
2101             #define SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_SHORT(out, in) (out = (int16_t)in)
2102             #define SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_INT(out, in) (out = (int32_t)in)
2103             #define SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_LONG(out, in) (out = (int64_t)in)
2104             #define SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_DOUBLE(out, in) (out = (double)in)
2105             #define SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_BYTE(out, in) (out = (int8_t)in)
2106             #define SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_SHORT(out, in) (out = (int16_t)in)
2107             #define SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_INT(out, in) (out = (int32_t)in)
2108             #define SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_LONG(out, in) (out = (int64_t)in)
2109             #define SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_FLOAT(out, in) (out = (float)in)
2110              
2111 2           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int8_t value, char* tmp_buffer, int32_t tmp_buffer_length) {
2112 2           snprintf(tmp_buffer, tmp_buffer_length, "%" PRId8, value);
2113 2           int32_t string_length = strlen(tmp_buffer);
2114 2           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2115 2           env->assign_object(env, stack, out, string);
2116 2           }
2117              
2118 2           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int16_t value, char* tmp_buffer, int32_t tmp_buffer_length) {
2119 2           snprintf(tmp_buffer, tmp_buffer_length, "%" PRId16, value);
2120 2           int32_t string_length = strlen(tmp_buffer);
2121 2           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2122 2           env->assign_object(env, stack, out, string);
2123 2           }
2124              
2125 828           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t value, char* tmp_buffer, int32_t tmp_buffer_length) {
2126 828           snprintf(tmp_buffer, tmp_buffer_length, "%" PRId32, value);
2127 828           int32_t string_length = strlen(tmp_buffer);
2128 828           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2129 828           env->assign_object(env, stack, out, string);
2130 828           }
2131              
2132 2           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int64_t value, char* tmp_buffer, int32_t tmp_buffer_length) {
2133 2           snprintf(tmp_buffer, tmp_buffer_length, "%" PRId64, value);
2134 2           int32_t string_length = strlen(tmp_buffer);
2135 2           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2136 2           env->assign_object(env, stack, out, string);
2137 2           }
2138              
2139 26           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, float value, char* tmp_buffer, int32_t tmp_buffer_length) {
2140 26           snprintf(tmp_buffer, tmp_buffer_length, "%g", value);
2141 26           int32_t string_length = strlen(tmp_buffer);
2142 26           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2143 26           env->assign_object(env, stack, out, string);
2144 26           }
2145              
2146 26           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, double value, char* tmp_buffer, int32_t tmp_buffer_length) {
2147 26           snprintf(tmp_buffer, tmp_buffer_length, "%g", value);
2148 26           int32_t string_length = strlen(tmp_buffer);
2149 26           void* string = env->new_string_no_mortal(env, stack, tmp_buffer, string_length);
2150 26           env->assign_object(env, stack, out, string);
2151 26           }
2152              
2153 15           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_STRING_TO_BYTE_ARRAY(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* src_string) {
2154 15           int32_t src_string_length = env->length(env, stack, src_string);
2155 15           const char* src_string_data = env->get_chars(env, stack, src_string);
2156 15           void* byte_array = env->new_byte_array_no_mortal(env, stack, src_string_length);
2157 15           int8_t* byte_array_data = env->get_elems_byte(env, stack, byte_array);
2158 15           memcpy(byte_array_data, src_string_data, src_string_length);
2159 15           env->assign_object(env, stack, out, byte_array);
2160 15           }
2161              
2162 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_ARRAY_TO_STRING(SPVM_ENV* env, SPVM_VALUE* stack, void** out, void* src_byte_array) {
2163 11           int32_t src_byte_array_length = env->length(env, stack, src_byte_array);
2164 11           int8_t* src_byte_array_data = env->get_elems_byte(env, stack, src_byte_array);
2165 11           void* string = env->new_string_no_mortal(env, stack, (const char*)src_byte_array_data, src_byte_array_length);
2166 11           env->assign_object(env, stack, out, string);
2167 11           }
2168              
2169 15           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_TO_BYTE_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int8_t value, int32_t object_data_offset) {
2170 15           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_CLASS);
2171 15           void* object = env->new_object_no_mortal(env, stack, basic_type);
2172 15           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2173 15           *(int8_t*)&fields[0] = value;
2174 15           env->assign_object(env, stack, out, object);
2175 15           }
2176              
2177 8           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_TO_SHORT_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int16_t value, int32_t object_data_offset) {
2178 8           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT_CLASS);
2179 8           void* object = env->new_object_no_mortal(env, stack, basic_type);
2180 8           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2181 8           *(int16_t*)&fields[0] = value;
2182 8           env->assign_object(env, stack, out, object);
2183 8           }
2184              
2185 193           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_INT_TO_INT_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int32_t value, int32_t object_data_offset) {
2186 193           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_INT_CLASS);
2187 193           void* object = env->new_object_no_mortal(env, stack, basic_type);
2188 193           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2189 193           *(int32_t*)&fields[0] = value;
2190 193           env->assign_object(env, stack, out, object);
2191 193           }
2192              
2193 34           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_TO_LONG_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, int64_t value, int32_t object_data_offset) {
2194 34           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_LONG_CLASS);
2195 34           void* object = env->new_object_no_mortal(env, stack, basic_type);
2196 34           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2197 34           *(int64_t*)&fields[0] = value;
2198 34           env->assign_object(env, stack, out, object);
2199 34           }
2200              
2201 10           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_TO_FLOAT_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, float value, int32_t object_data_offset) {
2202 10           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT_CLASS);
2203 10           void* object = env->new_object_no_mortal(env, stack, basic_type);
2204 10           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2205 10           *(float*)&fields[0] = value;
2206 10           env->assign_object(env, stack, out, object);
2207 10           }
2208              
2209 23           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_TO_DOUBLE_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void** out, double value, int32_t object_data_offset) {
2210 23           void* basic_type = env->api->runtime->get_basic_type_by_id(env->runtime, SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_CLASS);
2211 23           void* object = env->new_object_no_mortal(env, stack, basic_type);
2212 23           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2213 23           *(double*)&fields[0] = value;
2214 23           env->assign_object(env, stack, out, object);
2215 23           }
2216              
2217 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_BYTE_OBJECT_TO_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2218 11 50         if (object == NULL) {
2219 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2220 0           env->set_exception(env, stack, exception);
2221 0           *error_id = 1;
2222             }
2223             else {
2224 11 50         if (env->is_type_by_name(env, stack, object, "Byte", 0)) {
2225 11           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2226 11           *out = *(int8_t*)&fields[0];
2227             }
2228             else {
2229 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2230 0           env->set_exception(env, stack, exception);
2231 0           *error_id = 1;
2232             }
2233             }
2234 11           }
2235              
2236 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_SHORT_OBJECT_TO_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2237 11 50         if (object == NULL) {
2238 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2239 0           env->set_exception(env, stack, exception);
2240 0           *error_id = 1;
2241             }
2242             else {
2243 11 50         if (env->is_type_by_name(env, stack, object, "Short", 0)) {
2244 11           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2245 11           *out = *(int16_t*)&fields[0];
2246             }
2247             else {
2248 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2249 0           env->set_exception(env, stack, exception);
2250 0           *error_id = 1;
2251             }
2252             }
2253 11           }
2254              
2255 79           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_INT_OBJECT_TO_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2256 79 50         if (object == NULL) {
2257 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2258 0           env->set_exception(env, stack, exception);
2259 0           *error_id = 1;
2260             }
2261             else {
2262 79 50         if (env->is_type_by_name(env, stack, object, "Int", 0)) {
2263 79           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2264 79           *out = *(int32_t*)&fields[0];
2265             }
2266             else {
2267 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2268 0           env->set_exception(env, stack, exception);
2269 0           *error_id = 1;
2270             }
2271             }
2272 79           }
2273              
2274 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_LONG_OBJECT_TO_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2275 11 50         if (object == NULL) {
2276 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2277 0           env->set_exception(env, stack, exception);
2278 0           *error_id = 1;
2279             }
2280             else {
2281 11 50         if (env->is_type_by_name(env, stack, object, "Long", 0)) {
2282 11           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2283 11           *out = *(int64_t*)&fields[0];
2284             }
2285             else {
2286 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2287 0           env->set_exception(env, stack, exception);
2288 0           *error_id = 1;
2289             }
2290             }
2291 11           }
2292              
2293 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_FLOAT_OBJECT_TO_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2294 11 50         if (object == NULL) {
2295 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2296 0           env->set_exception(env, stack, exception);
2297 0           *error_id = 1;
2298             }
2299             else {
2300 11 50         if (env->is_type_by_name(env, stack, object, "Float", 0)) {
2301 11           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2302 11           *out = *(float*)&fields[0];
2303             }
2304             else {
2305 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2306 0           env->set_exception(env, stack, exception);
2307 0           *error_id = 1;
2308             }
2309             }
2310 11           }
2311              
2312 11           static inline void SPVM_IMPLEMENT_TYPE_CONVERSION_DOUBLE_OBJECT_TO_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* out, void* object, int32_t* error_id, int32_t object_data_offset) {
2313 11 50         if (object == NULL) {
2314 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_FROM_UNDEF]);
2315 0           env->set_exception(env, stack, exception);
2316 0           *error_id = 1;
2317             }
2318             else {
2319 11 50         if (env->is_type_by_name(env, stack, object, "Double", 0)) {
2320 11           SPVM_VALUE* fields = (SPVM_VALUE*)((intptr_t)object + object_data_offset);
2321 11           *out = *(double*)&fields[0];
2322             }
2323             else {
2324 0           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_UNBOXING_CONVERSION_NON_CORRESPONDING_NUMERIC_OBJECT_TYPE]);
2325 0           env->set_exception(env, stack, exception);
2326 0           *error_id = 1;
2327             }
2328             }
2329 11           }
2330              
2331             #define SPVM_IMPLEMENT_SET_STACK_BYTE(stack, stack_index, in) (*(int8_t*)&stack[stack_index] = in)
2332             #define SPVM_IMPLEMENT_SET_STACK_SHORT(stack, stack_index, in) (*(int16_t*)&stack[stack_index] = in)
2333             #define SPVM_IMPLEMENT_SET_STACK_INT(stack, stack_index, in) (*(int32_t*)&stack[stack_index] = in)
2334             #define SPVM_IMPLEMENT_SET_STACK_LONG(stack, stack_index, in) (*(int64_t*)&stack[stack_index] = in)
2335             #define SPVM_IMPLEMENT_SET_STACK_FLOAT(stack, stack_index, in) (*(float*)&stack[stack_index] = in)
2336             #define SPVM_IMPLEMENT_SET_STACK_DOUBLE(stack, stack_index, in) (*(double*)&stack[stack_index] = in)
2337             #define SPVM_IMPLEMENT_SET_STACK_OBJECT(stack, stack_index, in) (*(void**)&stack[stack_index] = in)
2338             #define SPVM_IMPLEMENT_SET_STACK_REF(stack, stack_index, in) (*(void**)&stack[stack_index] = in)
2339             #define SPVM_IMPLEMENT_SET_STACK_UNDEF(stack, stack_index) (*(void**)&stack[stack_index] = NULL)
2340              
2341 3           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, int8_t* in) {
2342 12 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2343 9           *(int8_t*)&stack[stack_base + stack_index] = *(in + stack_index);
2344             }
2345 3           }
2346              
2347 3           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, int16_t* in) {
2348 12 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2349 9           *(int16_t*)&stack[stack_base + stack_index] = *(in + stack_index);
2350             }
2351 3           }
2352              
2353 3           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, int32_t* in) {
2354 12 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2355 9           *(int32_t*)&stack[stack_base + stack_index] = *(in + stack_index);
2356             }
2357 3           }
2358              
2359 3           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, int64_t* in) {
2360 12 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2361 9           *(int64_t*)&stack[stack_base + stack_index] = *(in + stack_index);
2362             }
2363 3           }
2364              
2365 3           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, float* in) {
2366 12 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2367 9           *(float*)&stack[stack_base + stack_index] = *(in + stack_index);
2368             }
2369 3           }
2370              
2371 7           static inline void SPVM_IMPLEMENT_SET_STACK_MULNUM_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width, double* in) {
2372 24 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2373 17           *(double*)&stack[stack_base + stack_index] = *(in + stack_index);
2374             }
2375 7           }
2376              
2377             #define SPVM_IMPLEMENT_GET_STACK_BYTE(out, stack, stack_index) (out = *(int8_t*)&stack[stack_index])
2378             #define SPVM_IMPLEMENT_GET_STACK_SHORT(out, stack, stack_index) (out = *(int16_t*)&stack[stack_index])
2379             #define SPVM_IMPLEMENT_GET_STACK_INT(out, stack, stack_index) (out = *(int32_t*)&stack[stack_index])
2380             #define SPVM_IMPLEMENT_GET_STACK_LONG(out, stack, stack_index) (out = *(int64_t*)&stack[stack_index])
2381             #define SPVM_IMPLEMENT_GET_STACK_FLOAT(out, stack, stack_index) (out = *(float*)&stack[stack_index])
2382             #define SPVM_IMPLEMENT_GET_STACK_DOUBLE(out, stack, stack_index) (out = *(double*)&stack[stack_index])
2383              
2384 524031           static inline void SPVM_IMPLEMENT_GET_STACK_OBJECT(SPVM_ENV* env, void** out, SPVM_VALUE* stack, int32_t stack_index) {
2385 524031           env->assign_object(env, stack, out, *(void**)&stack[stack_index]);
2386 524031           }
2387              
2388             #define SPVM_IMPLEMENT_GET_STACK_REF(out, stack, stack_index) (out = *(void**)&stack[stack_index])
2389              
2390 11           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_BYTE(SPVM_ENV* env, int8_t* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2391 44 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2392 33           *(out + stack_index) = *(int8_t*)&stack[(stack_base) + stack_index];
2393             }
2394 11           }
2395              
2396 10           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_SHORT(SPVM_ENV* env, int16_t* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2397 40 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2398 30           *(out + stack_index) = *(int16_t*)&stack[(stack_base) + stack_index];
2399             }
2400 10           }
2401              
2402 10           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_INT(SPVM_ENV* env, int32_t* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2403 40 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2404 30           *(out + stack_index) = *(int32_t*)&stack[(stack_base) + stack_index];
2405             }
2406 10           }
2407              
2408 10           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_LONG(SPVM_ENV* env, int64_t* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2409 40 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2410 30           *(out + stack_index) = *(int64_t*)&stack[(stack_base) + stack_index];
2411             }
2412 10           }
2413              
2414 10           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_FLOAT(SPVM_ENV* env, float* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2415 40 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2416 30           *(out + stack_index) = *(float*)&stack[(stack_base) + stack_index];
2417             }
2418 10           }
2419              
2420 13           static inline void SPVM_IMPLEMENT_GET_STACK_MULNUM_DOUBLE(SPVM_ENV* env, double* out, SPVM_VALUE* stack, int32_t stack_base, int32_t args_width) {
2421 49 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2422 36           *(out + stack_index) = *(double*)&stack[(stack_base) + stack_index];
2423             }
2424 13           }
2425              
2426 4           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_BYTE(SPVM_ENV* env, int8_t* out, SPVM_VALUE* stack, int32_t stack_index, int8_t default_value) {
2427 4           int32_t args_width = env->args_width(env, stack);
2428 4 100         if (stack_index >= args_width) {
2429 3           *out = default_value;
2430             }
2431             else {
2432 1           *out = *(int8_t*)&stack[stack_index];
2433             }
2434 4           }
2435              
2436 4           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_SHORT(SPVM_ENV* env, int16_t* out, SPVM_VALUE* stack, int32_t stack_index, int16_t default_value) {
2437 4           int32_t args_width = env->args_width(env, stack);
2438 4 100         if (stack_index >= args_width) {
2439 3           *out = default_value;
2440             }
2441             else {
2442 1           *out = *(int16_t*)&stack[stack_index];
2443             }
2444 4           }
2445              
2446 645657           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_INT(SPVM_ENV* env, int32_t* out, SPVM_VALUE* stack, int32_t stack_index, int32_t default_value) {
2447 645657           int32_t args_width = env->args_width(env, stack);
2448 645657 100         if (stack_index >= args_width) {
2449 425616           *out = default_value;
2450             }
2451             else {
2452 220041           *out = *(int32_t*)&stack[stack_index];
2453             }
2454 645657           }
2455              
2456 5           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_LONG(SPVM_ENV* env, int64_t* out, SPVM_VALUE* stack, int32_t stack_index, int64_t default_value) {
2457 5           int32_t args_width = env->args_width(env, stack);
2458 5 100         if (stack_index >= args_width) {
2459 4           *out = default_value;
2460             }
2461             else {
2462 1           *out = *(int64_t*)&stack[stack_index];
2463             }
2464 5           }
2465              
2466 2           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_FLOAT(SPVM_ENV* env, float* out, SPVM_VALUE* stack, int32_t stack_index, float default_value) {
2467 2           int32_t args_width = env->args_width(env, stack);
2468 2 100         if (stack_index >= args_width) {
2469 1           *out = default_value;
2470             }
2471             else {
2472 1           *out = *(float*)&stack[stack_index];
2473             }
2474 2           }
2475              
2476 2           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_DOUBLE(SPVM_ENV* env, double* out, SPVM_VALUE* stack, int32_t stack_index, double default_value) {
2477 2           int32_t args_width = env->args_width(env, stack);
2478 2 100         if (stack_index >= args_width) {
2479 1           *out = default_value;
2480             }
2481             else {
2482 1           *out = *(double*)&stack[stack_index];
2483             }
2484 2           }
2485              
2486 18389           static inline void SPVM_IMPLEMENT_GET_STACK_OPTIONAL_OBJECT(SPVM_ENV* env, void** out, SPVM_VALUE* stack, int32_t stack_index) {
2487 18389           int32_t args_width = env->args_width(env, stack);
2488 18389 100         if (stack_index >= args_width) {
2489 17545           env->assign_object(env, stack, out, NULL);
2490             }
2491             else {
2492 844           env->assign_object(env, stack, out, *(void**)&stack[stack_index]);
2493             }
2494 18389           }
2495              
2496             #define SPVM_IMPLEMENT_RETURN_BYTE(stack, in) (*(int8_t*)&stack[0] = in)
2497             #define SPVM_IMPLEMENT_RETURN_SHORT(stack, in) (*(int16_t*)&stack[0] = in)
2498             #define SPVM_IMPLEMENT_RETURN_INT(stack, in) (*(int32_t*)&stack[0] = in)
2499             #define SPVM_IMPLEMENT_RETURN_LONG(stack, in) (*(int64_t*)&stack[0] = in)
2500             #define SPVM_IMPLEMENT_RETURN_FLOAT(stack, in) (*(float*)&stack[0] = in)
2501             #define SPVM_IMPLEMENT_RETURN_DOUBLE(stack, in) (*(double*)&stack[0] = in)
2502              
2503 88324           static inline void SPVM_IMPLEMENT_RETURN_OBJECT(SPVM_ENV* env, SPVM_VALUE* stack, void* in) {
2504 88324           *(void**)&stack[0] = in;
2505 88324 100         if (in != NULL) {
2506 87923           env->api->internal->lock_object(env, stack, in);
2507 87923           env->api->internal->inc_ref_count(env, stack, in);
2508 87923           env->api->internal->unlock_object(env, stack, in);
2509             }
2510 88324           }
2511              
2512             #define SPVM_IMPLEMENT_RETURN_UNDEF(stack) (*(void**)&stack[0] = NULL)
2513              
2514 6           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_BYTE(SPVM_ENV* env, SPVM_VALUE* stack, int8_t* in, int32_t args_width) {
2515 24 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2516 18           *(int8_t*)&stack[stack_index] = *(in + stack_index);
2517             }
2518 6           }
2519              
2520 5           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_SHORT(SPVM_ENV* env, SPVM_VALUE* stack, int16_t* in, int32_t args_width) {
2521 20 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2522 15           *(int16_t*)&stack[stack_index] = *(in + stack_index);
2523             }
2524 5           }
2525              
2526 5           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_INT(SPVM_ENV* env, SPVM_VALUE* stack, int32_t* in, int32_t args_width) {
2527 20 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2528 15           *(int32_t*)&stack[stack_index] = *(in + stack_index);
2529             }
2530 5           }
2531              
2532 5           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_LONG(SPVM_ENV* env, SPVM_VALUE* stack, int64_t* in, int32_t args_width) {
2533 20 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2534 15           *(int64_t*)&stack[stack_index] = *(in + stack_index);
2535             }
2536 5           }
2537              
2538 5           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_FLOAT(SPVM_ENV* env, SPVM_VALUE* stack, float* in, int32_t args_width) {
2539 20 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2540 15           *(float*)&stack[stack_index] = *(in + stack_index);
2541             }
2542 5           }
2543              
2544 6           static inline void SPVM_IMPLEMENT_RETURN_MULNUM_DOUBLE(SPVM_ENV* env, SPVM_VALUE* stack, double* in, int32_t args_width) {
2545 23 100         for (int32_t stack_index = 0; stack_index < args_width; stack_index++) {
2546 17           *(double*)&stack[stack_index] = *(in + stack_index);
2547             }
2548 6           }
2549              
2550             #define SPVM_IMPLEMENT_CALL_CLASS_METHOD(env, stack, error_id, method, args_width) (error_id = env->call_method_no_mortal(env, stack, method, args_width))
2551              
2552             #define SPVM_IMPLEMENT_CALL_INSTANCE_METHOD_STATIC(env, stack, error_id, method, args_width) (error_id = env->call_method_no_mortal(env, stack, method, args_width))
2553              
2554 505973           static inline void SPVM_IMPLEMENT_CALL_INSTANCE_METHOD(SPVM_ENV* env, SPVM_VALUE* stack, const char* interface_name, const char* method_name, int32_t args_width, int32_t* error_id, char* tmp_buffer, int32_t tmp_buffer_length) {
2555            
2556 505973           void* object = stack[0].oval;
2557            
2558 505973           *error_id = 0;
2559            
2560 505973           void* method = NULL;
2561 505973 100         if (!object) {
2562 1           void* exception = env->new_string_nolen_no_mortal(env, stack, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_CALL_INSTANCE_METHOD_INVOCANT_UNDEF]);
2563 1           env->set_exception(env, stack, exception);
2564 1           *error_id = 1;
2565             }
2566             else {
2567 505972           method = env->get_instance_method(env, stack, object, method_name);
2568            
2569 505972 100         if (!method) {
2570 2           snprintf(tmp_buffer, tmp_buffer_length, SPVM_IMPLEMENT_STRING_LITERALS[SPVM_IMPLEMENT_C_STRING_CALL_INSTANCE_METHOD_IMPLEMENT_NOT_FOUND], method_name, interface_name);
2571 2           void* exception = env->new_string_nolen_no_mortal(env, stack, tmp_buffer);
2572 2           env->set_exception(env, stack, exception);
2573 2           *error_id = 1;
2574             }
2575             }
2576            
2577 505973 100         if (!*error_id) {
2578 505970           *error_id = env->call_method_no_mortal(env, stack, method, args_width);
2579             }
2580 505973           }
2581              
2582             #endif