Quellcode durchsuchen

update thread, fix parse err on 'not in or'

pikastech vor 3 Jahren
Ursprung
Commit
cb30579c08

+ 4 - 3
package/_thread/_thread.c

@@ -13,9 +13,10 @@ static void _thread_func(void* arg) {
         if (_VM_is_first_lock()) {
             break;
         }
-        if (_VMEvent_getVMCnt() <= 0) {
-            break;
-        }
+        //! This May break the thread
+        // if (_VMEvent_getVMCnt() <= 0) {
+        //     break;
+        // }
         pika_debug("VM num %d", _VMEvent_getVMCnt());
         pika_platform_thread_delay();
     }

+ 1 - 1
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=parser.return_list"
+                "--gtest_filter=parser.not_in_or"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 4 - 3
port/linux/package/pikascript/pikascript-lib/_thread/_thread.c

@@ -13,9 +13,10 @@ static void _thread_func(void* arg) {
         if (_VM_is_first_lock()) {
             break;
         }
-        if (_VMEvent_getVMCnt() <= 0) {
-            break;
-        }
+        //! This May break the thread
+        // if (_VMEvent_getVMCnt() <= 0) {
+        //     break;
+        // }
         pika_debug("VM num %d", _VMEvent_getVMCnt());
         pika_platform_thread_delay();
     }

+ 24 - 13
src/PikaParser.c

@@ -769,9 +769,9 @@ char* Token_getPyload(char* token) {
     return (char*)((uintptr_t)token + 1);
 }
 
-uint8_t TokenStream_isContain(char* tokenStream,
-                              enum TokenType token_type,
-                              char* pyload) {
+uint8_t TokenStream_count(char* tokenStream,
+                          enum TokenType token_type,
+                          char* pyload) {
     Args buffs = {0};
     char* tokenStream_buff = strsCopy(&buffs, tokenStream);
     uint8_t res = 0;
@@ -780,16 +780,23 @@ uint8_t TokenStream_isContain(char* tokenStream,
         char* token = TokenStream_pop(&buffs, &tokenStream_buff);
         if (token_type == Token_getType(token)) {
             if (strEqu(Token_getPyload(token), pyload)) {
-                res = 1;
-                goto exit;
+                res++;
             }
         }
     }
-exit:
     strsDeinit(&buffs);
     return res;
 }
 
+uint8_t TokenStream_isContain(char* tokenStream,
+                              enum TokenType token_type,
+                              char* pyload) {
+    if (TokenStream_count(tokenStream, token_type, pyload) > 0) {
+        return 1;
+    }
+    return 0;
+}
+
 static char* _solveEqualLevelOperator(Args* buffs,
                                       char*
                                       operator,
@@ -964,21 +971,25 @@ void _Cursor_beforeIter(struct Cursor* cs) {
     cs->last_token = arg_newStr(TokenStream_pop(cs->buffs_p, &cs->tokenStream));
 }
 
-PIKA_BOOL Cursor_isContain(char* stmt, TokenType type, char* pyload) {
+uint8_t Cursor_count(char* stmt, TokenType type, char* pyload) {
     /* fast return */
     if (!strstr(stmt, pyload)) {
         return PIKA_FALSE;
     }
     Args buffs = {0};
-    PIKA_BOOL res = PIKA_FALSE;
     char* tokenStream = Lexer_getTokenStream(&buffs, stmt);
-    if (TokenStream_isContain(tokenStream, type, pyload)) {
-        res = PIKA_TRUE;
-    }
+    uint8_t res = TokenStream_count(tokenStream, type, pyload);
     strsDeinit(&buffs);
     return res;
 }
 
+PIKA_BOOL Cursor_isContain(char* stmt, TokenType type, char* pyload) {
+    if (Cursor_count(stmt, type, pyload) > 0) {
+        return PIKA_TRUE;
+    }
+    return PIKA_FALSE;
+}
+
 char* Cursor_popToken(Args* buffs, char** pStmt, char* devide) {
     Arg* out_item = arg_newStr("");
     Arg* tokenStream_after = arg_newStr("");
@@ -1566,11 +1577,11 @@ char* Suger_not_in(Args* out_buffs, char* line) {
     PIKA_BOOL got_not_in = PIKA_FALSE;
     PIKA_BOOL skip = PIKA_FALSE;
     Args buffs = {0};
-    if (!Cursor_isContain(line, TOKEN_operator, " not ")) {
+    if (1 != Cursor_count(line, TOKEN_operator, " not ")) {
         ret = line;
         goto __exit;
     }
-    if (!Cursor_isContain(line, TOKEN_operator, " in ")) {
+    if (1 != Cursor_count(line, TOKEN_operator, " in ")) {
         ret = line;
         goto __exit;
     }

+ 39 - 2
test/parse-test.cpp

@@ -5403,8 +5403,45 @@ TEST(parser, return_list) {
     printf("%s\r\n", lines);
     char* pikaAsm = Parser_linesToAsm(buffs, lines);
     printf("%s", pikaAsm);
-    // EXPECT_STREQ(pikaAsm,
-    //              "B0\n");
+    EXPECT_STREQ(pikaAsm,
+                 "B0\n"
+                 "2 REF ui.ALIGN.CENTER\n"
+                 "2 OUT align\n"
+                 "1 RUN ui.Text\n"
+                 "2 REF self.onclick_next\n"
+                 "2 OUT onclick\n"
+                 "1 RUN ui.Button\n"
+                 "0 LST \n"
+                 "0 RET \n"
+                 "B0\n");
+    args_deinit(buffs);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
+TEST(parser, not_in_or) {
+    pikaMemInfo.heapUsedMax = 0;
+    Args* buffs = New_strBuff();
+    char* lines = "a not in x or b not in x or c not in x\n";
+    printf("%s\r\n", lines);
+    char* pikaAsm = Parser_linesToAsm(buffs, lines);
+    printf("%s", pikaAsm);
+    EXPECT_STREQ(pikaAsm,
+                 "B0\n"
+                 "4 REF a\n"
+                 "4 REF x\n"
+                 "3 OPT  in \n"
+                 "2 OPT  not \n"
+                 "4 REF b\n"
+                 "4 REF x\n"
+                 "3 OPT  in \n"
+                 "2 OPT  not \n"
+                 "1 OPT  or \n"
+                 "3 REF c\n"
+                 "3 REF x\n"
+                 "2 OPT  in \n"
+                 "1 OPT  not \n"
+                 "0 OPT  or \n"
+                 "B0\n");
     args_deinit(buffs);
     EXPECT_EQ(pikaMemNow(), 0);
 }