diff --git a/src/interpreter/program.rs b/src/interpreter/program.rs index 3e51bba..2d2f715 100644 --- a/src/interpreter/program.rs +++ b/src/interpreter/program.rs @@ -103,7 +103,9 @@ impl ProgramInstance { let module_id = self.modules.get(module_name).ok_or_else(|| { Error::Program(format!("Module {} not found", module_name)) })?; - let func_id = module_id.resolve_func(&self.store, func_idx); + let func_id = module_id.func_by_index(&self.store, func_idx).ok_or_else(|| { + Error::Program(format!("Module doesn't contain function at index {}", func_idx)) + })?; self.store.invoke(func_id, args, state) } diff --git a/src/interpreter/runner.rs b/src/interpreter/runner.rs index dd788ec..57027f9 100644 --- a/src/interpreter/runner.rs +++ b/src/interpreter/runner.rs @@ -413,8 +413,15 @@ impl<'store, St: 'static> Interpreter<'store, St> { Ok(InstructionOutcome::Return) } - fn run_call<'a>(&mut self, context: &mut FunctionContext, func_idx: u32) -> Result { - let func = context.module().resolve_func(self.store, func_idx); + fn run_call<'a>( + &mut self, + context: &mut FunctionContext, + func_idx: u32, + ) -> Result { + let func = context + .module() + .func_by_index(self.store, func_idx) + .expect("Due to validation func should exists"); Ok(InstructionOutcome::ExecuteCall(func)) } diff --git a/src/interpreter/store.rs b/src/interpreter/store.rs index 1ab87d4..3e67168 100644 --- a/src/interpreter/store.rs +++ b/src/interpreter/store.rs @@ -56,12 +56,12 @@ impl ModuleId { .expect("Due to validation global should exists") } - pub fn resolve_func(&self, store: &Store, idx: u32) -> FuncId { + pub fn func_by_index(&self, store: &Store, idx: u32) -> Option { let instance = store.resolve_module(*self); - *instance + instance .funcs .get(idx as usize) - .expect("Due to validation func should exists") + .cloned() } pub fn resolve_type(&self, store: &Store, idx: u32) -> TypeId {