| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | // Copyright (c) 2023 Yuki Kimoto | 
| 2 |  |  |  |  |  |  | // MIT License | 
| 3 |  |  |  |  |  |  |  | 
| 4 |  |  |  |  |  |  | #include | 
| 5 |  |  |  |  |  |  | #include | 
| 6 |  |  |  |  |  |  | #include | 
| 7 |  |  |  |  |  |  | #include | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | #include "spvm_compiler.h" | 
| 10 |  |  |  |  |  |  | #include "spvm_type.h" | 
| 11 |  |  |  |  |  |  | #include "spvm_op.h" | 
| 12 |  |  |  |  |  |  | #include "spvm_hash.h" | 
| 13 |  |  |  |  |  |  | #include "spvm_list.h" | 
| 14 |  |  |  |  |  |  | #include "spvm_allocator.h" | 
| 15 |  |  |  |  |  |  | #include "spvm_yacc_util.h" | 
| 16 |  |  |  |  |  |  | #include "spvm_list.h" | 
| 17 |  |  |  |  |  |  | #include "spvm_opcode_list.h" | 
| 18 |  |  |  |  |  |  | #include "spvm_method.h" | 
| 19 |  |  |  |  |  |  | #include "spvm_field.h" | 
| 20 |  |  |  |  |  |  | #include "spvm_class_var.h" | 
| 21 |  |  |  |  |  |  | #include "spvm_native.h" | 
| 22 |  |  |  |  |  |  | #include "spvm_opcode.h" | 
| 23 |  |  |  |  |  |  | #include "spvm_basic_type.h" | 
| 24 |  |  |  |  |  |  | #include "spvm_use.h" | 
| 25 |  |  |  |  |  |  | #include "spvm_check.h" | 
| 26 |  |  |  |  |  |  | #include "spvm_opcode_builder.h" | 
| 27 |  |  |  |  |  |  | #include "spvm_object.h" | 
| 28 |  |  |  |  |  |  | #include "spvm_var_decl.h" | 
| 29 |  |  |  |  |  |  | #include "spvm_string_buffer.h" | 
| 30 |  |  |  |  |  |  | #include "spvm_allow.h" | 
| 31 |  |  |  |  |  |  | #include "spvm_interface.h" | 
| 32 |  |  |  |  |  |  | #include "spvm_class_var_access.h" | 
| 33 |  |  |  |  |  |  | #include "spvm_constant.h" | 
| 34 |  |  |  |  |  |  | #include "spvm_array_field_access.h" | 
| 35 |  |  |  |  |  |  | #include "spvm_field_access.h" | 
| 36 |  |  |  |  |  |  | #include "spvm_call_method.h" | 
| 37 |  |  |  |  |  |  | #include "spvm_var.h" | 
| 38 |  |  |  |  |  |  | #include "spvm_string.h" | 
| 39 |  |  |  |  |  |  | #include "spvm_class_file.h" | 
| 40 |  |  |  |  |  |  | #include "spvm_mutex.h" | 
| 41 |  |  |  |  |  |  |  | 
| 42 |  |  |  |  |  |  | #include "spvm_api.h" | 
| 43 |  |  |  |  |  |  | #include "spvm_api_runtime.h" | 
| 44 |  |  |  |  |  |  | #include "spvm_runtime.h" | 
| 45 |  |  |  |  |  |  | #include "spvm_runtime_basic_type.h" | 
| 46 |  |  |  |  |  |  | #include "spvm_runtime_class_var.h" | 
| 47 |  |  |  |  |  |  | #include "spvm_runtime_field.h" | 
| 48 |  |  |  |  |  |  | #include "spvm_runtime_arg.h" | 
| 49 |  |  |  |  |  |  | #include "spvm_runtime.h" | 
| 50 |  |  |  |  |  |  | #include "spvm_runtime_method.h" | 
| 51 |  |  |  |  |  |  | #include "spvm_runtime_string.h" | 
| 52 |  |  |  |  |  |  | #include "spvm_runtime_arg.h" | 
| 53 |  |  |  |  |  |  |  | 
| 54 | 1481 |  |  |  |  |  | SPVM_COMPILER* SPVM_COMPILER_new() { | 
| 55 | 1481 |  |  |  |  |  | SPVM_COMPILER* compiler = SPVM_ALLOCATOR_alloc_memory_block_unmanaged(sizeof(SPVM_COMPILER)); | 
| 56 |  |  |  |  |  |  |  | 
| 57 | 1481 |  |  |  |  |  | compiler->global_allocator = SPVM_ALLOCATOR_new(); | 
| 58 | 1481 |  |  |  |  |  | compiler->each_compile_allocators = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 59 | 1481 |  |  |  |  |  | compiler->error_message_allocator = SPVM_ALLOCATOR_new(); | 
| 60 | 1481 |  |  |  |  |  | compiler->class_file_allocator = SPVM_ALLOCATOR_new(); | 
| 61 |  |  |  |  |  |  |  | 
| 62 | 1481 |  |  |  |  |  | compiler->ch_ptr = ""; | 
| 63 |  |  |  |  |  |  |  | 
| 64 | 1481 |  |  |  |  |  | compiler->constant_strings = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 65 | 1481 |  |  |  |  |  | compiler->constant_string_symtable = SPVM_HASH_new_hash_permanent(compiler->global_allocator, 0); | 
| 66 |  |  |  |  |  |  |  | 
| 67 | 1481 |  |  |  |  |  | compiler->global_strings = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 68 | 1481 |  |  |  |  |  | compiler->global_string_symtable = SPVM_HASH_new_hash_permanent(compiler->global_allocator, 0); | 
| 69 |  |  |  |  |  |  |  | 
| 70 | 1481 |  |  |  |  |  | compiler->basic_types = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 71 | 1481 |  |  |  |  |  | compiler->basic_type_symtable = SPVM_HASH_new_hash_permanent(compiler->global_allocator, 0); | 
| 72 |  |  |  |  |  |  |  | 
| 73 | 1481 |  |  |  |  |  | compiler->class_files = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 74 | 1481 |  |  |  |  |  | compiler->class_file_class_names = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 75 |  |  |  |  |  |  |  | 
| 76 | 1481 |  |  |  |  |  | compiler->include_dirs = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 77 |  |  |  |  |  |  |  | 
| 78 | 1481 |  |  |  |  |  | compiler->error_messages = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 79 |  |  |  |  |  |  |  | 
| 80 | 1481 |  |  |  |  |  | compiler->ops = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 81 | 1481 |  |  |  |  |  | compiler->op_use_stack = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 82 | 1481 |  |  |  |  |  | compiler->op_types = SPVM_LIST_new_list_permanent(compiler->global_allocator, 0); | 
| 83 |  |  |  |  |  |  |  | 
| 84 | 1481 |  |  |  |  |  | compiler->runtime = SPVM_RUNTIME_new(); | 
| 85 |  |  |  |  |  |  |  | 
| 86 | 1481 |  |  |  |  |  | int32_t compiler_mutex_compile_size = SPVM_MUTEX_size(); | 
| 87 | 1481 |  |  |  |  |  | void* compiler_mutex_compile = SPVM_ALLOCATOR_alloc_memory_block_permanent(compiler->global_allocator, compiler_mutex_compile_size); | 
| 88 |  |  |  |  |  |  |  | 
| 89 | 1481 |  |  |  |  |  | SPVM_MUTEX_init(compiler_mutex_compile); | 
| 90 |  |  |  |  |  |  |  | 
| 91 | 1481 |  |  |  |  |  | compiler->mutex_compile = compiler_mutex_compile; | 
| 92 |  |  |  |  |  |  |  | 
| 93 | 1481 |  |  |  |  |  | return compiler; | 
| 94 |  |  |  |  |  |  | } | 
| 95 |  |  |  |  |  |  |  | 
| 96 | 1145 |  |  |  |  |  | void SPVM_COMPILER_free(SPVM_COMPILER* compiler) { | 
| 97 |  |  |  |  |  |  |  | 
| 98 | 1145 |  |  |  |  |  | SPVM_COMPILER_clear_error_messages(compiler); | 
| 99 |  |  |  |  |  |  |  | 
| 100 | 1145 |  |  |  |  |  | SPVM_COMPILER_set_start_file(compiler, NULL); | 
| 101 |  |  |  |  |  |  |  | 
| 102 | 1145 |  |  |  |  |  | SPVM_COMPILER_clear_include_dirs(compiler); | 
| 103 |  |  |  |  |  |  |  | 
| 104 | 1145 | 50 |  |  |  |  | if (compiler->runtime) { | 
| 105 | 1145 |  |  |  |  |  | SPVM_RUNTIME_free(compiler->runtime); | 
| 106 | 1145 |  |  |  |  |  | compiler->runtime = NULL; | 
| 107 |  |  |  |  |  |  | } | 
| 108 |  |  |  |  |  |  |  | 
| 109 | 3372 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->each_compile_allocators->length; i++) { | 
| 110 | 2227 |  |  |  |  |  | SPVM_ALLOCATOR* each_compile_allocator = SPVM_LIST_get(compiler->each_compile_allocators, i); | 
| 111 | 2227 |  |  |  |  |  | SPVM_ALLOCATOR_free(each_compile_allocator); | 
| 112 |  |  |  |  |  |  | } | 
| 113 |  |  |  |  |  |  |  | 
| 114 | 1145 |  |  |  |  |  | SPVM_ALLOCATOR_free(compiler->error_message_allocator); | 
| 115 | 1145 |  |  |  |  |  | compiler->error_message_allocator = NULL; | 
| 116 |  |  |  |  |  |  |  | 
| 117 | 1145 |  |  |  |  |  | int32_t found = 0; | 
| 118 | 19139 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->class_file_class_names->length; i++) { | 
| 119 | 17994 |  |  |  |  |  | SPVM_CLASS_FILE* class_file_class_name = SPVM_LIST_get(compiler->class_file_class_names, i); | 
| 120 | 17994 | 50 |  |  |  |  | if (class_file_class_name) { | 
| 121 | 17994 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->class_file_allocator, compiler->class_file_class_names->values[i]); | 
| 122 | 17994 |  |  |  |  |  | compiler->class_file_class_names->values[i] = NULL; | 
| 123 |  |  |  |  |  |  | } | 
| 124 |  |  |  |  |  |  | } | 
| 125 | 19139 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->class_files->length; i++) { | 
| 126 | 17994 |  |  |  |  |  | SPVM_CLASS_FILE* class_file = SPVM_LIST_get(compiler->class_files, i); | 
| 127 | 17994 | 50 |  |  |  |  | if (class_file) { | 
| 128 | 17994 |  |  |  |  |  | SPVM_COMPILER_free_class_file(compiler, compiler->class_files->values[i]); | 
| 129 | 17994 |  |  |  |  |  | compiler->class_files->values[i] = NULL; | 
| 130 |  |  |  |  |  |  | } | 
| 131 |  |  |  |  |  |  | } | 
| 132 |  |  |  |  |  |  |  | 
| 133 | 1145 |  |  |  |  |  | SPVM_ALLOCATOR_free(compiler->class_file_allocator); | 
| 134 | 1145 |  |  |  |  |  | compiler->class_file_allocator = NULL; | 
| 135 |  |  |  |  |  |  |  | 
| 136 | 1145 |  |  |  |  |  | SPVM_MUTEX_destroy(compiler->mutex_compile); | 
| 137 |  |  |  |  |  |  |  | 
| 138 | 1145 |  |  |  |  |  | SPVM_ALLOCATOR_free(compiler->global_allocator); | 
| 139 | 1145 |  |  |  |  |  | compiler->global_allocator = NULL; | 
| 140 | 1145 |  |  |  |  |  | } | 
| 141 |  |  |  |  |  |  |  | 
| 142 | 3592 |  |  |  |  |  | int32_t SPVM_COMPILER_compile(SPVM_COMPILER* compiler, const char* basic_type_name) { | 
| 143 |  |  |  |  |  |  |  | 
| 144 | 3592 |  |  |  |  |  | SPVM_MUTEX* compiler_mutex_compile = compiler->mutex_compile; | 
| 145 |  |  |  |  |  |  |  | 
| 146 | 3592 |  |  |  |  |  | SPVM_MUTEX_lock(compiler_mutex_compile); | 
| 147 |  |  |  |  |  |  |  | 
| 148 | 3592 |  |  |  |  |  | compiler->current_each_compile_allocator = SPVM_ALLOCATOR_new(); | 
| 149 |  |  |  |  |  |  |  | 
| 150 | 3592 |  |  |  |  |  | SPVM_COMPILER_clear_error_messages(compiler); | 
| 151 |  |  |  |  |  |  |  | 
| 152 | 3592 |  |  |  |  |  | int32_t compile_start_memory_blocks_count_tmp = compiler->current_each_compile_allocator->memory_blocks_count_tmp; | 
| 153 |  |  |  |  |  |  |  | 
| 154 | 3592 |  |  |  |  |  | compiler->if_require_not_found_basic_type_name_symtable = SPVM_HASH_new(compiler->current_each_compile_allocator, 0, SPVM_ALLOCATOR_C_ALLOC_TYPE_TMP); | 
| 155 |  |  |  |  |  |  |  | 
| 156 | 3592 |  |  |  |  |  | int32_t compiler_basic_types_base_id = compiler->basic_types->length; | 
| 157 |  |  |  |  |  |  |  | 
| 158 | 3592 |  |  |  |  |  | compiler->basic_types_base_id = compiler_basic_types_base_id; | 
| 159 |  |  |  |  |  |  |  | 
| 160 | 3592 |  |  |  |  |  | int32_t compiler_constant_strings_base_id = compiler->constant_strings->length; | 
| 161 |  |  |  |  |  |  |  | 
| 162 | 3592 |  |  |  |  |  | compiler->constant_strings_base_id = compiler_constant_strings_base_id; | 
| 163 |  |  |  |  |  |  |  | 
| 164 | 3592 | 100 |  |  |  |  | if (compiler->basic_types->length == 0) { | 
| 165 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_types(compiler); | 
| 166 |  |  |  |  |  |  |  | 
| 167 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_files(compiler); | 
| 168 |  |  |  |  |  |  | } | 
| 169 |  |  |  |  |  |  |  | 
| 170 | 3592 |  |  |  |  |  | SPVM_COMPILER_use_default_loaded_classes(compiler); | 
| 171 |  |  |  |  |  |  |  | 
| 172 | 3592 | 100 |  |  |  |  | if (basic_type_name) { | 
| 173 | 3266 |  |  |  |  |  | SPVM_STRING* basic_type_name_string = SPVM_STRING_new(compiler, basic_type_name, strlen(basic_type_name)); | 
| 174 | 3266 |  |  |  |  |  | basic_type_name = basic_type_name_string->value; | 
| 175 | 3266 |  |  |  |  |  | const char* start_file = SPVM_COMPILER_get_start_file(compiler); | 
| 176 | 3266 |  |  |  |  |  | int32_t start_line = SPVM_COMPILER_get_start_line(compiler); | 
| 177 |  |  |  |  |  |  |  | 
| 178 | 3266 |  |  |  |  |  | SPVM_COMPILER_use(compiler, basic_type_name, start_file, start_line); | 
| 179 |  |  |  |  |  |  | } | 
| 180 |  |  |  |  |  |  |  | 
| 181 |  |  |  |  |  |  | #ifdef SPVM_DEBUG_YACC | 
| 182 |  |  |  |  |  |  | SPVM_yydebug = 1; | 
| 183 |  |  |  |  |  |  | #else | 
| 184 | 3592 |  |  |  |  |  | SPVM_yydebug = 0; | 
| 185 |  |  |  |  |  |  | #endif | 
| 186 |  |  |  |  |  |  |  | 
| 187 | 3592 |  |  |  |  |  | compiler->end_of_file = 1; | 
| 188 |  |  |  |  |  |  |  | 
| 189 | 3592 |  |  |  |  |  | int32_t yyparse_error_id = SPVM_yyparse(compiler); | 
| 190 |  |  |  |  |  |  |  | 
| 191 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_ids(compiler); | 
| 192 |  |  |  |  |  |  |  | 
| 193 | 3592 |  |  |  |  |  | int32_t error_id = 0; | 
| 194 |  |  |  |  |  |  |  | 
| 195 | 3592 | 100 |  |  |  |  | if (yyparse_error_id) { | 
| 196 | 63 |  |  |  |  |  | error_id = SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_CLASS; | 
| 197 |  |  |  |  |  |  | } | 
| 198 |  |  |  |  |  |  | else { | 
| 199 | 3529 | 100 |  |  |  |  | if (SPVM_COMPILER_get_error_messages_length(compiler) > 0) { | 
| 200 | 115 |  |  |  |  |  | error_id = SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_CLASS; | 
| 201 |  |  |  |  |  |  | } | 
| 202 |  |  |  |  |  |  | else { | 
| 203 | 3414 |  |  |  |  |  | SPVM_CHECK_check(compiler); | 
| 204 | 3414 | 100 |  |  |  |  | if (SPVM_COMPILER_get_error_messages_length(compiler) > 0) { | 
| 205 | 373 |  |  |  |  |  | error_id = SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_CLASS; | 
| 206 |  |  |  |  |  |  | } | 
| 207 |  |  |  |  |  |  | else { | 
| 208 | 3041 |  |  |  |  |  | int32_t build_opcode_list_start_memory_blocks_count_tmp = compiler->current_each_compile_allocator->memory_blocks_count_tmp; | 
| 209 | 3041 |  |  |  |  |  | SPVM_OPCODE_BUILDER_build_opcode_list(compiler); | 
| 210 | 3041 | 50 |  |  |  |  | assert(compiler->current_each_compile_allocator->memory_blocks_count_tmp == build_opcode_list_start_memory_blocks_count_tmp); | 
| 211 | 3041 | 50 |  |  |  |  | assert(SPVM_COMPILER_get_error_messages_length(compiler) == 0); | 
| 212 |  |  |  |  |  |  | } | 
| 213 |  |  |  |  |  |  | } | 
| 214 |  |  |  |  |  |  | } | 
| 215 |  |  |  |  |  |  |  | 
| 216 | 3592 |  |  |  |  |  | SPVM_COMPILER_free_memory_tmp_each_compile(compiler); | 
| 217 |  |  |  |  |  |  |  | 
| 218 | 3592 | 50 |  |  |  |  | assert(compiler->current_each_compile_allocator->memory_blocks_count_tmp == compile_start_memory_blocks_count_tmp); | 
| 219 |  |  |  |  |  |  |  | 
| 220 | 3592 | 100 |  |  |  |  | if (error_id) { | 
| 221 | 14285 | 100 |  |  |  |  | for (int32_t basic_type_id = compiler_basic_types_base_id; basic_type_id < compiler->basic_types->length; basic_type_id++) { | 
| 222 | 13734 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); | 
| 223 |  |  |  |  |  |  |  | 
| 224 | 13734 |  |  |  |  |  | SPVM_CLASS_FILE* found_class_file = SPVM_COMPILER_get_class_file(compiler, basic_type->name); | 
| 225 | 13734 | 100 |  |  |  |  | if (found_class_file) { | 
| 226 | 7545 |  |  |  |  |  | SPVM_COMPILER_delete_class_file(compiler, basic_type->name); | 
| 227 |  |  |  |  |  |  | } | 
| 228 |  |  |  |  |  |  |  | 
| 229 | 13734 |  |  |  |  |  | SPVM_HASH_set(compiler->basic_type_symtable, basic_type->name, strlen(basic_type->name), NULL); | 
| 230 |  |  |  |  |  |  | } | 
| 231 | 551 |  |  |  |  |  | compiler->basic_types->length = compiler_basic_types_base_id; | 
| 232 |  |  |  |  |  |  |  | 
| 233 | 41407 | 100 |  |  |  |  | for (int32_t constant_string_id = compiler_constant_strings_base_id; constant_string_id < compiler->constant_strings->length; constant_string_id++) { | 
| 234 | 40856 |  |  |  |  |  | SPVM_BASIC_TYPE* constant_string = SPVM_LIST_get(compiler->constant_strings, constant_string_id); | 
| 235 | 40856 |  |  |  |  |  | SPVM_HASH_set(compiler->constant_string_symtable, constant_string->name, strlen(constant_string->name), NULL); | 
| 236 |  |  |  |  |  |  | } | 
| 237 | 551 |  |  |  |  |  | compiler->constant_strings->length = compiler_constant_strings_base_id; | 
| 238 |  |  |  |  |  |  |  | 
| 239 | 551 |  |  |  |  |  | SPVM_ALLOCATOR_free(compiler->current_each_compile_allocator); | 
| 240 | 551 |  |  |  |  |  | compiler->current_each_compile_allocator = NULL; | 
| 241 |  |  |  |  |  |  | } | 
| 242 |  |  |  |  |  |  | else { | 
| 243 | 3041 |  |  |  |  |  | SPVM_LIST_push(compiler->each_compile_allocators, compiler->current_each_compile_allocator); | 
| 244 | 3041 |  |  |  |  |  | compiler->current_each_compile_allocator = NULL; | 
| 245 |  |  |  |  |  |  |  | 
| 246 | 3041 |  |  |  |  |  | SPVM_COMPILER_build_runtime(compiler); | 
| 247 |  |  |  |  |  |  | } | 
| 248 |  |  |  |  |  |  |  | 
| 249 | 3592 |  |  |  |  |  | SPVM_MUTEX_unlock(compiler_mutex_compile); | 
| 250 |  |  |  |  |  |  |  | 
| 251 | 3592 |  |  |  |  |  | return error_id; | 
| 252 |  |  |  |  |  |  | } | 
| 253 |  |  |  |  |  |  |  | 
| 254 | 4737 |  |  |  |  |  | void SPVM_COMPILER_clear_error_messages(SPVM_COMPILER* compiler) { | 
| 255 |  |  |  |  |  |  |  | 
| 256 | 4737 |  |  |  |  |  | SPVM_LIST* error_messages = compiler->error_messages; | 
| 257 |  |  |  |  |  |  |  | 
| 258 | 5352 | 100 |  |  |  |  | for (int32_t i = 0; i < error_messages->length; i++) { | 
| 259 | 615 |  |  |  |  |  | const char* error_message = SPVM_LIST_get(error_messages, i); | 
| 260 |  |  |  |  |  |  |  | 
| 261 | 615 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->error_message_allocator, (void*)error_message); | 
| 262 | 615 |  |  |  |  |  | error_message = NULL; | 
| 263 |  |  |  |  |  |  | } | 
| 264 |  |  |  |  |  |  |  | 
| 265 | 4737 |  |  |  |  |  | error_messages->length = 0; | 
| 266 | 4737 |  |  |  |  |  | } | 
| 267 |  |  |  |  |  |  |  | 
| 268 | 34455 |  |  |  |  |  | void SPVM_COMPILER_add_class_file(SPVM_COMPILER* compiler, const char* class_name) { | 
| 269 |  |  |  |  |  |  |  | 
| 270 | 34455 |  |  |  |  |  | SPVM_CLASS_FILE* class_file = SPVM_COMPILER_get_class_file(compiler, class_name); | 
| 271 |  |  |  |  |  |  |  | 
| 272 | 34455 | 50 |  |  |  |  | if (!class_file) { | 
| 273 | 34455 |  |  |  |  |  | class_file = SPVM_ALLOCATOR_alloc_memory_block_tmp(compiler->class_file_allocator, sizeof(SPVM_CLASS_FILE)); | 
| 274 | 34455 |  |  |  |  |  | class_file->class_name = class_name; | 
| 275 | 34455 |  |  |  |  |  | SPVM_COMPILER_set_class_file(compiler, class_name, class_file); | 
| 276 |  |  |  |  |  |  | } | 
| 277 | 34455 |  |  |  |  |  | } | 
| 278 |  |  |  |  |  |  |  | 
| 279 | 7545 |  |  |  |  |  | void SPVM_COMPILER_delete_class_file(SPVM_COMPILER* compiler, const char* class_name) { | 
| 280 |  |  |  |  |  |  |  | 
| 281 | 7545 |  |  |  |  |  | int32_t found = 0; | 
| 282 | 7545 |  |  |  |  |  | int32_t found_index = -1; | 
| 283 | 20745 | 50 |  |  |  |  | for (int32_t i = 0; i < compiler->class_file_class_names->length; i++) { | 
| 284 | 20745 |  |  |  |  |  | const char* class_file_class_name = SPVM_LIST_get(compiler->class_file_class_names, i); | 
| 285 | 20745 | 100 |  |  |  |  | if (strcmp(class_name, class_file_class_name) == 0) { | 
| 286 | 7545 | 50 |  |  |  |  | if (compiler->class_files->values[i]) { | 
| 287 |  |  |  |  |  |  |  | 
| 288 | 7545 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->class_file_allocator, compiler->class_file_class_names->values[i]); | 
| 289 | 7545 |  |  |  |  |  | compiler->class_file_class_names->values[i] = NULL; | 
| 290 |  |  |  |  |  |  |  | 
| 291 | 7545 |  |  |  |  |  | SPVM_COMPILER_free_class_file(compiler, compiler->class_files->values[i]); | 
| 292 | 7545 |  |  |  |  |  | compiler->class_files->values[i] = NULL; | 
| 293 |  |  |  |  |  |  | } | 
| 294 | 7545 |  |  |  |  |  | found_index = i; | 
| 295 | 7545 |  |  |  |  |  | found = 1; | 
| 296 | 7545 |  |  |  |  |  | break; | 
| 297 |  |  |  |  |  |  | } | 
| 298 |  |  |  |  |  |  | } | 
| 299 |  |  |  |  |  |  |  | 
| 300 | 7545 | 50 |  |  |  |  | if (found_index >= 0) { | 
| 301 | 7545 | 100 |  |  |  |  | if (found_index < compiler->class_file_class_names->length - 1) { | 
| 302 | 7059 |  |  |  |  |  | int32_t move_length = compiler->class_file_class_names->length - 1 - found_index; | 
| 303 | 7059 |  |  |  |  |  | memmove(compiler->class_file_class_names->values + found_index, compiler->class_file_class_names->values + found_index + 1, sizeof(void*) * move_length); | 
| 304 | 7059 |  |  |  |  |  | memmove(compiler->class_files->values + found_index, compiler->class_files->values + found_index + 1, sizeof(void*) * move_length); | 
| 305 |  |  |  |  |  |  | } | 
| 306 |  |  |  |  |  |  |  | 
| 307 | 7545 |  |  |  |  |  | compiler->class_file_class_names->length--; | 
| 308 | 7545 |  |  |  |  |  | compiler->class_files->length--; | 
| 309 |  |  |  |  |  |  | } | 
| 310 | 7545 |  |  |  |  |  | } | 
| 311 |  |  |  |  |  |  |  | 
| 312 | 34455 |  |  |  |  |  | void SPVM_COMPILER_set_class_file(SPVM_COMPILER* compiler, const char* class_name, SPVM_CLASS_FILE* class_file) { | 
| 313 |  |  |  |  |  |  |  | 
| 314 | 34455 |  |  |  |  |  | int32_t found = 0; | 
| 315 | 545360 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->class_file_class_names->length; i++) { | 
| 316 | 510905 |  |  |  |  |  | const char* class_file_class_name = SPVM_LIST_get(compiler->class_file_class_names, i); | 
| 317 | 510905 | 50 |  |  |  |  | if (strcmp(class_name, class_file_class_name) == 0) { | 
| 318 | 0 | 0 |  |  |  |  | if (compiler->class_files->values[i]) { | 
| 319 |  |  |  |  |  |  |  | 
| 320 | 0 |  |  |  |  |  | SPVM_COMPILER_free_class_file(compiler, compiler->class_files->values[i]); | 
| 321 | 0 |  |  |  |  |  | compiler->class_files->values[i] = NULL; | 
| 322 |  |  |  |  |  |  | } | 
| 323 | 0 |  |  |  |  |  | compiler->class_files->values[i] = class_file; | 
| 324 | 0 |  |  |  |  |  | found = 1; | 
| 325 | 0 |  |  |  |  |  | break; | 
| 326 |  |  |  |  |  |  | } | 
| 327 |  |  |  |  |  |  | } | 
| 328 |  |  |  |  |  |  |  | 
| 329 | 34455 | 50 |  |  |  |  | if (!found) { | 
| 330 | 34455 |  |  |  |  |  | const char* class_name_clone = SPVM_ALLOCATOR_alloc_memory_block_tmp(compiler->class_file_allocator, strlen(class_name) + 1); | 
| 331 | 34455 |  |  |  |  |  | memcpy((void*)class_name_clone, class_name, strlen(class_name)); | 
| 332 | 34455 |  |  |  |  |  | SPVM_LIST_push(compiler->class_file_class_names, (void*)class_name_clone); | 
| 333 | 34455 |  |  |  |  |  | SPVM_LIST_push(compiler->class_files, (void*)class_file); | 
| 334 |  |  |  |  |  |  | } | 
| 335 | 34455 |  |  |  |  |  | } | 
| 336 |  |  |  |  |  |  |  | 
| 337 | 168352 |  |  |  |  |  | SPVM_CLASS_FILE* SPVM_COMPILER_get_class_file(SPVM_COMPILER* compiler, const char* class_name) { | 
| 338 |  |  |  |  |  |  |  | 
| 339 | 168352 |  |  |  |  |  | SPVM_CLASS_FILE* found_class_file = NULL; | 
| 340 | 2725452 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->class_file_class_names->length; i++) { | 
| 341 | 2651428 |  |  |  |  |  | const char* class_file_class_name = SPVM_LIST_get(compiler->class_file_class_names, i); | 
| 342 |  |  |  |  |  |  |  | 
| 343 | 2651428 | 100 |  |  |  |  | if (strcmp(class_name, class_file_class_name) == 0) { | 
| 344 | 94328 |  |  |  |  |  | found_class_file = SPVM_LIST_get(compiler->class_files, i); | 
| 345 | 94328 |  |  |  |  |  | break; | 
| 346 |  |  |  |  |  |  | } | 
| 347 |  |  |  |  |  |  | } | 
| 348 |  |  |  |  |  |  |  | 
| 349 | 168352 |  |  |  |  |  | return found_class_file; | 
| 350 |  |  |  |  |  |  | } | 
| 351 |  |  |  |  |  |  |  | 
| 352 | 25539 |  |  |  |  |  | void SPVM_COMPILER_free_class_file(SPVM_COMPILER* compiler, SPVM_CLASS_FILE* class_file) { | 
| 353 |  |  |  |  |  |  |  | 
| 354 | 25539 | 50 |  |  |  |  | assert(class_file); | 
| 355 |  |  |  |  |  |  |  | 
| 356 | 25539 |  |  |  |  |  | SPVM_CLASS_FILE_set_file(compiler, class_file, NULL); | 
| 357 |  |  |  |  |  |  |  | 
| 358 | 25539 |  |  |  |  |  | SPVM_CLASS_FILE_set_dir(compiler, class_file, NULL); | 
| 359 |  |  |  |  |  |  |  | 
| 360 | 25539 |  |  |  |  |  | SPVM_CLASS_FILE_set_rel_file(compiler, class_file, NULL); | 
| 361 |  |  |  |  |  |  |  | 
| 362 | 25539 |  |  |  |  |  | SPVM_CLASS_FILE_set_content(compiler, class_file, NULL); | 
| 363 |  |  |  |  |  |  |  | 
| 364 | 25539 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->class_file_allocator, class_file); | 
| 365 | 25539 |  |  |  |  |  | } | 
| 366 |  |  |  |  |  |  |  | 
| 367 | 16291 |  |  |  |  |  | void SPVM_COMPILER_add_basic_type_core(SPVM_COMPILER* compiler, int32_t basic_type_id, int32_t basic_type_category) { | 
| 368 | 16291 |  |  |  |  |  | const char* basic_type_name = SPVM_BASIC_TYPE_get_basic_type_name(compiler, basic_type_id); | 
| 369 | 16291 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_COMPILER_add_basic_type(compiler, basic_type_name); | 
| 370 | 16291 | 50 |  |  |  |  | assert(basic_type->id == basic_type_id); | 
| 371 | 16291 |  |  |  |  |  | basic_type->category = basic_type_category; | 
| 372 | 16291 |  |  |  |  |  | } | 
| 373 |  |  |  |  |  |  |  | 
| 374 | 58776 |  |  |  |  |  | SPVM_BASIC_TYPE* SPVM_COMPILER_add_basic_type(SPVM_COMPILER* compiler, const char* basic_type_name) { | 
| 375 |  |  |  |  |  |  |  | 
| 376 | 58776 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_HASH_get(compiler->basic_type_symtable, basic_type_name, strlen(basic_type_name)); | 
| 377 |  |  |  |  |  |  |  | 
| 378 | 58776 | 50 |  |  |  |  | if (!basic_type) { | 
| 379 | 58776 |  |  |  |  |  | basic_type = SPVM_BASIC_TYPE_new(compiler); | 
| 380 | 58776 |  |  |  |  |  | basic_type->id = compiler->basic_types->length; | 
| 381 | 58776 |  |  |  |  |  | SPVM_STRING* basic_type_name_string = SPVM_STRING_new(compiler, basic_type_name, strlen(basic_type_name)); | 
| 382 | 58776 |  |  |  |  |  | basic_type->name = basic_type_name_string->value; | 
| 383 | 58776 |  |  |  |  |  | SPVM_LIST_push(compiler->basic_types, basic_type); | 
| 384 | 58776 |  |  |  |  |  | SPVM_HASH_set(compiler->basic_type_symtable, basic_type->name, strlen(basic_type->name), basic_type); | 
| 385 |  |  |  |  |  |  | } | 
| 386 |  |  |  |  |  |  |  | 
| 387 | 58776 |  |  |  |  |  | return basic_type; | 
| 388 |  |  |  |  |  |  | } | 
| 389 |  |  |  |  |  |  |  | 
| 390 | 1481 |  |  |  |  |  | void SPVM_COMPILER_add_basic_types(SPVM_COMPILER* compiler) { | 
| 391 |  |  |  |  |  |  | // Add basic_types | 
| 392 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_UNKNOWN, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_UNKNOWN); | 
| 393 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_UNDEF, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_UNDEF); | 
| 394 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_VOID, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_VOID); | 
| 395 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 396 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 397 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_INT, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 398 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_LONG, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 399 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 400 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC); | 
| 401 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_STRING, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_STRING); | 
| 402 | 1481 |  |  |  |  |  | SPVM_COMPILER_add_basic_type_core(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ANY_OBJECT, SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_ANY_OBJECT); | 
| 403 | 1481 |  |  |  |  |  | } | 
| 404 |  |  |  |  |  |  |  | 
| 405 | 6410182 |  |  |  |  |  | int32_t SPVM_COMPILER_get_error_messages_length(SPVM_COMPILER* compiler) { | 
| 406 |  |  |  |  |  |  |  | 
| 407 | 6410182 |  |  |  |  |  | return compiler->error_messages->length; | 
| 408 |  |  |  |  |  |  | } | 
| 409 |  |  |  |  |  |  |  | 
| 410 | 618 |  |  |  |  |  | const char* SPVM_COMPILER_get_error_message(SPVM_COMPILER* compiler, int32_t index) { | 
| 411 |  |  |  |  |  |  |  | 
| 412 | 618 |  |  |  |  |  | const char* error_message = (const char*)SPVM_LIST_get(compiler->error_messages, index); | 
| 413 |  |  |  |  |  |  |  | 
| 414 | 618 |  |  |  |  |  | return error_message; | 
| 415 |  |  |  |  |  |  | } | 
| 416 |  |  |  |  |  |  |  | 
| 417 | 0 |  |  |  |  |  | void SPVM_COMPILER_print_error_messages(SPVM_COMPILER* compiler, FILE* fh) { | 
| 418 |  |  |  |  |  |  |  | 
| 419 | 0 | 0 |  |  |  |  | for (int32_t i = 0; i < compiler->error_messages->length; i++) { | 
| 420 | 0 |  |  |  |  |  | const char* error_message = (const char*)SPVM_LIST_get(compiler->error_messages, i); | 
| 421 | 0 |  |  |  |  |  | fprintf(fh, "[CompileError]%s\n", error_message); | 
| 422 |  |  |  |  |  |  | } | 
| 423 | 0 |  |  |  |  |  | } | 
| 424 |  |  |  |  |  |  |  | 
| 425 | 46370 |  |  |  |  |  | void SPVM_COMPILER_use(SPVM_COMPILER* compiler, const char* basic_type_name, const char* file, int32_t line) { | 
| 426 | 46370 |  |  |  |  |  | SPVM_OP* op_name_basic_type = SPVM_OP_new_op_name(compiler, basic_type_name, file, line); | 
| 427 | 46370 |  |  |  |  |  | SPVM_OP* op_type_class = SPVM_OP_build_basic_type(compiler, op_name_basic_type); | 
| 428 | 46370 |  |  |  |  |  | SPVM_OP* op_use = SPVM_OP_new_op_use(compiler, op_name_basic_type->file, op_name_basic_type->line); | 
| 429 | 46370 |  |  |  |  |  | SPVM_OP* op_name_alias = NULL; | 
| 430 | 46370 |  |  |  |  |  | int32_t is_require = 0; | 
| 431 | 46370 |  |  |  |  |  | SPVM_OP_build_use(compiler, op_use, op_type_class, op_name_alias, is_require); | 
| 432 | 46370 |  |  |  |  |  | SPVM_LIST_push(compiler->op_use_stack, op_use); | 
| 433 | 46370 |  |  |  |  |  | } | 
| 434 |  |  |  |  |  |  |  | 
| 435 | 0 |  |  |  |  |  | const char* SPVM_COMPILER_get_runtime_name(SPVM_HASH* runtime_constant_string_symtable, const char* name) { | 
| 436 |  |  |  |  |  |  |  | 
| 437 | 0 |  |  |  |  |  | SPVM_RUNTIME_STRING* string = SPVM_HASH_get(runtime_constant_string_symtable, name, strlen(name)); | 
| 438 |  |  |  |  |  |  |  | 
| 439 | 0 |  |  |  |  |  | const char* new_name = string->value; | 
| 440 |  |  |  |  |  |  |  | 
| 441 | 0 |  |  |  |  |  | return new_name; | 
| 442 |  |  |  |  |  |  | } | 
| 443 |  |  |  |  |  |  |  | 
| 444 | 3592 |  |  |  |  |  | void SPVM_COMPILER_use_default_loaded_classes(SPVM_COMPILER* compiler) { | 
| 445 |  |  |  |  |  |  | // Use automatically loaded classes | 
| 446 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Byte", "Byte", 0); | 
| 447 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Short", "Short", 0); | 
| 448 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Int", "Int", 0); | 
| 449 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Long", "Long", 0); | 
| 450 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Float", "Float", 0); | 
| 451 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Double", "Double", 0); | 
| 452 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Bool", "Bool", 0); | 
| 453 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Error", "Error", 0); | 
| 454 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Error::System", "Error::System", 0); | 
| 455 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Error::NotSupported", "Error::NotSupported", 0); | 
| 456 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "CommandInfo", "CommandInfo", 0); | 
| 457 | 3592 |  |  |  |  |  | SPVM_COMPILER_use(compiler, "Address", "Address", 0); | 
| 458 | 3592 |  |  |  |  |  | } | 
| 459 |  |  |  |  |  |  |  | 
| 460 | 1481 |  |  |  |  |  | void SPVM_COMPILER_set_default_loaded_class_files(SPVM_COMPILER* compiler) { | 
| 461 |  |  |  |  |  |  | // Add Bool class file | 
| 462 |  |  |  |  |  |  | { | 
| 463 | 1481 |  |  |  |  |  | const char* class_name = "Bool"; | 
| 464 | 1481 |  |  |  |  |  | const char* rel_file = "Bool.spvm"; | 
| 465 | 1481 |  |  |  |  |  | const char* content = "class Bool {\n  INIT {\n    $TRUE = new Bool;\n    $TRUE->{value} = 1;\n    $FALSE = new Bool;\n    $FALSE->{value} = 0;\n  }\n  \n  our $TRUE : ro Bool;\n  our $FALSE : ro Bool;\n  has value : ro int;\n}"; | 
| 466 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 467 |  |  |  |  |  |  | } | 
| 468 |  |  |  |  |  |  |  | 
| 469 |  |  |  |  |  |  | // Add Error class file | 
| 470 |  |  |  |  |  |  | { | 
| 471 | 1481 |  |  |  |  |  | const char* class_name = "Error"; | 
| 472 | 1481 |  |  |  |  |  | const char* rel_file = "Error.spvm"; | 
| 473 | 1481 |  |  |  |  |  | const char* content = "class Error;"; | 
| 474 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 475 |  |  |  |  |  |  | } | 
| 476 |  |  |  |  |  |  |  | 
| 477 |  |  |  |  |  |  | // Add Error::System class file | 
| 478 |  |  |  |  |  |  | { | 
| 479 | 1481 |  |  |  |  |  | const char* class_name = "Error::System"; | 
| 480 | 1481 |  |  |  |  |  | const char* rel_file = "Error/System.spvm"; | 
| 481 | 1481 |  |  |  |  |  | const char* content = "class Error::System extends Error;"; | 
| 482 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 483 |  |  |  |  |  |  | } | 
| 484 |  |  |  |  |  |  |  | 
| 485 |  |  |  |  |  |  | // Add Error::NotSupported class file | 
| 486 |  |  |  |  |  |  | { | 
| 487 | 1481 |  |  |  |  |  | const char* class_name = "Error::NotSupported"; | 
| 488 | 1481 |  |  |  |  |  | const char* rel_file = "Error/NotSupported.spvm"; | 
| 489 | 1481 |  |  |  |  |  | const char* content = "class Error::NotSupported extends Error;"; | 
| 490 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 491 |  |  |  |  |  |  | } | 
| 492 |  |  |  |  |  |  |  | 
| 493 |  |  |  |  |  |  | // Add Byte class file | 
| 494 |  |  |  |  |  |  | { | 
| 495 | 1481 |  |  |  |  |  | const char* class_name = "Byte"; | 
| 496 | 1481 |  |  |  |  |  | const char* rel_file = "Byte.spvm"; | 
| 497 | 1481 |  |  |  |  |  | const char* content = "class Byte {\n  has value : ro byte;\n  static method new : Byte ($value : int) {\n    my $self = new Byte;\n    $self->{value} = (byte)$value;\n    return $self;\n  }\n}"; | 
| 498 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 499 |  |  |  |  |  |  | } | 
| 500 |  |  |  |  |  |  |  | 
| 501 |  |  |  |  |  |  | // Add Short class file | 
| 502 |  |  |  |  |  |  | { | 
| 503 | 1481 |  |  |  |  |  | const char* class_name = "Short"; | 
| 504 | 1481 |  |  |  |  |  | const char* rel_file = "Short.spvm"; | 
| 505 | 1481 |  |  |  |  |  | const char* content = "class Short {\n  has value : ro short;\n  static method new : Short ($value : int) {\n    my $self = new Short;\n    $self->{value} = (short)$value;\n    return $self;\n  }\n}"; | 
| 506 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 507 |  |  |  |  |  |  | } | 
| 508 |  |  |  |  |  |  |  | 
| 509 |  |  |  |  |  |  | // Add Int class file | 
| 510 |  |  |  |  |  |  | { | 
| 511 | 1481 |  |  |  |  |  | const char* class_name = "Int"; | 
| 512 | 1481 |  |  |  |  |  | const char* rel_file = "Int.spvm"; | 
| 513 | 1481 |  |  |  |  |  | const char* content = "class Int {\n  has value : ro int;\n  static method new : Int ($value : int) {\n    my $self = new Int;\n    $self->{value} = $value;\n    return $self;\n  }\n}"; | 
| 514 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 515 |  |  |  |  |  |  | } | 
| 516 |  |  |  |  |  |  |  | 
| 517 |  |  |  |  |  |  | // Add Long class file | 
| 518 |  |  |  |  |  |  | { | 
| 519 | 1481 |  |  |  |  |  | const char* class_name = "Long"; | 
| 520 | 1481 |  |  |  |  |  | const char* rel_file = "Long.spvm"; | 
| 521 | 1481 |  |  |  |  |  | const char* content = "class Long {\n  has value : ro long;\n  static method new : Long ($value : long) {\n    my $self = new Long;\n    $self->{value} = $value;\n    return $self;\n  }\n}"; | 
| 522 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 523 |  |  |  |  |  |  | } | 
| 524 |  |  |  |  |  |  |  | 
| 525 |  |  |  |  |  |  | // Add Float class file | 
| 526 |  |  |  |  |  |  | { | 
| 527 | 1481 |  |  |  |  |  | const char* class_name = "Float"; | 
| 528 | 1481 |  |  |  |  |  | const char* rel_file = "Float.spvm"; | 
| 529 | 1481 |  |  |  |  |  | const char* content = "class Float {\n  has value : ro float;\n  static method new : Float ($value : float) {\n    my $self = new Float;\n    $self->{value} = $value;\n    return $self;\n  }\n}"; | 
| 530 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 531 |  |  |  |  |  |  | } | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | // Add Double class file | 
| 534 |  |  |  |  |  |  | { | 
| 535 | 1481 |  |  |  |  |  | const char* class_name = "Double"; | 
| 536 | 1481 |  |  |  |  |  | const char* rel_file = "Double.spvm"; | 
| 537 | 1481 |  |  |  |  |  | const char* content = "class Double {\n  has value : ro double;\n  static method new : Double ($value : double) {\n    my $self = new Double;\n    $self->{value} = $value;\n    return $self;\n  }\n}"; | 
| 538 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 539 |  |  |  |  |  |  | } | 
| 540 |  |  |  |  |  |  |  | 
| 541 |  |  |  |  |  |  | // Add CommandInfo class file | 
| 542 |  |  |  |  |  |  | { | 
| 543 | 1481 |  |  |  |  |  | const char* class_name = "CommandInfo"; | 
| 544 | 1481 |  |  |  |  |  | const char* rel_file = "CommandInfo.spvm"; | 
| 545 | 1481 |  |  |  |  |  | const char* content = "class CommandInfo {\n  our $PROGRAM_NAME : ro string;\n  our $ARGV : ro string[];\n  our $BASE_TIME : ro long;\n  }"; | 
| 546 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 547 |  |  |  |  |  |  | } | 
| 548 |  |  |  |  |  |  |  | 
| 549 |  |  |  |  |  |  | // Add Address class file | 
| 550 |  |  |  |  |  |  | { | 
| 551 | 1481 |  |  |  |  |  | const char* class_name = "Address"; | 
| 552 | 1481 |  |  |  |  |  | const char* rel_file = "Address.spvm"; | 
| 553 | 1481 |  |  |  |  |  | const char* content = "class Address : pointer {\n  static method new : Address () {\n    my $self = new Address;\n    return $self;\n  }\n}"; | 
| 554 | 1481 |  |  |  |  |  | SPVM_COMPILER_set_default_loaded_class_file(compiler, class_name, rel_file, content); | 
| 555 |  |  |  |  |  |  | } | 
| 556 | 1481 |  |  |  |  |  | } | 
| 557 |  |  |  |  |  |  |  | 
| 558 | 17772 |  |  |  |  |  | void SPVM_COMPILER_set_default_loaded_class_file(SPVM_COMPILER* compiler, const char* class_name, const char* rel_file, const char* content) { | 
| 559 | 17772 |  |  |  |  |  | SPVM_COMPILER_add_class_file(compiler, class_name); | 
| 560 |  |  |  |  |  |  |  | 
| 561 | 17772 |  |  |  |  |  | SPVM_CLASS_FILE* class_file = SPVM_COMPILER_get_class_file(compiler, class_name); | 
| 562 | 17772 |  |  |  |  |  | SPVM_CLASS_FILE_set_rel_file(compiler, class_file, rel_file); | 
| 563 | 17772 |  |  |  |  |  | SPVM_CLASS_FILE_set_content(compiler, class_file, content); | 
| 564 | 17772 |  |  |  |  |  | SPVM_CLASS_FILE_set_content_length(compiler, class_file, strlen(content)); | 
| 565 | 17772 |  |  |  |  |  | } | 
| 566 |  |  |  |  |  |  |  | 
| 567 | 3592 |  |  |  |  |  | void SPVM_COMPILER_assert_check_basic_type_ids(SPVM_COMPILER* compiler) { | 
| 568 |  |  |  |  |  |  |  | 
| 569 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_UNKNOWN); | 
| 570 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_UNDEF); | 
| 571 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_VOID); | 
| 572 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE); | 
| 573 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT); | 
| 574 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_INT); | 
| 575 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_LONG); | 
| 576 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT); | 
| 577 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE); | 
| 578 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_STRING); | 
| 579 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ANY_OBJECT); | 
| 580 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_CLASS); | 
| 581 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT_CLASS); | 
| 582 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_INT_CLASS); | 
| 583 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_LONG_CLASS); | 
| 584 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT_CLASS); | 
| 585 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_CLASS); | 
| 586 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_BOOL_CLASS); | 
| 587 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_CLASS); | 
| 588 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS); | 
| 589 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_NOT_SUPPORTED_CLASS); | 
| 590 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_COMMAND_INFO_CLASS); | 
| 591 | 3592 |  |  |  |  |  | SPVM_COMPILER_assert_check_basic_type_id(compiler, SPVM_NATIVE_C_BASIC_TYPE_ID_ADDRESS_CLASS); | 
| 592 | 3592 |  |  |  |  |  | } | 
| 593 |  |  |  |  |  |  |  | 
| 594 | 82616 |  |  |  |  |  | void SPVM_COMPILER_assert_check_basic_type_id(SPVM_COMPILER* compiler, int32_t basic_type_id) { | 
| 595 | 82616 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); | 
| 596 | 82616 |  |  |  |  |  | const char* basic_type_name_expected = SPVM_BASIC_TYPE_get_basic_type_name(compiler, basic_type_id); | 
| 597 |  |  |  |  |  |  |  | 
| 598 | 82616 | 50 |  |  |  |  | if (strcmp(basic_type->name, basic_type_name_expected) != 0) { | 
| 599 | 0 |  |  |  |  |  | fprintf(stderr, "[Unexpected Error]Basic Type ID:%d, Basic Type Name:%s, Expected Basic Type Name: %s\n", basic_type_id, basic_type->name, basic_type_name_expected); | 
| 600 | 0 |  |  |  |  |  | assert(0); | 
| 601 |  |  |  |  |  |  | } | 
| 602 | 82616 |  |  |  |  |  | } | 
| 603 |  |  |  |  |  |  |  | 
| 604 | 3592 |  |  |  |  |  | void SPVM_COMPILER_free_memory_tmp_each_compile(SPVM_COMPILER* compiler) { | 
| 605 | 53329950 | 100 |  |  |  |  | for (int32_t i = 0; i < compiler->ops->length; i++) { | 
| 606 | 53326358 |  |  |  |  |  | SPVM_OP* op = SPVM_LIST_get(compiler->ops, i); | 
| 607 | 53326358 |  |  |  |  |  | int32_t op_id = op->id; | 
| 608 | 53326358 |  |  |  |  |  | switch(op_id) { | 
| 609 |  |  |  |  |  |  | case SPVM_OP_C_ID_BLOCK: { | 
| 610 | 1562778 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, op->uv.block); | 
| 611 | 1562778 |  |  |  |  |  | break; | 
| 612 |  |  |  |  |  |  | } | 
| 613 |  |  |  |  |  |  | case SPVM_OP_C_ID_ATTRIBUTE: { | 
| 614 | 353589 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, op->uv.attribute); | 
| 615 | 353589 |  |  |  |  |  | break; | 
| 616 |  |  |  |  |  |  | } | 
| 617 |  |  |  |  |  |  | case SPVM_OP_C_ID_USE: { | 
| 618 | 80311 |  |  |  |  |  | SPVM_USE* use = op->uv.use; | 
| 619 | 80311 |  |  |  |  |  | use->alias_name = NULL; | 
| 620 | 80311 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, use); | 
| 621 | 80311 |  |  |  |  |  | break; | 
| 622 |  |  |  |  |  |  | } | 
| 623 |  |  |  |  |  |  | case SPVM_OP_C_ID_ALLOW: { | 
| 624 | 525 |  |  |  |  |  | SPVM_ALLOW* allow = op->uv.allow; | 
| 625 | 525 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, allow); | 
| 626 | 525 |  |  |  |  |  | break; | 
| 627 |  |  |  |  |  |  | } | 
| 628 |  |  |  |  |  |  | case SPVM_OP_C_ID_INTERFACE: { | 
| 629 | 1394 |  |  |  |  |  | SPVM_INTERFACE* interface = op->uv.interface; | 
| 630 | 1394 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, interface); | 
| 631 | 1394 |  |  |  |  |  | break; | 
| 632 |  |  |  |  |  |  | } | 
| 633 |  |  |  |  |  |  | case SPVM_OP_C_ID_CLASS_VAR_ACCESS: { | 
| 634 | 12964 |  |  |  |  |  | SPVM_CLASS_VAR_ACCESS* class_var_access = op->uv.class_var_access; | 
| 635 | 12964 |  |  |  |  |  | class_var_access->op_name = NULL; | 
| 636 | 12964 |  |  |  |  |  | class_var_access->class_var = NULL; | 
| 637 | 12964 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, class_var_access); | 
| 638 | 12964 |  |  |  |  |  | break; | 
| 639 |  |  |  |  |  |  | } | 
| 640 |  |  |  |  |  |  | case SPVM_OP_C_ID_CONSTANT: { | 
| 641 | 1002055 |  |  |  |  |  | SPVM_CONSTANT* constant = op->uv.constant; | 
| 642 | 1002055 |  |  |  |  |  | constant->op_constant = NULL; | 
| 643 | 1002055 |  |  |  |  |  | constant->type = NULL; | 
| 644 | 1002055 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, constant); | 
| 645 | 1002055 |  |  |  |  |  | break; | 
| 646 |  |  |  |  |  |  | } | 
| 647 |  |  |  |  |  |  | case SPVM_OP_C_ID_ARRAY_FIELD_ACCESS: { | 
| 648 | 2283 |  |  |  |  |  | SPVM_ARRAY_FIELD_ACCESS* array_field_access = op->uv.array_field_access; | 
| 649 | 2283 |  |  |  |  |  | array_field_access->field = NULL; | 
| 650 | 2283 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, array_field_access); | 
| 651 | 2283 |  |  |  |  |  | break; | 
| 652 |  |  |  |  |  |  | } | 
| 653 |  |  |  |  |  |  | case SPVM_OP_C_ID_FIELD_ACCESS: { | 
| 654 | 186836 |  |  |  |  |  | SPVM_FIELD_ACCESS* field_access = op->uv.field_access; | 
| 655 | 186836 |  |  |  |  |  | field_access->op_name = NULL; | 
| 656 | 186836 |  |  |  |  |  | field_access->field = NULL; | 
| 657 | 186836 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, field_access); | 
| 658 | 186836 |  |  |  |  |  | break; | 
| 659 |  |  |  |  |  |  | } | 
| 660 |  |  |  |  |  |  | case SPVM_OP_C_ID_CALL_METHOD: { | 
| 661 | 252759 |  |  |  |  |  | SPVM_CALL_METHOD* call_method = op->uv.call_method; | 
| 662 | 252759 |  |  |  |  |  | call_method->op_name = NULL; | 
| 663 | 252759 |  |  |  |  |  | call_method->method = NULL; | 
| 664 | 252759 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, call_method); | 
| 665 | 252759 |  |  |  |  |  | break; | 
| 666 |  |  |  |  |  |  | } | 
| 667 |  |  |  |  |  |  | case SPVM_OP_C_ID_VAR: { | 
| 668 | 6858912 |  |  |  |  |  | SPVM_VAR* var = op->uv.var; | 
| 669 | 6858912 |  |  |  |  |  | var->op_name = NULL; | 
| 670 | 6858912 |  |  |  |  |  | var->name = NULL; | 
| 671 | 6858912 |  |  |  |  |  | var->var_decl = NULL; | 
| 672 | 6858912 |  |  |  |  |  | var->call_method = NULL; | 
| 673 | 6858912 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, var); | 
| 674 | 6858912 |  |  |  |  |  | break; | 
| 675 |  |  |  |  |  |  | } | 
| 676 |  |  |  |  |  |  | case SPVM_OP_C_ID_VAR_DECL: { | 
| 677 | 2842805 |  |  |  |  |  | SPVM_VAR_DECL* var_decl = op->uv.var_decl; | 
| 678 | 2842805 | 100 |  |  |  |  | if (!var_decl->is_arg) { | 
| 679 | 2322339 |  |  |  |  |  | var_decl->op_var_decl = NULL; | 
| 680 | 2322339 |  |  |  |  |  | var_decl->type = NULL; | 
| 681 | 2322339 |  |  |  |  |  | var_decl->var = NULL; | 
| 682 | 2322339 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, var_decl); | 
| 683 |  |  |  |  |  |  | } | 
| 684 | 2842805 |  |  |  |  |  | break; | 
| 685 |  |  |  |  |  |  | } | 
| 686 |  |  |  |  |  |  | } | 
| 687 | 53326358 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->current_each_compile_allocator, op); | 
| 688 |  |  |  |  |  |  | } | 
| 689 |  |  |  |  |  |  |  | 
| 690 | 62368 | 100 |  |  |  |  | for (int32_t basic_type_id = compiler->basic_types_base_id; basic_type_id < compiler->basic_types->length; basic_type_id++) { | 
| 691 | 58776 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); | 
| 692 |  |  |  |  |  |  |  | 
| 693 | 58776 |  |  |  |  |  | SPVM_LIST* methods = basic_type->methods; | 
| 694 |  |  |  |  |  |  | { | 
| 695 |  |  |  |  |  |  | int32_t method_index; | 
| 696 | 365660 | 100 |  |  |  |  | for (method_index = 0; method_index < methods->length; method_index++) { | 
| 697 | 306884 |  |  |  |  |  | SPVM_METHOD* method = SPVM_LIST_get(methods, method_index); | 
| 698 | 306884 |  |  |  |  |  | method->op_method = NULL; | 
| 699 | 306884 |  |  |  |  |  | method->op_name = NULL; | 
| 700 | 306884 |  |  |  |  |  | method->op_block = NULL; | 
| 701 |  |  |  |  |  |  | } | 
| 702 |  |  |  |  |  |  | } | 
| 703 |  |  |  |  |  |  | } | 
| 704 |  |  |  |  |  |  |  | 
| 705 | 3592 |  |  |  |  |  | compiler->op_use_stack->length = 0; | 
| 706 |  |  |  |  |  |  |  | 
| 707 | 3592 |  |  |  |  |  | compiler->op_types->length = 0; | 
| 708 |  |  |  |  |  |  |  | 
| 709 | 3592 |  |  |  |  |  | compiler->ops->length = 0; | 
| 710 |  |  |  |  |  |  |  | 
| 711 | 3592 |  |  |  |  |  | SPVM_HASH_free(compiler->if_require_not_found_basic_type_name_symtable); | 
| 712 | 3592 |  |  |  |  |  | } | 
| 713 |  |  |  |  |  |  |  | 
| 714 | 3041 |  |  |  |  |  | SPVM_RUNTIME* SPVM_COMPILER_build_runtime(SPVM_COMPILER* compiler) { | 
| 715 |  |  |  |  |  |  |  | 
| 716 | 3041 |  |  |  |  |  | SPVM_RUNTIME* current_runtime = compiler->runtime; | 
| 717 |  |  |  |  |  |  |  | 
| 718 | 3041 |  |  |  |  |  | int32_t current_runtime_basic_types_length = current_runtime->basic_types_length; | 
| 719 |  |  |  |  |  |  |  | 
| 720 | 3041 |  |  |  |  |  | SPVM_RUNTIME* runtime = current_runtime; | 
| 721 |  |  |  |  |  |  |  | 
| 722 | 3041 |  |  |  |  |  | SPVM_RUNTIME_BASIC_TYPE** current_runtime_basic_types = current_runtime->basic_types; | 
| 723 |  |  |  |  |  |  |  | 
| 724 | 3041 |  |  |  |  |  | runtime->basic_types = SPVM_ALLOCATOR_alloc_memory_block_tmp(runtime->allocator, sizeof(SPVM_RUNTIME_BASIC_TYPE*) * compiler->basic_types->length); | 
| 725 | 3041 | 100 |  |  |  |  | if (current_runtime_basic_types_length > 0) { | 
| 726 | 2110 |  |  |  |  |  | memcpy(runtime->basic_types, current_runtime_basic_types, sizeof(SPVM_RUNTIME_BASIC_TYPE*) * current_runtime_basic_types_length); | 
| 727 | 2110 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(runtime->allocator, current_runtime_basic_types); | 
| 728 |  |  |  |  |  |  | } | 
| 729 |  |  |  |  |  |  |  | 
| 730 | 3041 |  |  |  |  |  | runtime->basic_types_length = compiler->basic_types->length; | 
| 731 |  |  |  |  |  |  |  | 
| 732 | 48083 | 100 |  |  |  |  | for (int32_t basic_type_id = current_runtime_basic_types_length; basic_type_id < compiler->basic_types->length; basic_type_id++) { | 
| 733 | 45042 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); | 
| 734 | 45042 |  |  |  |  |  | SPVM_RUNTIME_BASIC_TYPE* runtime_basic_type = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_BASIC_TYPE)); | 
| 735 |  |  |  |  |  |  |  | 
| 736 | 45042 |  |  |  |  |  | runtime->basic_types[basic_type_id] = runtime_basic_type; | 
| 737 |  |  |  |  |  |  | } | 
| 738 |  |  |  |  |  |  |  | 
| 739 | 3041 | 50 |  |  |  |  | assert(runtime->basic_types[0]); | 
| 740 |  |  |  |  |  |  |  | 
| 741 | 48083 | 100 |  |  |  |  | for (int32_t basic_type_id = current_runtime_basic_types_length; basic_type_id < compiler->basic_types->length; basic_type_id++) { | 
| 742 |  |  |  |  |  |  |  | 
| 743 | 45042 |  |  |  |  |  | SPVM_BASIC_TYPE* basic_type = SPVM_LIST_get(compiler->basic_types, basic_type_id); | 
| 744 | 45042 |  |  |  |  |  | SPVM_RUNTIME_BASIC_TYPE* runtime_basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, basic_type_id); | 
| 745 |  |  |  |  |  |  |  | 
| 746 | 45042 |  |  |  |  |  | SPVM_HASH_set(runtime->basic_type_symtable, basic_type->name, strlen(basic_type->name), runtime_basic_type); | 
| 747 |  |  |  |  |  |  |  | 
| 748 | 45042 |  |  |  |  |  | const char* runtime_string_pool = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, basic_type->string_pool->length); | 
| 749 | 45042 |  |  |  |  |  | memcpy((char*)runtime_string_pool, basic_type->string_pool->string, basic_type->string_pool->length); | 
| 750 | 45042 |  |  |  |  |  | runtime_basic_type->string_pool = runtime_string_pool; | 
| 751 | 45042 |  |  |  |  |  | runtime_basic_type->string_pool_length = basic_type->string_pool->length; | 
| 752 |  |  |  |  |  |  |  | 
| 753 | 45042 |  |  |  |  |  | SPVM_RUNTIME_STRING* runtime_constant_strings = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_STRING) * basic_type->constant_strings->length); | 
| 754 | 783142 | 100 |  |  |  |  | for (int32_t constant_string_index = 0; constant_string_index < basic_type->constant_strings->length; constant_string_index++) { | 
| 755 | 738100 |  |  |  |  |  | SPVM_STRING* constant_string = SPVM_LIST_get(basic_type->constant_strings, constant_string_index); | 
| 756 | 738100 |  |  |  |  |  | SPVM_RUNTIME_STRING* runtime_constant_string = &runtime_constant_strings[constant_string_index]; | 
| 757 | 738100 |  |  |  |  |  | runtime_constant_string->value = &runtime_basic_type->string_pool[constant_string->string_pool_index]; | 
| 758 | 738100 |  |  |  |  |  | runtime_constant_string->length = constant_string->length; | 
| 759 |  |  |  |  |  |  | } | 
| 760 | 45042 |  |  |  |  |  | runtime_basic_type->constant_strings = runtime_constant_strings; | 
| 761 | 45042 |  |  |  |  |  | runtime_basic_type->constant_strings_length = basic_type->constant_strings->length; | 
| 762 |  |  |  |  |  |  |  | 
| 763 | 45042 | 100 |  |  |  |  | if (basic_type->class_vars->length > 0) { | 
| 764 | 2027 |  |  |  |  |  | SPVM_RUNTIME_CLASS_VAR* runtime_class_vars = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_CLASS_VAR) * basic_type->class_vars->length); | 
| 765 | 7369 | 100 |  |  |  |  | for (int32_t class_var_index = 0; class_var_index < basic_type->class_vars->length; class_var_index++) { | 
| 766 | 5342 |  |  |  |  |  | SPVM_CLASS_VAR* class_var = SPVM_LIST_get(basic_type->class_vars, class_var_index); | 
| 767 | 5342 |  |  |  |  |  | SPVM_RUNTIME_CLASS_VAR* runtime_class_var = &runtime_class_vars[class_var_index]; | 
| 768 |  |  |  |  |  |  |  | 
| 769 | 5342 |  |  |  |  |  | runtime_class_var->index = class_var->index; | 
| 770 | 5342 |  |  |  |  |  | runtime_class_var->basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, class_var->type->basic_type->id); | 
| 771 | 5342 |  |  |  |  |  | runtime_class_var->type_dimension = class_var->type->dimension; | 
| 772 | 5342 |  |  |  |  |  | runtime_class_var->type_flag = class_var->type->flag; | 
| 773 | 5342 |  |  |  |  |  | runtime_class_var->current_basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, class_var->current_basic_type->id); | 
| 774 |  |  |  |  |  |  |  | 
| 775 | 5342 |  |  |  |  |  | SPVM_STRING* class_var_name_string = SPVM_HASH_get(basic_type->constant_string_symtable, class_var->name, strlen(class_var->name)); | 
| 776 | 5342 |  |  |  |  |  | runtime_class_var->name = runtime_basic_type->constant_strings[class_var_name_string->index].value; | 
| 777 |  |  |  |  |  |  | } | 
| 778 | 2027 |  |  |  |  |  | runtime_basic_type->class_vars = runtime_class_vars; | 
| 779 | 2027 |  |  |  |  |  | runtime_basic_type->class_vars_length = basic_type->class_vars->length; | 
| 780 |  |  |  |  |  |  | } | 
| 781 |  |  |  |  |  |  |  | 
| 782 | 45042 | 100 |  |  |  |  | if (basic_type->fields->length > 0) { | 
| 783 | 13848 |  |  |  |  |  | SPVM_RUNTIME_FIELD* runtime_fields = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_FIELD) * basic_type->fields->length); | 
| 784 | 36847 | 100 |  |  |  |  | for (int32_t field_index = 0; field_index < basic_type->fields->length; field_index++) { | 
| 785 | 22999 |  |  |  |  |  | SPVM_FIELD* field = SPVM_LIST_get(basic_type->fields, field_index); | 
| 786 | 22999 |  |  |  |  |  | SPVM_RUNTIME_FIELD* runtime_field = &runtime_fields[field_index]; | 
| 787 |  |  |  |  |  |  |  | 
| 788 | 22999 |  |  |  |  |  | runtime_field->index = field->index; | 
| 789 | 22999 |  |  |  |  |  | runtime_field->offset = field->offset; | 
| 790 | 22999 |  |  |  |  |  | runtime_field->basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, field->type->basic_type->id); | 
| 791 | 22999 |  |  |  |  |  | runtime_field->type_dimension = field->type->dimension; | 
| 792 | 22999 |  |  |  |  |  | runtime_field->type_flag = field->type->flag; | 
| 793 | 22999 |  |  |  |  |  | runtime_field->current_basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, field->current_basic_type->id); | 
| 794 |  |  |  |  |  |  |  | 
| 795 | 22999 |  |  |  |  |  | SPVM_STRING* field_name_string = SPVM_HASH_get(basic_type->constant_string_symtable, field->name, strlen(field->name)); | 
| 796 | 22999 |  |  |  |  |  | runtime_field->name = runtime_basic_type->constant_strings[field_name_string->index].value; | 
| 797 |  |  |  |  |  |  | } | 
| 798 | 13848 |  |  |  |  |  | runtime_basic_type->fields = runtime_fields; | 
| 799 | 13848 |  |  |  |  |  | runtime_basic_type->fields_length = basic_type->fields->length; | 
| 800 |  |  |  |  |  |  | } | 
| 801 |  |  |  |  |  |  |  | 
| 802 | 45042 | 100 |  |  |  |  | if (basic_type->methods->length > 0) { | 
| 803 | 34570 |  |  |  |  |  | SPVM_RUNTIME_METHOD* runtime_methods = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_METHOD) * basic_type->methods->length); | 
| 804 | 319043 | 100 |  |  |  |  | for (int32_t method_index = 0; method_index < basic_type->methods->length; method_index++) { | 
| 805 |  |  |  |  |  |  |  | 
| 806 | 284473 |  |  |  |  |  | SPVM_METHOD* method = SPVM_LIST_get(basic_type->methods, method_index); | 
| 807 | 284473 |  |  |  |  |  | SPVM_RUNTIME_METHOD* runtime_method = &runtime_methods[method_index]; | 
| 808 |  |  |  |  |  |  |  | 
| 809 | 284473 | 50 |  |  |  |  | assert(method->opcode_list->length > 0); | 
| 810 |  |  |  |  |  |  |  | 
| 811 | 284473 |  |  |  |  |  | runtime_method->opcodes = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_OPCODE) * method->opcode_list->length); | 
| 812 | 284473 |  |  |  |  |  | memcpy(runtime_method->opcodes, method->opcode_list->values, sizeof(SPVM_OPCODE) * method->opcode_list->length); | 
| 813 | 284473 |  |  |  |  |  | runtime_method->opcodes_length = method->opcode_list->length; | 
| 814 |  |  |  |  |  |  |  | 
| 815 | 284473 |  |  |  |  |  | runtime_method->index = method->index; | 
| 816 | 284473 |  |  |  |  |  | runtime_method->current_basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, method->current_basic_type->id); | 
| 817 | 284473 |  |  |  |  |  | runtime_method->is_class_method = method->is_class_method; | 
| 818 | 284473 |  |  |  |  |  | runtime_method->is_init = method->is_init; | 
| 819 | 284473 |  |  |  |  |  | runtime_method->is_anon = method->is_anon; | 
| 820 | 284473 |  |  |  |  |  | runtime_method->byte_vars_width = method->byte_vars_width; | 
| 821 | 284473 |  |  |  |  |  | runtime_method->short_vars_width  = method->short_vars_width; | 
| 822 | 284473 |  |  |  |  |  | runtime_method->int_vars_width = method->int_vars_width; | 
| 823 | 284473 |  |  |  |  |  | runtime_method->long_vars_width  = method->long_vars_width; | 
| 824 | 284473 |  |  |  |  |  | runtime_method->float_vars_width  = method->float_vars_width; | 
| 825 | 284473 |  |  |  |  |  | runtime_method->double_vars_width  = method->double_vars_width; | 
| 826 | 284473 |  |  |  |  |  | runtime_method->object_vars_width = method->object_vars_width; | 
| 827 | 284473 |  |  |  |  |  | runtime_method->ref_vars_width = method->ref_vars_width; | 
| 828 | 284473 |  |  |  |  |  | runtime_method->mortal_stack_length  = method->mortal_stack_length; | 
| 829 | 284473 |  |  |  |  |  | runtime_method->return_basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, method->return_type->basic_type->id); | 
| 830 | 284473 |  |  |  |  |  | runtime_method->return_type_dimension = method->return_type->dimension; | 
| 831 | 284473 |  |  |  |  |  | runtime_method->return_type_flag = method->return_type->flag; | 
| 832 | 284473 |  |  |  |  |  | runtime_method->is_native = method->is_native; | 
| 833 | 284473 |  |  |  |  |  | runtime_method->is_precompile = method->is_precompile; | 
| 834 | 284473 |  |  |  |  |  | runtime_method->is_destructor = method->is_destructor; | 
| 835 | 284473 |  |  |  |  |  | runtime_method->is_required = method->is_required; | 
| 836 | 284473 |  |  |  |  |  | runtime_method->is_enum = method->is_enum; | 
| 837 |  |  |  |  |  |  |  | 
| 838 | 284473 |  |  |  |  |  | SPVM_STRING* method_name_string = SPVM_HASH_get(basic_type->constant_string_symtable, method->name, strlen(method->name)); | 
| 839 | 284473 |  |  |  |  |  | runtime_method->name = runtime_basic_type->constant_strings[method_name_string->index].value; | 
| 840 |  |  |  |  |  |  |  | 
| 841 | 284473 | 100 |  |  |  |  | if (method->args_length > 0) { | 
| 842 | 217309 |  |  |  |  |  | runtime_method->args = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_ARG) * method->args_length); | 
| 843 | 217309 |  |  |  |  |  | runtime_method->args_length = method->args_length; | 
| 844 | 704036 | 100 |  |  |  |  | for (int32_t arg_index = 0; arg_index < method->args_length; arg_index++) { | 
| 845 | 486727 |  |  |  |  |  | SPVM_VAR_DECL* arg_var_decl = SPVM_LIST_get(method->var_decls, arg_index); | 
| 846 | 486727 |  |  |  |  |  | SPVM_RUNTIME_ARG* runtime_arg = &runtime_method->args[arg_index]; | 
| 847 |  |  |  |  |  |  |  | 
| 848 | 486727 |  |  |  |  |  | SPVM_STRING* arg_name_string = SPVM_HASH_get(basic_type->constant_string_symtable, arg_var_decl->name, strlen(arg_var_decl->name)); | 
| 849 |  |  |  |  |  |  |  | 
| 850 | 486727 |  |  |  |  |  | runtime_arg->name = runtime_basic_type->constant_strings[arg_name_string->index].value; | 
| 851 | 486727 |  |  |  |  |  | runtime_arg->index = arg_index; | 
| 852 | 486727 |  |  |  |  |  | runtime_arg->basic_type = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, arg_var_decl->type->basic_type->id); | 
| 853 | 486727 |  |  |  |  |  | runtime_arg->type_dimension = arg_var_decl->type->dimension; | 
| 854 | 486727 |  |  |  |  |  | runtime_arg->type_flag = arg_var_decl->type->flag; | 
| 855 | 486727 |  |  |  |  |  | runtime_arg->stack_index = arg_var_decl->arg_stack_index; | 
| 856 |  |  |  |  |  |  | } | 
| 857 |  |  |  |  |  |  | } | 
| 858 |  |  |  |  |  |  |  | 
| 859 | 284473 |  |  |  |  |  | runtime_method->required_args_length = method->required_args_length; | 
| 860 |  |  |  |  |  |  | } | 
| 861 | 34570 |  |  |  |  |  | runtime_basic_type->methods = runtime_methods; | 
| 862 | 34570 |  |  |  |  |  | runtime_basic_type->methods_length = basic_type->methods->length; | 
| 863 |  |  |  |  |  |  | } | 
| 864 |  |  |  |  |  |  |  | 
| 865 | 45042 | 100 |  |  |  |  | if (basic_type->anon_basic_types->length > 0) { | 
| 866 | 549 |  |  |  |  |  | SPVM_RUNTIME_BASIC_TYPE** runtime_anon_basic_types = SPVM_ALLOCATOR_alloc_memory_block_permanent(runtime->allocator, sizeof(SPVM_RUNTIME_BASIC_TYPE*) * basic_type->anon_basic_types->length); | 
| 867 | 8504 | 100 |  |  |  |  | for (int32_t anon_basic_type_index = 0; anon_basic_type_index < basic_type->anon_basic_types->length; anon_basic_type_index++) { | 
| 868 | 7955 |  |  |  |  |  | SPVM_BASIC_TYPE* anon_basic_type = SPVM_LIST_get(basic_type->anon_basic_types, anon_basic_type_index); | 
| 869 | 7955 |  |  |  |  |  | runtime_anon_basic_types[anon_basic_type_index] = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, anon_basic_type->id); | 
| 870 |  |  |  |  |  |  | } | 
| 871 | 549 |  |  |  |  |  | runtime_basic_type->anon_basic_types = runtime_anon_basic_types; | 
| 872 | 549 |  |  |  |  |  | runtime_basic_type->anon_basic_types_length = basic_type->anon_basic_types->length; | 
| 873 |  |  |  |  |  |  | } | 
| 874 |  |  |  |  |  |  |  | 
| 875 | 45042 |  |  |  |  |  | runtime_basic_type->id = basic_type->id; | 
| 876 | 45042 |  |  |  |  |  | runtime_basic_type->category = basic_type->category; | 
| 877 |  |  |  |  |  |  |  | 
| 878 | 45042 |  |  |  |  |  | SPVM_STRING* basic_type_string = SPVM_HASH_get(basic_type->constant_string_symtable, basic_type->name, strlen(basic_type->name)); | 
| 879 | 45042 | 50 |  |  |  |  | assert(basic_type_string->index >= 0); | 
| 880 | 45042 |  |  |  |  |  | runtime_basic_type->name = runtime_basic_type->constant_strings[basic_type_string->index].value; | 
| 881 |  |  |  |  |  |  |  | 
| 882 | 45042 | 100 |  |  |  |  | if (basic_type->class_rel_file) { | 
| 883 | 34801 |  |  |  |  |  | SPVM_STRING* basic_type_rel_file_string = SPVM_HASH_get(basic_type->constant_string_symtable, basic_type->class_rel_file, strlen(basic_type->class_rel_file)); | 
| 884 | 34801 |  |  |  |  |  | runtime_basic_type->class_rel_file = runtime_basic_type->constant_strings[basic_type_rel_file_string->index].value; | 
| 885 |  |  |  |  |  |  | } | 
| 886 |  |  |  |  |  |  |  | 
| 887 | 45042 | 100 |  |  |  |  | if (basic_type->class_dir) { | 
| 888 | 23629 |  |  |  |  |  | SPVM_STRING* basic_type_dir_string = SPVM_HASH_get(basic_type->constant_string_symtable, basic_type->class_dir, strlen(basic_type->class_dir)); | 
| 889 | 23629 |  |  |  |  |  | runtime_basic_type->class_dir = runtime_basic_type->constant_strings[basic_type_dir_string->index].value; | 
| 890 |  |  |  |  |  |  | } | 
| 891 |  |  |  |  |  |  |  | 
| 892 | 45042 | 100 |  |  |  |  | if (basic_type->version_string) { | 
| 893 | 171 |  |  |  |  |  | SPVM_STRING* basic_type_version_string = SPVM_HASH_get(basic_type->constant_string_symtable, basic_type->version_string, strlen(basic_type->version_string)); | 
| 894 | 171 |  |  |  |  |  | runtime_basic_type->version_string = runtime_basic_type->constant_strings[basic_type_version_string->index].value; | 
| 895 |  |  |  |  |  |  | } | 
| 896 |  |  |  |  |  |  |  | 
| 897 | 45042 |  |  |  |  |  | runtime_basic_type->is_anon = basic_type->is_anon; | 
| 898 |  |  |  |  |  |  |  | 
| 899 | 45042 |  |  |  |  |  | runtime_basic_type->is_pointer = basic_type->is_pointer; | 
| 900 |  |  |  |  |  |  |  | 
| 901 | 45042 | 100 |  |  |  |  | if (basic_type->parent) { | 
| 902 | 1954 |  |  |  |  |  | SPVM_BASIC_TYPE* parent_basic_type = SPVM_HASH_get(compiler->basic_type_symtable, basic_type->parent->name, strlen(basic_type->parent->name)); | 
| 903 | 1954 |  |  |  |  |  | runtime_basic_type->parent = SPVM_API_RUNTIME_get_basic_type_by_id(runtime, parent_basic_type->id); | 
| 904 |  |  |  |  |  |  | } | 
| 905 |  |  |  |  |  |  |  | 
| 906 | 45042 |  |  |  |  |  | runtime_basic_type->fields_size = basic_type->fields_size; | 
| 907 |  |  |  |  |  |  |  | 
| 908 | 45042 | 100 |  |  |  |  | if (basic_type->init_method) { | 
| 909 | 29024 |  |  |  |  |  | runtime_basic_type->init_method = &runtime_basic_type->methods[basic_type->init_method->index]; | 
| 910 |  |  |  |  |  |  | } | 
| 911 |  |  |  |  |  |  |  | 
| 912 | 45042 | 100 |  |  |  |  | if (basic_type->destructor_method) { | 
| 913 | 739 |  |  |  |  |  | runtime_basic_type->destructor_method = &runtime_basic_type->methods[basic_type->destructor_method->index]; | 
| 914 |  |  |  |  |  |  | } | 
| 915 |  |  |  |  |  |  | } | 
| 916 |  |  |  |  |  |  |  | 
| 917 | 3041 |  |  |  |  |  | compiler->runtime = runtime; | 
| 918 |  |  |  |  |  |  |  | 
| 919 | 3041 |  |  |  |  |  | return runtime; | 
| 920 |  |  |  |  |  |  | } | 
| 921 |  |  |  |  |  |  |  | 
| 922 | 1807 |  |  |  |  |  | SPVM_RUNTIME* SPVM_COMPILER_get_runtime(SPVM_COMPILER* compiler) { | 
| 923 | 1807 |  |  |  |  |  | return compiler->runtime; | 
| 924 |  |  |  |  |  |  | } | 
| 925 |  |  |  |  |  |  |  | 
| 926 | 618 |  |  |  |  |  | void SPVM_COMPILER_error(SPVM_COMPILER* compiler, const char* error_message_template, ...) { | 
| 927 |  |  |  |  |  |  |  | 
| 928 | 618 |  |  |  |  |  | int32_t error_message_length = 0; | 
| 929 |  |  |  |  |  |  |  | 
| 930 |  |  |  |  |  |  | // Message template | 
| 931 | 618 |  |  |  |  |  | int32_t error_message_template_length = (int32_t)strlen(error_message_template); | 
| 932 |  |  |  |  |  |  |  | 
| 933 |  |  |  |  |  |  | va_list args; | 
| 934 | 618 |  |  |  |  |  | va_start(args, error_message_template); | 
| 935 |  |  |  |  |  |  |  | 
| 936 | 618 |  |  |  |  |  | error_message_length += error_message_template_length; | 
| 937 |  |  |  |  |  |  |  | 
| 938 |  |  |  |  |  |  | // Argument count | 
| 939 | 618 |  |  |  |  |  | char* found_ptr = (char*)error_message_template; | 
| 940 |  |  |  |  |  |  | while (1) { | 
| 941 | 2617 |  |  |  |  |  | found_ptr = strchr(found_ptr, '%'); | 
| 942 | 2617 | 100 |  |  |  |  | if (found_ptr) { | 
| 943 | 1999 | 100 |  |  |  |  | if (*(found_ptr + 1) == 'c') { | 
| 944 | 3 | 50 |  |  |  |  | int arg = va_arg(args, int); | 
| 945 | 3 |  |  |  |  |  | error_message_length++; | 
| 946 |  |  |  |  |  |  | } | 
| 947 | 1996 | 100 |  |  |  |  | else if (*(found_ptr + 1) == 's') { | 
| 948 | 1302 | 100 |  |  |  |  | char* arg = va_arg(args, char*); | 
| 949 | 1302 |  |  |  |  |  | error_message_length += strlen(arg); | 
| 950 |  |  |  |  |  |  | } | 
| 951 | 694 | 100 |  |  |  |  | else if (*(found_ptr + 1) == 'd') { | 
| 952 | 688 | 100 |  |  |  |  | (void) va_arg(args, int); | 
| 953 | 688 |  |  |  |  |  | error_message_length += 30; | 
| 954 |  |  |  |  |  |  | } | 
| 955 | 6 | 50 |  |  |  |  | else if (*(found_ptr + 1) == '%') { | 
| 956 |  |  |  |  |  |  | // Nothing | 
| 957 | 6 |  |  |  |  |  | found_ptr++; | 
| 958 |  |  |  |  |  |  | } | 
| 959 |  |  |  |  |  |  | else { | 
| 960 | 0 |  |  |  |  |  | assert(0); | 
| 961 |  |  |  |  |  |  | } | 
| 962 | 1999 |  |  |  |  |  | found_ptr++; | 
| 963 |  |  |  |  |  |  | } | 
| 964 |  |  |  |  |  |  | else { | 
| 965 | 618 |  |  |  |  |  | break; | 
| 966 |  |  |  |  |  |  | } | 
| 967 | 1999 |  |  |  |  |  | } | 
| 968 | 618 |  |  |  |  |  | va_end(args); | 
| 969 |  |  |  |  |  |  |  | 
| 970 | 618 |  |  |  |  |  | char* error_message = SPVM_ALLOCATOR_alloc_memory_block_tmp(compiler->error_message_allocator, error_message_length + 1); | 
| 971 |  |  |  |  |  |  |  | 
| 972 | 618 |  |  |  |  |  | va_start(args, error_message_template); | 
| 973 | 618 |  |  |  |  |  | vsprintf(error_message, error_message_template, args); | 
| 974 | 618 |  |  |  |  |  | va_end(args); | 
| 975 |  |  |  |  |  |  |  | 
| 976 | 618 |  |  |  |  |  | SPVM_LIST_push(compiler->error_messages, error_message); | 
| 977 | 618 |  |  |  |  |  | } | 
| 978 |  |  |  |  |  |  |  | 
| 979 | 3266 |  |  |  |  |  | const char* SPVM_COMPILER_get_start_file(SPVM_COMPILER* compiler) { | 
| 980 | 3266 |  |  |  |  |  | return compiler->start_file; | 
| 981 |  |  |  |  |  |  | } | 
| 982 |  |  |  |  |  |  |  | 
| 983 | 4411 |  |  |  |  |  | void SPVM_COMPILER_set_start_file(SPVM_COMPILER* compiler, const char* start_file) { | 
| 984 | 4411 | 100 |  |  |  |  | if (compiler->start_file) { | 
| 985 | 2938 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->global_allocator, (void*)compiler->start_file); | 
| 986 | 2938 |  |  |  |  |  | compiler->start_file = NULL; | 
| 987 |  |  |  |  |  |  | } | 
| 988 |  |  |  |  |  |  |  | 
| 989 | 4411 | 100 |  |  |  |  | if (start_file) { | 
| 990 | 3266 |  |  |  |  |  | int32_t start_file_length = strlen(start_file); | 
| 991 | 3266 |  |  |  |  |  | compiler->start_file = SPVM_ALLOCATOR_alloc_memory_block_tmp(compiler->global_allocator, start_file_length + 1); | 
| 992 | 3266 |  |  |  |  |  | memcpy((void*)compiler->start_file, start_file, start_file_length); | 
| 993 |  |  |  |  |  |  | } | 
| 994 | 4411 |  |  |  |  |  | } | 
| 995 |  |  |  |  |  |  |  | 
| 996 | 3266 |  |  |  |  |  | int32_t SPVM_COMPILER_get_start_line(SPVM_COMPILER* compiler) { | 
| 997 | 3266 |  |  |  |  |  | return compiler->start_line; | 
| 998 |  |  |  |  |  |  | } | 
| 999 |  |  |  |  |  |  |  | 
| 1000 | 3266 |  |  |  |  |  | void SPVM_COMPILER_set_start_line(SPVM_COMPILER* compiler, int32_t start_line) { | 
| 1001 | 3266 |  |  |  |  |  | compiler->start_line = start_line; | 
| 1002 | 3266 |  |  |  |  |  | } | 
| 1003 |  |  |  |  |  |  |  | 
| 1004 | 17837 |  |  |  |  |  | int32_t SPVM_COMPILER_get_include_dirs_length(SPVM_COMPILER* compiler) { | 
| 1005 | 17837 |  |  |  |  |  | SPVM_LIST* include_dirs = compiler->include_dirs; | 
| 1006 | 17837 |  |  |  |  |  | int32_t include_dirs_length = include_dirs->length; | 
| 1007 | 17837 |  |  |  |  |  | return include_dirs_length; | 
| 1008 |  |  |  |  |  |  | } | 
| 1009 |  |  |  |  |  |  |  | 
| 1010 | 34869 |  |  |  |  |  | void SPVM_COMPILER_add_include_dir(SPVM_COMPILER* compiler, const char* include_dir) { | 
| 1011 | 34869 |  |  |  |  |  | int32_t include_dir_length = strlen(include_dir); | 
| 1012 | 34869 |  |  |  |  |  | char* compiler_include_dir = SPVM_ALLOCATOR_alloc_memory_block_tmp(compiler->global_allocator, include_dir_length + 1); | 
| 1013 | 34869 |  |  |  |  |  | memcpy(compiler_include_dir, include_dir, include_dir_length); | 
| 1014 | 34869 |  |  |  |  |  | SPVM_LIST_push(compiler->include_dirs, (void*)compiler_include_dir); | 
| 1015 | 34869 |  |  |  |  |  | } | 
| 1016 |  |  |  |  |  |  |  | 
| 1017 | 1145 |  |  |  |  |  | void SPVM_COMPILER_clear_include_dirs(SPVM_COMPILER* compiler) { | 
| 1018 | 1145 |  |  |  |  |  | int32_t include_dirs_length = SPVM_COMPILER_get_include_dirs_length(compiler); | 
| 1019 |  |  |  |  |  |  |  | 
| 1020 | 32430 | 100 |  |  |  |  | for (int32_t i = 0; i < include_dirs_length; i++) { | 
| 1021 | 31285 |  |  |  |  |  | const char* include_dir = SPVM_COMPILER_get_include_dir(compiler, i); | 
| 1022 | 31285 |  |  |  |  |  | SPVM_ALLOCATOR_free_memory_block_tmp(compiler->global_allocator, (void*)include_dir); | 
| 1023 | 31285 |  |  |  |  |  | include_dir = NULL; | 
| 1024 |  |  |  |  |  |  | } | 
| 1025 |  |  |  |  |  |  |  | 
| 1026 | 1145 |  |  |  |  |  | SPVM_LIST_clear(compiler->include_dirs); | 
| 1027 | 1145 |  |  |  |  |  | } | 
| 1028 |  |  |  |  |  |  |  | 
| 1029 | 91611 |  |  |  |  |  | const char* SPVM_COMPILER_get_include_dir (SPVM_COMPILER* compiler, int32_t include_dir_id) { | 
| 1030 | 91611 |  |  |  |  |  | const char* include_dir = SPVM_LIST_get(compiler->include_dirs, include_dir_id); | 
| 1031 | 91611 |  |  |  |  |  | return include_dir; | 
| 1032 |  |  |  |  |  |  | } |