From b8d9ad1f6636f46a832b0f949ce7525ae08f53bd Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 6 Aug 2022 14:10:19 +0200 Subject: basic method calls & many bugfix --- bootstrap/cgen.c | 79 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 27 deletions(-) (limited to 'bootstrap/cgen.c') 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) { -- cgit v1.2.3