txlyre 2 weeks ago
parent
commit
9b35d20f12
1 changed files with 25 additions and 12 deletions
  1. 25 12
      qic.c

+ 25 - 12
qic.c

@@ -615,7 +615,7 @@ token_t *tokenize_string(char *source, size_t *pos, size_t *size) {
           buf[k++] = source[(*pos)++];
         }
 
-        if (k != 2)
+        if (k != 2 || (!size && strncmp(buf, "00", 2) == 0))
           LEX_ERROR("malformed \\x escape sequence");
 
         buf[k] = 0;
@@ -2411,7 +2411,7 @@ node_t *parse_func(list_t *tokens, size_t *pos, int is_expr) {
         char *l = ((token_t *)tokens->data[(*pos)++])->text;
         node_t *r = NULL;
 
-        if (!flag && AT(ASSIGN))
+        if (!flag && strcmp(l, "_") != 0 && AT(ASSIGN))
           flag = 1;
 
         if (flag) {
@@ -3639,7 +3639,7 @@ void compile_func(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
             entry.key, argc + 1, argc);
         compile_node(gbuf, tbuf, ctx, ltab, lstk, sstk, lbl, pair->data[1]);
         buffer_fmt(tbuf, ");\n");
-      } else
+      } else if (strcmp(entry.key, "_") != 0)
         buffer_fmt(tbuf, "qi_decl(state, \"%s\", qi_list_index(pargs, %d));\n",
                    entry.key, argc);
 
@@ -6232,11 +6232,12 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
     compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->a);
     EMIT(");\n");
 
-    if (node->tag == N_FOROFVAR) {
+    if (node->tag == N_FOROFVAR && strcmp(node->t->text, "_") != 0) {
       EMIT("qi_decl(state, \"%s\", state->nil);\n", node->t->text);
     } else if (node->tag == N_FOROFVARUNPACK) {
       for (size_t i = 0; i < node->l->length; i++)
-        EMIT("qi_decl(state, \"%s\", state->nil);\n", node->l->data[i]);
+        if (strcmp(node->l->data[i], "_") != 0)
+          EMIT("qi_decl(state, \"%s\", state->nil);\n", node->l->data[i]);
     }
 
     EMIT("for (qi_size_t length = _qi_length(state, %s), i = 0; i < length; "
@@ -6245,13 +6246,25 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
 
     if (node->tag == N_FOROFUNPACK || node->tag == N_FOROFVARUNPACK) {
       for (size_t i = 0; i < node->l->length; i++)
-        EMIT("qi_set(state, false, \"%s\", qi_index(state, qi_index(state, %s, "
-             "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
-             node->l->data[i], varname, i);
-    } else
-      EMIT("qi_set(state, false, \"%s\", qi_index(state, %s, "
-           "qi_make_number(state, i)));\n",
-           node->t->text, varname);
+        if (strcmp(node->l->data[i], "_") == 0) {
+          EMIT("(void)(qi_index(state, qi_index(state, %s, "
+               "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
+               varname, i);
+        } else {
+          EMIT("qi_set(state, false, \"%s\", qi_index(state, qi_index(state, %s, "
+               "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
+               node->l->data[i], varname, i);
+        }
+    } else {
+      if (strcmp(node->t->text, "_") == 0) {
+        EMIT("(void)(qi_index(state, %s, qi_make_number(state, i)));\n",
+             varname);
+      } else {
+        EMIT("qi_set(state, false, \"%s\", qi_index(state, %s, "
+             "qi_make_number(state, i)));\n",
+             node->t->text, varname);
+      }
+    }
 
     CTXPUSH("scope");
     EMIT("qi_new_scope(state);\n");