diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index 8f800ccee..e21498fb7 100644 --- a/port/linux/.vscode/launch.json +++ b/port/linux/.vscode/launch.json @@ -11,7 +11,7 @@ "program": "${workspaceFolder}/build/test/pikascript_test", // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain", "args": [ - "--gtest_filter=VM.num1" + "--gtest_filter=vm.test64_hex" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", diff --git a/port/linux/test/VM-test.cpp b/port/linux/test/VM-test.cpp index 793d2b3cb..314a30812 100644 --- a/port/linux/test/VM-test.cpp +++ b/port/linux/test/VM-test.cpp @@ -1690,3 +1690,43 @@ TEST(vm, pass_) { obj_deinit(pikaMain); EXPECT_EQ(pikaMemNow(), 0); } + +TEST(vm, test64_hex) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + extern unsigned char pikaModules_py_a[]; + obj_linkLibrary(pikaMain, pikaModules_py_a); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, + "import GTestTask\n" + "res = GTestTask.test64(0xffffffff, 20)\n"); + /* collect */ + int64_t res = obj_getInt(pikaMain, "res"); + /* assert */ + EXPECT_EQ(res, 4294967295 * 20); + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} + +TEST(vm, test64_hex_print) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + extern unsigned char pikaModules_py_a[]; + obj_linkLibrary(pikaMain, pikaModules_py_a); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, + "0xffffffff\n" + "print(0xffffffff)\n"); + /* collect */ + /* assert */ + EXPECT_STREQ(log_buff[0], "4294967295\r\n"); + EXPECT_STREQ(log_buff[1], "4294967295\r\n"); + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} diff --git a/src/PikaVM.c b/src/PikaVM.c index ea427fa7e..3e3e0c18f 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -1247,7 +1247,7 @@ static char* __get_transferd_str(Args* buffs, char* str, size_t* iout_p) { char hex_str[] = "0x00"; hex_str[2] = str_rep[i + 2]; hex_str[3] = str_rep[i + 3]; - char hex = (char)strtol(hex_str, NULL, 0); + char hex = (char)strtoll(hex_str, NULL, 0); transfered_str[i_out++] = hex; i += 3; continue; @@ -1373,18 +1373,18 @@ static Arg* VM_instruction_handler_NUM(PikaObj* self, Arg* numArg = arg_ret_reg; /* hex */ if (data[1] == 'x' || data[1] == 'X') { - return arg_setInt(numArg, "", strtol(data, NULL, 0)); + return arg_setInt(numArg, "", strtoll(data, NULL, 0)); } if (data[1] == 'o' || data[1] == 'O') { - char strtol_buff[10] = {0}; - strtol_buff[0] = '0'; - __platform_memcpy(strtol_buff + 1, data + 2, strGetSize(data) - 2); - return arg_setInt(numArg, "", strtol(strtol_buff, NULL, 0)); + char strtoll_buff[10] = {0}; + strtoll_buff[0] = '0'; + __platform_memcpy(strtoll_buff + 1, data + 2, strGetSize(data) - 2); + return arg_setInt(numArg, "", strtoll(strtoll_buff, NULL, 0)); } if (data[1] == 'b' || data[1] == 'B') { - char strtol_buff[10] = {0}; - __platform_memcpy(strtol_buff, data + 2, strGetSize(data) - 2); - return arg_setInt(numArg, "", strtol(strtol_buff, NULL, 2)); + char strtoll_buff[10] = {0}; + __platform_memcpy(strtoll_buff, data + 2, strGetSize(data) - 2); + return arg_setInt(numArg, "", strtoll(strtoll_buff, NULL, 2)); } /* float */ if (strIsContain(data, '.') || @@ -2664,7 +2664,11 @@ void VMState_solveUnusedStack(VMState* vm) { char* res = obj_toStr(arg_getPtr(arg)); __platform_printf("%s\r\n", res); } else if (type == ARG_TYPE_INT) { + #if PIKA_PRINT_LLD_ENABLE + __platform_printf("%lld\r\n", arg_getInt(arg)); + #else __platform_printf("%d\r\n", (int)arg_getInt(arg)); + #endif } else if (type == ARG_TYPE_FLOAT) { __platform_printf("%f\r\n", arg_getFloat(arg)); } else if (type == ARG_TYPE_STRING) { diff --git a/src/dataArgs.c b/src/dataArgs.c index c3056538d..730a79f15 100644 --- a/src/dataArgs.c +++ b/src/dataArgs.c @@ -401,10 +401,10 @@ char* getPrintSring(Args* self, char* name, char* valString) { return res; } -char* getPrintStringFromInt(Args* self, char* name, int32_t val) { +char* getPrintStringFromInt(Args* self, char* name, int64_t val) { Args buffs = {0}; char* res = NULL; - char* valString = strsFormat(&buffs, 32, "%d", val); + char* valString = strsFormat(&buffs, 32, "%lld", val); res = getPrintSring(self, name, valString); strsDeinit(&buffs); return res; @@ -440,7 +440,7 @@ char* args_print(Args* self, char* name) { } if (type == ARG_TYPE_INT) { - int32_t val = args_getInt(self, name); + int64_t val = args_getInt(self, name); res = getPrintStringFromInt(self, name, val); goto exit; } diff --git a/src/pika_config_valid.h b/src/pika_config_valid.h index dfc00ca72..6e0293432 100644 --- a/src/pika_config_valid.h +++ b/src/pika_config_valid.h @@ -300,6 +300,10 @@ #ifndef PIKA_STRING_UTF8_ENABLE #define PIKA_STRING_UTF8_ENABLE 1 #endif + + #ifndef PIKA_PRINT_LLD_ENABLE + #define PIKA_PRINT_LLD_ENABLE 1 + #endif /* configuration validation */