struct member defaults are processed later in the pipeline
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 Jan 2021 15:26:22 +0000 (09:26 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 Jan 2021 15:26:22 +0000 (09:26 -0600)
bin/onyx
build.sh
include/onyxastnodes.h
src/onyx.c
src/onyxsymres.c
src/onyxutils.c

index bd63eb032a4fcde930ab2c4387f3ad915c3d4ee7..6ea6feebf02c890c805e4a8d137968b5a8c11245 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 7d326e927e5f1b6925ac301041f85d95a9562dea..9462fc75b3d268b6e18038bef5c0eaa3a3d19a7c 100644 (file)
--- a/build.sh
+++ b/build.sh
@@ -3,9 +3,14 @@
 C_FILES="onyx onyxbuiltins onyxchecker onyxclone onyxdoc onyxentities onyxerrors onyxlex onyxparser onyxsempass onyxsymres onyxtypes onyxutils onyxwasm"
 TARGET='./bin/onyx'
 CC='gcc'
-FLAGS='-O3 -I./include'
-BUILD_DIR='./build'
 
+if [ "$1" = "debug" ]; then
+    FLAGS='-g3 -I./include'
+else
+    FLAGS='-O3 -I./include'
+fi
+
+BUILD_DIR='./build'
 mkdir -p "$BUILD_DIR"
 
 for file in $C_FILES ; do
index 315ab55b7f910fcbdc1f986d102344013e02d037..57ebca9a1abf67c6682061ae0b63172ca2317772 100644 (file)
@@ -807,6 +807,7 @@ typedef enum EntityType {
     Entity_Type_Foreign_Global_Header,
     Entity_Type_Function_Header,
     Entity_Type_Global_Header,
+    Entity_Type_Struct_Member_Default,
     Entity_Type_Memory_Reservation,
     Entity_Type_Expression,
     Entity_Type_Global,
index 9f7874569c50a3c76bb11e993cbd283216ac3332..87ef6ebb281c93e0102ccb3bcf324912a3a68462 100644 (file)
@@ -338,9 +338,14 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res
                 break;
             }
 
-            case Ast_Kind_Type_Alias:
             case Ast_Kind_Struct_Type:
             case Ast_Kind_Poly_Struct_Type: {
+                ent.type = Entity_Type_Struct_Member_Default;
+                ent.type_alias = (AstType *) node;
+                entity_heap_insert(&compiler_state->prog_info.entities, ent);
+                // fallthrough
+            }
+            case Ast_Kind_Type_Alias: {
                 ent.type = Entity_Type_Type_Alias;
                 ent.type_alias = (AstType *) node;
                 entity_heap_insert(&compiler_state->prog_info.entities, ent);
index 97749ccff4a92f9ff5355d7154643d111604ac21..a4d0a52ac4e912d171fd56996013c757a71ede17 100644 (file)
@@ -33,6 +33,7 @@ static void symres_use_package(AstUsePackage* package);
 static void symres_enum(AstEnumType* enum_node);
 static void symres_memres_type(AstMemRes** memres);
 static void symres_memres(AstMemRes** memres);
+static void symres_struct_defaults(AstType* st);
 
 static AstFieldAccess* make_field_access(AstTyped* node, char* field) {
     AstFieldAccess* fa = onyx_ast_node_new(semstate.node_allocator, sizeof(AstFieldAccess), Ast_Kind_Field_Access);
@@ -147,10 +148,6 @@ AstType* symres_type(AstType* type) {
                     return type;
                 }
             }
-
-            if (member->initial_value != NULL) {
-                symres_expression(&member->initial_value);
-            }
         }
 
         return type;
@@ -897,6 +894,32 @@ static void symres_memres(AstMemRes** memres) {
     }
 }
 
+static void symres_struct_defaults(AstType* t) {
+    switch (t->kind) {
+        case Ast_Kind_Struct_Type: {
+            AstStructType* st = (AstStructType *) t;
+            bh_arr_each(AstStructMember *, smem, st->members) {
+                if ((*smem)->initial_value != NULL) {
+                    symres_expression(&(*smem)->initial_value);
+                }
+            }
+            break;
+        }
+
+        case Ast_Kind_Poly_Struct_Type: {
+            AstPolyStructType* st = (AstPolyStructType *) t;
+            bh_arr_each(AstStructMember *, smem, st->base_struct->members) {
+                if ((*smem)->initial_value != NULL) {
+                    symres_expression(&(*smem)->initial_value);
+                }
+            }
+            break;
+        }
+
+        default: break;
+    }
+}
+
 static void symres_polyproc(AstPolyProc* pp) {
     pp->poly_scope = semstate.curr_scope;
 }
@@ -933,6 +956,7 @@ void symres_entity(Entity* ent) {
         case Entity_Type_Memory_Reservation:      symres_memres(&ent->mem_res); break;
         case Entity_Type_Polymorphic_Proc:        symres_polyproc(ent->poly_proc); break;
         case Entity_Type_String_Literal:          symres_expression(&ent->expr); break;
+        case Entity_Type_Struct_Member_Default:   symres_struct_defaults((AstType *) ent->type_alias); break;
 
         default: break;
     }
index 4a2c57bda34e14311195e64e2e893e70192bb745..51530275751b53b130d41ea6dd1841a844478ff1 100644 (file)
@@ -122,6 +122,7 @@ const char* entity_type_strings[Entity_Type_Count] = {
     "Foreign_Global Header",
     "Function Header",
     "Global Header",
+    "Struct Member Default",
     "Memory Reservation",
     "Expression",
     "Global",