txlyre 1 dienu atpakaļ
vecāks
revīzija
4bcf0e0eea
1 mainītis faili ar 16 papildinājumiem un 17 dzēšanām
  1. 16 17
      qic.c

+ 16 - 17
qic.c

@@ -1782,14 +1782,14 @@ void compile_list(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, lis
   NEWGID();
 
   buffer_fmt(tbuf, "qi_list_t *__list%d(qi_state_t *state) {\n", gid);
-  buffer_fmt(tbuf, "qi_list_t *list = qi_list_make();\n");
+  buffer_fmt(tbuf, "qi_list_t *list = qi_list_make_n(%d);\n", seq->length);
 
   for (size_t i = 0; i < seq->length; i++) {
-    buffer_fmt(tbuf, "qi_list_push(list, ");
+    buffer_fmt(tbuf, "qi_list_data(list, %d) = ", i);
 
     compile_node(gbuf, tbuf, ctx, lstk, lbl, seq->data[i]);
 
-    buffer_fmt(tbuf, ");\n");
+    buffer_fmt(tbuf, ";\n");
   }
 
   buffer_fmt(tbuf, "return list;\n");
@@ -1951,22 +1951,12 @@ void compile_block(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, li
       compile_func(gbuf, buf, ctx, lstk, lbl, n);
 
       EMIT("\n");
-    } else if (n->tag == N_VAR || n->tag == N_LET) {
-      table_iterate(n->h, {
-        EMIT("qi_%s(state, \"%s\", ", n->tag == N_LET? "decl_const": "decl", entry.key);
-        
-        if (entry.value)
-          compile_node(gbuf, buf, ctx, lstk, lbl, entry.value);
-        else EMIT("state->nil");
-
-        EMIT(");\n");
-      });
     }
   }
 
   for (size_t i = 0; i < block->length; i++) {
     node_t *n = block->data[i];
-    if (n->tag == N_FUNCDEF || n->tag == N_VAR || n->tag == N_LET)
+    if (n->tag == N_FUNCDEF)
       continue;
 
     compile_node(gbuf, buf, ctx, lstk, lbl, n);
@@ -1990,7 +1980,7 @@ const char *STD[][2] = {
     "}\n"
     "let SEEK_SET = 0, SEEK_CUR = 1, SEEK_END = 2\n"
     "func frewind(file)\n"
-    "  return fseek(file, 0, SEEK_SET)\n"
+    "  return file.rewind()\n"
     "func file_read(filename) {\n"
     "  var file = fopen(filename, \"r\")\n"
     "  defer fclose(file)\n"
@@ -2201,8 +2191,17 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, lis
       COMPASSIGN(node->a, "sub", EMIT("state->one"));
       break;
 
-    case N_VAR: break;
-    case N_LET: break;
+    case N_VAR: case N_LET: 
+      table_iterate(node->h, {
+        EMIT("qi_%s(state, \"%s\", ", node->tag == N_LET? "decl_const": "decl", entry.key);
+        
+        if (entry.value)
+          compile_node(gbuf, buf, ctx, lstk, lbl, entry.value);
+        else EMIT("state->nil");
+
+        EMIT(");\n");
+      });
+    break;
 
     case N_IF:
       EMIT("if (_qi_truthy(state, ");