aboutsummaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-03-03 13:37:05 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-03-03 13:37:05 -0500
commitbf5a7253458ec5b3f4fe054b3b2f5f80211c1892 (patch)
treee2ec63d23498c661bfda29dafa3e0311ed1140d1 /compile.c
parentec7a9e5f107a68072b3a4dd84aa6a4b461657345 (diff)
Definitively go with "Int" and "Num" over "Int64" and "Num64", plus add
Int__bits()
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/compile.c b/compile.c
index 4f221996..a7ab054f 100644
--- a/compile.c
+++ b/compile.c
@@ -32,8 +32,8 @@ CORD compile_type(type_t *t)
case VoidType: return "void";
case MemoryType: return "void";
case BoolType: return "Bool_t";
- case IntType: return CORD_asprintf("Int%ld_t", Match(t, IntType)->bits);
- case NumType: return CORD_asprintf("Num%ld_t", Match(t, NumType)->bits);
+ case IntType: return Match(t, IntType)->bits == 64 ? "Int_t" : CORD_asprintf("Int%ld_t", Match(t, IntType)->bits);
+ case NumType: return Match(t, NumType)->bits == 64 ? "Num_t" : CORD_asprintf("Num%ld_t", Match(t, NumType)->bits);
case StringType: {
const char *dsl = Match(t, StringType)->dsl;
return dsl ? CORD_cat(dsl, "_t") : "Str_t";
@@ -72,8 +72,14 @@ CORD expr_as_string(env_t *env, CORD expr, type_t *t, CORD color)
switch (t->tag) {
case MemoryType: return CORD_asprintf("Memory__as_str($stack(%r), %r, &Memory)", expr, color);
case BoolType: return CORD_asprintf("Bool__as_str($stack(%r), %r, &Bool)", expr, color);
- case IntType: return CORD_asprintf("Int%ld__as_str($stack(%r), %r, &Int%ld)", Match(t, IntType)->bits, expr, color, Match(t, IntType)->bits);
- case NumType: return CORD_asprintf("Num%ld__as_str($stack(%r), %r, &Num%ld)", Match(t, NumType)->bits, expr, color, Match(t, NumType)->bits);
+ case IntType: {
+ CORD name = type_to_cord(t);
+ return CORD_asprintf("%r__as_str($stack(%r), %r, &%r)", name, expr, color, name);
+ }
+ case NumType: {
+ CORD name = type_to_cord(t);
+ return CORD_asprintf("%r__as_str($stack(%r), %r, &Num%r)", name, expr, color, name);
+ }
case StringType: return CORD_asprintf("Str__as_str($stack(%r), %r, &Str)", expr, color);
case ArrayType: return CORD_asprintf("Array__as_str($stack(%r), %r, %r)", expr, color, compile_type_info(env, t));
case TableType: return CORD_asprintf("Table_as_str($stack(%r), %r, %r)", expr, color, compile_type_info(env, t));
@@ -773,7 +779,7 @@ CORD compile(env_t *env, ast_t *ast)
if (for_->empty)
code_err(for_->empty, "'else' is not implemented for loops over integers");
return CORD_all(
- "for (Int64_t ", value, " = 1, $n = ", compile(env, for_->iter), "; ", value, " <= $n; ++", value, ")\n"
+ "for (int64_t ", value, " = 1, $n = ", compile(env, for_->iter), "; ", value, " <= $n; ++", value, ")\n"
"\t", compile(scope, for_->body), "\n");
}
default: code_err(for_->iter, "Iteration is not implemented for type: %T", iter_t);
@@ -1034,9 +1040,7 @@ CORD compile(env_t *env, ast_t *ast)
CORD compile_type_info(env_t *env, type_t *t)
{
switch (t->tag) {
- case BoolType: return "&Bool";
- case IntType: return CORD_asprintf("&Int%ld", Match(t, IntType)->bits);
- case NumType: return CORD_asprintf("&Num%ld", Match(t, NumType)->bits);
+ case BoolType: case IntType: case NumType: return CORD_asprintf("&%r", type_to_cord(t));
case StringType: return CORD_all("&", Match(t, StringType)->dsl ? Match(t, StringType)->dsl : "Str");
case StructType: return CORD_all("&", Match(t, StructType)->name);
case EnumType: return CORD_all("&", Match(t, EnumType)->name);