summaryrefslogtreecommitdiff
path: root/decls_cgen.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2020-02-28 13:17:44 -0500
committerLeo Tenenbaum <pommicket@gmail.com>2020-02-28 13:17:44 -0500
commit7d90b03b3d698a633582305a0e584919d5bb3f53 (patch)
tree95990bf8456aee41cea1e940483684025a754d86 /decls_cgen.c
parent982d900343b8a7d9405c68d3ab176ad180858c4c (diff)
started new #foreign system
Diffstat (limited to 'decls_cgen.c')
-rw-r--r--decls_cgen.c83
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);