From 02bbc29f04a0281cc419ea0316320d7402b6449b Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 29 Dec 2020 21:34:32 -0600 Subject: [PATCH] working on making structs better as a whole --- docs/bugs | 2 +- docs/struct_fixes | 49 ++++++++++++ include/onyxtypes.h | 4 + onyx | Bin 287104 -> 287128 bytes progs/odin_example.onyx | 2 +- src/onyxchecker.c | 9 +-- src/onyxsymres.c | 9 ++- src/onyxtypes.c | 5 ++ tests/struct_robustness | 25 ++++++ tests/struct_robustness.onyx | 145 +++++++++++++++++++++++++++++++++++ 10 files changed, 240 insertions(+), 10 deletions(-) create mode 100644 docs/struct_fixes create mode 100644 tests/struct_robustness create mode 100644 tests/struct_robustness.onyx diff --git a/docs/bugs b/docs/bugs index 10e43eaa..b5c6a35d 100644 --- a/docs/bugs +++ b/docs/bugs @@ -53,7 +53,7 @@ List of known bugs: } ``` -[ ] Polymorphic structs do not recognize default values for members. +[X] Polymorphic structs do not recognize default values for members. [ ] `use` on struct members does not work correctly if the type is a union. ``` diff --git a/docs/struct_fixes b/docs/struct_fixes new file mode 100644 index 00000000..e9310b70 --- /dev/null +++ b/docs/struct_fixes @@ -0,0 +1,49 @@ +Currently, there are many janky things about structs in Onyx. I want +to revisit all of the code related to them and fix all the issues I +am having. To recap, here are all of the features that are required +for structs to work: + * #union + * #size + * #align + * `use` members + * struct literals + * polymorphic structs + +All of these features work well individually, but when used together +(such as struct literals over polymoprhic structs), they have many +issues. + +Here is a brief explanation of the current data model: + * AstStruct contains: + - an array of AstStructMembers + - the minimum size + - the minimum alignment + + * AstStructMembers contain: + - A symbol (token) for the name + - the initial value + + * AstStructLiterals contain: + - an array of values (unnamed) + - an array of AstStructMembers representing named values + + * AstPolyStructs contain: + - the base AstStruct + - an array of tokens representing the parameters + - the scope the struct was defined in + +In principle, this is the simple way each of the features should work: + * #union + - use 'max' instead of '+' when computing struct size + - all members have offset 0 + * #size + - the size is the minimum of the size given and the computed size + * #align + - the alignment is the minimum of the alignment given and the computed alignment + * `use` members + - adds members of used type to member list, with proper offsets + * struct literals + - ensures all values needed for the struct are present (no + automatic zero values) + * polymorphic structs + - copy the base struct, introduce the type symbols, resolve symbols, win diff --git a/include/onyxtypes.h b/include/onyxtypes.h index 15bf0856..54251639 100644 --- a/include/onyxtypes.h +++ b/include/onyxtypes.h @@ -67,6 +67,10 @@ typedef struct StructMember { // be many struct members, and iterating through an array would be // easier and less costly. - brendanfh 2020/09/17 char *name; + + struct AstTyped* initial_value; + + b32 member_was_used : 1; } StructMember; #define TYPE_KINDS \ diff --git a/onyx b/onyx index 217ea22c9838e25bdcd2712d5c3df742d11c5f87..2722db43ed545bbccaeeb50a9f94c0cc7419695f 100755 GIT binary patch delta 49520 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 delta 48994 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 == NULL) { - // HACK: This relies on the third member of the 'range' struct to exist, be the step, - // and have an initial_value. - AstStructMember* step_member = ((AstStructType *) builtin_range_type)->members[2]; - if (check_expression(&step_member->initial_value)) return 1; + type_lookup_member(expected_range_type, "step", &smem); + assert(smem.initial_value != NULL); + if (check_expression(&smem.initial_value)) return 1; - range->step = step_member->initial_value; + range->step = smem.initial_value; } return 0; diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 5f7a668a..2d0921c7 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -356,21 +356,24 @@ static void symres_struct_literal(AstStructLiteral* sl) { return; } + if (s.member_was_used) { + (*smem)->flags |= Ast_Flag_Struct_Mem_Used; + } + sl->values[s.idx] = (*smem)->initial_value; } if (sl->type->kind == Type_Kind_Struct) { - AstStructType* st = (AstStructType *) sl->type_node; bh_arr_each(StructMember*, smem, sl->type->Struct.memarr) { u32 idx = (*smem)->idx; if (sl->values[idx] == NULL) { - if (st->kind != Ast_Kind_Struct_Type || st->members[idx]->initial_value == NULL) { + if ((*smem)->initial_value == NULL) { onyx_report_error(sl->token->pos, "No value was given for the field '%s'.", (*smem)->name); return; } - sl->values[idx] = st->members[idx]->initial_value; + sl->values[idx] = (*smem)->initial_value; } } } diff --git a/src/onyxtypes.c b/src/onyxtypes.c index 0145f72e..31ffcc04 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -367,6 +367,8 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { .type = (*member)->type, .idx = idx, .name = bh_strdup(alloc, (*member)->token->text), + .member_was_used = ((*member)->flags & Ast_Flag_Struct_Mem_Used) != 0, + .initial_value = (*member)->initial_value, }; bh_table_put(StructMember, s_type->Struct.members, (*member)->token->text, smem); @@ -647,6 +649,9 @@ u32 type_get_alignment_log2(Type* type) { b32 type_lookup_member(Type* type, char* member, StructMember* smem) { if (type->kind == Type_Kind_Pointer) type = type->Pointer.elem; + smem->member_was_used = 0; + smem->initial_value = NULL; + switch (type->kind) { case Type_Kind_Struct: { TypeStruct* stype = &type->Struct; diff --git a/tests/struct_robustness b/tests/struct_robustness new file mode 100644 index 00000000..e78fd204 --- /dev/null +++ b/tests/struct_robustness @@ -0,0 +1,25 @@ +Testing a simple structure. +SimpleStruct<16, 4>(41, 67, Steve) + + +Testing a simple union. +0x3F000000 == 0x3F000000 + + +Testing a struct with default values. +DefaultedStruct(0, 1.0, 2, 3.0) +DefaultedStruct(3, 1.0, 2, 0.0) + + +Testing a struct with `use`. +StructWithUse(1234, (1.0, 2.0), 5678) +StructWithUse(1234, (1.0, 2.0), 5678) + + +Testing a polymorphic struct. +PolyStruct(1234, 5678.0) +PolyStruct(1234.0, 5678) + + +Testing a polymorphic struct with default values. +PolyStruct(1234, 5678.0) diff --git a/tests/struct_robustness.onyx b/tests/struct_robustness.onyx new file mode 100644 index 00000000..1391139e --- /dev/null +++ b/tests/struct_robustness.onyx @@ -0,0 +1,145 @@ +use package core + +main :: proc (args: [] cstr) { + + test_simple_struct(); + test_simple_union(); + test_default_values(); + test_simple_use(); + test_polymorphic(); + test_polymorphic_with_defaults(); + + test_simple_struct :: proc () { + println("Testing a simple structure."); + + SimpleStruct :: struct { + age : u16; + height : u32; + + name : str; + } + + ss := SimpleStruct.{ 41, 67, "Steve" }; + + printf("SimpleStruct<%i, %i>(%i, %i, %s)\n", + sizeof SimpleStruct, + alignof SimpleStruct, + cast(u32) ss.age, ss.height, ss.name); + } + + test_simple_union :: proc () { + println("\n\nTesting a simple union."); + + SimpleUnion :: struct #union { + int_val : i32; + float_val : f32; + } + + u : SimpleUnion; + u.float_val = 0.5; + + printf("%p == 0x3F000000\n", u.int_val); + } + + test_default_values :: proc () { + println("\n\nTesting a struct with default values."); + + DefaultedStruct :: struct { + i : i32 = 0; + f : f32 = 1; + l : i64 = 2; + d : f64 = 3; + } + + ds1 := DefaultedStruct.{}; + print_defaulted(ds1); + + ds2 := DefaultedStruct.{ i = 3, d = 0 }; + print_defaulted(ds2); + + print_defaulted :: proc (use ds: DefaultedStruct) { + printf("DefaultedStruct(%i, %f, %l, %d)\n", i, f, l, d); + } + } + + test_simple_use :: proc () { + println("\n\nTesting a struct with `use`."); + + StructWithUse :: struct { + first_member : i32; + + use used_member : UsedMember; + + last_member : i32; + } + + UsedMember :: struct { + x : f32; + y : f32; + } + + // This does not work, but it should. + // swu := StructWithUse.{ 1234, UsedMember.{ 1, 2 }, 5678 }; + + // Neither does this, but it also should. + // swu := StructWithUse.{ + // first_member = 1234, + // used_member = UsedMember.{ 1, 2 }, + // last_member = 5678, + // }; + + // This does, when all non-used members are listed out. + swu := StructWithUse.{ 1234, 1, 2, 5678 }; + + // This also does. + swu2 := StructWithUse.{ + first_member = 1234, + x = 1, + y = 2, + last_member = 5678, + }; + + print_swu :: proc (use swu: StructWithUse) { + printf("StructWithUse(%i, (%f, %f), %i)\n", + first_member, x, y, last_member); + } + + print_swu(swu); + print_swu(swu2); + } + + test_polymorphic :: proc () { + println("\n\nTesting a polymorphic struct."); + + PolyStruct :: struct ($T, $R) { + t_data : T; + r_data : R; + } + + ps1 : PolyStruct(i32, f32); + ps1.t_data = 1234; + ps1.r_data = 5678; + + printf("PolyStruct(%i, %f)\n", ps1.t_data, ps1.r_data); + + // Currently, this is how you have to do this. + ps2 := (#type PolyStruct(f32, i32)).{ 1234, 5678 }; + printf("PolyStruct(%f, %i)\n", ps2.t_data, ps2.r_data); + } + + test_polymorphic_with_defaults :: proc () { + println("\n\nTesting a polymorphic struct with default values."); + + PolyStruct :: struct ($T, $R) { + t_data : T = 1234; + r_data : R = 5678; + } + + PolyStructTyped :: #type PolyStruct(i32, f32); + + ps := PolyStructTyped.{}; + printf("PolyStruct(%i, %f)\n", ps.t_data, ps.r_data); + } +} + +#include_file "core/std/js" \ No newline at end of file -- 2.25.1