summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c33
1 files changed, 31 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;