package Ġorg . jetbrains . k annot ator . control Flow . builder . analysis Ċ Ċ import Ġorg . jetbrains . k annot ator . declarations . ClassName Ċ import Ġorg . jetbrains . k annot ator . asm . util .* Ċ import Ġorg . jetbrains . k annot ator . annotations Inference . engine .* Ċ Ċ import Ġorg . object web . asm .* Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġorg . object web . asm . Type .* Ċ import Ġorg . object web . asm . tree .* Ċ import Ġorg . object web . asm . tree . analysis . Value Ċ import Ġorg . object web . asm . tree . analysis . Frame Ċ Ċ import Ġjava . util .* Ċ import Ġcom . gs . collections . impl . map . strategy . mutable . Unified Map With Hash ing Strategy Ċ import Ġcom . gs . collections . api . block . Hash ing Strategy Ċ import Ġorg . jetbrains . k annot ator . declarations . Method Ċ import Ġorg . jetbrains . k annot ator . index . Declaration Index Ċ import Ġorg . jetbrains . k annot ator . declarations . Annotations Ċ import Ġorg . jetbrains . k annot ator . declarations . Positions For Method Ċ import Ġorg . jetbrains . k annot ator . declarations . Field Ċ import Ġorg . jetbrains . k annot ator . runtime . annotations . Analysis Type Ċ Ċ trait ĠAnnotation Ċ Ċ public Ġfun Ġ< A : ĠAnnotation > Ġgenerate Assert s For Call Arguments ( ĊĠĠĠĠĠĠĠ Ġinstruction Node : ĠAbstract Insn Node ?, ĊĠĠĠĠĠĠĠ Ġdeclaration Index : ĠDeclaration Index , ĊĠĠĠĠĠĠĠ Ġannotations : ĠAn notations < A >, ĊĠĠĠĠĠĠĠ Ġadd Assert For Stack Value : Ġ( Int ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġneed Generate Assert For This : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġneed Generate Assert For Argument : Ġ( A ?) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠ Ġadd Assert For External Stack Value : Ġ( Int ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( instruction Node Ġ! is ĠMethod Insn Node ) Ġthrow ĠIllegalArgumentException (" Not Ġa Ġmethod Ġinstruction : Ġ$ instruction Node ") ĊĠĠĠ Ġval Ġhas This Ġ= Ġinstruction Node . get Opcode () Ġ!= ĠIN VOKE STATIC ĊĠĠĠ Ġval Ġthis Slots Ġ= Ġif Ġ( has This ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġval Ġparameters Count Ġ= Ġinstruction Node . get Argument Count () Ġ+ Ġthis Slots ĊĠĠĠ Ġval Ġarg Types Ġ= ĠType . get Argument Types ( instruction Node . desc ) ĊĊĠĠĠ Ġfun Ġadd Assert For Argument On Stack ( index : ĠInt , Ġexternal : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġthis Slots Ġ|| Ġ! arg Types [ index Ġ- Ġthis Slots ]. is Primitive Or Void Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex From Top Ġ= Ġparameters Count Ġ- Ġindex Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( external ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Assert For External Stack Value ( index From Top ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Assert For Stack Value ( index From Top ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( has This Ġ&& Ġneed Generate Assert For This ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Assert For Argument On Stack ( 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( instruction Node . get Opcode () Ġ!= ĠIN V OK ED Y NAMIC ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġdeclaration Index . find Method By Method Insn Node ( instruction Node ) ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= ĠPosition s For Method ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( param Index Ġin Ġthis Slots .. parameters Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Annotation Ġ= Ġannotations [ positions . for Parameter ( param Index ). position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( param Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need Generate Assert For Argument ( param Annotation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Assert For Argument On Stack ( param Index , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Assert For Argument On Stack ( param Index , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( param Index Ġin Ġthis Slots .. parameters Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Assert For Argument On Stack ( param Index , Ġtrue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠDeclaration Index . find Method By Method Insn Node ( method Insn Node : ĠMethod Insn Node ): ĠMethod ? Ġ{ ĊĠĠĠ Ġreturn Ġthis . find Method ( ClassName . from Internal Name ( method Insn Node . owner !! ), Ġmethod Insn Node . name !! , Ġmethod Insn Node . desc ) Ċ } Ċ Ċ fun ĠDeclaration Index . find Field By Field Insn Node ( field Insn Node : ĠField Insn Node ): ĠField ? Ġ{ ĊĠĠĠ Ġreturn Ġthis . find Field ( ClassName . from Internal Name ( field Insn Node . owner ), Ġfield Insn Node . name ) Ċ } Ċ Ċ public Ġfun Ġ< V : ĠCopy able Value < V >> ĠFrame < V >. copy (): ĠFrame < V > Ġ{ ĊĠĠĠ Ġval Ġframe Copy Ġ= ĠInference Frame < V >( this ) ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. getLocal s () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġget Local ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Copy . set Local ( i , Ġv . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġframe Copy . clear Stack () ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. get Stack Size () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġget Stack ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Copy . push ( v . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġframe Copy . set Lost Value (( this Ġas ĠInference Frame < V >). get Lost Value ()?. copy ()) ĊĊĠĠĠ Ġreturn Ġframe Copy Ċ } Ċ Ċ fun Ġ< V : ĠValue > ĠFrame < V >. forEach Value ( body : Ġ( value : ĠV ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. this . getLocal s () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġthis . getLocal ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. this . get Stack Size () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġthis . get Stack ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< V : ĠValue > ĠFrame < V >. all Values ( body : Ġ( value : ĠV ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. this . getLocal s () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġthis . getLocal ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull Ġ&& Ġ! body ( v )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. this . get Stack Size () Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġthis . get Stack ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull Ġ&& Ġ! body ( v )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun Ġ< Q : ĠQual ifier > ĠQual ifier . extract ( qual ifier Set : ĠQual ifier Set < Q >): ĠQ ? Ġ{ ĊĠĠĠ Ġif Ġ( qual ifier Set . contains ( this )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠQ ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠMulti Qualifier <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . qual ifiers [ qual ifier Set . id ] Ġas ĠQ ? ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġextract Ġqualifier ") Ċ } Ċ Ċ fun Ġ< Q : ĠQual ifier , ĠI : ĠQual ifier > ĠQual ified Value < Q >. copy ( qual ifier Set : ĠQual ifier Set < I >, Ġqualifier : ĠI ): ĠQual ified Value < Q > Ġ{ ĊĠĠĠ Ġval Ġthis Qualifier Ġ= Ġthis . qual ifier ĊĠĠĠ Ġif Ġ( qual ifier Set . contains ( this Qualifier )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( qual ifier Ġas ĠQ ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Qualifier Ġis ĠMulti Qualifier <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthis Qualifier Copy Ġ= Ġ( this Qualifier Ġas ĠMulti Qualifier < Analysis Type >). copy ( qual ifier Set . id , Ġqualifier ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( this Qualifier Copy Ġas ĠQ ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġextract Ġqualifier ") Ċ } Ċ Ċ class ĠQual ified Value Hash ing Strategy < Q : ĠQual ifier , ĠI : ĠQual ifier >( ĊĠĠĠĠĠĠĠ Ġval Ġqualifier Set : ĠQual ifier Set < I > Ċ ) Ġ: ĠHash ing Strategy < Qualified Value < Q >> Ġ{ ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġequals ( object 1 : ĠQual ified Value < Q > ?, Ġobject 2 : ĠQual ified Value < Q >? ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( object 1 Ġidentity Equals Ġobject 2 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( object 1 Ġ== Ġnull Ġ|| Ġobject 2 Ġ== Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( object 1 . base . id Ġ!= Ġobject 2 . base . id ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġ( object 1 . qual ifier . extract < I >( qual ifier Set ) Ġ== Ġobject 2 . qual ifier . extract < I >( qual ifier Set )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġcompute HashCode (_ object : ĠQual ified Value < Q >? ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ object Ġ== Ġnull ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 9 *_ object . base . id Ġ+ Ġ(_ object . qual ifier . extract < I >( qual ifier Set )?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< Q : ĠQual ifier , ĠI : ĠQual ifier > Ġupdate Qual ifiers ( ĊĠĠĠĠĠĠĠ Ġframe : ĠFrame < Qualified Value Set < Q >>, ĊĠĠĠĠĠĠĠ Ġframe Values : ĠQual ified Value Set < Q > ?, ĊĠĠĠĠĠĠĠ Ġqualifier Set : ĠQual ifier Set < I >, ĊĠĠĠĠĠĠĠ Ġupdate Original Values : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtransform : Ġ( I ) Ġ-> ĠI Ċ ): ĠFrame < Qualified Value Set < Q >> Ġ{ ĊĠĠĠ Ġif Ġ( frame Values Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠUn ified Map With Hash ing Strategy < Qualified Value < Q >, ĠQual ified Value < Q >>( Qualified Value Hash ing Strategy ( qual ifier Set )) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( stack Value Ġin Ġframe Values . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq 1 Ġ= Ġstack Value . qual ifier . extract < I >( qual ifier Set ) Ġ?: Ġqualifier Set . initial ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq 2 Ġ= Ġtransform ( q 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( q 2 Ġ!= Ġq 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( stack Value , Ġstack Value . copy ( qual ifier Set , Ġq 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( update Original Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Set Ġ= Ġframe Values . values Ġas ĠMutable Set < Qualified Value < Q >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( orig Value , ĠnewValue ) Ġin Ġmap . entrySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Set . remove ( orig Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Set . add ( newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreplaced Values Ġ= ĠHashSet < Qualified Value < Q >>() ĊĠĠĠĠĠĠĠ Ġframe . forEach Value Ġ{ Ġvalue Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplaced Values . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġvalue Set . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map . containsKey ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplaced Values . add ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġreplaced Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Set . values Ġas ĠMutable Set < Qualified Value < Q >> ). remove ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Set . values Ġas ĠMutable Set < Qualified Value < Q >> ). add ( map [ value ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġframe Ċ } Ċ Ċ open Ġclass ĠBasic Frame Transformer < Q : ĠQual ifier >: ĠDefault Frame Transformer < Qualified Value Set < Q >>() Ġ{ ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Post Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Node : ĠAbstract Insn Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Kind : ĠEdge Kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Frame : ĠFrame < Qualified Value Set < Q >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Frame : ĠFrame < Qualified Value Set < Q >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer : ĠAnalyzer < Qualified Value Set < Q >> ): ĠFrame < Qualified Value Set < Q >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( insn Node . get Opcode () Ġ== ĠA STORE Ġ&& Ġedge Kind Ġ== ĠEdge Kind . DEFAULT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Frame Ġ= Ġexecuted Frame . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Index Ġ= Ġ( insn Node Ġas ĠVar Insn Node ). ` var ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= Ġpre Frame . get Stack From Top ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= Ġpre Frame . getLocal ( var Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinf Post Frame Ġ= Ġpost Frame Ġas ĠInference Frame < Qualified Value Set < Q >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Lost Value Ġ= Ġinf Post Frame . get Lost Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Lost Value Ġ= Ġif Ġ( lhs Ġ!= Ġnull ) ĠQual ified Value Set ( lhs ._ size , ĠHashSet ( lhs . values )) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Lost Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Lost Value Ġ== Ġnull ) Ġprev Lost Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( prev Lost Value Ġ== Ġnull ) Ġcurr Lost Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġanalyzer . get Interpreter (). merge ( prev Lost Value , Ġcurr Lost Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf Post Frame . set Lost Value ( new Lost Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Frame . set Local ( var Index , Ġif Ġ( rhs Ġ!= Ġnull ) ĠQual ified Value Set ( rhs ._ size , ĠHashSet ( rhs . values )) Ġelse Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpost Frame ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexecuted Frame ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMulti Frame Transformer < K : ĠAnalysis Type , ĠV : ĠCopy able Value < V >>( ĊĠĠĠĠĠĠĠ Ġval Ġtransform ers : ĠMap < K , ĠFrame Transformer < V >> Ċ ): ĠFrame Transformer < V > Ġ{ ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Pseudo Results ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Node : ĠAbstract Insn Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Frame : ĠFrame < V >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Frame : ĠFrame < V >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer : ĠAnalyzer < V > ĊĠĠĠ Ġ): ĠCollection < Result Frame < V >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Frame Copy Ġ= Ġpre Frame . copy () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult List Ġ= ĠArrayList < Result Frame < V >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġtransformer ) Ġin Ġtransform ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . addAll ( transformer . get Pseudo Results ( insn Node , Ġpre Frame Copy , Ġexecuted Frame , Ġanalyzer )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Post Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Node : ĠAbstract Insn Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Kind : ĠEdge Kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Frame : ĠFrame < V >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Frame : ĠFrame < V >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer : ĠAnalyzer < V > ĊĠĠĠ Ġ): ĠFrame < V >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Frame Copy Ġ= Ġpre Frame . copy () ĊĊĠĠĠĠĠĠĠ Ġvar Ġpost Frame : ĠFrame < V > Ġ= Ġexecuted Frame ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġtransformer ) Ġin Ġtransform ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Frame Ġ= Ġtransformer . getPost Frame ( insn Node , Ġedge Kind , Ġpre Frame Copy , Ġpost Frame , Ġanalyzer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Frame Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Frame Ġ= Ġnext Frame ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpost Frame ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< V : ĠValue > ĠAnalyzer < V >. get Instruction Index ( insn : ĠAbstract Insn Node ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġm Ġ= Ġget Method Node () ĊĠĠĠ Ġreturn Ġif Ġ( m Ġ!= Ġnull ) Ġm . instructions . indexOf ( insn ) Ġelse Ġ- 1 Ċ } Ċ Ċ fun Ġ< V : ĠValue > ĠAnalyzer < V >. get Instruction Frame ( insn : ĠAbstract Insn Node ): ĠFrame < V >? Ġ{ ĊĠĠĠ Ġval Ġm Ġ= Ġget Method Node () ĊĠĠĠ Ġreturn Ġif Ġ( m Ġ!= Ġnull ) Ġget Frames ()[ m . instructions . indexOf ( insn )] Ġelse Ġnull Ċ } Ċ Ċ fun Ġ< V : ĠValue > ĠFrame < V >. get Stack From Top ( index : ĠInt ): ĠV ? Ġ= ĊĠĠĠĠĠĠĠ Ġget Stack ( get Stack Size () Ġ- Ġindex Ġ- Ġ 1 ) Ċ Ċ fun Ġ< V : ĠValue > ĠMethod Insn Node . get Receiver ( frame : ĠFrame < V >): ĠV ? Ġ= ĊĠĠĠĠĠĠĠ Ġframe . get Stack From Top ( get Argument Count ()) Ċ Ċ public Ġclass ĠQual ified Values Analyzer < Q : ĠQual ifier >( ĊĠĠĠĠĠĠĠ Ġval Ġowner : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġval Ġmethod Node : ĠMethod Node , ĊĠĠĠĠĠĠĠ Ġval Ġqualifier Set : ĠQual ifier Set < Q >, ĊĠĠĠĠĠĠĠ Ġval Ġframe Transformer : ĠFrame Transformer < Qualified Value Set < Q >>, ĊĠĠĠĠĠĠĠ Ġval Ġqualifier Evaluator : ĠQual ifier Evaluator < Q > Ċ ) Ġ: ĠAnalyzer < Qualified Value Set < Q >>( Qualified Values Interpreter ( Method ( owner , Ġmethod Node ), Ġqualifier Set , Ġqualifier Evaluator ), Ġframe Transformer ) Ġ{ ĊĠĠĠ Ġprotected Ġoverride Ġfun Ġnew Frame ( n Local s : ĠInt , Ġn Stack : ĠInt ): ĠFrame < Qualified Value Set < Q >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInference Frame ( n Local s , Ġn Stack ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġoverride Ġfun Ġnew Frame ( src : ĠFrame < out ĠQual ified Value Set < Q >> ): ĠFrame < Qualified Value Set < Q >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInference Frame ( src ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun Ġ< Q : ĠQual ifier > ĠMethod Node . run Qualifier Analysis ( ĊĠĠĠĠĠĠĠ Ġowner : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġqualifier Set : ĠQual ifier Set < Q >, ĊĠĠĠĠĠĠĠ Ġframe Transformer : ĠFrame Transformer < Qualified Value Set < Q >>, ĊĠĠĠĠĠĠĠ Ġqualifier Evaluator : ĠQual ifier Evaluator < Q > Ċ ): ĠAnalysis Result < Qualified Value Set < Q >> Ġ= ĊĠĠĠĠĠĠĠ ĠQual ified Values Analyzer ( owner , Ġthis , Ġqualifier Set , Ġframe Transformer , Ġqualifier Evaluator ). analyze ( owner . internal , Ġthis )