txlyre 1 week ago
parent
commit
2b4ef0290b
1 changed files with 15 additions and 19 deletions
  1. 15 19
      qic.c

+ 15 - 19
qic.c

@@ -3855,8 +3855,8 @@ void compile_block(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
 
   for (size_t i = 0; i < block->length; i++) {
     node_t *n = block->data[i];
-    if (n->tag == N_CONST || n->tag == N_ENUM || n->tag == N_FUNCDEF || n->tag == N_CLASS ||
-        n->tag == N_PASS)
+    if (n->tag == N_CONST || n->tag == N_ENUM || n->tag == N_FUNCDEF ||
+        n->tag == N_CLASS || n->tag == N_PASS)
       continue;
 
     if (DEBUG)
@@ -6038,7 +6038,8 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
            node->l->data[i], varname, i);
   } break;
 
-  case N_CONST: case N_ENUM:
+  case N_CONST:
+  case N_ENUM:
     break;
 
   case N_IF:
@@ -6240,29 +6241,24 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
           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; "
-         "i++) {\n",
-         varname);
+    EMIT("while (!qi_iter_end(state, %s)) {\n", varname);
+    EMIT("qi_value_t *el = qi_iter_next(state, %s);\n", varname);
 
     if (node->tag == N_FOROFUNPACK || node->tag == N_FOROFVARUNPACK) {
       for (size_t i = 0; i < node->l->length; i++)
         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);
+          EMIT("(void)(qi_index(state, el, "
+               "qi_make_number(state, %d)));\n",
+               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);
+          EMIT("qi_set(state, false, \"%s\", qi_index(state, "
+               "el, qi_make_number(state, %d)));\n",
+               node->l->data[i], 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);
+      if (strcmp(node->t->text, "_") != 0) {
+        EMIT("qi_set(state, false, \"%s\", el);\n",
+             node->t->text);
       }
     }