From: Brendan Hansen Date: Wed, 14 Jul 2021 20:07:08 +0000 (-0500) Subject: added parameters to type_info for polymorphed structs X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=9e6b289d981cc69aaccad7c3b7defb9ca394b783;p=onyx.git added parameters to type_info for polymorphed structs --- diff --git a/core/type_info/type_info.onyx b/core/type_info/type_info.onyx index 512970ea..b51afe89 100644 --- a/core/type_info/type_info.onyx +++ b/core/type_info/type_info.onyx @@ -141,6 +141,7 @@ Type_Info_Struct :: struct { name: str; members: [] Member; + parameters: [] any; } Type_Info_Compound :: struct { diff --git a/src/onyxutils.c b/src/onyxutils.c index 6cad0d13..c6ea629b 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -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'.", diff --git a/src/onyxwasm_type_table.c b/src/onyxwasm_type_table.c index 936dbb4f..d36c4fc2 100644 --- a/src/onyxwasm_type_table.c +++ b/src/onyxwasm_type_table.c @@ -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; }