61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
|
#include "prog.h"
|
||
|
|
||
|
MK_ENUM_C(OpcodeKind, OPCODE_KIND);
|
||
|
|
||
|
void prog_init(struct prog* self)
|
||
|
{
|
||
|
assert(self);
|
||
|
vec_init(&self->instructions);
|
||
|
vec_init(&self->values);
|
||
|
}
|
||
|
|
||
|
void prog_free(struct prog* self)
|
||
|
{
|
||
|
assert(self);
|
||
|
vec_free_elements(&self->instructions, NULL);
|
||
|
vec_free(&self->instructions);
|
||
|
|
||
|
vec_free_elements(&self->values, (void*) value_free);
|
||
|
vec_free(&self->values);
|
||
|
}
|
||
|
|
||
|
size_t prog_add_instruction(struct prog* self,
|
||
|
OpcodeKind opcode,
|
||
|
ssize_t param)
|
||
|
{
|
||
|
assert(self);
|
||
|
struct instruction* instr = malloc(sizeof(struct instruction));
|
||
|
instr->opcode = opcode;
|
||
|
instr->param = param;
|
||
|
|
||
|
vec_push(&self->instructions, instr);
|
||
|
|
||
|
return self->instructions.size - 1;
|
||
|
}
|
||
|
|
||
|
size_t prog_add_new_value(struct prog* self,
|
||
|
struct value* value)
|
||
|
{
|
||
|
assert(self);
|
||
|
assert(value);
|
||
|
|
||
|
vec_push(&self->values, value);
|
||
|
|
||
|
return self->values.size - 1;
|
||
|
}
|
||
|
|
||
|
void prog_dump(struct prog* self)
|
||
|
{
|
||
|
assert(self);
|
||
|
|
||
|
printf("--- PROG ---\n");
|
||
|
for (size_t i=0; i<self->instructions.size; i++)
|
||
|
{
|
||
|
struct instruction const* instr = self->instructions.data[i];
|
||
|
printf("%zu\t%s %zd\n",
|
||
|
i,
|
||
|
OpcodeKindStr[instr->opcode],
|
||
|
instr->param);
|
||
|
}
|
||
|
}
|