#include "compile-node.h" #include #include #include extern enum bshell_status compile_node( struct compile_ctx *ctx, struct bshell_ast_node *src) { switch (src->n_type) { case BSHELL_AST_IF: return compile_if(ctx, src); case BSHELL_AST_BLOCK: return compile_block_immediate(ctx, src); default: return compile_expression(ctx, src); } return BSHELL_SUCCESS; } enum bshell_status bshell_compile( struct bshell_ast_node *src, bshell_scriptblock *dest) { struct compile_ctx ctx = {.c_block = dest}; enum bshell_status status = compile_node(&ctx, src); if (status != BSHELL_SUCCESS) { return status; } status = compile_resolve_labels(&ctx); while (!fx_queue_empty(&ctx.c_state)) { compile_pop_state(&ctx); } while (!fx_queue_empty(&ctx.c_stack)) { struct compile_value *value = compile_pop_value(&ctx); compile_value_destroy(value); } if (status != BSHELL_SUCCESS) { return status; } return BSHELL_SUCCESS; }