Lot's of work on Any and Type
This commit is contained in:
30
ccodegen.cpp
30
ccodegen.cpp
@@ -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("}");
|
||||
|
||||
Reference in New Issue
Block a user