ref: add type/classname result for each gen_* function

This commit is contained in:
samsonium
2026-11-04 22:25:25 +03:00
parent b278e8bb74
commit aae183c0c0
15 changed files with 204 additions and 108 deletions
+49
View File
@@ -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};
}