package Ġdev . false hon est y . asm helper . dsl Ċ Ċ import Ġdev . false hon est y . asm helper . Asm Helper Ċ import Ġdev . false hon est y . asm helper . dsl . instructions . Descriptor Ċ import Ġorg . object web . asm . Op codes Ċ import Ġorg . object web . asm . tree . Abstract Insn Node Ċ import Ġorg . object web . asm . tree . Method Insn Node Ċ import Ġorg . object web . asm . tree . Method Node Ċ Ċ /** Ċ Ġ* ĠThis Ġutility Ġclass Ġhelps Ġto Ġspecify Ġwhere Ġsome Ġbytecode Ġaction Ġshould Ġoccur . Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġnumero us Ġ[ Injection Point ] s Ġyou Ġcan Ġutilize , Ġeach Ġproviding Ġa Ġdifferent Ġabstraction . Ċ Ġ* Ċ Ġ* Ġ@ param Ġbefore Ġspecifies Ġif Ġthe Ġaction Ġshould Ġoccur Ġbefore Ġ( the Ġdefault ) Ġor Ġafter Ġthe Ġlocated Ġinstruction . Ċ Ġ* Ġ@ param Ġshift Ġspecifies Ġthe Ġoffset Ġto Ġwhere Ġthe Ġaction Ġshould Ġoccur . ĠThis Ġvalue Ġcan Ġbe Ġnegative Ġor Ġpositive . ĠThis Ġvalue Ġalways Ġsh ifts Ġforward , Ġregardless Ġof Ġthe Ġvalue Ġof Ġ[ before ]. Ċ Ġ*/ Ċ data Ġclass ĠAt ( val Ġvalue : ĠInjection Point , Ġval Ġbefore : ĠBoolean Ġ= Ġtrue , Ġval Ġshift : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠ Ġfun Ġget Target ed Nodes ( method : ĠMethod Node ): ĠList < Abstract Insn Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInjection Point . HEAD Ġ-> ĠlistOf ( method . instructions . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInjection Point . TAIL Ġ-> ĠlistOf ( method . instructions . last . previous ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInjection Point . RETURN Ġ-> Ġmethod . instructions . iterator (). as Sequence (). toList (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . opcode Ġin ĠOp codes . I RETURN .. Op codes . RETURN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġif Ġ( value . ordinal Ġ!= Ġnull ) ĠlistOf ( it [ value . ordinal ]) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInjection Point . IN VOKE Ġ-> Ġmethod . instructions . iterator (). as Sequence (). toList (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġvalue . descriptor ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠMethod Insn Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrem apped Name Ġ= ĠA sm Helper . re mapper . remap MethodName ( it . owner , Ġit . name , Ġit . desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrem apped Desc Ġ= ĠA sm Helper . re mapper . remap Desc ( it . desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrem apped ClassName Ġ= ĠA sm Helper . re mapper . remap ClassName ( it . owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrem apped ClassName Ġ== Ġdescriptor . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( rem apped Name Ġ== Ġdescriptor . name Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA sm Helper . method Maps [ rem apped Name ] Ġ== Ġdescriptor . name Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA sm Helper . method Maps [ descriptor . name ] Ġ== Ġrem apped Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrem apped Desc Ġ== Ġdescriptor . desc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . ordinal Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . ordinal Ġ>= Ġit . size ) Ġempty List () Ġelse ĠlistOf ( it [ value . ordinal ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInjection Point . CUSTOM Ġ-> Ġvalue . finder ( method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠInjection Point Ġ{ ĊĠĠĠ Ġobject ĠHEAD Ġ: ĠInjection Point () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject s Ġto Ġwhere Ġa Ġreturn Ġoperation Ġis Ġmade . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNorm ally , Ġthis Ġinject s Ġinto Ġevery Ġreturn Ġopcode Ġthat Ġfits Ġthis Ġdescription , Ġhowever , ĊĠĠĠĠ Ġ* Ġoptionally Ġone Ġcan Ġspecify Ġthe Ġexact Ġopcode Ġto Ġinject Ġto Ġby Ġspecifying Ġ[ ordinal ]. ĊĠĠĠĠ Ġ* ĠThis Ġvalue Ġ( 0 Ġindexed ) Ġis Ġthe Ġindex Ġof Ġthe Ġoperation Ġyou Ġwant . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠRETURN ( val Ġordinal : ĠInt ? Ġ= Ġnull ) Ġ: ĠInjection Point () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject s Ġto Ġwhere Ġan Ġinvoke Ġoperation Ġis Ġmade . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNorm ally , Ġthis Ġinject s Ġinto Ġevery Ġinvoke Ġopcode Ġthat Ġfits Ġthis Ġdescription , Ġhowever , ĊĠĠĠĠ Ġ* Ġoptionally Ġone Ġcan Ġspecify Ġthe Ġexact Ġopcode Ġto Ġinject Ġto Ġby Ġspecifying Ġ[ ordinal ]. ĊĠĠĠĠ Ġ* ĠThis Ġvalue Ġ( 0 Ġindexed ) Ġis Ġthe Ġindex Ġof Ġthe Ġoperation Ġyou Ġwant . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠIN VOKE ( val Ġdescriptor : ĠDescriptor , Ġval Ġordinal : ĠInt ? Ġ= Ġnull ) Ġ: ĠInjection Point () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject s Ġinto Ġthe Ġvery Ġvery Ġend Ġof Ġa Ġmethod , Ġbefore Ġthe Ġfinal Ġreturn . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠT AIL Ġ: ĠInjection Point () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġthe Ġuser Ġto Ġfind Ġtheir Ġown Ġinjection Ġpoints . ĠThe Ġmethod Ġnode ĊĠĠĠĠ Ġ* Ġto Ġbe Ġsearched Ġis Ġpassed Ġin , Ġand Ġthe Ġfinder Ġmethod Ġshould Ġreturn ĊĠĠĠĠ Ġ* Ġa Ġlist Ġof Ġnodes Ġto Ġbe Ġinjected Ġto . ĠThe Ġlist Ġcan Ġbe Ġof Ġsize Ġ>= Ġ 0 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠCUSTOM ( val Ġfinder : Ġ( Method Node ) Ġ-> ĠList < Abstract Insn Node >) Ġ: ĠInjection Point () Ċ } Ċ