Fixing bugs, prepending all names with context name
This commit is contained in:
51
ccodegen.cpp
51
ccodegen.cpp
@@ -18,6 +18,12 @@ gen_line(Ast *node){
|
||||
genln("#line %d", node->pos->line+1);
|
||||
}
|
||||
|
||||
function void
|
||||
gen_scope_name(Ast_Scope *scope){
|
||||
if(scope->parent_scope) gen_scope_name(scope->parent_scope);
|
||||
if(scope->name.str) gen("%s_", scope->name.str);
|
||||
}
|
||||
|
||||
// @todo: Gen complicated decl
|
||||
//array 10 ( pointer (pointer array 5 int a))
|
||||
// int (*(*(a[5])))[10]
|
||||
@@ -41,7 +47,9 @@ gen_simple_decl_prefix(Ast_Type *ast){
|
||||
auto name = constant->name;
|
||||
gen("%s ", name.str);
|
||||
}break;
|
||||
default: gen("%s ", name(ast));
|
||||
default: {
|
||||
gen("%s ", name(ast));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +70,7 @@ gen_simple_decl_postfix(Ast_Type *ast){
|
||||
}
|
||||
|
||||
function void
|
||||
gen_simple_decl(Ast_Type *ast, Intern_String name = {}){
|
||||
gen_simple_decl(Ast_Type *ast, Intern_String name = {}, Ast_Scope *scope = 0){
|
||||
if(ast->kind == TYPE_LAMBDA) {
|
||||
gen_simple_decl_prefix(ast->func.ret);
|
||||
gen("(*%s)(", name.str);
|
||||
@@ -75,6 +83,7 @@ gen_simple_decl(Ast_Type *ast, Intern_String name = {}){
|
||||
else{
|
||||
gen_simple_decl_prefix(ast);
|
||||
if(name.len) {
|
||||
if(scope) gen_scope_name(scope);
|
||||
gen("%s", name.str);
|
||||
}
|
||||
gen_simple_decl_postfix(ast);
|
||||
@@ -124,18 +133,18 @@ enum {
|
||||
};
|
||||
|
||||
function void
|
||||
gen_var(Intern_String name, Ast_Type *type, Ast_Expr *expr, B32 emit_value){
|
||||
gen_simple_decl(type, name);
|
||||
gen_var(Ast_Decl *decl, B32 emit_value){
|
||||
gen_simple_decl(decl->type, decl->name, decl->parent_scope);
|
||||
|
||||
if(emit_value == DONT_EMIT_VALUE){
|
||||
return;
|
||||
}
|
||||
|
||||
if(expr){
|
||||
if(decl->expr){
|
||||
gen(" = ");
|
||||
gen_expr(expr);
|
||||
gen_expr(decl->expr);
|
||||
} else { // Default zero
|
||||
if(is_numeric(type)){
|
||||
if(is_numeric(decl->type)){
|
||||
gen(" = 0");
|
||||
} else {
|
||||
gen(" = {}");
|
||||
@@ -145,10 +154,10 @@ gen_var(Intern_String name, Ast_Type *type, Ast_Expr *expr, B32 emit_value){
|
||||
|
||||
function void
|
||||
gen_lambda(Intern_String name, Ast_Lambda *lambda){
|
||||
gen_simple_decl(lambda->type->func.ret, name);
|
||||
gen_simple_decl(lambda->type->func.ret, name, lambda->parent_scope);
|
||||
gen("(");
|
||||
For(lambda->args){
|
||||
gen_var(it->name, it->type, 0, DONT_EMIT_VALUE);
|
||||
gen_var(it, DONT_EMIT_VALUE);
|
||||
if(&it != (lambda->args.end() - 1)) gen(", ");
|
||||
}
|
||||
gen(")");
|
||||
@@ -163,13 +172,17 @@ function void
|
||||
gen_expr(Ast_Expr *ast){
|
||||
switch(ast->kind){
|
||||
CASE(IDENT, Atom){
|
||||
gen_scope_name(node->parent_scope);
|
||||
gen("%s", node->intern_val.str);
|
||||
BREAK();
|
||||
}
|
||||
|
||||
CASE(VALUE, Atom){
|
||||
B32 written = gen_value(node->value);
|
||||
if(!written) gen("%s", node->value.intern_val.str);
|
||||
if(!written) {
|
||||
gen_scope_name(node->parent_scope);
|
||||
gen("%s", node->value.intern_val.str);
|
||||
}
|
||||
BREAK();
|
||||
}
|
||||
|
||||
@@ -273,7 +286,7 @@ gen_ast(Ast *ast){
|
||||
}
|
||||
|
||||
CASE(VAR, Decl){
|
||||
gen_var(node->name, node->type, node->expr, is_inside_struct ? DONT_EMIT_VALUE : ALWAYS_EMIT_VALUE);
|
||||
gen_var(node, is_inside_struct ? DONT_EMIT_VALUE : ALWAYS_EMIT_VALUE);
|
||||
if(!is_flag_set(ast->flags, AST_EXPR)) gen(";");
|
||||
BREAK();
|
||||
}
|
||||
@@ -333,7 +346,9 @@ gen_ast(Ast *ast){
|
||||
}
|
||||
|
||||
CASE(STRUCT, Decl){
|
||||
gen("typedef struct %s{", node->name.str);
|
||||
gen("typedef struct ");
|
||||
gen_scope_name(node->parent_scope);
|
||||
gen("%s{", node->name.str);
|
||||
global_indent++;
|
||||
is_inside_struct++;
|
||||
For(node->scope->decls){
|
||||
@@ -343,7 +358,9 @@ gen_ast(Ast *ast){
|
||||
|
||||
is_inside_struct--;
|
||||
global_indent--;
|
||||
genln("}%s;", node->name.str);
|
||||
genln("}");
|
||||
gen_scope_name(node->parent_scope);
|
||||
gen("%s;", node->name.str);
|
||||
BREAK();
|
||||
}
|
||||
|
||||
@@ -359,10 +376,8 @@ gen_ast(Ast *ast){
|
||||
global_indent++;
|
||||
For(node->scope->decls){
|
||||
genln("%s", it->name.str);
|
||||
if(it->expr){
|
||||
gen(" = ");
|
||||
gen_expr(it->expr);
|
||||
}
|
||||
gen(" = ");
|
||||
gen_value(it->value);
|
||||
gen(",");
|
||||
}
|
||||
global_indent--;
|
||||
@@ -521,7 +536,7 @@ resolve_everything_in_module(Ast_Module *module){
|
||||
For_Named(it->decls, jt){
|
||||
resolve_name(it, jt->pos, jt->name);
|
||||
if(jt->kind == AST_STRUCT){
|
||||
type_complete(jt->type);
|
||||
type_complete(jt->type_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user