From f5dc9ad48db4d22e7d6f15e340063dc7cb14c1e1 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 29 Sep 2019 23:47:52 +0200 Subject: Implicit cast from str to ?&c_char, fix use of parameters (to use sys v registers) --- src/program.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'src/program.c') 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; } -- cgit v1.2.3