Codegen basic arrays with size attached

This commit is contained in:
Krzosa Karol
2022-06-07 17:38:15 +02:00
parent ec89defb5d
commit 9cdc5ee6c9
7 changed files with 118 additions and 42 deletions

View File

@@ -20,7 +20,7 @@ gen_indent(){
function void
gen_simple_decl_prefix(Ast_Resolved_Type *ast){
switch(ast->kind){
case TYPE_POINTER:{gen_simple_decl_prefix(ast->base); gen("*");} break;
case TYPE_POINTER: gen_simple_decl_prefix(ast->base); gen("*"); break;
case TYPE_ARRAY: gen_simple_decl_prefix(ast->base); break;
case TYPE_LAMBDA:break;
case TYPE_ENUM:
@@ -37,7 +37,12 @@ function void
gen_simple_decl_postfix(Ast_Resolved_Type *ast){
switch(ast->kind){
case TYPE_POINTER: gen_simple_decl_postfix(ast->base); break;
case TYPE_ARRAY: gen("[%d]", (int)ast->arr.size); gen_simple_decl_postfix(ast->arr.base); break;
case TYPE_ARRAY:
gen("[");
if(ast->arr.size != ARRAY_SIZE_INFERRED)
gen("%d", (int)ast->arr.size);
gen("]");
gen_simple_decl_postfix(ast->arr.base); break;
case TYPE_LAMBDA:break;
case TYPE_ENUM: case TYPE_STRUCT:break;
default: name(ast);
@@ -59,14 +64,13 @@ gen_simple_decl(Ast_Resolved_Type *ast, Intern_String name){
gen_simple_decl_prefix(ast);
if(name.len) {
gen("%s", name.str);
gen_simple_decl_postfix(ast);
}
gen_simple_decl_postfix(ast);
}
}
function void
gen_value(Value a){
// gen("%s", docname(a.type));
switch(a.type->kind){
CASE_INT: {
Scratch scratch;
@@ -94,13 +98,30 @@ gen_expr(Ast_Expr *ast){
}
CASE(INDEX, Index){
gen("(");
gen_expr(node->expr);
Sym *sym = resolved_get(node);
if(is_array(sym->type)){
gen("(");
gen("(");
gen("[");
gen_expr(node->index);
gen("]");
gen(")");
gen("(");
gen_simple_decl(sym->type->arr.base, {});
gen("*)");
gen_expr(node->expr);
gen(".data)");
gen("[");
gen_expr(node->index);
gen("]");
gen(")");
} else{
gen("(");
gen_expr(node->expr);
gen("[");
gen_expr(node->index);
gen("]");
gen(")");
}
BREAK();
}
@@ -123,11 +144,11 @@ gen_expr(Ast_Expr *ast){
}
}
else{
gen("(");
if(!token_is_assign(node->op)) gen("(");
gen_expr(node->left);
gen("%s", name(node->op));
gen_expr(node->right);
gen(")");
if(!token_is_assign(node->op)) gen(")");
}
BREAK();
}
@@ -153,7 +174,10 @@ gen_expr(Ast_Expr *ast){
CASE(CALL, Call){
// @todo: Reach into map instead of direct lookup
if(is_struct(node->type) || is_array(node->type)){ // @todo: Should this be type_type maybe???
if(is_struct(node->type) || is_array(node->type)){
if(is_array(node->type)){
gen("(Slice){%d, ", node->exprs.len);
}
gen("(");
gen_simple_decl(node->type, {});
gen(")");
@@ -177,6 +201,9 @@ gen_expr(Ast_Expr *ast){
if(!node->exprs.is_last(&it)) gen(", ");
}
gen("}");
if(is_array(node->type)){
gen("}");
}
}
else{
gen_expr(node->name);
@@ -240,10 +267,21 @@ gen_ast(Ast *ast){
CASE(VAR, Var){
Sym *sym = resolved_get(node);
gen_simple_decl(sym->type, node->name);
if(is_array(sym->type)){
gen("Slice %s", node->name.str);
} else{
gen_simple_decl(sym->type, node->name);
}
if(node->expr){
gen(" = ");
gen_expr(node->expr);
} else if(is_array(sym->type)){
gen(" = (Slice){%d, (", sym->type->arr.size);
gen_simple_decl(sym->type, {});
gen("){}");
gen("}");
}
gen(";");
BREAK();
@@ -498,3 +536,15 @@ compile_file(String filename){
String result = compile_string(filecontent, filename);
return result;
}
typedef struct Custom_Data{
S32 thing;
}Custom_Data;
typedef struct Slice{
S64 len;
void *data;
}Slice;
Slice thing = (Slice){2, (Custom_Data []){(Custom_Data ){1}, (Custom_Data ){2}}};