package Ġnet . cord a . dj vm . code Ċ Ċ import Ġnet . cord a . dj vm . analysis . Analysis Configuration Ċ import Ġnet . cord a . dj vm . analysis . Class And Member Visitor Ċ import Ġnet . cord a . dj vm . code . instructions . Method Entry Ċ import Ġnet . cord a . dj vm . references . Class Representation Ċ import Ġnet . cord a . dj vm . references . Member Ċ import Ġnet . cord a . dj vm . references . Method Body Ċ import Ġnet . cord a . dj vm . utilities . Processor Ċ import Ġnet . cord a . dj vm . utilities . logger For Ċ import Ġorg . object web . asm . Class Visitor Ċ import Ġorg . object web . asm . Op codes .* Ċ Ċ /** Ċ Ġ* ĠHelper Ġclass Ġfor Ġapplying Ġa Ġset Ġof Ġdefinition Ġproviders Ġand Ġemitter s Ġto Ġa Ġclass Ġor Ġset Ġof Ġclasses . Ċ Ġ* Ċ Ġ* Ġ@ param Ġclass Visitor ĠClass Ġvisitor Ġto Ġuse Ġwhen Ġtra ver sing Ġthe Ġstructure Ġof Ġclasses . Ċ Ġ* Ġ@ property Ġconfiguration ĠThe Ġconfiguration Ġto Ġuse Ġfor Ġclass Ġanalysis . Ċ Ġ* Ġ@ property Ġdefinition Providers ĠA Ġset Ġof Ġproviders Ġused Ġto Ġupdate Ġthe Ġname Ġor Ġmeta - data Ġof Ġclasses Ġand Ġmembers . Ċ Ġ* Ġ@ param Ġemitter s ĠA Ġset Ġof Ġcode Ġemitter s Ġused Ġto Ġmodify Ġand Ġinstrument Ġmethod Ġbodies . Ċ Ġ*/ Ċ class ĠClass Mut ator ( ĊĠĠĠĠĠĠĠ Ġclass Visitor : ĠClass Visitor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconfiguration : ĠAnalysis Configuration , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefinition Providers : ĠList < Definition Provider > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġemitter s : ĠList < Emitter > Ġ= Ġempty List () Ċ ) Ġ: ĠClass And Member Visitor ( configuration , Ġclass Visitor ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInternal Ġ[ Emitter ] Ġto Ġadd Ġstatic Ġfield Ġinitial izers Ġto ĊĠĠĠĠ Ġ* Ġany Ġclass Ġconstructor Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠPre pend Class Initializer Ġ: ĠEmit ter Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġemit ( context : ĠEmit ter Context , Ġinstruction : ĠInstruction ) Ġ= Ġcontext . emit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instruction Ġis ĠMethod Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġinstruction . method . member Name Ġ== Ġ"< cl init >" Ġ&& Ġinstruction . method . signature Ġ== Ġ" () V " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġinitial izers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte Code ( initial izers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial izers . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠSome Ġemitter s Ġmust Ġbe Ġexecuted Ġbefore Ġothers . ĠE . g . Ġwe Ġneed Ġto Ġapply ĊĠĠĠĠ Ġ* Ġthe Ġtracing Ġemitter s Ġbefore Ġthe Ġnon - tracing Ġones . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġemitter s : ĠList < Emitter > Ġ= Ġ( emitter s Ġ+ ĠPre pend Class Initializer ()). sorted By ( Emitter :: priority ) ĊĠĠĠ Ġprivate Ġval Ġinitial izers Ġ= Ġmutable ListOf < Method Body >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrack s Ġwhether Ġany Ġmodifications Ġhave Ġbeen Ġapplied Ġto Ġany Ġof Ġthe Ġprocessed Ġclass ( es ) Ġand Ġpert inent Ġmembers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġhas Been Modified : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġdefinition Ġproviders Ġto Ġa Ġclass . ĠThis Ġcan Ġbe Ġused Ġto Ġupdate Ġthe Ġname Ġor Ġdefinition Ġ( pert inent Ġmeta - data ) ĊĠĠĠĠ Ġ* Ġof Ġthe Ġclass Ġitself . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( clazz : ĠClass Representation ): ĠClass Representation Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresulting Class Ġ= Ġclazz ĊĠĠĠĠĠĠĠ ĠProcessor . process Entries OfType < Class Definition Provider >( definition Providers , Ġanalysis Context . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresulting Class Ġ= Ġit . define ( current Analysis Context (), Ġresulting Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( clazz Ġ!= Ġresulting Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace (" Type Ġhas Ġbeen Ġmut ated Ġ{}", Ġclazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Been Modified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Class ( result ing Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġwe Ġhave Ġsome Ġstatic Ġfields Ġto Ġinitialise , Ġand Ġhaven 't Ġalready Ġadded Ġthem ĊĠĠĠĠ Ġ* Ġto Ġan Ġexisting Ġclass Ġinitial iser Ġblock Ġthen Ġwe Ġneed Ġto Ġcreate Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit Class End ( class Visitor : ĠClass Visitor , Ġclazz : ĠClass Representation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Write Class Initializer ( class Visitor ) ĊĠĠĠĠĠĠĠ Ġsuper . visit Class End ( class Visitor , Ġclazz ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Write Class Initializer ( class Visitor : ĠClass Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( initial izers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Method ( ACC _ STATIC , Ġ"< cl init >", Ġ" () V ", Ġnull , Ġnull )?. also Ġ{ Ġmv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit ter Module ( mv ). write Byte Code ( initial izers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Insn ( RETURN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Max s (- 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial izers . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Been Modified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġdefinition Ġproviders Ġto Ġa Ġmethod . ĠThis Ġcan Ġbe Ġused Ġto Ġupdate Ġthe Ġname Ġor Ġdefinition Ġ( pert inent Ġmeta - data ) ĊĠĠĠĠ Ġ* Ġof Ġa Ġclass Ġmember . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit Method ( clazz : ĠClass Representation , Ġmethod : ĠMember ): ĠMember Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresulting Method Ġ= Ġmethod ĊĠĠĠĠĠĠĠ ĠProcessor . process Entries OfType < Member Definition Provider >( definition Providers , Ġanalysis Context . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresulting Method Ġ= Ġit . define ( current Analysis Context (), Ġresulting Method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġresulting Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace (" Method Ġhas Ġbeen Ġmut ated Ġ{}", Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Been Modified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Method ( clazz , Ġresulting Method ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġdefinition Ġproviders Ġto Ġa Ġfield . ĠThis Ġcan Ġbe Ġused Ġto Ġupdate Ġthe Ġname Ġor Ġdefinition Ġ( pert inent Ġmeta - data ) ĊĠĠĠĠ Ġ* Ġof Ġa Ġclass Ġmember . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit Field ( clazz : ĠClass Representation , Ġfield : ĠMember ): ĠMember Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresulting Field Ġ= Ġfield ĊĠĠĠĠĠĠĠ ĠProcessor . process Entries OfType < Member Definition Provider >( definition Providers , Ġanalysis Context . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresulting Field Ġ= Ġit . define ( current Analysis Context (), Ġresulting Field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġresulting Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace (" Field Ġhas Ġbeen Ġmut ated Ġ{}", Ġfield ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial izers Ġ+= Ġresulting Field . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Been Modified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Field ( clazz , Ġresulting Field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġemitter s Ġto Ġan Ġinstruction . ĠThis Ġcan Ġbe Ġused Ġto Ġinstrument Ġa Ġpart Ġof Ġthe Ġcode Ġblock , Ġchange Ġbehaviour Ġof ĊĠĠĠĠ Ġ* Ġan Ġexisting Ġinstruction , Ġor Ġstrip Ġit Ġout Ġcompletely . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit Instruction ( method : ĠMember , Ġemitter : ĠEmit ter Module , Ġinstruction : ĠInstruction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠEmit ter Context ( current Analysis Context (), Ġconfiguration , Ġemitter ) ĊĠĠĠĠĠĠĠ ĠProcessor . process Entries OfType < Emitter >( emitter s , Ġanalysis Context . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . emit ( context , Ġinstruction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! emitter . emit Default Instruction Ġ|| Ġemitter . has Emit ted Custom Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Been Modified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Instruction ( method , Ġemitter , Ġinstruction ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger For < Class Mut ator >() ĊĠĠĠ Ġ} Ċ Ċ } Ċ