50 lines
1.0 KiB
C
50 lines
1.0 KiB
C
#include <compiler/internals/gen.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
|
|
// Field access
|
|
gen_res_t gen_field(fzl_gen_t *gen, fzl_node_t *node)
|
|
{
|
|
if (!gen || !node)
|
|
return gen_error;
|
|
|
|
gen_res_t parent_res = gen_common(gen, node->memb.parent);
|
|
if (parent_res.error)
|
|
return gen_error;
|
|
|
|
fzl_ctable_t *ct = NULL;
|
|
for (size_t i = 0; i < gen->classes_count; i++)
|
|
{
|
|
if (strcmp(parent_res.classname, gen->classes[i]->name) == 0)
|
|
{
|
|
ct = gen->classes[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!ct)
|
|
return gen_error;
|
|
|
|
fzl_token_t *ftok = node->memb.field->token;
|
|
fzl_ctable_field_t ctf;
|
|
bool field_exists = false;
|
|
for (size_t i = 0; i < ct->fields_count; i++)
|
|
{
|
|
if (strcmp(ftok->value, ct->fields[i].name) == 0)
|
|
{
|
|
field_exists = true;
|
|
ctf = ct->fields[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!field_exists)
|
|
return gen_error;
|
|
|
|
gen_op(gen, FZL_OPCODE_GET_FIELD);
|
|
gen_word(gen, ctf.slot_index);
|
|
|
|
return (gen_res_t){
|
|
.error = false, .type = ctf.type, .classname = parent_res.classname};
|
|
}
|