aboutsummaryrefslogtreecommitdiff
path: root/src/type.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/type.cff')
-rw-r--r--src/type.cff22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/type.cff b/src/type.cff
index 980a83a..593ec3c 100644
--- a/src/type.cff
+++ b/src/type.cff
@@ -34,9 +34,9 @@ struct TypeTraits {
case Fn f;
h = fnv1a_i(h, f.ret.id);
- foreach(p, _, f.params,
+ foreach(p, _, f.params) {
h = fnv1a_i(h, p.id);
- )
+ }
case Agg agg;
h = fnv1a_i(h, agg.id);
@@ -77,11 +77,11 @@ struct TypeTraits {
if f0.params.#len != f1.params.#len {
return #f;
}
- foreach(p, i, f0.params,
+ foreach(p, i, f0.params) {
if p != f1.params[i] {
return #f;
}
- )
+ }
return #t;
case Agg agg;
@@ -123,7 +123,7 @@ extern fn completetype(ty *const Type) bool {
switch ty.u {
case Void; return #f;
case Fn; return #f;
- case Arr a; return a.length >= 0;
+ case Arr a; return a.length >= 0 and completetype(a.child);
case Agg agg; return !agg.fwd;
}
return #t;
@@ -173,14 +173,18 @@ extern fn putprimtypes(env *Env) void {
{ "uptrint",&ty_uptrint, { g_targ.ptrsize, .u: :Int { .sgn: #f }}},
};
- foreach(type, _, types[0::],
+ foreach(type, _, types[0::]) {
envput(env, { type.name, .u: :Ty(*type.gty = interntype(type.ty)) }, #null);
- )
+ }
ty_voidptr = interntype({ .size: g_targ.ptrsize, .u: :Ptr(ty_void) });
}
-extern fn isnumtype(ty *const Type) bool {
- return ty->is(:Int) or ty->is(:Flo);
+extern fn mkslicetype(child *const Type) *const Type {
+ let align = MAX(g_targ.ptrsize, g_targ.sizesize);
+ return interntype({
+ ALIGNUP(g_targ.ptrsize + g_targ.sizesize, align), align,
+ .u: :Slice(child)
+ });
}
fn numtype2rank(ty *const Type) int {