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:
@@ -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(")");
|
||||
|
||||
Reference in New Issue
Block a user