added parameters to type_info for polymorphed structs
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 14 Jul 2021 20:07:08 +0000 (15:07 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 14 Jul 2021 20:07:08 +0000 (15:07 -0500)
core/type_info/type_info.onyx
src/onyxutils.c
src/onyxwasm_type_table.c

index 512970ea9eaece89c97a919e1ef91a617709842d..b51afe89cdfe12ab5aa3f51dc875ee27a197aea9 100644 (file)
@@ -141,6 +141,7 @@ Type_Info_Struct :: struct {
 
     name: str;
     members: [] Member;
+    parameters: [] any;
 }
 
 Type_Info_Compound :: struct {
index 6cad0d13a4964a52f30a26b6d4b7d5e67e3ff561..c6ea629b95503f9c8b2c44a02afe03129cae75bb 100644 (file)
@@ -703,6 +703,8 @@ static void solve_for_polymorphic_param_value(PolySolveResult* resolved, AstPoly
         *resolved = ((PolySolveResult) { PSK_Type, .actual = resolved_type });
 
     } else {
+        resolve_expression_type(value);
+
         if ((value->flags & Ast_Flag_Comptime) == 0) {
             if (err_msg) *err_msg = "Expected compile-time known argument.";
             return;
@@ -1257,6 +1259,8 @@ AstStructType* polymorphic_struct_lookup(AstPolyStructType* ps_type, bh_arr(AstP
         }
 
         if (sln->kind == PSK_Value) {
+            resolve_expression_type(sln->value);
+
             if ((sln->value->flags & Ast_Flag_Comptime) == 0) {
                 onyx_report_error(pos,
                     "Expected compile-time known argument for '%b'.",
index 936dbb4fd82b029366d8c8fc69bd79ba6b6f857b..d36c4fc26c9f0f62e86e1b3ed1ac3e8a7715d25d 100644 (file)
@@ -168,6 +168,7 @@ u64 build_type_table(OnyxWasmModule* module) {
             case Type_Kind_Struct: {
                 TypeStruct* s = &type->Struct;
                 u32* name_locations = bh_alloc_array(global_scratch_allocator, u32, s->mem_count);
+                u32* param_locations = bh_alloc_array(global_scratch_allocator, u32, bh_arr_length(s->poly_sln));
 
                 u32 i = 0;
                 bh_arr_each(StructMember*, pmem, s->memarr) {
@@ -179,6 +180,37 @@ u64 build_type_table(OnyxWasmModule* module) {
 
                 bh_buffer_align(&table_buffer, 8);
 
+                i = 0;
+                bh_arr_each(AstPolySolution, sln, s->poly_sln) {
+                    bh_buffer_align(&table_buffer, 8);
+                    param_locations[i++] = table_buffer.length;
+
+                    switch (sln->kind) {
+                        case PSK_Type: {
+                            // NOTE: This assumes a little endian compiler (which is assumed in other part of the code too)
+                            bh_buffer_append(&table_buffer, &sln->type->id, 4);
+                            break;
+                        }
+
+                        case PSK_Value: {
+                            assert(sln->value->type);
+                            u32 size = type_size_of(sln->value->type);
+
+                            bh_buffer_grow(&table_buffer, table_buffer.length + size);
+                            u8* buffer = table_buffer.data + table_buffer.length;
+                            emit_raw_data(module, buffer, sln->value);
+                            table_buffer.length += size;
+                            break;
+                        }
+
+                        default: {
+                            // Set to null if this is not known how to encode
+                            param_locations[i-1] = 0;
+                            break;
+                        }
+                    }
+                }
+
                 u32 members_base = table_buffer.length;
 
                 i = 0;
@@ -197,6 +229,19 @@ u64 build_type_table(OnyxWasmModule* module) {
                     bh_buffer_write_byte(&table_buffer, mem->initial_value != NULL ? 1 : 0);
                 }
 
+                bh_buffer_align(&table_buffer, 8);
+                u32 params_base = table_buffer.length;
+
+                i = 0;
+                bh_arr_each(AstPolySolution, sln, s->poly_sln) {
+                    bh_buffer_align(&table_buffer, 8);
+                    PATCH;
+                    bh_buffer_write_u64(&table_buffer, param_locations[i++]);
+
+                    if (sln->kind == PSK_Type) bh_buffer_write_u32(&table_buffer, basic_types[Basic_Kind_Type_Index].id);
+                    else                       bh_buffer_write_u32(&table_buffer, sln->value->type->id);
+                }
+
                 u32 name_base = 0;
                 u32 name_length = 0;
                 if (s->name) {
@@ -217,6 +262,9 @@ u64 build_type_table(OnyxWasmModule* module) {
                 PATCH;
                 bh_buffer_write_u64(&table_buffer, members_base);
                 bh_buffer_write_u64(&table_buffer, s->mem_count);
+                PATCH;
+                bh_buffer_write_u64(&table_buffer, params_base);
+                bh_buffer_write_u64(&table_buffer, bh_arr_length(s->poly_sln));
 
                 break;
             }