30 lines
652 B
C
30 lines
652 B
C
#include <compiler/internals/gen.h>
|
|
|
|
// Identifier lookup
|
|
gen_res_t gen_identifier(fzl_gen_t *gen, fzl_node_t *node)
|
|
{
|
|
if (!gen || !node)
|
|
return gen_error;
|
|
|
|
fzl_sym_t sym;
|
|
bool exists = false;
|
|
ssize_t i = gen->syms_top - 1;
|
|
for (; i >= 0; i--)
|
|
if ((exists = fzl_symt_get(gen->syms[i], node->token->value, &sym)))
|
|
break;
|
|
|
|
if (!exists)
|
|
return gen_error;
|
|
|
|
if (!sym.slot_set)
|
|
return gen_error;
|
|
|
|
size_t depth = gen->syms_top - 1 - i;
|
|
gen_op(gen, FZL_OPCODE_LOAD_LOCAL);
|
|
gen_word(gen, depth);
|
|
gen_word(gen, sym.slot);
|
|
|
|
return (gen_res_t){
|
|
.error = false, .type = sym.type, .classname = sym.classname};
|
|
}
|