diff options
Diffstat (limited to 'src/type.cff')
| -rw-r--r-- | src/type.cff | 22 |
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 { |