Selaa lähdekoodia

enhance syntax check for def

lyon 3 vuotta sitten
vanhempi
sitoutus
d8b71908f0
3 muutettua tiedostoa jossa 30 lisäystä ja 2 poistoa
  1. 8 1
      src/PikaParser.c
  2. 1 0
      src/dataString.c
  3. 21 1
      test/pikaMain-test.cpp

+ 8 - 1
src/PikaParser.c

@@ -1768,6 +1768,8 @@ char* _defGetDefault(Args* outBuffs, char** dec_out) {
     Arg* dec_arg = arg_strAppend(arg_newStr(fn_name), "(");
     Arg* default_arg = arg_newStr("");
     char* arg_list = strsCut(&buffs, dec_str, '(', ')');
+    char* default_out = NULL;
+    pika_assert(NULL != arg_list);
     int arg_num = strCountSign(arg_list, ',') + 1;
     for (int i = 0; i < arg_num; i++) {
         char* arg_str = strsPopToken(&buffs, &arg_list, ',');
@@ -1787,7 +1789,7 @@ char* _defGetDefault(Args* outBuffs, char** dec_out) {
     strPopLastToken(arg_getStr(dec_arg), ',');
     dec_arg = arg_strAppend(dec_arg, ")");
     *dec_out = strsCopy(outBuffs, arg_getStr(dec_arg));
-    char* default_out = strsCopy(outBuffs, arg_getStr(default_arg));
+    default_out = strsCopy(outBuffs, arg_getStr(default_arg));
     strPopLastToken(default_out, ',');
     arg_deinit(dec_arg);
     arg_deinit(default_arg);
@@ -2024,6 +2026,11 @@ AST* AST_parseLine_withBlockStack_withBlockDeepth(char* line,
             goto exit;
         }
         declare = strsGetCleanCmd(&buffs, declare);
+        if (!strIsContain(declare, '(') || !strIsContain(declare, ')')) {
+            obj_deinit(ast);
+            ast = NULL;
+            goto exit;
+        }
         char* defaultStmt = _defGetDefault(&buffs, &declare);
         AST_setNodeBlock(ast, "def");
         AST_setNodeAttr(ast, "declare", declare);

+ 1 - 0
src/dataString.c

@@ -91,6 +91,7 @@ char* strAppendWithSize(char* strOut, char* pData, int32_t Size) {
 }
 
 int32_t strCountSign(char* strIn, char sign) {
+    pika_assert(NULL != strIn);
     int count = 0;
     while (*strIn) {
         if (*strIn == sign) {

+ 21 - 1
test/pikaMain-test.cpp

@@ -1932,6 +1932,26 @@ TEST(pikaMain, REPL_push_mode) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
+TEST(pikaMain, REPL_push_mode_err) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    /* run */
+    PikaObj* self = newRootObj("pikaMain", New_PikaMain);
+    __platform_printf("BEGIN\r\n");
+    char lines[] =
+        "def test:\n"
+        "    print('test')\n"
+        "\n";
+    for (size_t i = 0; i < strGetSize(lines); i++) {
+        obj_runChar(self, lines[i]);
+    }
+    /* assert */
+    EXPECT_STREQ(log_buff[1], "Error: Syntax error.\r\n");
+    /* deinit */
+    obj_deinit(self);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 #if 0
 TEST(pikaMain, REPL_input) {
     /* init */
@@ -2792,7 +2812,7 @@ TEST(pikaMain, REPL_key_left) {
 }
 
 TEST(pikaMain, REPL_key_left_del) {
-    char lines[] = {'1',  '2',      '+', '3',  '4', 0x1b,
+    char lines[] = {'1',  '2',      '+',  '3',  '4', 0x1b,
                     0x5b, KEY_LEFT, '\b', '\n', 0x00};
     /* init */
     pikaMemInfo.heapUsedMax = 0;