Functions have unique names now unless they are foreign, probably will
need a keyword to not mangle the names.
This commit is contained in:
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user