From 0ed4f6255753f517f93e4a40ddc449dd481f5c83 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 18 Jun 2022 15:24:54 +0200 Subject: [PATCH] Fix #strict regression, adding Any and Type_Info --- ccodegen.cpp | 2 ++ parsing.cpp | 3 ++- programs/base.kl | 2 +- programs/main.kl | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ types.h | 43 ++++----------------------------------- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/ccodegen.cpp b/ccodegen.cpp index aaa144f..0cb4eb4 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -641,6 +641,7 @@ function void insert_builtin_into_scope(Ast_Scope *p, String name, Ast_Type *type){ Intern_String string = pctx->intern(name); Ast_Decl *decl = ast_type(0, string, type); + type->type_id = pctx->type_ids++; decl->parent_scope = p; decl->state = DECL_RESOLVED; insert_into_scope(p, decl); @@ -663,6 +664,7 @@ insert_builtin_types_into_scope(Ast_Scope *p){ insert_builtin_into_scope(p, "U64"_s, type_u64); insert_builtin_into_scope(p, "F32"_s, type_f32); insert_builtin_into_scope(p, "F64"_s, type_f64); + insert_builtin_into_scope(p, "Any"_s, type_any); } global F64 parsing_time_begin; diff --git a/parsing.cpp b/parsing.cpp index baf4413..5f6ffb1 100644 --- a/parsing.cpp +++ b/parsing.cpp @@ -734,10 +734,10 @@ parse_decl(B32 is_global){ } } + Ast_Flag flags = 0; Token *tname = token_get(); if(token_match(TK_Identifier, TK_DoubleColon)){ - Ast_Flag flags = 0; if(token_match_pound(intern_foreign)){ set_flag(flags, AST_FOREIGN); } else if(token_match_pound(intern_strict)){ @@ -794,6 +794,7 @@ parse_decl(B32 is_global){ } if(result){ + set_flag(result->flags, flags); result->name = tname->intern_val; } diff --git a/programs/base.kl b/programs/base.kl index fcd0870..0509538 100644 --- a/programs/base.kl +++ b/programs/base.kl @@ -1,5 +1,5 @@ Os :: #import "os_windows.kl" -SizeU :: #strict U64 +SizeU :: U64 arena_di: U64 Arena :: struct diff --git a/programs/main.kl b/programs/main.kl index 5a8d313..10d24ce 100644 --- a/programs/main.kl +++ b/programs/main.kl @@ -14,6 +14,59 @@ Windows_Bitmap :: struct hdc: HDC dib: HBITMAP +Type_ID :: U64 +Type_Info_Kind :: enum + TYPE_NONE + TYPE_S64 // FIRST_NUMERIC + TYPE_S32 + TYPE_S16 + TYPE_S8 + TYPE_INT + TYPE_CHAR + TYPE_U64 + TYPE_U32 + TYPE_U16 + TYPE_U8 + TYPE_F32 + TYPE_F64 + TYPE_POINTER + TYPE_BOOL // LAST_NUMERIC + TYPE_STRING + TYPE_VOID + TYPE_ARRAY + TYPE_LAMBDA + TYPE_STRUCT + TYPE_UNION + TYPE_ENUM + TYPE_TYPE + TYPE_SLICE + TYPE_TUPLE + TYPE_ANY + +Any :: struct + data: *void + type: Type_ID + +Type_Info_Struct_Field :: struct + name: String + type: Type_ID + offset: S32 + +Type_Info :: struct + kind: Type_Info_Kind + size: S32 + align: S32 + is_unsigned: Bool + type_id: Type_ID + + base_type: Type_ID + array_size: S32 + struct_member_count: S32 + fields: *Type_Info_Struct_Field + +type_infos: []*Type_Info + + Bitmap :: struct size: Vec2I data: *U32 diff --git a/types.h b/types.h index 41bb584..289d4af 100644 --- a/types.h +++ b/types.h @@ -33,6 +33,7 @@ enum Ast_Type_Kind{ TYPE_TYPE, TYPE_SLICE, TYPE_TUPLE, + TYPE_ANY, TYPE_UNTYPED_FIRST = TYPE_UNTYPED_BOOL, TYPE_UNTYPED_LAST = TYPE_UNTYPED_STRING, @@ -103,45 +104,6 @@ struct Ast_Type{ }; }; -function const char * -docname(Ast_Type *type){ - switch(type->kind){ - case TYPE_NONE: return "[Invalid Ast_Type]"; - case TYPE_COMPLETING: return "[Completing]"; - case TYPE_INCOMPLETE: return "[Incomplete]"; - case TYPE_UNTYPED_BOOL: return "[Untyped_Bool]"; - case TYPE_UNTYPED_INT: return "[Untyped_Int]"; - case TYPE_UNTYPED_FLOAT: return "[Untyped_Float]"; - case TYPE_UNTYPED_STRING: return "[Untyped_String]"; - case TYPE_S64: return "[S64]"; - case TYPE_S32: return "[S32]"; - case TYPE_S16: return "[S16]"; - case TYPE_S8: return "[S8]"; - case TYPE_U64: return "[U64]"; - case TYPE_U32: return "[U32]"; - case TYPE_U16: return "[U16]"; - case TYPE_U8: return "[U8]"; - case TYPE_F32: return "[Float32]"; - case TYPE_F64: return "[Float64]"; - case TYPE_BOOL: return "[Bool]"; - case TYPE_STRING: return "[String]"; - case TYPE_CHAR: return "[char]"; - case TYPE_INT: return "[int]"; - case TYPE_VOID: return "[void]"; - case TYPE_POINTER: return "[Pointer]"; - case TYPE_ARRAY: return "[Array]"; - case TYPE_LAMBDA: return "[Lambda]"; - case TYPE_STRUCT: return "[Struct]"; - case TYPE_UNION: return "[Union]"; - case TYPE_ENUM: return "[Enum]"; - case TYPE_TYPE: return "[Type]"; - case TYPE_SLICE: return "[Slice]"; - case TYPE_TUPLE: return "[Tuple]"; - invalid_default_case; - } - return ""; -} - function const char * name(Ast_Type *type){ switch(type->kind){ @@ -174,6 +136,7 @@ global Ast_Type type__void = {TYPE_VOID}; global Ast_Type type__string = {TYPE_STRING, sizeof(String), __alignof(String)}; global Ast_Type type__bool = {TYPE_BOOL, sizeof(bool), __alignof(bool)}; global Ast_Type type__type = {TYPE_TYPE}; +global Ast_Type type__any = {TYPE_ANY}; global Ast_Type type__f32 = {TYPE_F32, sizeof(F32), __alignof(F32)}; global Ast_Type type__f64 = {TYPE_F64, sizeof(F64), __alignof(F64)}; @@ -201,6 +164,7 @@ global Ast_Type *type_pointer_to_char; // Needs to be inited at runtime global Ast_Type *type_void = &type__void; global Ast_Type *type_pointer_to_void; // Needs to be inited at runtime +global Ast_Type *type_any = &type__any; global Ast_Type *type_type = &type__type; global Ast_Type *type_string = &type__string; global Ast_Type *type_bool = &type__bool; @@ -226,6 +190,7 @@ global Ast_Type *untyped_float = &type__untyped_float; //----------------------------------------------------------------------------- // Type constructors and utillities //----------------------------------------------------------------------------- +force_inline B32 is_any(Ast_Type *a){return a->kind == TYPE_ANY;} force_inline B32 is_struct(Ast_Type *a){return a->kind == TYPE_STRUCT;} force_inline B32 is_lambda(Ast_Type *a){return a->kind == TYPE_LAMBDA;} force_inline B32 is_array(Ast_Type *a){return a->kind == TYPE_ARRAY;}