Codegen basic arrays with size attached
This commit is contained in:
78
ccodegen.cpp
78
ccodegen.cpp
@@ -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}}};
|
||||
Reference in New Issue
Block a user