Lot's of work on Any and Type

This commit is contained in:
Krzosa Karol
2022-06-19 15:28:18 +02:00
parent 014ef07b9f
commit 79edfae55b
7 changed files with 48 additions and 43 deletions

View File

@@ -178,7 +178,7 @@ gen_value(Value a){
assert(a.type == type_pointer_to_char);
gen("\"%Q\"", a.intern_val);
} else{
gen("LIT(\"%Q\")", a.intern_val);
gen("(String){(U8 *)\"%Q\", %d}", a.intern_val, a.intern_val.len);
}
break;
CASE_BOOL: a.bool_val ? gen("true"):gen("false"); break;
@@ -255,13 +255,6 @@ gen_lambda(Intern_String name, Ast_Lambda *lambda, B32 generate_block = true){
function bool
gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
if(is_any(type_of_var)){
gen("(Any){&");
gen_expr(ast);
gen(", %d}", ast->resolved_type->type_id);
return true;
}
switch(ast->kind){
CASE(IDENT, Atom){
if(node->resolved_decl->kind == AST_MODULE_NAMESPACE || node->resolved_decl->kind == AST_FILE_NAMESPACE)
@@ -344,21 +337,9 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
CASE(UNARY, Unary){
gen("(");
if(node->op != TK_PostIncrement && node->op != TK_PostDecrement){
if(node->op == TK_Pointer){
// Normal types are usually generated with gen_simple_decl
// if they are part of the expression they are a value
// which means we need to shortcircuit here with proper type_id
Ast_Type *base = get_type_base(node->resolved_type);
if(base == type_type){
gen("%d)", node->resolved_type_val->type_id);
return true;
}
}
gen("%s", name(node->op));
}
if(node->op != TK_PostIncrement && node->op != TK_PostDecrement) gen("%s", name(node->op));
gen_expr(node->expr);
if(node->op == TK_PostIncrement || node->op == TK_PostDecrement) gen("%s", name(node->op));
if(node->op == TK_PostIncrement || node->op == TK_PostDecrement) gen("%s", name(node->op));
gen(")");
BREAK();
}
@@ -398,7 +379,7 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
gen(".%Q = ", it->resolved_name);
else if(is_array(node->resolved_type))
gen("[%d] = ", (int)it->resolved_index);
gen_expr(it->item);
gen_expr(it->item, it->resolved_type);
if(!node->exprs.is_last(&it)) gen(", ");
}
gen("}");
@@ -832,7 +813,6 @@ typedef struct String{
U8 *str;
S64 len;
}String;
#define LIT(x) (String){.str=(U8 *)x, .len=sizeof(x)-1}
#define assert(x) do{if(!(x))__debugbreak();}while(0)
#define assert_msg(x,...) assert(x)
@@ -919,7 +899,7 @@ typedef struct String{
gen(".struct_member_count = %d, ", it->agg.members.len);
gen(".struct_members = (Type_Info_Struct_Member[]){");
For_Named(it->agg.members, m){
gen("{.name = LIT(\"%Q\"), .type = %d, .offset = %d}, ", m.name, m.type->type_id, m.offset);
gen("{.name = (String){(U8 *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
}
gen("}");