type_info fix (hopefully)
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 20 Jul 2021 03:18:32 +0000 (22:18 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 20 Jul 2021 03:18:32 +0000 (22:18 -0500)
bin/onyx
include/onyxastnodes.h
src/onyxbuiltins.c
src/onyxtypes.c
src/onyxwasm.c
src/onyxwasm_type_table.c

index 9311233c2492a1ddbad21d2d6b89f66dd07fb467..320e82c9f9b8beb07f9924139a19e387012f63b4 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 790b10e284a35950cd9eee73899bd41a697af1a8..6273059ad71b99c40eefc5bf9e99a66671924503 100644 (file)
@@ -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;
index 49f5bbb4f54e5b4b170e5b01dd01bc8145f79992..161022fc02c73e1a9eced96e10bcda18b1e30288 100644 (file)
@@ -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 } };
 
index e0a21e14e3bc00364f6d177bd44ce738d7b016dd..94bd3568da7925d1de17c99d17e6ad347d3df9a9 100644 (file)
@@ -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);
 }
index 155233025525ef0de66f6229be9556a52ec4713e..6d90994b2cc841d53616cbc24d5c55f292ef2e6c 100644 (file)
@@ -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;
index 86b229590c0a9697ef6fc5fc65963ac29dc72228..c8bf7238726fc7ad6f35bbc97a51f629ff6e24b8 100644 (file)
@@ -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);