feat: finish generator
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user