summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-17 06:42:32 +0200
committerkdx <kikoodx@paranoici.org>2023-06-17 06:42:32 +0200
commit9cc55f4c51903afbf46a2fbe7725d9aa855f795d (patch)
tree582ddd3d4058abdb2f1e8be19a4d269152d4a55f
parent6837ab2d68c5fd69cd6fd9038ad8495a098da32a (diff)
downloadgolem-9cc55f4c51903afbf46a2fbe7725d9aa855f795d.tar.gz
local dec optionnal init
-rw-r--r--src/main.c33
-rwxr-xr-xtesting.sh1
2 files changed, 32 insertions, 2 deletions
diff --git a/src/main.c b/src/main.c
index 882ef03..bfaeee8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -516,7 +516,14 @@ local(Token **rest, Token *tok)
{
tok = skip(tok, "local");
Node *const node = new_unary(NOD_LOCAL, tok, new_word(tok));
- *rest = skip(tok->next, ";");
+ tok = tok->next;
+
+ if (equal(tok, "=")) {
+ tok = tok->next;
+ node->rhs = expr(&tok, tok);
+ }
+
+ *rest = skip(tok, ";");
return node;
}
@@ -943,6 +950,7 @@ static int depth;
static void gen_expr(Node *node);
static void gen_globaldec(Node *node);
+static void gen_localdec(Node *node);
static void gen_fncall(Node *node);
static void gen_variableget(Node *node);
static void gen_deref(Node *node);
@@ -1024,6 +1032,21 @@ gen_globaldec(Node *node)
}
static void
+gen_localdec(Node *node)
+{
+ if (node->rhs == NULL)
+ return;
+
+ const int found = node_find(locals, node->lhs);
+ printf("\tLIT %04x\n", const_expr(node->rhs));
+ printf("\tLIT ,__stack_ptr LDA\n");
+ if (locals_size - found - 1)
+ printf("\tLIT %04x SUB\n",
+ locals_size - found - 1);
+ printf("\tSTA\n");
+}
+
+static void
gen_fncall(Node *node)
{
Node *cur = node->rhs;
@@ -1298,8 +1321,11 @@ gen_function(Node *node)
if (node->type == NOD_BLOCK_STMT)
node = node->lhs;
- while (node->type == NOD_LOCAL) {
+ Node localdecshead = {0};
+ Node *localdecs = &localdecshead;
+ while (node != NULL && node->type == NOD_LOCAL) {
cur = cur->next = node->lhs;
+ localdecs = localdecs->next = node;
node = node->next;
}
locals = head.next;
@@ -1323,6 +1349,9 @@ gen_function(Node *node)
cur = cur->next;
}
+ for (cur = localdecshead.next; cur != NULL; cur = cur->next)
+ gen_localdec(cur);
+
while (node != NULL) {
gen_stmt(node, ognode->lhs, -1);
node = node->next;
diff --git a/testing.sh b/testing.sh
index fe19039..21f28ec 100755
--- a/testing.sh
+++ b/testing.sh
@@ -55,6 +55,7 @@ test "$1" "main() 0; //ayayayayayayaya comment"
test "$1" "main() return;"
test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }"
test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }"
+test "$1" "main() { local a = 5; dbg a; a--; dbg a; }"
test "$1" "main() { wrt [\"(\"]; wrt '\n'; }"
test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;"
test "$1" "main();"