diff --git a/.gitignore b/.gitignore index c1ac5aa..6a8fef2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.txt *.4c *.bin +*.rdbg *.c backup* diff --git a/core_codegen_c_language.cpp b/core_codegen_c_language.cpp index f1e501f..07fe335 100644 --- a/core_codegen_c_language.cpp +++ b/core_codegen_c_language.cpp @@ -154,19 +154,39 @@ gen_string_simple_decl(Allocator *a, Ast_Type *ast, String name){ return result; } +function String +get_type_postfix(Ast_Type *type){ + switch(type->kind) { + case TYPE_F32: return "f"_s; break; + case TYPE_U64: return "ULL"_s; break; + case TYPE_S64: return "LL"_s; break; + case TYPE_F64:case TYPE_S8:case TYPE_S16: + case TYPE_S32:case TYPE_U8:case TYPE_U16: + case TYPE_INT:case TYPE_U32:case TYPE_CHAR: + return ""_s; + break; + invalid_default_case; + } + assert(!"Unhandled case or error"); + return ""_s; +} + function B32 gen_value(Token *pos, Value a){ if(is_untyped(a.type)) compiler_error(pos, "Internal compiler error: Untyped got propagated to the codegen stage"); B32 result = true; - if(is_enum(a.type)) - goto integer; - switch(a.type->kind){ + Ast_Type *type = a.type; + if(is_enum(a.type)){ + type = a.type->base; + } + + switch(type->kind){ CASE_INT: { - integer: Scratch scratch; + String postfix = get_type_postfix(type); const char *string = bigint_to_error_string(scratch, &a.big_int_val, 10); - gen("%s", string); + gen("%s%Q", string, postfix); }break; case TYPE_POINTER:{ if(a.type == type_pointer_to_char){ @@ -181,7 +201,10 @@ gen_value(Token *pos, Value a){ gen("(String){(U8 *)\"%Q\", %d}", a.intern_val, a.intern_val.len); break; CASE_BOOL: a.bool_val ? gen("true"):gen("false"); break; - CASE_FLOAT: gen("%f", a.f64_val); break; + CASE_FLOAT: { + String postfix = get_type_postfix(type); + gen("%f%Q", a.f64_val, postfix); + }break; case TYPE_TYPE: { gen("%d", a.type_val->type_id); }break; diff --git a/core_main.cpp b/core_main.cpp index b5151ce..1da7b52 100644 --- a/core_main.cpp +++ b/core_main.cpp @@ -1,4 +1,43 @@ /* + +- [ ] Basic + - [ ] Pass size and alignment calculations to C ? + - [ ] Fix . operator lookups + - [ ] Combining casts with . operator + - [ ] Disable .len for Strings, are there other things that use this convention? + +- [ ] Builtin data structures + - [ ] Fix Length etc. they should be function calls not operators + - [ ] Strings probably should have len() instead of string.len + - [ ] Slices + - [ ] Some way to take slice of data + - [ ] Tuples + - [ ] Dynamic arrays + - [ ] Hash tables + +- [ ] C Codegen + - [ ] Function renaming to prevent colissions, we can't really touch other stuff cause I want it to be easily debuggable + +- [ ] Programming constructs + - [ ] Using language construct + - [ ] Function polimorphism + - [ ] Operator Overloading + - [ ] Named loops and breaking out of them + +- [ ] Bytecode interpreter + - [ ] Ir + - [ ] Interpreter + - [ ] Code generation + +- [ ] Parametric Polymorphism + +- [ ] Conditional compilation #if (maybe just do something like a conditional load or import?) #import "windows.kl" when os == "windows" + +- [ ] Any + - [ ] Assigning to any values like ints etc. should work perhaps? But what type they should have? + - [ ] Var args using any + - [ ] Slice of Any should work well + ------------------------------------------------------------------------------- 2022.05.28 - On lambda expressions @@ -56,43 +95,6 @@ For modules it's a bit different cause they should be distributed as valid. ------------------------------------------------------------------------------- -- [ ] Basic - - [ ] Pass size and alignment calculations to C ? - - [ ] Fix . operator lookups - - [ ] Combining casts with . operator - -- [ ] Builtin data structures - - [ ] Fix Length etc. they should be function calls not operators - - [ ] Strings probably should have len() instead of string.len - - [ ] Slices - - [ ] Some way to take slice of data - - [ ] Tuples - - [ ] Dynamic arrays - - [ ] Hash tables - -- [ ] C Codegen - - [ ] Function renaming to prevent colissions, we can't really touch other stuff cause I want it to be easily debuggable - -- [ ] Programming constructs - - [ ] Using language construct - - [ ] Function polimorphism - - [ ] Operator Overloading - - [ ] Named loops and breaking out of them - -- [ ] Bytecode interpreter - - [ ] Ir - - [ ] Interpreter - - [ ] Code generation - -- [ ] Parametric Polymorphism - -- [ ] Conditional compilation #if (maybe just do something like a conditional load or import?) #import "windows.kl" when os == "windows" - - -- [ ] Any - - [ ] Assigning to any values like ints etc. should work perhaps? But what type they should have? - - [ ] Var args using any - - [ ] Slice of Any should work well - [ ] Probably need to give Ast_Expr a Value field, then I can express Type nicely - [ ] I would love for String, slice, Any etc. to have their struct declarations in source files, I also would want for stuff like string.str to work without weird special cases diff --git a/examples/raymarcher.kl b/examples/raymarcher.kl index e4e9cd1..391788f 100644 --- a/examples/raymarcher.kl +++ b/examples/raymarcher.kl @@ -41,6 +41,8 @@ Raymarcher_Update :: () if hit Screen[x + y*X] = Vec3_ConvertToARGB({1, uv.y, 0}) + + else;; Screen[x + y*X] = 0