ref: add type/classname result for each gen_* function
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
#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_res_t){.error = true};
|
||||
|
||||
gen_res_t parent_res = gen_common(gen, node->memb.parent);
|
||||
if (parent_res.error)
|
||||
return (gen_res_t){.error = true};
|
||||
|
||||
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_res_t){.error = true};
|
||||
|
||||
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_res_t){.error = true};
|
||||
|
||||
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};
|
||||
}
|
||||
Reference in New Issue
Block a user