Jelajahi Sumber

support float('1.1')

lyon 3 tahun lalu
induk
melakukan
db95b14950

+ 13 - 10
package/PikaStdLib/PikaStdLib_SysObj.c

@@ -79,6 +79,9 @@ pika_float PikaStdLib_SysObj_float(PikaObj* self, Arg* arg) {
     if (ARG_TYPE_FLOAT == type) {
         return (float)arg_getFloat(arg);
     }
+    if (ARG_TYPE_STRING == type) {
+        return strtod(arg_getStr(arg), NULL);
+    }
     obj_setSysOut(self, "[error] convert to pika_float type failed.");
     obj_setErrorCode(self, 1);
     return -99999.99999;
@@ -161,9 +164,9 @@ Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
     //               "0 RUN __iter__\n"
     //               "0 OUT __res\n");
     const uint8_t bytes[] = {
-        0x08, 0x00, 0x00, 0x00,/* instruct array size */
+        0x08, 0x00, 0x00, 0x00, /* instruct array size */
         0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x00, /* instruct array */
-        0x10, 0x00, 0x00, 0x00,                                    /* const pool size */
+        0x10, 0x00, 0x00, 0x00,                         /* const pool size */
         0x00, 0x5f, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x5f,
         0x5f, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
     };
@@ -247,11 +250,11 @@ Arg* PikaStdLib_SysObj___setitem__(PikaObj* self,
         )
         /* clang-format on */
         const uint8_t bytes[] = {
-            0x0c, 0x00, 0x00, 0x00,/* instruct array size */
+            0x0c, 0x00, 0x00, 0x00, /* instruct array size */
             0x10, 0x81, 0x01, 0x00, 0x10, 0x01, 0x07, 0x00, 0x00, 0x02, 0x0d,
             0x00,
             /* instruct array */
-            0x19, 0x00, 0x00, 0x00,/* const pool size */
+            0x19, 0x00, 0x00, 0x00, /* const pool size */
             0x00, 0x5f, 0x5f, 0x6b, 0x65, 0x79, 0x00, 0x5f, 0x5f, 0x76, 0x61,
             0x6c, 0x00, 0x5f, 0x5f, 0x73, 0x65, 0x74, 0x69, 0x74, 0x65, 0x6d,
             0x5f, 0x5f, 0x00,
@@ -283,10 +286,10 @@ int PikaStdLib_SysObj_len(PikaObj* self, Arg* arg) {
         )
             /* clang-format on */
             const uint8_t bytes[] = {
-                0x08, 0x00, 0x00, 0x00,/* instruct array size */
+                0x08, 0x00, 0x00, 0x00, /* instruct array size */
                 0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
                                                                    array */
-                0x0f, 0x00, 0x00, 0x00,/* const pool size */
+                0x0f, 0x00, 0x00, 0x00, /* const pool size */
                 0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
                 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
             };
@@ -315,7 +318,7 @@ Arg* PikaStdLib_SysObj_list(PikaObj* self, PikaTuple* val) {
         )
         /* clang-format on */
         const uint8_t bytes[] = {
-            0x3c, 0x00, 0x00, 0x00,/* instruct array size */
+            0x3c, 0x00, 0x00, 0x00, /* instruct array size */
             0x00, 0x95, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x10, 0x81, 0x07,
             0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x04, 0x13, 0x00, 0x00, 0x82,
             0x17, 0x00, 0x00, 0x04, 0x24, 0x00, 0x00, 0x0d, 0x24, 0x00, 0x00,
@@ -323,7 +326,7 @@ Arg* PikaStdLib_SysObj_list(PikaObj* self, PikaTuple* val) {
             0x00, 0x86, 0x3a, 0x00, 0x00, 0x8c, 0x13, 0x00, 0x00, 0x8c, 0x24,
             0x00, 0x00, 0x8c, 0x07, 0x00,
             /* instruct array */
-            0x3d, 0x00, 0x00, 0x00,/* const pool size */
+            0x3d, 0x00, 0x00, 0x00, /* const pool size */
             0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, 0x5f, 0x5f, 0x6c, 0x69,
             0x73, 0x74, 0x00, 0x69, 0x74, 0x65, 0x72, 0x00, 0x24, 0x6c, 0x30,
             0x00, 0x24, 0x6c, 0x30, 0x2e, 0x5f, 0x5f, 0x6e, 0x65, 0x78, 0x74,
@@ -624,8 +627,8 @@ Arg* PikaStdLib_SysObj_eval(PikaObj* self, char* code) {
 }
 
 static enum shellCTRL __obj_shellLineHandler_input(PikaObj* self,
-                                                     char* input_line,
-                                                     struct ShellConfig* cfg) {
+                                                   char* input_line,
+                                                   struct ShellConfig* cfg) {
     cfg->context = arg_newStr(input_line);
     return SHELL_CTRL_EXIT;
 }

+ 13 - 10
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c

@@ -79,6 +79,9 @@ pika_float PikaStdLib_SysObj_float(PikaObj* self, Arg* arg) {
     if (ARG_TYPE_FLOAT == type) {
         return (float)arg_getFloat(arg);
     }
+    if (ARG_TYPE_STRING == type) {
+        return strtod(arg_getStr(arg), NULL);
+    }
     obj_setSysOut(self, "[error] convert to pika_float type failed.");
     obj_setErrorCode(self, 1);
     return -99999.99999;
@@ -161,9 +164,9 @@ Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
     //               "0 RUN __iter__\n"
     //               "0 OUT __res\n");
     const uint8_t bytes[] = {
-        0x08, 0x00, 0x00, 0x00,/* instruct array size */
+        0x08, 0x00, 0x00, 0x00, /* instruct array size */
         0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x00, /* instruct array */
-        0x10, 0x00, 0x00, 0x00,                                    /* const pool size */
+        0x10, 0x00, 0x00, 0x00,                         /* const pool size */
         0x00, 0x5f, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x5f,
         0x5f, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
     };
@@ -247,11 +250,11 @@ Arg* PikaStdLib_SysObj___setitem__(PikaObj* self,
         )
         /* clang-format on */
         const uint8_t bytes[] = {
-            0x0c, 0x00, 0x00, 0x00,/* instruct array size */
+            0x0c, 0x00, 0x00, 0x00, /* instruct array size */
             0x10, 0x81, 0x01, 0x00, 0x10, 0x01, 0x07, 0x00, 0x00, 0x02, 0x0d,
             0x00,
             /* instruct array */
-            0x19, 0x00, 0x00, 0x00,/* const pool size */
+            0x19, 0x00, 0x00, 0x00, /* const pool size */
             0x00, 0x5f, 0x5f, 0x6b, 0x65, 0x79, 0x00, 0x5f, 0x5f, 0x76, 0x61,
             0x6c, 0x00, 0x5f, 0x5f, 0x73, 0x65, 0x74, 0x69, 0x74, 0x65, 0x6d,
             0x5f, 0x5f, 0x00,
@@ -283,10 +286,10 @@ int PikaStdLib_SysObj_len(PikaObj* self, Arg* arg) {
         )
             /* clang-format on */
             const uint8_t bytes[] = {
-                0x08, 0x00, 0x00, 0x00,/* instruct array size */
+                0x08, 0x00, 0x00, 0x00, /* instruct array size */
                 0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
                                                                    array */
-                0x0f, 0x00, 0x00, 0x00,/* const pool size */
+                0x0f, 0x00, 0x00, 0x00, /* const pool size */
                 0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
                 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
             };
@@ -315,7 +318,7 @@ Arg* PikaStdLib_SysObj_list(PikaObj* self, PikaTuple* val) {
         )
         /* clang-format on */
         const uint8_t bytes[] = {
-            0x3c, 0x00, 0x00, 0x00,/* instruct array size */
+            0x3c, 0x00, 0x00, 0x00, /* instruct array size */
             0x00, 0x95, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x10, 0x81, 0x07,
             0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x04, 0x13, 0x00, 0x00, 0x82,
             0x17, 0x00, 0x00, 0x04, 0x24, 0x00, 0x00, 0x0d, 0x24, 0x00, 0x00,
@@ -323,7 +326,7 @@ Arg* PikaStdLib_SysObj_list(PikaObj* self, PikaTuple* val) {
             0x00, 0x86, 0x3a, 0x00, 0x00, 0x8c, 0x13, 0x00, 0x00, 0x8c, 0x24,
             0x00, 0x00, 0x8c, 0x07, 0x00,
             /* instruct array */
-            0x3d, 0x00, 0x00, 0x00,/* const pool size */
+            0x3d, 0x00, 0x00, 0x00, /* const pool size */
             0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, 0x5f, 0x5f, 0x6c, 0x69,
             0x73, 0x74, 0x00, 0x69, 0x74, 0x65, 0x72, 0x00, 0x24, 0x6c, 0x30,
             0x00, 0x24, 0x6c, 0x30, 0x2e, 0x5f, 0x5f, 0x6e, 0x65, 0x78, 0x74,
@@ -624,8 +627,8 @@ Arg* PikaStdLib_SysObj_eval(PikaObj* self, char* code) {
 }
 
 static enum shellCTRL __obj_shellLineHandler_input(PikaObj* self,
-                                                     char* input_line,
-                                                     struct ShellConfig* cfg) {
+                                                   char* input_line,
+                                                   struct ShellConfig* cfg) {
     cfg->context = arg_newStr(input_line);
     return SHELL_CTRL_EXIT;
 }

+ 13 - 0
test/sysObj-test.cpp

@@ -116,6 +116,19 @@ TEST(sysobj, print2) {
     obj_deinit(self);
     EXPECT_EQ(pikaMemNow(), 0);
 }
+
 #endif
 
+TEST(sysobj, float_str) {
+    char* line = "float('1.1')\n";
+    PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
+    obj_run(self, line);
+    /* collect */
+    /* assert */
+    EXPECT_STREQ(log_buff[0], "1.100000\r\n");
+    /* deinit */
+    obj_deinit(self);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 TEST_END