From: Brendan Hansen Date: Wed, 8 Sep 2021 13:49:28 +0000 (-0500) Subject: made slice, varargs and dynamic array types simpler X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=e3e571d4b31c848825df922ec09f5e1e0852af2d;p=onyx.git made slice, varargs and dynamic array types simpler --- diff --git a/bin/onyx b/bin/onyx index 4a8dd734..17501404 100755 Binary files a/bin/onyx and b/bin/onyx differ diff --git a/include/types.h b/include/types.h index 03574c74..448e8037 100644 --- a/include/types.h +++ b/include/types.h @@ -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; \ diff --git a/src/astnodes.c b/src/astnodes.c index 7cdbc445..f67d92b0 100644 --- a/src/astnodes.c +++ b/src/astnodes.c @@ -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 { diff --git a/src/checker.c b/src/checker.c index 0e595ae1..80a9e46c 100644 --- a/src/checker.c +++ b/src/checker.c @@ -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; diff --git a/src/polymorph.c b/src/polymorph.c index c05734bb..d072b98e 100644 --- a/src/polymorph.c +++ b/src/polymorph.c @@ -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; } diff --git a/src/types.c b/src/types.c index 84ccbd01..785e3232 100644 --- a/src/types.c +++ b/src/types.c @@ -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", "", 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 ""; - 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) { diff --git a/src/utils.c b/src/utils.c index b98a9e21..ea4eadeb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -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; diff --git a/src/wasm_type_table.c b/src/wasm_type_table.c index 4daf9d1c..a930f1bb 100644 --- a/src/wasm_type_table.c +++ b/src/wasm_type_table.c @@ -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; }