From: Brendan Hansen Date: Tue, 20 Jul 2021 03:18:32 +0000 (-0500) Subject: type_info fix (hopefully) X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=edf25cbbe28d4e4a1ee9af0c0dce37a68b523934;p=onyx.git type_info fix (hopefully) --- diff --git a/bin/onyx b/bin/onyx index 9311233c..320e82c9 100755 Binary files a/bin/onyx and b/bin/onyx differ diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 790b10e2..6273059a 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -710,7 +710,7 @@ struct AstSwitch { u32 flags; \ OnyxToken* token; \ struct Entity* entity; \ - char* name; \ + u64 type_id; \ void* __unused; \ Type* type struct AstType { AstType_base; }; @@ -724,6 +724,7 @@ struct AstDynArrType { AstType_base; AstType* elem; }; struct AstVarArgType { AstType_base; AstType* elem; }; struct AstStructType { AstType_base; + char *name; bh_arr(AstStructMember *) members; @@ -751,6 +752,7 @@ struct AstPolyStructParam { }; struct AstPolyStructType { AstType_base; + char *name; Scope *scope; bh_arr(AstPolyStructParam) poly_params; @@ -768,6 +770,7 @@ struct AstPolyCallType { }; struct AstEnumType { AstType_base; + char *name; Scope *scope; AstType *backing; diff --git a/src/onyxbuiltins.c b/src/onyxbuiltins.c index 49f5bbb4..161022fc 100644 --- a/src/onyxbuiltins.c +++ b/src/onyxbuiltins.c @@ -3,33 +3,33 @@ #include "onyxerrors.h" #include "onyxutils.h" -AstBasicType basic_type_void = { Ast_Kind_Basic_Type, 0, NULL, NULL, "void" , NULL, NULL, &basic_types[Basic_Kind_Void] }; -AstBasicType basic_type_bool = { Ast_Kind_Basic_Type, 0, NULL, NULL, "bool" , NULL, NULL, &basic_types[Basic_Kind_Bool] }; -AstBasicType basic_type_i8 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "i8" , NULL, NULL, &basic_types[Basic_Kind_I8] }; -AstBasicType basic_type_u8 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "u8" , NULL, NULL, &basic_types[Basic_Kind_U8] }; -AstBasicType basic_type_i16 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "i16" , NULL, NULL, &basic_types[Basic_Kind_I16] }; -AstBasicType basic_type_u16 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "u16" , NULL, NULL, &basic_types[Basic_Kind_U16] }; -AstBasicType basic_type_i32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "i32" , NULL, NULL, &basic_types[Basic_Kind_I32] }; -AstBasicType basic_type_u32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "u32" , NULL, NULL, &basic_types[Basic_Kind_U32] }; -AstBasicType basic_type_i64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "i64" , NULL, NULL, &basic_types[Basic_Kind_I64] }; -AstBasicType basic_type_u64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "u64" , NULL, NULL, &basic_types[Basic_Kind_U64] }; -AstBasicType basic_type_f32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "f32" , NULL, NULL, &basic_types[Basic_Kind_F32] }; -AstBasicType basic_type_f64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, "f64" , NULL, NULL, &basic_types[Basic_Kind_F64] }; -AstBasicType basic_type_rawptr = { Ast_Kind_Basic_Type, 0, NULL, NULL, "rawptr", NULL, NULL, &basic_types[Basic_Kind_Rawptr] }; -AstBasicType basic_type_type_expr = { Ast_Kind_Basic_Type, 0, NULL, NULL, "type_expr", NULL, NULL, &basic_types[Basic_Kind_Type_Index] }; +AstBasicType basic_type_void = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Void] }; +AstBasicType basic_type_bool = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Bool] }; +AstBasicType basic_type_i8 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I8] }; +AstBasicType basic_type_u8 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U8] }; +AstBasicType basic_type_i16 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I16] }; +AstBasicType basic_type_u16 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U16] }; +AstBasicType basic_type_i32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I32] }; +AstBasicType basic_type_u32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U32] }; +AstBasicType basic_type_i64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I64] }; +AstBasicType basic_type_u64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U64] }; +AstBasicType basic_type_f32 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F32] }; +AstBasicType basic_type_f64 = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F64] }; +AstBasicType basic_type_rawptr = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Rawptr] }; +AstBasicType basic_type_type_expr = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Type_Index] }; // NOTE: Types used for numeric literals -AstBasicType basic_type_int_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, "unsized_int", NULL, NULL, &basic_types[Basic_Kind_Int_Unsized] }; -AstBasicType basic_type_float_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, "unsized_float", NULL, NULL, &basic_types[Basic_Kind_Float_Unsized] }; +AstBasicType basic_type_int_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Int_Unsized] }; +AstBasicType basic_type_float_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Float_Unsized] }; static OnyxToken simd_token = { Token_Type_Symbol, 0, "", { 0 } }; -AstBasicType basic_type_i8x16 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "i8x16", NULL, NULL, &basic_types[Basic_Kind_I8X16] }; -AstBasicType basic_type_i16x8 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "i16x8", NULL, NULL, &basic_types[Basic_Kind_I16X8] }; -AstBasicType basic_type_i32x4 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "i32x4", NULL, NULL, &basic_types[Basic_Kind_I32X4] }; -AstBasicType basic_type_i64x2 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "i64x2", NULL, NULL, &basic_types[Basic_Kind_I64X2] }; -AstBasicType basic_type_f32x4 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "f32x4", NULL, NULL, &basic_types[Basic_Kind_F32X4] }; -AstBasicType basic_type_f64x2 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "f64x2", NULL, NULL, &basic_types[Basic_Kind_F64X2] }; -AstBasicType basic_type_v128 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, "v128", NULL, NULL, &basic_types[Basic_Kind_V128] }; +AstBasicType basic_type_i8x16 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I8X16] }; +AstBasicType basic_type_i16x8 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I16X8] }; +AstBasicType basic_type_i32x4 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I32X4] }; +AstBasicType basic_type_i64x2 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I64X2] }; +AstBasicType basic_type_f32x4 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F32X4] }; +AstBasicType basic_type_f64x2 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F64X2] }; +AstBasicType basic_type_v128 = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_V128] }; OnyxToken builtin_package_token = { Token_Type_Symbol, 7, "builtin ", { 0 } }; diff --git a/src/onyxtypes.c b/src/onyxtypes.c index e0a21e14..94bd3568 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -47,6 +47,7 @@ static bh_imap type_vararg_map; static void type_register(Type* type) { static u32 next_unique_id = 1; type->id = next_unique_id++; + if (type->ast_type) type->ast_type->type_id = type->id; bh_imap_put(&type_map, type->id, (u64) type); } diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 15523302..6d90994b 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -2343,8 +2343,13 @@ EMIT_FUNC(expression, AstTyped* expr) { bh_arr(WasmInstruction) code = *pcode; if (node_is_type((AstNode *) expr)) { - Type* type = type_build_from_ast(context.ast_alloc, (AstType *) expr); - WID(WI_I32_CONST, type->id); + AstType* type = (AstType *) expr; + if (type->type_id != 0) { + WID(WI_I32_CONST, ((AstType *) expr)->type_id); + } else { + Type* t = type_build_from_ast(context.ast_alloc, type); + WID(WI_I32_CONST, t->id); + } *pcode = code; return; diff --git a/src/onyxwasm_type_table.c b/src/onyxwasm_type_table.c index 86b22959..c8bf7238 100644 --- a/src/onyxwasm_type_table.c +++ b/src/onyxwasm_type_table.c @@ -10,8 +10,8 @@ u64 build_type_table(OnyxWasmModule* module) { #define PATCH (bh_arr_push(base_patch_locations, table_buffer.length)) // This is the data behind the "type_table" slice in type_info.onyx - u32 type_count = bh_arr_length(type_map.entries) + 2; - u64* table_info = bh_alloc_array(global_heap_allocator, u64, type_count + 4); // HACK + u32 type_count = bh_arr_length(type_map.entries) + 1; + u64* table_info = bh_alloc_array(global_heap_allocator, u64, type_count); // HACK bh_buffer table_buffer; bh_buffer_init(&table_buffer, global_heap_allocator, 4096);