package Ġdev . bin club . bin sc ure . processors . flow . jump Ċ Ċ import Ġdev . bin club . bin sc ure . IC lass Processor Ċ import Ġdev . bin club . bin sc ure . classpath . Class Sources Ċ import Ġdev . bin club . bin sc ure . configuration . Configuration Manager . root Config Ċ import Ġdev . bin club . bin sc ure . utils .* Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġorg . object web . asm . tree .* ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġcook ied rag on 2 3 4 Ġ 1 4 / Apr / 2 0 2 0 Ċ Ġ*/ Ċ class ĠJump Re arr anger ( source : ĠClass Sources ): ĠI Class Processor ( source ) Ġ{ Ċ ĉ override Ġval Ġprogress Description : ĠString Ċĉ ĉ get () Ġ= Ġ" Re arr anging Ġjumps " Ċ ĉ override Ġval Ġconfig Ġ= Ġroot Config . flow Ob fusc ation ĊĉĊ ĉ override Ġfun Ġprocess ( Ċĉ ĉ source : ĠClass Sources , Ċĉ ĉ classes : ĠMutable Collection < Class Node >, Ċĉ ĉ pass Through : ĠMutable Map < String , ĠByteArray > Ċ ĉ ) Ġ{ Ċĉ ĉ if Ġ(! config . enabled ) Ċĉĉ ĉ return ĊĉĉĊĉ ĉ for Ġ( class Node Ġin Ġclasses ) Ġ{ Ċĉĉ ĉ if Ġ( is Excluded ( class Node )) Ċĉĉĉ ĉ continue ĊĉĉĉĊĉĉ ĉ method Loop @ for Ġ( method Ġin Ġclass Node . methods ) Ġ{ Ċĉĉĉ ĉ if Ġ( is Excluded ( class Node , Ġmethod )) Ċĉĉĉĉ ĉ continue ĊĉĉĉĉĊĉĉĉ ĉ val Ġstacks Ġ= ĠStack Height Calculator . calculate Stack Height ( class Node , Ġmethod ) Ċĉĉĉ ĉ val Ġtargets Ġ= Ġmutable Map Of < Jump Insn Node , ĠLabel Node >() Ċĉĉĉ ĉ var Ġvar I Ġ= Ġif Ġ( method . access . has Access ( ACC _ STATIC )) Ġ 0 Ġelse Ġ 1 Ċĉĉĉ ĉ val Ġstores Ġ= Ġhash Set Of < Int >() ĊĉĉĉĉĊĉĉĉ ĉ for Ġ( insn Ġin Ġmethod . instructions ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( insn Ġis ĠJump Insn Node ) Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( stacks [ insn . label ] !!. size Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ targets [ insn ] Ġ= Ġinsn . label Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( insn Ġis ĠVar Insn Node ) Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( insn . opcode Ġ== ĠA STORE ) Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ(! stores . contains ( insn .` var ` )) Ġ{ Ċĉĉĉĉĉĉĉ ĉ stores . add ( insn .` var `) Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ // continue @ method Loop Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ if Ġ( insn .` var ` Ġ>= Ġvar I ) Ġ{ Ċĉĉĉĉĉĉ ĉ var I Ġ= Ġinsn .` var ` Ġ+ Ġ 1 Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( targets . size Ġ> Ġ 2 ) Ġ{ Ċĉĉĉĉ ĉ val Ġappend Ġ= ĠIn sn List (). apply Ġ{ Ċĉĉĉĉĉ ĉ val Ġd flt Ġ= Ġnew Label () Ċĉĉĉĉĉ ĉ val Ġswitch Start Ġ= Ġnew Label () Ċĉĉĉĉĉ ĉ add ( d flt ) Ċĉĉĉĉĉ ĉ add ( ICON ST _ M 1 ) Ċĉĉĉĉĉ ĉ add ( switch Start ) Ċĉĉĉĉĉ ĉ // add ( Var Insn Node ( I LOAD , Ġvar I )) Ċĉĉĉĉĉ ĉ val Ġtbl Switch Ġ= ĠTable Switch Insn Node ( Ċĉĉĉĉĉĉĉ 0 , Ċĉĉĉĉĉĉ ĉ targets . size Ġ- Ġ 1 , Ċĉĉĉĉĉĉ ĉ d flt Ċĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉ ĉ tbl Switch . labels Ġ= Ġfixed Size List ( targets . size ) Ċĉĉĉĉĉ ĉ add ( tbl Switch ) ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉĉĉĉ ĉ for Ġ(( jump , Ġtarget ) Ġin Ġtargets . entries . sh uffled ()) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnew Target Ġ= Ġnew Label () Ċĉĉĉĉĉĉ ĉ jump . label Ġ= Ġnew Target Ċĉĉĉĉĉĉ ĉ add ( new Target ) Ċĉĉĉĉĉĉ ĉ add ( ldc Int ( i )) Ċĉĉĉĉĉĉ ĉ add ( Jump Insn Node ( GOTO , Ġswitch Start )) Ċĉĉĉĉĉĉ ĉ tbl Switch . labels [ i ] Ġ= Ġtarget Ċĉĉĉĉĉĉ ĉ i Ġ+= Ġ 1 Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ method . instructions . add ( append ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ