Functions have unique names now unless they are foreign, probably will

need a keyword to not mangle the names.
This commit is contained in:
Krzosa Karol
2022-09-28 14:55:56 +02:00
parent 83ffc82f79
commit aa1da4e926
12 changed files with 69 additions and 31 deletions

View File

@@ -249,10 +249,6 @@ gen_var(Ast_Decl *decl, B32 emit_value, B32 scope_names){
function void
gen_lambda(Intern_String name, Ast_Lambda *lambda, B32 generate_block = true){
bool is_foreign = is_flag_set(lambda->flags, AST_FOREIGN);
if(name == pctx->intern("main"_s) || name == pctx->intern("WinMain"_s)){
is_foreign = true;
}
gen_simple_decl(lambda->resolved_type->func.ret, name);
gen("(");
For(lambda->args){
@@ -275,23 +271,26 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
if(node->resolved_decl->kind == AST_MODULE_NAMESPACE || node->resolved_decl->kind == AST_FILE_NAMESPACE)
return false;
if(type_of_var){
if(is_slice(type_of_var) && is_array(node->resolved_decl->type)){
gen("{%d, ", (int)node->resolved_decl->type->arr.size);
gen("%Q}", node->intern_val);
}
else if(!is_any(ast->resolved_type) && is_any(type_of_var)){
gen("(Any){&");
gen_expr(ast);
gen(", %d}", ast->resolved_type->type_id);
}
else goto otherwise;
if(type_of_var && is_slice(type_of_var) && is_array(node->resolved_decl->type)){
gen("{%d, ", (int)node->resolved_decl->type->arr.size);
gen("%Q}", node->intern_val);
}
else{
otherwise:
else if(type_of_var && !is_any(ast->resolved_type) && is_any(type_of_var)){
gen("(Any){&");
gen_expr(ast);
gen(", %d}", ast->resolved_type->type_id);
}
else if(node->resolved_decl->kind == AST_LAMBDA){
gen("%Q", node->resolved_decl->unique_name);
}
else {
gen("%Q", node->intern_val);
}
BREAK();
}
@@ -388,8 +387,7 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
}
CASE(CALL, Call){
gen_expr(node->name);
gen("(");
gen("%Q(", node->resolved_decl->unique_name);
For(node->exprs){
gen_expr(it->item, it->resolved_type);
if(!node->exprs.is_last(&it)) gen(", ");
@@ -583,10 +581,11 @@ gen_ast(Ast *ast){
CASE(LAMBDA, Decl){
gen_line(node);
genln("");
if(is_flag_set(node->expr->flags, AST_FOREIGN)){
gen("/*foreign*/");
}
gen_lambda(node->name, node->lambda);
gen_lambda(node->unique_name, node->lambda);
BREAK();
}
@@ -648,7 +647,7 @@ gen_ast(Ast *ast){
}break;
case TYPE_LAMBDA:{
gen("// ");
gen_lambda(node->name, node->lambda);
gen_lambda(node->unique_name, node->lambda);
} break;
invalid_default_case;
}
@@ -790,14 +789,34 @@ typedef struct String{
}
}
Intern_String intern_main = pctx->intern("main"_s);
Intern_String intern_win_main = pctx->intern("WinMain"_s);
Ast_Decl *main = 0;
Ast_Decl *win_main = 0;
// Generate lambda forward decls
For(pctx->ordered_decls){
if(it->kind == AST_LAMBDA){
if(it->name == intern_main){
main = it;
it->unique_name = it->name;
}
if(it->name == intern_win_main){
win_main = it;
it->unique_name = it->name;
}
genln("");
gen_lambda(it->name, it->lambda, false);
gen_lambda(it->unique_name, it->lambda, false);
}
}
if(!main && !win_main){
compiler_error(0, "Entry point is not defined! Try main or WinMain");
}
// Generate language.kl
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
Ast_Decl *it = pctx->ordered_decls[i];