diff --git a/ccodegen.cpp b/ccodegen.cpp index 82c962b..51bf993 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -183,6 +183,9 @@ gen_value(Value a){ break; CASE_BOOL: a.bool_val ? gen("true"):gen("false"); break; CASE_FLOAT: gen("%f", a.f64_val); break; + case TYPE_TYPE: { + gen("%d", a.type_val->type_id); + }break; default: result = false; } return result; @@ -668,6 +671,7 @@ insert_builtin_types_into_scope(Ast_Scope *p){ 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); + insert_builtin_into_scope(p, "Type"_s, type_type); } global F64 parsing_time_begin; diff --git a/programs/language.kl b/programs/language.kl index c726548..4ceb6ac 100644 --- a/programs/language.kl +++ b/programs/language.kl @@ -66,7 +66,8 @@ Type_Info :: struct type_infos_len: S32 #foreign type_infos : *Type_Info #foreign -get_type_info :: (id: Type_ID): *Type_Info +get_type_info :: (type: Type): *Type_Info + id := type->S32 if id >= type_infos_len return 0 return type_infos + id \ No newline at end of file diff --git a/programs/main.kl b/programs/main.kl index 1655f06..385a731 100644 --- a/programs/main.kl +++ b/programs/main.kl @@ -60,7 +60,7 @@ WinMain :: (hInstance: HINSTANCE, hPrevInstance: HINSTANCE, lpCmdLine: LPSTR, nS if good_scheduling := false, timeBeginPeriod(1) == TIMERR_NOERROR good_scheduling = true - char_info := get_type_info(5) + char_info := get_type_info(char) assert(char_info.kind == Type_Info_Kind.CHAR) arena: Arena diff --git a/typechecking.cpp b/typechecking.cpp index 65abc81..36449db 100644 --- a/typechecking.cpp +++ b/typechecking.cpp @@ -641,6 +641,11 @@ resolve_cast(Ast_Binary *node){ node->before_type = expr.type; switch(expr.type->kind){ + case TYPE_TYPE:{ + if(is_int(type)){ + expr.type = type; + } else goto failure; + } break; case TYPE_ENUM:{ if(is_int(type)) expr.type = type; diff --git a/types.h b/types.h index 1a3595e..a571101 100644 --- a/types.h +++ b/types.h @@ -124,6 +124,7 @@ name(Ast_Type *type){ case TYPE_U64: return "U64"; case TYPE_ANY: return "Any"; case TYPE_TUPLE: return "Tuple"; + case TYPE_TYPE: return "S64"; invalid_default_case; } return "";