Generating proper C postfixes for types

This commit is contained in:
Krzosa Karol
2022-09-28 09:56:18 +02:00
parent e7ae3cffc6
commit 313e14b300
4 changed files with 71 additions and 43 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@
*.txt
*.4c
*.bin
*.rdbg
*.c
backup*

View File

@@ -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;

View File

@@ -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

View File

@@ -42,6 +42,8 @@ Raymarcher_Update :: ()
if hit
Screen[x + y*X] = Vec3_ConvertToARGB({1, uv.y, 0})
else;; Screen[x + y*X] = 0