#include #include #include // 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}; }