Sfoglia il codice sorgente

support 0xffffffff literal and print

pikastech 3 anni fa
parent
commit
295ff87e5d
5 ha cambiato i file con 61 aggiunte e 13 eliminazioni
  1. 1 1
      port/linux/.vscode/launch.json
  2. 40 0
      port/linux/test/VM-test.cpp
  3. 13 9
      src/PikaVM.c
  4. 3 3
      src/dataArgs.c
  5. 4 0
      src/pika_config_valid.h

+ 1 - 1
port/linux/.vscode/launch.json

@@ -11,7 +11,7 @@
             "program": "${workspaceFolder}/build/test/pikascript_test",
             "program": "${workspaceFolder}/build/test/pikascript_test",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             "args": [
             "args": [
-                "--gtest_filter=VM.num1"
+                "--gtest_filter=vm.test64_hex"
             ],
             ],
             "stopAtEntry": false,
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",
             "cwd": "${workspaceFolder}",

+ 40 - 0
port/linux/test/VM-test.cpp

@@ -1690,3 +1690,43 @@ TEST(vm, pass_) {
     obj_deinit(pikaMain);
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
     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);
+}

+ 13 - 9
src/PikaVM.c

@@ -1247,7 +1247,7 @@ static char* __get_transferd_str(Args* buffs, char* str, size_t* iout_p) {
             char hex_str[] = "0x00";
             char hex_str[] = "0x00";
             hex_str[2] = str_rep[i + 2];
             hex_str[2] = str_rep[i + 2];
             hex_str[3] = str_rep[i + 3];
             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;
             transfered_str[i_out++] = hex;
             i += 3;
             i += 3;
             continue;
             continue;
@@ -1373,18 +1373,18 @@ static Arg* VM_instruction_handler_NUM(PikaObj* self,
     Arg* numArg = arg_ret_reg;
     Arg* numArg = arg_ret_reg;
     /* hex */
     /* hex */
     if (data[1] == 'x' || data[1] == 'X') {
     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') {
     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') {
     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 */
     /* float */
     if (strIsContain(data, '.') ||
     if (strIsContain(data, '.') ||
@@ -2664,7 +2664,11 @@ void VMState_solveUnusedStack(VMState* vm) {
             char* res = obj_toStr(arg_getPtr(arg));
             char* res = obj_toStr(arg_getPtr(arg));
             __platform_printf("%s\r\n", res);
             __platform_printf("%s\r\n", res);
         } else if (type == ARG_TYPE_INT) {
         } 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));
             __platform_printf("%d\r\n", (int)arg_getInt(arg));
+            #endif
         } else if (type == ARG_TYPE_FLOAT) {
         } else if (type == ARG_TYPE_FLOAT) {
             __platform_printf("%f\r\n", arg_getFloat(arg));
             __platform_printf("%f\r\n", arg_getFloat(arg));
         } else if (type == ARG_TYPE_STRING) {
         } else if (type == ARG_TYPE_STRING) {

+ 3 - 3
src/dataArgs.c

@@ -401,10 +401,10 @@ char* getPrintSring(Args* self, char* name, char* valString) {
     return res;
     return res;
 }
 }
 
 
-char* getPrintStringFromInt(Args* self, char* name, int32_t val) {
+char* getPrintStringFromInt(Args* self, char* name, int64_t val) {
     Args buffs = {0};
     Args buffs = {0};
     char* res = NULL;
     char* res = NULL;
-    char* valString = strsFormat(&buffs, 32, "%d", val);
+    char* valString = strsFormat(&buffs, 32, "%lld", val);
     res = getPrintSring(self, name, valString);
     res = getPrintSring(self, name, valString);
     strsDeinit(&buffs);
     strsDeinit(&buffs);
     return res;
     return res;
@@ -440,7 +440,7 @@ char* args_print(Args* self, char* name) {
     }
     }
 
 
     if (type == ARG_TYPE_INT) {
     if (type == ARG_TYPE_INT) {
-        int32_t val = args_getInt(self, name);
+        int64_t val = args_getInt(self, name);
         res = getPrintStringFromInt(self, name, val);
         res = getPrintStringFromInt(self, name, val);
         goto exit;
         goto exit;
     }
     }

+ 4 - 0
src/pika_config_valid.h

@@ -300,6 +300,10 @@
     #ifndef PIKA_STRING_UTF8_ENABLE
     #ifndef PIKA_STRING_UTF8_ENABLE
         #define PIKA_STRING_UTF8_ENABLE 1
         #define PIKA_STRING_UTF8_ENABLE 1
     #endif
     #endif
+    
+    #ifndef PIKA_PRINT_LLD_ENABLE
+        #define PIKA_PRINT_LLD_ENABLE 1
+    #endif
 
 
     /* configuration validation */
     /* configuration validation */