Core: Add Ast_Label
This commit is contained in:
@@ -621,95 +621,95 @@ gen_ast(Ast *ast) {
|
||||
BREAK();
|
||||
}
|
||||
|
||||
CASE(CONTINUE, Pass) {
|
||||
unused(node);
|
||||
case AST_LABEL: {
|
||||
auto n = (Ast_Label *)ast;
|
||||
if (n->enable_goto == false) gen("/* %Q */", n->name);
|
||||
if (n->enable_goto == true) gen("%Q:", n->name);
|
||||
gen_stmt_scope(n->scope);
|
||||
} break;
|
||||
|
||||
case AST_CONTINUE: {
|
||||
gen("continue;");
|
||||
BREAK();
|
||||
}
|
||||
CASE(BREAK, Break) {
|
||||
unused(node);
|
||||
} break;
|
||||
|
||||
case AST_BREAK: {
|
||||
gen("break;");
|
||||
BREAK();
|
||||
}
|
||||
} break;
|
||||
|
||||
CASE(COMPILER_BREAKPOINT_STMT, Break) {
|
||||
unused(node);
|
||||
case AST_COMPILER_BREAKPOINT_STMT: {
|
||||
__debugbreak();
|
||||
BREAK();
|
||||
}
|
||||
} break;
|
||||
|
||||
CASE(PASS, Pass) {
|
||||
unused(node);
|
||||
gen("//pass");
|
||||
BREAK();
|
||||
}
|
||||
case AST_PASS: {
|
||||
gen("// pass");
|
||||
} break;
|
||||
|
||||
CASE(BINARY, Binary) {
|
||||
gen_expr(node);
|
||||
gen(";");
|
||||
BREAK();
|
||||
}
|
||||
CASE(BINARY, Binary) {
|
||||
gen_expr(node);
|
||||
gen(";");
|
||||
BREAK();
|
||||
}
|
||||
|
||||
CASE(FOR, For) {
|
||||
// Array iter
|
||||
if (node->is_array_traversal) {
|
||||
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
|
||||
if (is_array(node->cond->resolved_type)) {
|
||||
gen("BufferSize(");
|
||||
gen_expr(node->cond);
|
||||
gen(")");
|
||||
}
|
||||
else {
|
||||
assert(is_slice(node->cond->resolved_type));
|
||||
gen_expr(node->cond);
|
||||
gen(".len");
|
||||
}
|
||||
CASE(FOR, For) {
|
||||
// Array iter
|
||||
if (node->is_array_traversal) {
|
||||
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
|
||||
if (is_array(node->cond->resolved_type)) {
|
||||
gen("BufferSize(");
|
||||
gen_expr(node->cond);
|
||||
gen(")");
|
||||
}
|
||||
else {
|
||||
assert(is_slice(node->cond->resolved_type));
|
||||
gen_expr(node->cond);
|
||||
gen(".len");
|
||||
}
|
||||
|
||||
gen("; _i%d+=1)", node->pos->line);
|
||||
gen("{");
|
||||
global_indent++;
|
||||
genln("");
|
||||
gen_simple_decl(node->array_traversal_var->type, node->array_traversal_var->name);
|
||||
gen(" = ");
|
||||
gen_expr(node->cond);
|
||||
if (node->is_also_slice_traversal) gen(".data");
|
||||
gen(" + _i%d;", node->pos->line);
|
||||
For(node->scope->stmts) {
|
||||
gen_line(it);
|
||||
gen("; _i%d+=1)", node->pos->line);
|
||||
gen("{");
|
||||
global_indent++;
|
||||
genln("");
|
||||
gen_ast(it);
|
||||
gen_simple_decl(node->array_traversal_var->type, node->array_traversal_var->name);
|
||||
gen(" = ");
|
||||
gen_expr(node->cond);
|
||||
if (node->is_also_slice_traversal) gen(".data");
|
||||
gen(" + _i%d;", node->pos->line);
|
||||
For(node->scope->stmts) {
|
||||
gen_line(it);
|
||||
genln("");
|
||||
gen_ast(it);
|
||||
}
|
||||
global_indent--;
|
||||
gen_last_line();
|
||||
genln("}");
|
||||
}
|
||||
global_indent--;
|
||||
gen_last_line();
|
||||
genln("}");
|
||||
|
||||
// Normal for loop
|
||||
else {
|
||||
gen("for(");
|
||||
if (node->init) gen_expr(node->init);
|
||||
gen(";");
|
||||
if (node->cond) gen_expr(node->cond);
|
||||
gen(";");
|
||||
if (node->iter) gen_expr(node->iter);
|
||||
gen(")");
|
||||
gen_stmt_scope(node->scope);
|
||||
}
|
||||
|
||||
BREAK();
|
||||
}
|
||||
|
||||
// Normal for loop
|
||||
else {
|
||||
gen("for(");
|
||||
if (node->init) gen_expr(node->init);
|
||||
gen(";");
|
||||
if (node->cond) gen_expr(node->cond);
|
||||
gen(";");
|
||||
if (node->iter) gen_expr(node->iter);
|
||||
gen(")");
|
||||
gen_stmt_scope(node->scope);
|
||||
CASE(LAMBDA, Decl) {
|
||||
gen_line(node);
|
||||
genln("");
|
||||
|
||||
if (is_flag_set(node->expr->flags, AST_FOREIGN)) {
|
||||
gen("/*foreign*/");
|
||||
}
|
||||
gen_lambda(node->unique_name, node->lambda);
|
||||
BREAK();
|
||||
}
|
||||
|
||||
BREAK();
|
||||
}
|
||||
|
||||
CASE(LAMBDA, Decl) {
|
||||
gen_line(node);
|
||||
genln("");
|
||||
|
||||
if (is_flag_set(node->expr->flags, AST_FOREIGN)) {
|
||||
gen("/*foreign*/");
|
||||
}
|
||||
gen_lambda(node->unique_name, node->lambda);
|
||||
BREAK();
|
||||
}
|
||||
|
||||
case AST_UNION:
|
||||
CASE(STRUCT, Decl) {
|
||||
gen("%s ", node->kind == AST_STRUCT ? "struct" : "union");
|
||||
|
||||
Reference in New Issue
Block a user