aboutsummaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/program.c')
-rw-r--r--src/program.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/program.c b/src/program.c
index 63d2b6e..128f0f9 100644
--- a/src/program.c
+++ b/src/program.c
@@ -570,26 +570,30 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
self->read_index += 1;
break;
}
+ case AMAL_OP_CALL_START: {
+ u8 num_args = self->data.data[self->read_index];
+ return_if_error(amal_exec_call_start(executor, num_args));
+ self->read_index += 1;
+ break;
+ }
case AMAL_OP_CALL: {
u8 import_index;
u16 func_index;
- u8 num_args;
BytecodeHeaderFunction func_def;
i8 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));
- am_memcpy(&num_args, self->data.data + self->read_index + sizeof(import_index) + sizeof(func_index), sizeof(num_args));
amal_program_get_header_function_by_index(self, import_index, func_index, &func_def);
assert(func_def.num_return_types == 1 && "TODO: Support 0 and more than 1 return values");
assert(self->return_value_index == 1);
dst_reg = self->return_values_stack[0];
- self->return_value_index -= func_def.num_return_types;
+ self->return_value_index = 0;
/* func_offset will only be non-zero when the function has been decoded (FUNC_START) */
if(func_def.func_offset != 0) {
/* TODO: Instead of pushing num args, push the sum of sizeof the last num_args */
- return_if_error(amal_exec_call(executor, func_def.func_offset, num_args, dst_reg));
+ return_if_error(amal_exec_call(executor, func_def.func_offset, dst_reg));
} else {
/*
The code for the function has not been generated yet (the function is defined after the current location).
@@ -609,24 +613,23 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
return_if_error(hash_map_insert(&self->deferred_func_calls, key_mem, &new_deferred_call_list));
}
/* Dummy call to offset 0, offset will be replace later when the target function hits AMAL_OP_FUNC_START */
- return_if_error(amal_exec_call(executor, 0, num_args, dst_reg));
+ return_if_error(amal_exec_call(executor, 0, dst_reg));
}
- self->read_index += 4;
+ self->read_index += 3;
break;
}
- case AMAL_OP_CALLR:
+ case AMAL_OP_CALLR: {
assert(bool_false && "TODO: Implement CALLR");
- self->read_index += 2;
+ self->read_index += 1;
break;
+ }
case AMAL_OP_CALLE: {
u8 import_index;
u16 extern_func_index;
- u8 num_args;
i8 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));
- am_memcpy(&num_args, self->data.data + self->read_index + sizeof(import_index) + sizeof(extern_func_index), sizeof(num_args));
assert(self->return_value_index == 1 && "TODO: Support extern functions that don't return any value");
dst_reg = self->return_values_stack[0];
self->return_value_index = 0;
@@ -634,9 +637,9 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_
{
ProgramExternFunc extern_func;
return_if_error(amal_program_get_extern_func_by_index(self, import_index, extern_func_index, &extern_func));
- return_if_error(amal_exec_calle(executor, extern_func.func, num_args, dst_reg));
+ return_if_error(amal_exec_calle(executor, extern_func.func, dst_reg));
}
- self->read_index += 4;
+ self->read_index += 3;
break;
}
case AMAL_OP_CMP: {