made slice, varargs and dynamic array types simpler
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 8 Sep 2021 13:49:28 +0000 (08:49 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 8 Sep 2021 13:49:28 +0000 (08:49 -0500)
bin/onyx
include/types.h
src/astnodes.c
src/checker.c
src/polymorph.c
src/types.c
src/utils.c
src/wasm_type_table.c

index 4a8dd7340b3b9d9847955ea73d45fc462557900a..17501404afe787b8fd019d66eddfcccd842ff85a 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 03574c746377a1769af5a7aeb6a3fe78691f60e1..448e803761e4a6f3b23658746b039f869d5f6e7a 100644 (file)
@@ -113,9 +113,9 @@ struct TypeWithOffset {
         Type* types[];                                            \
     })                                                            \
     TYPE_KIND(Array, struct { u32 size; u32 count; Type *elem; }) \
-    TYPE_KIND(Slice, struct { Type *ptr_to_data; })               \
-    TYPE_KIND(DynArray, struct { Type *ptr_to_data; })            \
-    TYPE_KIND(VarArgs, struct { Type *ptr_to_data; })             \
+    TYPE_KIND(Slice, struct { Type *elem; })                      \
+    TYPE_KIND(DynArray, struct { Type *elem; })                   \
+    TYPE_KIND(VarArgs, struct { Type *elem; })                    \
     TYPE_KIND(Enum, struct {                                      \
         char* name;                                               \
         Type* backing;                                            \
index 7cdbc4456e6fdb2e217727ddf908876b04d8353c..f67d92b0cab78ba138b4206eb30672a0f4b9e84f 100644 (file)
@@ -513,7 +513,7 @@ b32 type_check_or_auto_cast(AstTyped** pnode, Type* type) {
 
     if (node->kind == Ast_Kind_Struct_Literal && node->type_node == NULL) {
         if (node->entity != NULL) return 1;
-        if (type->kind == Type_Kind_VarArgs) type = type->VarArgs.ptr_to_data->Pointer.elem;
+        if (type->kind == Type_Kind_VarArgs) type = type->VarArgs.elem;
         if (!type_is_sl_constructable(type)) return 0;
 
         node->type = type;
@@ -745,7 +745,7 @@ b32 cast_is_legal(Type* from_, Type* to_, char** err_msg) {
     }
 
     if (to->kind == Type_Kind_Slice && from->kind == Type_Kind_Array) {
-        if (!types_are_compatible(to->Slice.ptr_to_data->Pointer.elem, from->Array.elem)) {
+        if (!types_are_compatible(to->Slice.elem, from->Array.elem)) {
             *err_msg = "Array to slice cast is not valid here because the types are different.";
             return 0;
         } else {
@@ -754,7 +754,7 @@ b32 cast_is_legal(Type* from_, Type* to_, char** err_msg) {
     }
 
     if (to->kind == Type_Kind_Slice && from->kind == Type_Kind_VarArgs) {
-        if (!types_are_compatible(to->Slice.ptr_to_data->Pointer.elem, from->VarArgs.ptr_to_data->Pointer.elem)) {
+        if (!types_are_compatible(to->Slice.elem, from->VarArgs.elem)) {
             *err_msg = "Variadic argument to slice cast is not valid here because the types are different.";
             return 0;
         } else {
index 0e595ae1fee561087ea528edfef8592ad5632783..80a9e46ccaf9b09cd0e5916dcbd54f0ae3676743 100644 (file)
@@ -259,8 +259,8 @@ CheckStatus check_for(AstFor* fornode) {
         fornode->loop_type = For_Loop_Array;
     }
     else if (iter_type->kind == Type_Kind_Slice) {
-        if (fornode->by_pointer) fornode->var->type = iter_type->Slice.ptr_to_data;
-        else                     fornode->var->type = iter_type->Slice.ptr_to_data->Pointer.elem;
+        if (fornode->by_pointer) fornode->var->type = type_make_pointer(context.ast_alloc, iter_type->Slice.elem);
+        else                     fornode->var->type = iter_type->Slice.elem;
 
         fornode->loop_type = For_Loop_Slice;
 
@@ -270,14 +270,14 @@ CheckStatus check_for(AstFor* fornode) {
             ERROR_(fornode->var->token->pos, "Cannot iterate by pointer over '%s'.", type_get_name(iter_type));
         }
 
-        fornode->var->type = iter_type->VarArgs.ptr_to_data->Pointer.elem;
+        fornode->var->type = iter_type->VarArgs.elem;
 
         // NOTE: Slices are VarArgs are being treated the same here.
         fornode->loop_type = For_Loop_Slice;
     }
     else if (iter_type->kind == Type_Kind_DynArray) {
-        if (fornode->by_pointer) fornode->var->type = iter_type->DynArray.ptr_to_data;
-        else                     fornode->var->type = iter_type->DynArray.ptr_to_data->Pointer.elem;
+        if (fornode->by_pointer) fornode->var->type = type_make_pointer(context.ast_alloc, iter_type->DynArray.elem);
+        else                     fornode->var->type = iter_type->DynArray.elem;
 
         fornode->loop_type = For_Loop_DynArr;
     }
@@ -638,7 +638,7 @@ CheckStatus check_call(AstCall** pcall) {
                 if (arg_pos >= callee->type->Function.param_count) goto type_checking_done;
 
                 if (formal_params[arg_pos]->kind == Type_Kind_VarArgs) {
-                    variadic_type = formal_params[arg_pos]->VarArgs.ptr_to_data->Pointer.elem;
+                    variadic_type = formal_params[arg_pos]->VarArgs.elem;
                     variadic_param = &callee->params[arg_pos];
                     arg_state = AS_Expecting_Typed_VA;
                     continue;
index c05734bbf3cbf06c090d2a8a264a3b11f7be8b74..d072b98e096bc80f22ed4045aa98acabc1b34dc6 100644 (file)
@@ -282,7 +282,7 @@ static PolySolveResult solve_poly_type(AstNode* target, AstType* type_expr, Type
                 bh_arr_push(elem_queue, ((PolySolveElem) {
                     .type_expr = ((AstSliceType *) elem.type_expr)->elem,
                     .kind = PSK_Type,
-                    .actual = elem.actual->Slice.ptr_to_data->Pointer.elem,
+                    .actual = elem.actual->Slice.elem,
                 }));
                 break;
             }
@@ -293,7 +293,7 @@ static PolySolveResult solve_poly_type(AstNode* target, AstType* type_expr, Type
                 bh_arr_push(elem_queue, ((PolySolveElem) {
                     .type_expr = ((AstDynArrType *) elem.type_expr)->elem,
                     .kind = PSK_Type,
-                    .actual = elem.actual->DynArray.ptr_to_data->Pointer.elem,
+                    .actual = elem.actual->DynArray.elem,
                 }));
                 break;
             }
index 84ccbd01e595a0863238b32de9cde00f5876b8bb..785e3232d89974bbecbec5010e28209bfe628989 100644 (file)
@@ -164,17 +164,17 @@ b32 types_are_compatible_(Type* t1, Type* t2, b32 recurse_pointers) {
 
         case Type_Kind_Slice: {
             if (t2->kind != Type_Kind_Slice) return 0;
-            return types_are_compatible(t1->Slice.ptr_to_data->Pointer.elem, t2->Slice.ptr_to_data->Pointer.elem);
+            return types_are_compatible(t1->Slice.elem, t2->Slice.elem);
         }
 
         case Type_Kind_VarArgs: {
             if (t2->kind != Type_Kind_VarArgs) return 0;
-            return types_are_compatible(t1->VarArgs.ptr_to_data->Pointer.elem, t2->VarArgs.ptr_to_data->Pointer.elem);
+            return types_are_compatible(t1->VarArgs.elem, t2->VarArgs.elem);
         }
 
         case Type_Kind_DynArray: {
             if (t2->kind != Type_Kind_DynArray) return 0;
-            return types_are_compatible(t1->DynArray.ptr_to_data->Pointer.elem, t2->DynArray.ptr_to_data->Pointer.elem);
+            return types_are_compatible(t1->DynArray.elem, t2->DynArray.elem);
         }
 
         case Type_Kind_Compound: {
@@ -714,7 +714,8 @@ Type* type_make_slice(bh_allocator alloc, Type* of) {
         type_register(slice_type);
         bh_imap_put(&type_slice_map, of->id, slice_type->id);
 
-        slice_type->Slice.ptr_to_data = type_make_pointer(alloc, of);
+        type_make_pointer(alloc, of);
+        slice_type->Slice.elem = of;
 
         return slice_type;
     }
@@ -734,7 +735,8 @@ Type* type_make_dynarray(bh_allocator alloc, Type* of) {
         type_register(dynarr);
         bh_imap_put(&type_dynarr_map, of->id, dynarr->id);
 
-        dynarr->DynArray.ptr_to_data = type_make_pointer(alloc, of);
+        type_make_pointer(alloc, of);
+        dynarr->DynArray.elem = of;
 
         return dynarr;
     }
@@ -754,7 +756,8 @@ Type* type_make_varargs(bh_allocator alloc, Type* of) {
         type_register(va_type);
         bh_imap_put(&type_vararg_map, of->id, va_type->id);
 
-        va_type->VarArgs.ptr_to_data = type_make_pointer(alloc, of);
+        type_make_pointer(alloc, of);
+        va_type->VarArgs.elem = of;
 
         return va_type;
     }
@@ -806,9 +809,9 @@ const char* type_get_unique_name(Type* type) {
             else
                 return bh_aprintf(global_scratch_allocator, "%s@%l", "<anonymous enum>", type->id);
 
-        case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_unique_name(type->Slice.ptr_to_data->Pointer.elem));
-        case Type_Kind_VarArgs: return bh_aprintf(global_scratch_allocator, "..%s", type_get_unique_name(type->VarArgs.ptr_to_data->Pointer.elem));
-        case Type_Kind_DynArray: return bh_aprintf(global_scratch_allocator, "[..] %s", type_get_unique_name(type->DynArray.ptr_to_data->Pointer.elem));
+        case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_unique_name(type->Slice.elem));
+        case Type_Kind_VarArgs: return bh_aprintf(global_scratch_allocator, "..%s", type_get_unique_name(type->VarArgs.elem));
+        case Type_Kind_DynArray: return bh_aprintf(global_scratch_allocator, "[..] %s", type_get_unique_name(type->DynArray.elem));
 
         case Type_Kind_Function: {
             char buf[1024];
@@ -869,9 +872,9 @@ const char* type_get_name(Type* type) {
             else
                 return "<anonymous enum>";
 
-        case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_name(type->Slice.ptr_to_data->Pointer.elem));
-        case Type_Kind_VarArgs: return bh_aprintf(global_scratch_allocator, "..%s", type_get_name(type->VarArgs.ptr_to_data->Pointer.elem));
-        case Type_Kind_DynArray: return bh_aprintf(global_scratch_allocator, "[..] %s", type_get_name(type->DynArray.ptr_to_data->Pointer.elem));
+        case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_name(type->Slice.elem));
+        case Type_Kind_VarArgs: return bh_aprintf(global_scratch_allocator, "..%s", type_get_name(type->VarArgs.elem));
+        case Type_Kind_DynArray: return bh_aprintf(global_scratch_allocator, "[..] %s", type_get_name(type->DynArray.elem));
 
         case Type_Kind_Function: {
             char buf[512];
@@ -948,7 +951,7 @@ b32 type_lookup_member(Type* type, char* member, StructMember* smem) {
             fori (i, 0, (i64) (sizeof(slice_members) / sizeof(StructMember))) {
                 if (strcmp(slice_members[i].name, member) == 0) {
                     *smem = slice_members[i];
-                    if (smem->idx == 0) smem->type = type->Slice.ptr_to_data;
+                    if (smem->idx == 0) smem->type = type_make_pointer(context.ast_alloc, type->Slice.elem);
 
                     return 1;
                 }
@@ -960,7 +963,7 @@ b32 type_lookup_member(Type* type, char* member, StructMember* smem) {
             fori (i, 0, (i64) (sizeof(array_members) / sizeof(StructMember))) {
                 if (strcmp(array_members[i].name, member) == 0) {
                     *smem = array_members[i];
-                    if (smem->idx == 0) smem->type = type->DynArray.ptr_to_data;
+                    if (smem->idx == 0) smem->type = type_make_pointer(context.ast_alloc, type->DynArray.elem);
                     if (smem->idx == 3) smem->type = type_build_from_ast(context.ast_alloc, builtin_allocator_type);
 
                     return 1;
@@ -992,7 +995,7 @@ b32 type_lookup_member_by_idx(Type* type, i32 idx, StructMember* smem) {
             if (idx > 2) return 0;
 
             *smem = slice_members[idx];
-            if (smem->idx == 0) smem->type = type->Slice.ptr_to_data;
+            if (smem->idx == 0) smem->type = type_make_pointer(context.ast_alloc, type->Slice.elem);
 
             return 1;
         }
@@ -1001,7 +1004,7 @@ b32 type_lookup_member_by_idx(Type* type, i32 idx, StructMember* smem) {
             if (idx > 4) return 0;
 
             *smem = array_members[idx];
-            if (idx == 0) smem->type = type->DynArray.ptr_to_data;
+            if (idx == 0) smem->type = type_make_pointer(context.ast_alloc, type->DynArray.elem);
             if (idx == 3) smem->type = type_build_from_ast(context.ast_alloc, builtin_allocator_type);
 
             return 1;
@@ -1027,7 +1030,7 @@ b32 type_linear_member_lookup(Type* type, i32 idx, TypeWithOffset* two) {
         case Type_Kind_Slice:
         case Type_Kind_VarArgs: {
             if (idx == 0) { 
-                two->type = type->Slice.ptr_to_data;
+                two->type = type_make_pointer(context.ast_alloc, type->Slice.elem);
                 two->offset = 0;
             }
             if (idx == 1) {
@@ -1039,7 +1042,7 @@ b32 type_linear_member_lookup(Type* type, i32 idx, TypeWithOffset* two) {
         }
         case Type_Kind_DynArray: {
             if (idx == 0) { 
-                two->type = type->DynArray.ptr_to_data;
+                two->type = type_make_pointer(context.ast_alloc, type->DynArray.elem);
                 two->offset = 0;
             }
             if (idx == 1) {
index b98a9e218a4e97dbd6fcba46e633f16e42a95787..ea4eadeb0c1c131d9661b1fe5fd11ef990981faa 100644 (file)
@@ -382,7 +382,7 @@ AstTyped* find_matching_overload_by_arguments(bh_arr(OverloadOption) overloads,
             Type* type_to_match = ol_type->params[i];
             AstTyped** value    = &args.values[i];
 
-            if (type_to_match->kind == Type_Kind_VarArgs) type_to_match = type_to_match->VarArgs.ptr_to_data->Pointer.elem;
+            if (type_to_match->kind == Type_Kind_VarArgs) type_to_match = type_to_match->VarArgs.elem;
             if ((*value)->kind == Ast_Kind_Argument) {
                 // :ArgumentResolvingIsComplicated
                 if (((AstArgument *) (*value))->is_baked) continue;
index 4daf9d1c530b6f63d1e8125a07d7c736b46a1516..a930f1bb5060074738bf5d0a06a81614604e0ce2 100644 (file)
@@ -58,7 +58,7 @@ u64 build_type_table(OnyxWasmModule* module) {
                 bh_buffer_write_u32(&table_buffer, type->kind);
                 bh_buffer_write_u32(&table_buffer, type_size_of(type));
                 bh_buffer_write_u32(&table_buffer, type_alignment_of(type));
-                bh_buffer_write_u32(&table_buffer, type->Slice.ptr_to_data->Pointer.elem->id);
+                bh_buffer_write_u32(&table_buffer, type->Slice.elem->id);
                 break;
             }
 
@@ -67,7 +67,7 @@ u64 build_type_table(OnyxWasmModule* module) {
                 bh_buffer_write_u32(&table_buffer, type->kind);
                 bh_buffer_write_u32(&table_buffer, type_size_of(type));
                 bh_buffer_write_u32(&table_buffer, type_alignment_of(type));
-                bh_buffer_write_u32(&table_buffer, type->DynArray.ptr_to_data->Pointer.elem->id);
+                bh_buffer_write_u32(&table_buffer, type->DynArray.elem->id);
                 break;
             }
 
@@ -76,7 +76,7 @@ u64 build_type_table(OnyxWasmModule* module) {
                 bh_buffer_write_u32(&table_buffer, type->kind);
                 bh_buffer_write_u32(&table_buffer, type_size_of(type));
                 bh_buffer_write_u32(&table_buffer, type_alignment_of(type));
-                bh_buffer_write_u32(&table_buffer, type->VarArgs.ptr_to_data->Pointer.elem->id);
+                bh_buffer_write_u32(&table_buffer, type->VarArgs.elem->id);
                 break;
             }