aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c2
-rw-r--r--enums.c28
-rw-r--r--structs.c7
-rw-r--r--typecheck.c3
4 files changed, 18 insertions, 22 deletions
diff --git a/compile.c b/compile.c
index 6c50890a..fafbfc06 100644
--- a/compile.c
+++ b/compile.c
@@ -182,7 +182,7 @@ CORD compile_statement(env_t *env, ast_t *ast)
(void)result_t;
for (when_clause_t *clause = when->clauses; clause; clause = clause->next) {
const char *clause_tag_name = Match(clause->tag_name, Var)->name;
- code = CORD_all(code, "case $tag$", env->file_prefix, enum_t->name, "$", clause_tag_name, ": {\n");
+ code = CORD_all(code, "case ", env->file_prefix, enum_t->name, "$tag$", clause_tag_name, ": {\n");
type_t *tag_type = NULL;
for (tag_t *tag = enum_t->tags; tag; tag = tag->next) {
if (streq(tag->name, clause_tag_name)) {
diff --git a/enums.c b/enums.c
index 9d33c5c5..e9256b11 100644
--- a/enums.c
+++ b/enums.c
@@ -29,12 +29,12 @@ static CORD compile_str_method(env_t *env, ast_t *ast)
"switch (obj->$tag) {\n");
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
if (!tag->fields) {
- str_func = CORD_all(str_func, "\tcase $tag$", full_name, "$", tag->name, ": return use_color ? \"\\x1b[36;1m",
+ str_func = CORD_all(str_func, "\tcase ", full_name, "$tag$", tag->name, ": return use_color ? \"\\x1b[36;1m",
def->name, ".", tag->name, "\\x1b[m\" : \"", def->name, ".", tag->name, "\";\n");
continue;
}
- str_func = CORD_all(str_func, "\tcase $tag$", full_name, "$", tag->name, ": return CORD_all(use_color ? \"\\x1b[36;1m",
+ str_func = CORD_all(str_func, "\tcase ", full_name, "$tag$", tag->name, ": return CORD_all(use_color ? \"\\x1b[36;1m",
def->name, ".", tag->name, "\\x1b[m(\" : \"", def->name, ".", tag->name, "(\"");
if (tag->secret) {
@@ -75,10 +75,10 @@ static CORD compile_compare_method(env_t *env, ast_t *ast)
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
if (tag->fields) {
type_t *tag_type = Table$str_get(*env->types, CORD_to_const_char_star(CORD_all(def->name, "$", tag->name)));
- cmp_func = CORD_all(cmp_func, "\tcase $tag$", full_name, "$", tag->name, ": "
+ cmp_func = CORD_all(cmp_func, "\tcase ", full_name, "$tag$", tag->name, ": "
"return generic_compare(&x->", tag->name, ", &y->", tag->name, ", ", compile_type_info(env, tag_type), ");\n");
} else {
- cmp_func = CORD_all(cmp_func, "\tcase $tag$", full_name, "$", tag->name, ": return 0;\n");
+ cmp_func = CORD_all(cmp_func, "\tcase ", full_name, "$tag$", tag->name, ": return 0;\n");
}
}
cmp_func = CORD_all(cmp_func, "default: return 0;\n}\n}\n");
@@ -105,10 +105,10 @@ static CORD compile_equals_method(env_t *env, ast_t *ast)
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
if (tag->fields) {
type_t *tag_type = Table$str_get(*env->types, CORD_to_const_char_star(CORD_all(def->name, "$", tag->name)));
- eq_func = CORD_all(eq_func, "\tcase $tag$", full_name, "$", tag->name, ": "
+ eq_func = CORD_all(eq_func, "\tcase ", full_name, "$tag$", tag->name, ": "
"return generic_equal(&x->", tag->name, ", &y->", tag->name, ", ", compile_type_info(env, tag_type), ");\n");
} else {
- eq_func = CORD_all(eq_func, "\tcase $tag$", full_name, "$", tag->name, ": return yes;\n");
+ eq_func = CORD_all(eq_func, "\tcase ", full_name, "$tag$", tag->name, ": return yes;\n");
}
}
eq_func = CORD_all(eq_func, "default: return 0;\n}\n}\n");
@@ -135,11 +135,11 @@ static CORD compile_hash_method(env_t *env, ast_t *ast)
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
if (tag->fields) {
type_t *tag_type = Table$str_get(*env->types, CORD_to_const_char_star(CORD_all(def->name, "$", tag->name)));
- hash_func = CORD_all(hash_func, "\tcase $tag$", full_name, "$", tag->name, ": "
+ hash_func = CORD_all(hash_func, "\tcase ", full_name, "$tag$", tag->name, ": "
"hashes[1] = generic_hash(&obj->", tag->name, ", ", compile_type_info(env, tag_type), ");\n"
"break;\n");
} else {
- hash_func = CORD_all(hash_func, "\tcase $tag$", full_name, "$", tag->name, ": break;\n");
+ hash_func = CORD_all(hash_func, "\tcase ", full_name, "$tag$", tag->name, ": break;\n");
}
}
hash_func = CORD_all(hash_func, "}\n"
@@ -158,7 +158,7 @@ void compile_enum_def(env_t *env, ast_t *ast)
CORD enum_def = CORD_all("struct ", full_name, "_s {\n"
"\tenum {");
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
- CORD_appendf(&enum_def, "$tag$%r$%s = %ld", full_name, tag->name, tag->value);
+ CORD_appendf(&enum_def, "%r$tag$%s = %ld", full_name, tag->name, tag->value);
if (tag->next) enum_def = CORD_cat(enum_def, ", ");
}
enum_def = CORD_cat(enum_def, "} $tag;\n"
@@ -166,8 +166,7 @@ void compile_enum_def(env_t *env, ast_t *ast)
for (tag_ast_t *tag = def->tags; tag; tag = tag->next) {
compile_struct_def(env, WrapAST(ast, StructDef, .name=CORD_to_const_char_star(CORD_all(def->name, "$", tag->name)), .fields=tag->fields));
enum_def = CORD_all(enum_def, full_name, "$", tag->name, "_t ", tag->name, ";\n");
- if (tag->fields) {
- // Constructor:
+ if (tag->fields) { // Constructor macros:
CORD arg_sig = CORD_EMPTY;
for (arg_ast_t *field = tag->fields; field; field = field->next) {
type_t *field_t = get_arg_ast_type(env, field);
@@ -179,18 +178,13 @@ void compile_enum_def(env_t *env, ast_t *ast)
env->code->fndefs = CORD_cat(env->code->fndefs, constructor_def);
CORD constructor_impl = CORD_all("public inline ", full_name, "_t ", full_name, "$tagged$", tag->name, "(", arg_sig, ") { return (",
- full_name, "_t){.$tag=$tag$", full_name, "$", tag->name, ", .", tag->name, "={");
+ full_name, "_t){.$tag=", full_name, "$tag$", tag->name, ", .", tag->name, "={");
for (arg_ast_t *field = tag->fields; field; field = field->next) {
constructor_impl = CORD_all(constructor_impl, field->name);
if (field->next) constructor_impl = CORD_cat(constructor_impl, ", ");
}
constructor_impl = CORD_cat(constructor_impl, "}}; }\n");
env->code->funcs = CORD_cat(env->code->funcs, constructor_impl);
- } else { // Empty tagged data:
- CORD singleton = CORD_all("extern const ", full_name, "_t ", full_name, "$tagged$", tag->name, ";\n");
- env->code->fndefs = CORD_cat(env->code->fndefs, singleton);
- CORD value = CORD_all("public const ", full_name, "_t ", full_name, "$tagged$", tag->name, " = {$tag$", full_name, "$", tag->name, "};\n");
- env->code->funcs = CORD_cat(env->code->funcs, value);
}
}
enum_def = CORD_cat(enum_def, "};\n};\n");
diff --git a/structs.c b/structs.c
index 730d8aec..d62d2df2 100644
--- a/structs.c
+++ b/structs.c
@@ -118,14 +118,15 @@ void compile_struct_def(env_t *env, ast_t *ast)
CORD_appendf(&env->code->typedefs, "typedef struct %r_s %r_t;\n", full_name, full_name);
CORD_appendf(&env->code->typedefs, "#define %r(...) ((%r_t){__VA_ARGS__})\n", full_name, full_name);
- CORD_appendf(&env->code->typecode, "struct %r_s {\n", full_name);
+ CORD struct_code = CORD_all("struct ", full_name, "_s {\n");
for (arg_ast_t *field = def->fields; field; field = field->next) {
type_t *field_t = get_arg_ast_type(env, field);
CORD type_code = compile_type(env, field_t);
- CORD_appendf(&env->code->typecode, "%r %s%s;\n", type_code, field->name,
+ CORD_appendf(&struct_code, "%r %s%s;\n", type_code, field->name,
CORD_cmp(type_code, "Bool_t") ? "" : ":1");
}
- CORD_appendf(&env->code->typecode, "};\n");
+ struct_code = CORD_all(struct_code, "};\n");
+ env->code->typecode = CORD_all(env->code->typecode, struct_code);
// Typeinfo:
CORD_appendf(&env->code->typedefs, "extern const TypeInfo %r;\n", full_name);
diff --git a/typecheck.c b/typecheck.c
index e3cf0b5c..fbd7509d 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -282,7 +282,8 @@ void bind_statement(env_t *env, ast_t *statement)
type_t *constructor_t = Type(FunctionType, .args=Match(tag->type, StructType)->fields, .ret=type);
set_binding(ns_env, tag->name, new(binding_t, .type=constructor_t, .code=CORD_all(env->file_prefix, def->name, "$tagged$", tag->name)));
} else { // Empty singleton value:
- set_binding(ns_env, tag->name, new(binding_t, .type=type, .code=CORD_all(env->file_prefix, def->name, "$tagged$", tag->name)));
+ CORD code = CORD_all("(", env->file_prefix, def->name, "_t){", env->file_prefix, def->name, "$tag$", tag->name, "}");
+ set_binding(ns_env, tag->name, new(binding_t, .type=type, .code=code));
}
Table$str_set(env->types, heap_strf("%s$%s", def->name, tag->name), tag->type);
}