aboutsummaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/program.c')
-rw-r--r--src/program.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/program.c b/src/program.c
index 4c0f1a2..ac3c923 100644
--- a/src/program.c
+++ b/src/program.c
@@ -445,6 +445,14 @@ static void header_func_set_offset(amal_program *self, u16 func_index, u32 code_
am_memcpy(&header_func->func_offset, &code_offset, sizeof(code_offset));
}
+static u8 header_func_get_num_params(amal_program *self, u16 func_index) {
+ u8 result;
+ BytecodeHeaderFunction *header_func = ((BytecodeHeaderFunction*)self->funcs_start) + func_index;
+ assert(sizeof(header_func->num_params) == sizeof(result));
+ am_memcpy(&result, &header_func->num_params, sizeof(result));
+ return result;
+}
+
static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_executor *executor) {
u32 instructions_size;
u32 read_start;
@@ -496,7 +504,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
u16 intermediate_index;
Number number;
- am_memcpy(&intermediate_index, &self->data.data[self->read_index + sizeof(i8)], sizeof(intermediate_index));
+ am_memcpy(&intermediate_index, &self->data.data[self->read_index + sizeof(AmalReg)], sizeof(intermediate_index));
return_if_error(amal_program_get_intermediate_by_index(self, intermediate_index, &number));
return_if_error(amal_exec_movi(executor, self->data.data[self->read_index], number.value.integer));
@@ -507,7 +515,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
u16 data_index;
BufferView data_ptr;
- am_memcpy(&data_index, &self->data.data[self->read_index + sizeof(i8)], sizeof(data_index));
+ am_memcpy(&data_index, &self->data.data[self->read_index + sizeof(AmalReg)], sizeof(data_index));
return_if_error(amal_program_get_data_by_index(self, data_index, &data_ptr));
return_if_error(amal_exec_movd(executor, self->data.data[self->read_index], data_ptr));
@@ -586,7 +594,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
u8 import_index;
u16 func_index;
BytecodeHeaderFunction func_def;
- i8 dst_reg;
+ AmalReg dst_reg;
am_memcpy(&import_index, self->data.data + self->read_index, sizeof(import_index));
am_memcpy(&func_index, self->data.data + self->read_index + sizeof(import_index), sizeof(func_index));
@@ -632,7 +640,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
case AMAL_OP_CALLE: {
u8 import_index;
u16 extern_func_index;
- i8 dst_reg;
+ AmalReg dst_reg;
am_memcpy(&import_index, self->data.data + self->read_index, sizeof(import_index));
am_memcpy(&extern_func_index, self->data.data + self->read_index + sizeof(import_index), sizeof(extern_func_index));
@@ -653,8 +661,13 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
self->read_index += 3;
break;
}
+ case AMAL_OP_BIT_AND: {
+ assert(bool_false && "TODO: Implement!");
+ self->read_index += 3;
+ break;
+ }
case AMAL_OP_JZ: {
- i8 reg;
+ AmalReg reg;
u16 target_label;
reg = self->data.data[self->read_index];
am_memcpy(&target_label, self->data.data + self->read_index + sizeof(reg), sizeof(target_label));
@@ -670,19 +683,21 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
break;
}
case AMAL_OP_RET: {
- const i8 reg = self->data.data[self->read_index];
+ const AmalReg reg = self->data.data[self->read_index];
return_if_error(amal_exec_ret(executor, reg));
self->read_index += 1;
break;
}
case AMAL_OP_FUNC_START: {
u8 func_flags;
+ u8 func_num_params;
u16 func_num_local_var_regs;
assert(!inside_func);
inside_func = bool_true;
assert(func_counter < self->num_functions);
+ func_num_params = header_func_get_num_params(self, func_counter);
header_func_set_offset(self, func_counter, amal_exec_get_code_offset(executor));
return_if_error(resolve_deferred_func_calls(self, executor, func_counter));
++func_counter;
@@ -691,7 +706,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
am_memcpy(&func_num_local_var_regs, self->data.data + self->read_index + sizeof(func_flags), sizeof(func_num_local_var_regs));
if(func_flags & FUNC_FLAG_EXPORTED)
return_if_error(amal_program_set_exported_function_instruction_offset_advance(self, amal_exec_get_code_offset(executor)));
- return_if_error(amal_exec_func_start(executor, func_num_local_var_regs));
+ return_if_error(amal_exec_func_start(executor, func_num_params, func_num_local_var_regs));
self->read_index += 3;
break;
}