(
state: &mut FrameState,
method: &MethodRefInfo,
is_static: bool,
is_special: bool,
context: &str,
instruction_index: usize,
)
| 964 | context: context.to_string(), |
| 965 | message: format!( |
| 966 | "Bytecode block ended unexpectedly after instruction {index}" |
| 967 | ), |
| 968 | }); |
| 969 | }; |
| 970 | state = successors.swap_remove(position).1; |
| 971 | if !successors.is_empty() { |
| 972 | return Err(jvm::Error::VerificationError { |
| 973 | context: context.to_string(), |
| 974 | message: format!( |
| 975 | "Bytecode block contains an internal branch at instruction {index}" |
| 976 | ), |
| 977 | }); |
| 978 | } |
| 979 | } else { |
| 980 | for (target, successor_state) in successors { |
| 981 | if target >= instructions.len() { |
| 982 | continue; |
| 983 | } |
| 984 | merge_block_entry( |
| 985 | target, |
| 986 | successor_state, |
| 987 | &block_starts, |
| 988 | &block_by_instruction, |
| 989 | &mut entry_states, |
| 990 | &mut worklist, |
| 991 | &mut queued, |
| 992 | context, |
| 993 | )?; |
| 994 | } |
| 995 | break; |
| 996 | } |
| 997 | } |
| 998 | } |
| 999 | |
| 1000 | Ok(FrameAnalysis { |
| 1001 | block_starts, |
| 1002 | entry_states, |
| 1003 | }) |
no test coverage detected