aboutsummaryrefslogtreecommitdiff
path: root/bootstrap/cgen.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-06 14:10:19 +0200
committerlemon <lsof@mailbox.org>2022-08-06 14:10:29 +0200
commitb8d9ad1f6636f46a832b0f949ce7525ae08f53bd (patch)
tree037c7e0a86835b2e284df786e3ba2680b7677cc4 /bootstrap/cgen.c
parent1dd19e56fb81d1334bb21e4aa097f9593576feb7 (diff)
basic method calls & many bugfix
Diffstat (limited to 'bootstrap/cgen.c')
-rw-r--r--bootstrap/cgen.c79
1 files changed, 52 insertions, 27 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c
index 8685ffe..3df1ce7 100644
--- a/bootstrap/cgen.c
+++ b/bootstrap/cgen.c
@@ -33,7 +33,7 @@ gentype(const struct type *ty) {
case TYeunion:
assert(ty->_cname);
pri("%s", ty->_cname);
- return;
+ break;
case TYenum:
gentype(ty->enu.intty);
break;
@@ -155,6 +155,8 @@ geniniex(struct expr *ex) {
static void
genexpr(struct expr *ex) {
const struct type *ty = unconstify(ex->ty);
+ struct decl *decl;
+
switch (ex->t) {
case Eintlit:
intlit:
@@ -234,6 +236,17 @@ genexpr(struct expr *ex) {
case Eget:
pri("%e%s%s", ex->get.lhs, ex->get.lhs->ty->t == TYptr ? "->" : ".", ex->get.fld);
break;
+ case Emcall:
+ decl = container_of(ex->mcall.met, struct decl, fn);
+ assert(*decl->_cname);
+ pri("%s(", *decl->_cname);
+ for (int i = 0; i < ex->mcall.args.n; ++i) {
+ pri("%e", &ex->mcall.args.d[i]);
+ if (i < ex->mcall.args.n - 1)
+ pri(", ");
+ }
+ pri(")");
+ break;
}
}
@@ -343,7 +356,7 @@ genblock(struct blockstmt block) {
static void liftnested(struct stmt *stmt);
-// lift nested fns and static vars
+static void liftdecl(struct decl *decl);
static void
liftnestedex(struct expr *ex) {
@@ -390,12 +403,41 @@ liftnestedex(struct expr *ex) {
case Eget:
liftnestedex(ex->get.lhs);
break;
+ case Emcall:
+ liftdecl(container_of(ex->mcall.met, struct decl, fn));
+ for (int i = 0; i < ex->call.args.n; ++i)
+ liftnestedex(&ex->mcall.args.d[i]);
+ break;
+ }
+}
+
+static void
+liftdecl(struct decl *decl) {
+ static int id;
+ switch (decl->t) {
+ case Dfn:
+ if (decl->fn.body) {
+ *decl->_cname = xasprintf("__f%s_%d", decl->fn.name, id++);
+ genfn(decl->externp, *decl->_cname, &decl->fn);
+ }
+ break;
+ case Dstatic:
+ if (!decl->externp) {
+ assert(decl->var.ini);
+ *decl->_cname = xasprintf("__s%s_%d", decl->name, id++);
+ genstatic(decl->externp, *decl->_cname, &decl->var);
+ }
+ break;
+ case Dlet:
+ liftnestedex(decl->var.ini);
+ break;
+ default:
+ break;
}
}
static void // lift nested fns and static vars
liftnested(struct stmt *stmt) {
- static int id;
if (!stmt)
return;
switch (stmt->t) {
@@ -407,26 +449,7 @@ liftnested(struct stmt *stmt) {
liftnestedex(&stmt->expr);
break;
case Sdecl:
- switch (stmt->decl.t) {
- case Dfn:
- if (stmt->decl.fn.body) {
- *stmt->decl._cname = xasprintf("__f%s_%d", stmt->decl.fn.name, id++);
- genfn(stmt->decl.externp, *stmt->decl._cname, &stmt->decl.fn);
- }
- break;
- case Dstatic:
- if (!stmt->decl.externp) {
- assert(stmt->decl.var.ini);
- *stmt->decl._cname = xasprintf("__s%s_%d", stmt->decl.name, id++);
- genstatic(stmt->decl.externp, *stmt->decl._cname, &stmt->decl.var);
- }
- break;
- case Dlet:
- liftnestedex(stmt->decl.var.ini);
- break;
- default:
- break;
- }
+ liftdecl(&stmt->decl);
break;
case Sifelse:
liftnested(stmt->ifelse.f);
@@ -525,11 +548,8 @@ defctype(const struct type *ty, void *_) {
if (!ty->_cname)
switch (ty->t) {
case TYvoid: case TYbool:
- case TYint: case TYfloat:
+ case TYenum: case TYint: case TYfloat:
break;
- case TYenum:
- defctype(ty->enu.intty, NULL);
- return;
case TYptr:
defctype(ty->child, NULL);
break;
@@ -566,6 +586,11 @@ defctype(const struct type *ty, void *_) {
case TYunion:
kind = "union";
agg:
+ if (ty->konst) {
+ defctype(unconstify(ty), NULL);
+ *cname = (char *)unconstify(ty)->_cname;
+ break;
+ }
*cname = xasprintf("__ty%s%d", ty->agg.name ? ty->agg.name : "", id++);
pri("typedef %s %s %s;\n", kind, *cname, *cname);
if (!ty->agg.fwd) {