package Ġcom . android . tools . idea . rendering . class loading Ċ Ċ import Ġorg . jetbrains . org . object web . asm .* Ċ import Ġorg . jetbrains . org . object web . asm . commons . Generator Adapter Ċ import Ġorg . jetbrains . org . object web . asm . commons . Method Ċ import Ġkotlin . reflect . jvm . java Method Ċ Ċ class ĠProcess Abort ed ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ċ Ċ object ĠLoop Breaker Ġ{ ĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġcheck Loop () Ġ{ ĊĠĠĠ Ġif Ġ( Thread . currentThread (). is Inter rupted ) Ġthrow ĠInterruptedException () ĊĠ Ġ} Ċ } Ċ Ċ object ĠThread Local Random Ġ{ ĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġnext Int ( min : ĠInt , Ġmax : ĠInt ): ĠInt Ġ= Ġjava . util . concurrent . Thread Local Random . current (). nextInt ( min , Ġmax ) Ċ } Ċ Ċ private Ġfun Ġjava . lang . reflect . Method . to MethodType (): ĠMethod Ġ= ĠMethod ( name , ĠType . getMethod Descriptor ( this )) Ċ Ċ /** Ċ Ġ* ĠClass Ġtransformation Ġthat Ġinserts Ġchecks Ġof Ġ[ Thread # is Inter rupted ] Ġinto Ġthe Ġloops , Ġallowing Ġthe Ġthread Ġto Ġbe Ġinterrupted Ġeven Ġin Ġcases Ċ Ġ* Ġwhere Ġthe Ġcode Ġdoes Ġnot Ġcheck Ġfor Ġit Ġexplicitly . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdelegate Ġthe Ġ[ Class Visitor ] Ġto Ġgenerate Ġthe Ġoutput Ġof Ġthis Ġtransformation . Ċ Ġ* Ġ@ param Ġcheck Percentage Ġthe Ġpercentage Ġin Ġthe Ġ[ 1 , Ġ 1 0 0 ] Ġrange Ġto Ġdo Ġinterrupt Ġchecks . ĠThe Ġinterrupt Ġcondition Ġwill Ġonly Ġbe Ġchecked Ġin Ġ 1 % Ċ Ġ* Ġof Ġthe Ġloops . Ċ Ġ* Ġ@ param Ġshould Instrument Ġcallback Ġthat Ġreceives Ġclass Ġand Ġmethod Ġname Ġdetermines Ġwhether Ġit Ġshould Ġbe Ġtransformed . Ċ Ġ*/ Ċ class ĠC ooper ative Interrupt Transform ( delegate : ĠClass Visitor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcheck Percentage : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġshould Instrument : Ġ( String , ĠString ) Ġ-> ĠBoolean Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ}) Ġ: ĊĠ ĠClass Visitor ( Op codes . ASM 7 , Ġdelegate ), ĠClass Visitor UniqueId Provider Ġ{ ĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ( check Percentage Ġ! in Ġ 1 .. 1 0 0 ) Ġthrow ĠIllegalArgumentException (" check Percentage Ġmust Ġbe Ġin Ġ[ 1 , Ġ 1 0 0 ]") ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġunique Id : ĠString Ġ= Ġ"${ C ooper ative Interrupt Transform :: className }, $ check Percentage ,$ should Instrument " ĊĠ Ġprivate Ġval Ġloop Breaker Type Ġ= ĠType . getType ( Loop Breaker :: class . java ) ĊĠ Ġprivate Ġval Ġloop Check Method Ġ= ĠLoop Breaker :: check Loop . java Method !!. to MethodType () ĊĠ Ġprivate Ġval Ġthread Local Random Type Ġ= ĠType . getType ( Thread Local Random :: class . java ) ĊĠ Ġprivate Ġval Ġthread Local Random Next Int Method Ġ= ĠThread Local Random :: nextInt . java Method !!. to MethodType () ĊĠ Ġprivate Ġvar ĠclassName Ġ= Ġ"" ĊĊĠ Ġoverride Ġfun Ġvisit ( version : ĠInt , Ġaccess : ĠInt , Ġname : ĠString ?, Ġsignature : ĠString ?, Ġsuper Name : ĠString ?, Ġinterfaces : ĠArray < out ĠString > ?) Ġ{ ĊĠĠĠ ĠclassName Ġ= Ġname Ġ?: Ġ"" ĊĠĠĠ Ġsuper . visit ( version , Ġaccess , Ġname , Ġsignature , Ġsuper Name , Ġinterfaces ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Method ( access : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions : ĠArray < out ĠString >? ): ĠMethod Visitor Ġ{ ĊĠĠĠ Ġval Ġdelegate Ġ= Ġsuper . visit Method ( access , Ġname , Ġdescriptor , Ġsignature , Ġexceptions ) ĊĠĠĠ Ġreturn Ġif Ġ( should Instrument ( className , Ġname Ġ?: Ġ"")) Ġ{ ĊĠĠĠĠĠ Ġobject Ġ: ĠGenerator Adapter ( Op codes . ASM 7 , Ġdelegate , Ġaccess , Ġname , Ġdescriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Jump Insn ( opcode : ĠInt , Ġlabel : ĠLabel ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġskip Check Ġ= ĠLabel () ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠMin Ġrandom Ġvalue ĊĠĠĠĠĠĠĠĠĠ Ġpush ( 1 ) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠMax Ġrandom Ġvalue ĊĠĠĠĠĠĠĠĠĠ Ġpush ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġinvoke Static ( thread Local Random Type , Ġthread Local Random Next Int Method ) ĊĠĠĠĠĠĠĠĠĠ Ġpush ( check Percentage ) ĊĠĠĠĠĠĠĠĠĠ Ġif IC mp ( GE , Ġskip Check ) ĊĠĠĠĠĠĠĠĠĠ Ġinvoke Static ( loop Breaker Type , Ġloop Check Method ) ĊĠĠĠĠĠĠĠĠĠ Ġvisit Label ( skip Check ) ĊĊĠĠĠĠĠĠĠĠĠ Ġsuper . visit Jump Insn ( opcode , Ġlabel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġdelegate ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }