diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index c230b9348..9aa4aed9d 100644 --- a/port/linux/.vscode/launch.json +++ b/port/linux/.vscode/launch.json @@ -44,7 +44,7 @@ // "--gtest_filter=except.for_loop" // "--gtest_filter=builtin.init_raise" // "--gtest_filter=builtin.strformat" - "--gtest_filter=except.typeerr" + // "--gtest_filter=except.typeerr" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", diff --git a/port/linux/test/python/PikaUI/pikascript-api/pikaModules_cache.py.a b/port/linux/test/python/PikaUI/pikascript-api/pikaModules_cache.py.a index e19b22838..2f8af66a2 100644 Binary files a/port/linux/test/python/PikaUI/pikascript-api/pikaModules_cache.py.a and b/port/linux/test/python/PikaUI/pikascript-api/pikaModules_cache.py.a differ diff --git a/src/PikaCompiler.c b/src/PikaCompiler.c index f7b32d622..853c4f31e 100644 --- a/src/PikaCompiler.c +++ b/src/PikaCompiler.c @@ -426,6 +426,37 @@ static int32_t __foreach_handler_getModuleNum(Arg* argEach, return 0; } +#include +#include + +/* Times33 checksum calculation from a specific offset in the file */ +uint32_t file_calculate_times33(FILE* fp, uint32_t offset) { + uint32_t checksum = 5381; // Times33 uses 5381 as the initial value + uint8_t buffer[64]; // 64-byte buffer for reading + + // Seek to the specified offset in the file + pika_platform_fseek(fp, offset, SEEK_SET); + + size_t bytes_read; + // Read the file chunk by chunk and update the checksum + while ((bytes_read = pika_platform_fread(buffer, 1, sizeof(buffer), fp)) > + 0) { + for (size_t i = 0; i < bytes_read; i++) { + checksum = (checksum * 33) + buffer[i]; + } + } + + return checksum; +} + +uint32_t bytes_caclulate_times33(uint8_t* bytes, uint32_t size) { + uint32_t checksum = 5381; // Times33 uses 5381 as the initial value + for (uint32_t i = 0; i < size; i++) { + checksum = (checksum * 33) + bytes[i]; + } + return checksum; +} + int LibObj_linkFile(LibObj* self, char* output_file_name) { FILE* out_file = pika_platform_fopen(output_file_name, "wb+"); @@ -451,22 +482,23 @@ int LibObj_linkFile(LibObj* self, char* output_file_name) { uint32_t module_num = linker.module_num; uint32_t modules_size = linker.sum_size; uint32_t block_size = linker.block_size; - uint32_t totle_size = block_size * (module_num + 1) + modules_size; + uint32_t total_size = block_size * (module_num + 1) + modules_size; uint8_t* meta_block_buff = pikaMalloc(block_size); pika_platform_memset(meta_block_buff, 0, block_size); /* write meta info */ const uint32_t magic_code_offset = sizeof(uint32_t) * PIKA_APP_MAGIC_CODE_OFFSET; - const uint32_t totle_size_offset = + const uint32_t total_size_offset = sizeof(uint32_t) * PIKA_APP_MODULE_SIZE_OFFSET; const uint32_t version_offset = sizeof(uint32_t) * PIKA_APP_VERSION_OFFSET; const uint32_t module_num_offset = sizeof(uint32_t) * PIKA_APP_MODULE_NUM_OFFSET; const uint32_t info_block_size_offset = sizeof(uint32_t) * PIKA_APP_INFO_BLOCK_SIZE_OFFSET; + const uint32_t times33_offset = sizeof(uint32_t) * PIKA_APP_TIMES33_OFFSET; - // the meta info is the first block + /* the meta info is the first block */ pika_platform_memcpy(meta_block_buff + magic_code_offset, &magic_code, sizeof(uint32_t)); pika_platform_memcpy(meta_block_buff + version_offset, &version_num, @@ -475,23 +507,33 @@ int LibObj_linkFile(LibObj* self, char* output_file_name) { pika_platform_memcpy(meta_block_buff + module_num_offset, &module_num, sizeof(uint32_t)); /* write modules_size to the file */ - pika_platform_memcpy(meta_block_buff + totle_size_offset, &totle_size, + pika_platform_memcpy(meta_block_buff + total_size_offset, &total_size, sizeof(uint32_t)); /* write block_size to the file */ pika_platform_memcpy(meta_block_buff + info_block_size_offset, &block_size, sizeof(uint32_t)); linker_fwrite(&linker, meta_block_buff, block_size); + /* write module index to file */ args_foreach(self->list, (fn_args_foreach)__foreach_handler_libWriteIndex, &linker); /* write module bytecode to file */ args_foreach(self->list, (fn_args_foreach)__foreach_handler_libWriteBytecode, &linker); + + /* Calculate CRC16 from block_size to the end of the file using the new + * function */ + uint32_t ftimes33 = file_calculate_times33(out_file, block_size); + + /* Move back to times33_offset position and write the CRC16 value */ + pika_platform_fseek(out_file, times33_offset, SEEK_SET); + pika_platform_fwrite(&ftimes33, sizeof(uint32_t), 1, out_file); + /* main process */ /* deinit */ pika_platform_fclose(out_file); pikaFree(meta_block_buff, block_size); - pika_assert(totle_size == linker.written_size); + pika_assert(total_size == linker.written_size); return 0; } @@ -505,7 +547,9 @@ static int _getModuleNum(uint8_t* library_bytes) { uint32_t* library_info = (uint32_t*)library_bytes; uint32_t version_num = library_info[PIKA_APP_VERSION_OFFSET]; uint32_t module_num = library_info[PIKA_APP_MODULE_NUM_OFFSET]; - + uint32_t library_times33_saved = library_info[PIKA_APP_TIMES33_OFFSET]; + uint32_t total_size = library_info[PIKA_APP_MODULE_SIZE_OFFSET]; + uint32_t info_block_size = library_info[PIKA_APP_INFO_BLOCK_SIZE_OFFSET]; /* check magic_code */ if (!((magic_code[0] == 0x0f) && (magic_code[1] == 'p') && (magic_code[2] == 'y') && (magic_code[3] == 'a'))) { @@ -522,6 +566,19 @@ static int _getModuleNum(uint8_t* library_bytes) { "version of compiled library.\r\n"); return PIKA_RES_ERR_INVALID_VERSION_NUMBER; } + + /* check times33 */ + if (0 != library_times33_saved) { + // support the old version without times33 + uint32_t library_times34_calculated = bytes_caclulate_times33( + library_bytes + info_block_size, total_size - info_block_size); + if (library_times33_saved != library_times34_calculated) { + pika_platform_printf( + "Error: invalid checksum, the package is broken.\r\n", + library_times34_calculated, library_times33_saved); + return PIKA_RES_ERR_INVALID_PARAM; + } + } return module_num; } diff --git a/src/PikaCompiler.h b/src/PikaCompiler.h index 470fa084c..2e85141a2 100644 --- a/src/PikaCompiler.h +++ b/src/PikaCompiler.h @@ -57,6 +57,7 @@ PIKA_RES _loadModuleDataWithName(uint8_t* library_bytes, #define PIKA_APP_VERSION_OFFSET 2 #define PIKA_APP_MODULE_NUM_OFFSET 3 #define PIKA_APP_INFO_BLOCK_SIZE_OFFSET 4 +#define PIKA_APP_TIMES33_OFFSET 5 typedef struct { Arg* farg; diff --git a/src/PikaPlatform.c b/src/PikaPlatform.c index 003d2d4e9..4fc17338c 100644 --- a/src/PikaPlatform.c +++ b/src/PikaPlatform.c @@ -612,7 +612,7 @@ PIKA_WEAK void pika_platform_thread_yield(void) { pika_thread_idle_hook(); #if PIKA_FREERTOS_ENABLE vTaskDelay(1); -#elif defined(_WIN32) +#elif defined(_WIN32) && !defined(CROSS_BUILD) SwitchToThread(); #elif defined(__linux) sched_yield(); diff --git a/src/PikaVersion.h b/src/PikaVersion.h index cdce1306c..2e87bdd30 100644 --- a/src/PikaVersion.h +++ b/src/PikaVersion.h @@ -2,4 +2,4 @@ #define PIKA_VERSION_MINOR 13 #define PIKA_VERSION_MICRO 4 -#define PIKA_EDIT_TIME "2024/10/13 21:00:39" +#define PIKA_EDIT_TIME "2024/10/13 23:56:45" diff --git a/tools/pikaCompiler/rust-msc-latest-win10.exe b/tools/pikaCompiler/rust-msc-latest-win10.exe index 6f516cea7..345a1d74d 100644 Binary files a/tools/pikaCompiler/rust-msc-latest-win10.exe and b/tools/pikaCompiler/rust-msc-latest-win10.exe differ