Var args sort of working, but I feel like all this stuff will need to get yanked out

or tested and refactored
This commit is contained in:
Krzosa Karol
2022-09-30 22:33:47 +02:00
parent 4c6497c5d6
commit 0646ae9279
6 changed files with 75 additions and 25 deletions

View File

@@ -5,7 +5,7 @@ global S32 global_indent;
global S32 is_inside_struct;
function void gen_ast(Ast *ast);
function bool gen_expr(Ast_Expr *ast, Ast_Type *type_of_var = 0);
function bool gen_expr(Ast_Expr *ast, Ast_Type *type_of_var = 0, bool is_vargs = false);
function void
gen_indent(){
@@ -271,9 +271,14 @@ gen_lambda(Intern_String name, Ast_Lambda *lambda, B32 generate_block = true){
gen_simple_decl(lambda->resolved_type->func.ret, name);
gen("(");
For(lambda->args){
gen_var(it, DONT_EMIT_VALUE, true);
if(&it != (lambda->args.end() - 1))
gen(", ");
if(is_flag_set(it->flags, AST_ANY_VARGS)){
gen("...");
}
else{
gen_var(it, DONT_EMIT_VALUE, true);
if(&it != (lambda->args.end() - 1))
gen(", ");
}
}
gen(")");
@@ -284,21 +289,27 @@ gen_lambda(Intern_String name, Ast_Lambda *lambda, B32 generate_block = true){
}
function bool
gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
gen_expr(Ast_Expr *ast, Ast_Type *type_of_var, bool is_vargs){
switch(ast->kind){
CASE(IDENT, Atom){
if(node->resolved_decl->kind == AST_MODULE_NAMESPACE || node->resolved_decl->kind == AST_FILE_NAMESPACE)
return false;
if(type_of_var && is_slice(type_of_var) && is_array(node->resolved_decl->type)){
assert(!is_vargs);
gen("{%d, ", (int)node->resolved_decl->type->arr.size);
gen("%Q}", node->intern_val);
}
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);
if(is_vargs){
gen_expr(ast, 0, is_vargs);
}
else {
gen("(Any){&");
gen_expr(ast);
gen(", %d}", ast->resolved_type->type_id);
}
}
else if(node->resolved_decl->kind == AST_LAMBDA){
@@ -315,9 +326,14 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
CASE(VALUE, Atom){
if(is_any(type_of_var)){
gen("(Any){&");
gen("("); gen_simple_decl(node->type); gen("){"); gen_value(node->pos, node->value); gen("}");
gen(", %d}", node->type->type_id);
if(is_vargs){
gen("(Any){&");
gen("("); gen_simple_decl(node->type); gen("){"); gen_value(node->pos, node->value); gen("}");
gen(", %d}", node->type->type_id);
}
else{
gen_value(node->pos, node->value);
}
return true;
}
@@ -335,7 +351,7 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
CASE(INDEX, Index){
gen("(");
gen_expr(node->expr);
gen_expr(node->expr, 0, is_vargs);
if(node->index_original_type == type_string){
gen(".str");
}
@@ -356,11 +372,11 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
CASE(BINARY, Binary){
if(node->op == TK_Dot){
if(gen_expr(node->left)){
if(gen_expr(node->left, 0, 0)){
if(node->dot_access_step_resolution && node->dot_access_step_resolution->kind == TYPE_POINTER) gen("->");
else gen(".");
}
gen_expr(node->right);
gen_expr(node->right, 0, 0);
return true;
}
@@ -428,7 +444,7 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
CASE(CALL, Call){
gen("%Q(", node->resolved_decl->unique_name);
For(node->exprs){
gen_expr(it->item, it->resolved_type);
gen_expr(it->item, it->resolved_type, is_flag_set(it->flags, AST_ANY_VARGS));
if(!node->exprs.is_last(&it)) gen(", ");
}
gen(")");
@@ -436,6 +452,15 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){
}
CASE(COMPOUND, Call){
if(is_vargs){
For(node->exprs){
gen_expr(it->item, it->resolved_type, true);
if(!node->exprs.is_last(&it)) gen(", ");
}
return true;
}
gen("(");
gen_simple_decl(node->resolved_type);
gen(")");