38 lines
825 B
C
38 lines
825 B
C
#include <compiler/internals/gen.h>
|
|
|
|
// Conditional operation
|
|
gen_res_t gen_condition(fzl_gen_t *gen, fzl_node_t *node)
|
|
{
|
|
if (!gen || !node)
|
|
return gen_error;
|
|
|
|
gen_res_t cres = gen_common(gen, node->cond.condition);
|
|
if (cres.error)
|
|
return gen_error;
|
|
|
|
gen_op(gen, FZL_OPCODE_JZ);
|
|
|
|
size_t jz_if = gen->ops_count;
|
|
gen_word(gen, (uint64_t)0);
|
|
|
|
gen_res_t tblock_res = gen_common(gen, node->cond.true_block);
|
|
if (tblock_res.error)
|
|
return gen_error;
|
|
|
|
gen_op(gen, FZL_OPCODE_JMP);
|
|
size_t jmp_else = gen->ops_count;
|
|
gen_word(gen, (uint64_t)0);
|
|
|
|
gen->ops[jz_if] = gen->ops_count;
|
|
|
|
if (node->cond.else_block)
|
|
{
|
|
gen_res_t fblock_res = gen_common(gen, node->cond.else_block);
|
|
if (fblock_res.error)
|
|
return gen_error;
|
|
}
|
|
|
|
gen->ops[jmp_else] = gen->ops_count;
|
|
return gen_ok_null;
|
|
}
|