|
@@ -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, ");
|