diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2020-02-28 13:17:44 -0500 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2020-02-28 13:17:44 -0500 |
commit | 7d90b03b3d698a633582305a0e584919d5bb3f53 (patch) | |
tree | 95990bf8456aee41cea1e940483684025a754d86 /decls_cgen.c | |
parent | 982d900343b8a7d9405c68d3ab176ad180858c4c (diff) |
started new #foreign system
Diffstat (limited to 'decls_cgen.c')
-rw-r--r-- | decls_cgen.c | 83 |
1 files changed, 39 insertions, 44 deletions
diff --git a/decls_cgen.c b/decls_cgen.c index c04e433..44fa436 100644 --- a/decls_cgen.c +++ b/decls_cgen.c @@ -3,6 +3,45 @@ This file is part of toc. toc is distributed under version 3 of the GNU General Public License, without any warranty whatsoever. You should have received a copy of the GNU General Public License along with toc. If not, see <https://www.gnu.org/licenses/>. */ + +/* TODO */ +#if 0 + if (d->flags & DECL_FOREIGN) { + cgen_write(g, "extern "); + if ((d->flags & DECL_IS_CONST) && (d->type.kind == TYPE_FN) && arr_len(d->idents) == 1) { + /* foreign function declaration */ + Type *fn_types = d->type.fn.types; + const char *foreign_name = (d->flags & DECL_FOUND_VAL) + ? d->val.fn->foreign.name + : d->foreign.name_str; + cgen_type_pre(g, &fn_types[0], d->where); + cgen_write(g, " %s", foreign_name); + cgen_write(g, "("); + arr_foreach(fn_types, Type, t) { + if (t == fn_types) continue; + if (t != fn_types+1) + cgen_write(g, ", "); + cgen_type_pre(g, t, d->where); + cgen_type_post(g, t, d->where); + } + cgen_write(g, ")"); + cgen_type_post(g, &fn_types[0], d->where); + cgen_write(g, ";"); + if (!ident_eq_str(d->idents[0], foreign_name)) { + cgen_write(g, "static "); + cgen_type_pre(g, &d->type, d->where); + cgen_write(g, " const "); + cgen_ident(g, d->idents[0]); + cgen_type_post(g, &d->type, d->where); + cgen_write(g, " = %s;", foreign_name); + } + cgen_nl(g); + if (d->flags & DECL_FOUND_VAL) + d->val.fn->c.name = d->idents[0]; + return; + +#endif + static void cgen_decls_stmt(CGenerator *g, Statement *s); static void cgen_decls_block(CGenerator *g, Block *b); static void cgen_decls_decl(CGenerator *g, Declaration *d); @@ -108,50 +147,6 @@ static void cgen_decls_block(CGenerator *g, Block *b) { } static void cgen_decls_decl(CGenerator *g, Declaration *d) { - if (d->flags & DECL_FOREIGN) { - cgen_write(g, "extern "); - if ((d->flags & DECL_IS_CONST) && (d->type.kind == TYPE_FN) && arr_len(d->idents) == 1) { - /* foreign function declaration */ - Type *fn_types = d->type.fn.types; - const char *foreign_name = (d->flags & DECL_FOUND_VAL) - ? d->val.fn->foreign.name - : d->foreign.name_str; - cgen_type_pre(g, &fn_types[0], d->where); - cgen_write(g, " %s", foreign_name); - cgen_write(g, "("); - arr_foreach(fn_types, Type, t) { - if (t == fn_types) continue; - if (t != fn_types+1) - cgen_write(g, ", "); - cgen_type_pre(g, t, d->where); - cgen_type_post(g, t, d->where); - } - cgen_write(g, ")"); - cgen_type_post(g, &fn_types[0], d->where); - cgen_write(g, ";"); - if (!ident_eq_str(d->idents[0], foreign_name)) { - cgen_write(g, "static "); - cgen_type_pre(g, &d->type, d->where); - cgen_write(g, " const "); - cgen_ident(g, d->idents[0]); - cgen_type_post(g, &d->type, d->where); - cgen_write(g, " = %s;", foreign_name); - } - cgen_nl(g); - if (d->flags & DECL_FOUND_VAL) - d->val.fn->c.name = d->idents[0]; - return; - } else { - /* foreign non-function */ - const char *foreign_name = d->foreign.name_str; - cgen_type_pre(g, &d->type, d->where); - cgen_write(g, " %s", foreign_name); - cgen_type_post(g, &d->type, d->where); - cgen_write(g, ";"); - cgen_nl(g); - } - return; - } cgen_decls_type(g, &d->type); if (cgen_fn_is_direct(g, d)) { cgen_fn_decl(g, d->expr.fn, &d->expr.type); |