Skip to content

Commit f814388

Browse files
committed
fixed: storage of union variants
1 parent 1bc0d8a commit f814388

7 files changed

Lines changed: 20 additions & 35 deletions

File tree

compiler/include/astnodes.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ typedef enum AstKind {
195195
Ast_Kind_Distinct_Type,
196196
Ast_Kind_Type_End,
197197

198-
Ast_Kind_Union_Variant,
199198
Ast_Kind_Enum_Value,
200199

201200
Ast_Kind_NumLit,
@@ -1088,7 +1087,7 @@ struct AstUnionType {
10881087
AstType_base;
10891088
char *name;
10901089

1091-
bh_arr(AstUnionVariant *) variants;
1090+
bh_arr(AstUnionVariant) variants;
10921091
bh_arr(AstTyped *) meta_tags;
10931092

10941093
AstType *tag_backing_type;

compiler/src/astnodes.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ static const char* ast_node_names[] = {
5555
"DISTINCT TYPE",
5656
"TYPE_END (BAD)",
5757

58-
"UNION VARIANT",
5958
"ENUM VALUE",
6059

6160
"NUMERIC LITERAL",

compiler/src/checker.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4357,8 +4357,7 @@ CHECK_FUNC(union, AstUnionType *u_node) {
43574357

43584358
CHECK(meta_tags, u_node->meta_tags);
43594359

4360-
bh_arr_each(AstUnionVariant *, pvariant, u_node->variants) {
4361-
AstUnionVariant *variant = *pvariant;
4360+
bh_arr_each(AstUnionVariant, variant, u_node->variants) {
43624361
track_declaration_for_symbol_info(context, variant->token->pos, (AstNode *) variant);
43634362

43644363
assert(variant->type_node);

compiler/src/clone.c

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ static inline i32 ast_kind_to_size(AstNode* node) {
113113
case Ast_Kind_Capture_Block: return sizeof(AstCaptureBlock);
114114
case Ast_Kind_Capture_Local: return sizeof(AstCaptureLocal);
115115
case Ast_Kind_Union_Type: return sizeof(AstUnionType);
116-
case Ast_Kind_Union_Variant: return sizeof(AstUnionVariant);
117116
case Ast_Kind_Procedural_Expansion: return sizeof(AstProceduralExpansion);
118117
case Ast_Kind_Code_Block: return sizeof(AstCodeBlock);
119118

@@ -411,8 +410,16 @@ AstNode* ast_clone(Context *context, void* n) {
411410
du->variants = NULL;
412411
bh_arr_new(context->gp_alloc, du->variants, bh_arr_length(su->variants));
413412

414-
bh_arr_each(AstUnionVariant *, uv, su->variants) {
415-
bh_arr_push(du->variants, (AstUnionVariant *) ast_clone(context, *uv));
413+
bh_arr_each(AstUnionVariant, uv, su->variants) {
414+
AstUnionVariant new_variant = *uv;
415+
416+
new_variant.meta_tags = NULL;
417+
bh_arr_new(context->gp_alloc, new_variant.meta_tags, bh_arr_length(su->meta_tags));
418+
bh_arr_each(AstTyped *, tag, su->meta_tags) {
419+
bh_arr_push(new_variant.meta_tags, (AstTyped *) ast_clone(context, *tag));
420+
}
421+
422+
bh_arr_push(du->variants, new_variant);
416423
}
417424

418425
du->meta_tags = NULL;
@@ -434,21 +441,6 @@ AstNode* ast_clone(Context *context, void* n) {
434441
break;
435442
}
436443

437-
case Ast_Kind_Union_Variant: {
438-
C(AstUnionVariant, type_node);
439-
440-
AstUnionVariant *du = (AstUnionVariant *) nn;
441-
AstUnionVariant *su = (AstUnionVariant *) node;
442-
443-
du->meta_tags = NULL;
444-
bh_arr_new(context->gp_alloc, du->meta_tags, bh_arr_length(su->meta_tags));
445-
bh_arr_each(AstTyped *, tag, su->meta_tags) {
446-
bh_arr_push(du->meta_tags, (AstTyped *) ast_clone(context, *tag));
447-
}
448-
449-
break;
450-
}
451-
452444
case Ast_Kind_Poly_Call_Type: {
453445
AstPolyCallType* pcd = (AstPolyCallType *) nn;
454446
AstPolyCallType* pcs = (AstPolyCallType *) node;

compiler/src/doc.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -762,9 +762,7 @@ static b32 write_doc_union_type(Context *context, bh_buffer *buffer, AstBinding
762762
bh_buffer_init(&type_buf, context->scratch_alloc, 256);
763763

764764
bh_buffer_write_u32(buffer, bh_arr_length(union_node->variants));
765-
bh_arr_each(AstUnionVariant*, puv, union_node->variants) {
766-
AstUnionVariant* uv = *puv;
767-
765+
bh_arr_each(AstUnionVariant, uv, union_node->variants) {
768766
bh_buffer_clear(&type_buf);
769767
write_type_node(context, &type_buf, uv->type_node);
770768

compiler/src/parser.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2927,17 +2927,17 @@ static AstUnionType* parse_union(OnyxParser* parser) {
29272927
break;
29282928
}
29292929

2930-
AstUnionVariant *variant = make_node(AstUnionVariant, Ast_Kind_Union_Variant);
2931-
variant->meta_tags = meta_tags;
2932-
variant->token = expect_token(parser, Token_Type_Symbol);
2930+
AstUnionVariant variant = { 0 };
2931+
variant.meta_tags = meta_tags;
2932+
variant.token = expect_token(parser, Token_Type_Symbol);
29332933

29342934
if (consume_token_if_next(parser, Token_Type_Keyword_As)) {
2935-
variant->explicit_tag_value = parse_factor(parser);
2935+
variant.explicit_tag_value = parse_factor(parser);
29362936
}
29372937

29382938
expect_token(parser, ':');
29392939

2940-
variant->type_node = parse_type(parser);
2940+
variant.type_node = parse_type(parser);
29412941

29422942
bh_arr_push(u_node->variants, variant);
29432943

compiler/src/types.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -741,8 +741,7 @@ static Type* type_build_from_ast_inner(Context *context, AstType* type_node, b32
741741

742742
//
743743
// All variants need to have type know.
744-
bh_arr_each(AstUnionVariant *, pvariant, union_->variants) {
745-
AstUnionVariant *variant = *pvariant;
744+
bh_arr_each(AstUnionVariant, variant, union_->variants) {
746745
if (!variant->type) {
747746
variant->type = type_build_from_ast_inner(context, variant->type_node, 1);
748747
}
@@ -784,8 +783,7 @@ static Type* type_build_from_ast_inner(Context *context, AstType* type_node, b32
784783

785784
//
786785
// Create variant instances
787-
bh_arr_each(AstUnionVariant *, pvariant, union_->variants) {
788-
AstUnionVariant *variant = *pvariant;
786+
bh_arr_each(AstUnionVariant, variant, union_->variants) {
789787
assert(variant->type);
790788

791789
u32 var_alignment = type_alignment_of(variant->type);

0 commit comments

Comments
 (0)