From 95724fd6a6b6c47f49648d48c9278a91162e3c31 Mon Sep 17 00:00:00 2001 From: DaniPopes <57450786+DaniPopes@users.noreply.github.com> Date: Sat, 2 Mar 2024 21:06:54 +0200 Subject: [PATCH] chore(interpreter): factor out jump logic (#1146) --- .../interpreter/src/instructions/control.rs | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/crates/interpreter/src/instructions/control.rs b/crates/interpreter/src/instructions/control.rs index 05da0a7cf8..ac843da98c 100644 --- a/crates/interpreter/src/instructions/control.rs +++ b/crates/interpreter/src/instructions/control.rs @@ -1,39 +1,32 @@ -use revm_primitives::Bytes; - use crate::{ gas, - primitives::{Spec, U256}, + primitives::{Bytes, Spec, U256}, Host, InstructionResult, Interpreter, InterpreterResult, }; pub fn jump(interpreter: &mut Interpreter, _host: &mut H) { gas!(interpreter, gas::MID); pop!(interpreter, dest); - let dest = as_usize_or_fail!(interpreter, dest, InstructionResult::InvalidJump); - if interpreter.contract.is_valid_jump(dest) { - // SAFETY: In analysis we are checking create our jump table and we do check above to be - // sure that jump is safe to execute. - interpreter.instruction_pointer = - unsafe { interpreter.contract.bytecode.as_ptr().add(dest) }; - } else { - interpreter.instruction_result = InstructionResult::InvalidJump; - } + jump_inner(interpreter, dest); } pub fn jumpi(interpreter: &mut Interpreter, _host: &mut H) { gas!(interpreter, gas::HIGH); pop!(interpreter, dest, value); if value != U256::ZERO { - let dest = as_usize_or_fail!(interpreter, dest, InstructionResult::InvalidJump); - if interpreter.contract.is_valid_jump(dest) { - // SAFETY: In analysis we are checking if jump is valid destination and - // this `if` makes this unsafe block safe. - interpreter.instruction_pointer = - unsafe { interpreter.contract.bytecode.as_ptr().add(dest) }; - } else { - interpreter.instruction_result = InstructionResult::InvalidJump - } + jump_inner(interpreter, dest); + } +} + +#[inline(always)] +fn jump_inner(interpreter: &mut Interpreter, dest: U256) { + let dest = as_usize_or_fail!(interpreter, dest, InstructionResult::InvalidJump); + if !interpreter.contract.is_valid_jump(dest) { + interpreter.instruction_result = InstructionResult::InvalidJump; + return; } + // SAFETY: `is_valid_jump` ensures that `dest` is in bounds. + interpreter.instruction_pointer = unsafe { interpreter.contract.bytecode.as_ptr().add(dest) }; } pub fn jumpdest(interpreter: &mut Interpreter, _host: &mut H) {