revm_bytecode/legacy/
analysis.rs1use super::JumpTable;
2use crate::opcode;
3use bitvec::{bitvec, order::Lsb0, vec::BitVec};
4use std::sync::Arc;
5
6pub fn analyze_legacy(bytetecode: &[u8]) -> JumpTable {
13 let mut jumps: BitVec<u8> = bitvec![u8, Lsb0; 0; bytetecode.len()];
14
15 let range = bytetecode.as_ptr_range();
16 let start = range.start;
17 let mut iterator = start;
18 let end = range.end;
19 while iterator < end {
20 let opcode = unsafe { *iterator };
21 if opcode::JUMPDEST == opcode {
22 unsafe { jumps.set_unchecked(iterator.offset_from(start) as usize, true) }
24 iterator = unsafe { iterator.offset(1) };
25 } else {
26 let push_offset = opcode.wrapping_sub(opcode::PUSH1);
27 if push_offset < 32 {
28 iterator = unsafe { iterator.offset((push_offset + 2) as isize) };
30 } else {
31 iterator = unsafe { iterator.offset(1) };
33 }
34 }
35 }
36
37 JumpTable(Arc::new(jumps))
38}