private void analyze ( Analyzer analyzer , boolean allowFlow , IntArray pendingTargets , IntArray completedTargets ) throws Exception { pending : while ( pendingTargets . size ( ) > 0 ) { int pc = pendingTargets . pop ( ) ; if ( allowFlow ) { if ( completedTargets . contains ( pc ) ) continue pending ; completedTargets . add ( pc ) ; } setOffset ( pc ) ; flow : do { pc = getOffset ( ) ; if ( pc < 0 ) throw new IllegalStateException ( ) ; if ( ! allowFlow ) { if ( completedTargets . contains ( pc ) ) break flow ; completedTargets . add ( pc ) ; } if ( isBranch ( ) ) { int targetPC = getBranchTarget ( ) ; if ( ! pendingTargets . contains ( targetPC ) ) pendingTargets . add ( targetPC ) ; } else if ( isSwitch ( ) ) { int [ ] switchTargets = getSwitchTargets ( ) ; for ( int i = 0 ; i < switchTargets . length ; i ++ ) { if ( ! pendingTargets . contains ( switchTargets [ i ] ) ) pendingTargets . add ( switchTargets [ i ] ) ; } } analyzer . analyze ( this ) ; } while ( next ( ) ) ; } }
Analyzes the code for a basic block .