// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . kotlin . idea . debugger . evaluate . compilation Ċ Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . registry . Registry Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . impl . compiled . Signature Parsing Ċ import Ġcom . intellij . psi . impl . compiled . Stub Building Visitor Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . util . Class Util Ċ import Ġcom . intellij . util . concurrency . annotations . Requires Read Lock Ċ import Ġorg . jetbrains . kotlin . idea . debugger . evaluate . variables . Evaluator Value Converter Ċ import Ġorg . jetbrains . kotlin . idea . debugger . evaluate . variables . box Ċ import Ġorg . jetbrains . org . object web . asm .* Ċ import Ġjava . text . String Character Iterator Ċ Ċ object ĠReflection Call Class Patch er Ġ{ ĊĠĠĠ Ġvar Ġis Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠRegistry .` is ` (" kotlin . debugger . evaluator . enable . reflection . patch ing ") ĊĠĠĠĠĠĠĠ Ġset ( newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegistry . get (" kotlin . debugger . evaluator . enable . reflection . patch ing "). setValue ( newValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Read Lock ĊĠĠĠ Ġfun Ġpatch ( bytes : ĠByteArray , Ġproject : ĠProject , Ġscope : ĠGlobal Search Scope ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠClass Reader ( bytes ) ĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠClass Writer ( reader , ĠClass Writer . COMPUTE _ MAX S ) ĊĊĠĠĠĠĠĠĠ Ġreader . accept ( object Ġ: ĠClass Visitor ( Op codes . API _ VERSION , Ġwriter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions : ĠArray < out ĠString >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠMethod Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġsuper . visit Method ( access , Ġname , Ġdescriptor , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠReflection Call Method Visitor ( project , Ġscope , Ġdelegate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwriter . toByteArray () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠReflection Call Method Visitor ( ĊĠĠĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠĠĠ Ġprivate Ġval Ġscope : ĠGlobal Search Scope , ĊĠĠĠ Ġmethod Visitor : ĠMethod Visitor Ċ ) Ġ: ĠMethod Visitor ( Op codes . API _ VERSION , Ġmethod Visitor ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġbox Value ( type : ĠType , Ġbox ed Type : ĠType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Descriptor Ġ= Ġ"(" Ġ+ Ġtype . descriptor Ġ+ Ġ")" Ġ+ Ġbox ed Type . descriptor ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE STATIC , Ġbox ed Type . internal Name , Ġ" valueOf ", Ġmethod Descriptor , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun box Value ( type : ĠType , Ġbox ed Type : ĠType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbox ed ClassName Ġ= Ġbox ed Type . internal Name ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= ĠEvalu ator Value Converter . UN BOX ING _ METHOD _ NAMES [ boxed ClassName ] Ġ?: Ġerror (" Unexpected Ġbox ed Ġtype : Ġ$ boxed Type ") ĊĠĠĠĠĠĠĠ Ġval Ġmethod Descriptor Ġ= Ġ" ()" Ġ+ Ġtype . descriptor ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġbox ed ClassName , ĠmethodName , Ġmethod Descriptor , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpush Class Literal ( type : ĠType , Ġresolved Class : ĠPsi Class ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type . sort Ġ!= ĠType . OBJECT Ġ&& Ġtype . sort Ġ!= ĠType . ARRAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Object Ġor Ġarray Ġtype Ġexpected , Ġgot Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinternal Name Ġ= Ġtype . internal Name ĊĠĠĠĠĠĠĠ Ġval Ġpsi Class Ġ= Ġresolved Class Ġ?: Ġfind Class ( internal Name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( psi Class Ġ!= Ġnull Ġ&& Ġ! psi Class . has Modifier Property ( Psi Modifier . PUBLIC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( internal Name . replace ('/', Ġ'. ')) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE STATIC , Ġ" java / lang / Class ", Ġ" forName ", Ġ"( Ljava / lang / String ;) Ljava / lang / Class ;", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Class ( internal Name : ĠString ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠType . get ObjectType ( internal Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type . sort Ġ!= ĠType . OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArray Ġdoesn 't Ġhave Ġany Ġfields Ġ(` length ` Ġcalls Ġis Ġtransformed Ġto Ġthe ĠARRAY LENGTH Ġinstruction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠString Character Iterator ( type . descriptor ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Type Ġ= ĠSignature Parsing . parse TypeString ( iterator , ĠStub Building Visitor . GU ESS ING _ MAP PER ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJava Psi Facade . getInstance ( project ). find Class ( class Type , Ġscope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Reflection Field ( owner : ĠString , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Class Literal ( Type . get ObjectType ( owner )) Ġ/// Ġ..., Ġreceiver Type ĊĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( name ) Ġ/// Ġ..., Ġreceiver Type , ĠfieldName ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Signature Ġ= Ġ"( Ljava / lang / String ;) Ljava / lang / reflect / Field ;" ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġ" java / lang / Class ", Ġ" getDeclared Field ", Ġmethod Signature , Ġfalse ) Ġ/// Ġ..., Ġfield ĊĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . DUP ) Ġ/// Ġ..., Ġfield , Ġfield ĊĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( 1 ) Ġ/// Ġ..., Ġfield , Ġfield , Ġ' true ' ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġ" java / lang / reflect / Field ", Ġ" setAccessible ", Ġ"( Z ) V ", Ġfalse ) Ġ/// Ġ..., Ġfield ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Field Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString , Ġdescriptor : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġfind Class ( owner )?. find Field ByName ( name , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull Ġ|| Ġfield . has Modifier Property ( Psi Modifier . PUBLIC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Field Insn ( opcode , Ġowner , Ġname , Ġdescriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Type Ġ= ĠType . getType ( descriptor ) ĊĠĠĠĠĠĠĠ Ġval Ġbox ed ValueType Ġ= Ġbox ( valueType ) ĊĊĠĠĠĠĠĠĠ Ġfetch Reflection Field ( owner , Ġname ) Ġ// Ġ..., Ġfield ĊĊĠĠĠĠĠĠĠ Ġval Ġis Category 2 Type Ġ= Ġvalue Type . size Ġ== Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . GET STATIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . AC ON ST _ NULL ) Ġ/// Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT STATIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġvalue , Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . AC ON ST _ NULL ) Ġ/// Ġvalue , Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( is Category 2 Type ) ĠOp codes . DUP 2 _ X 2 Ġelse ĠOp codes . DUP 2 _ X 1 ) Ġ/// Ġfield , Ġreceiver , Ġvalue , Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . POP 2 ) Ġ/// Ġfield , Ġreceiver , Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . GET FIELD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġreceiver , Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . SWAP ) Ġ/// Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT FIELD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġreceiver , Ġvalue , Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( is Category 2 Type ) ĠOp codes . DUP _ X 2 Ġelse ĠOp codes . DUP _ X 1 ) Ġ/// Ġreceiver , Ġfield , Ġvalue , Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . POP ) Ġ/// Ġreceiver , Ġfield , Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( is Category 2 Type ) ĠOp codes . DUP 2 _ X 2 Ġelse ĠOp codes . DUP _ X 2 ) Ġ/// Ġvalue , Ġreceiver , Ġfield , Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( is Category 2 Type ) ĠOp codes . POP 2 Ġelse ĠOp codes . POP ) Ġ/// Ġvalue , Ġreceiver , Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . SWAP ) Ġ/// Ġvalue , Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( is Category 2 Type ) ĠOp codes . DUP 2 _ X 2 Ġelse ĠOp codes . DUP 2 _ X 1 ) Ġ/// Ġfield , Ġreceiver , Ġvalue , Ġfield , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . POP 2 ) Ġ/// Ġfield , Ġreceiver , Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unexpected Ġopcode Ġ$ opcode ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Put Ġ= Ġopcode Ġ== ĠOp codes . PUT STATIC Ġ|| Ġopcode Ġ== ĠOp codes . PUT FIELD ĊĠĠĠĠĠĠĠ Ġif Ġ( is Put Ġ&& Ġvalue Type Ġ!= Ġbox ed ValueType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbox Value ( valueType , Ġbox ed ValueType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġif Ġ( is Put ) Ġ" set " Ġelse Ġ" get " ĊĠĠĠĠĠĠĠ Ġval Ġmethod Signature Ġ= Ġif Ġ( is Put ) Ġ"( Ljava / lang / Object ; Ljava / lang / Object ;) V " Ġelse Ġ"( Ljava / lang / Object ;) Ljava / lang / Object ;" ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġ" java / lang / reflect / Field ", ĠmethodName , Ġmethod Signature , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Put ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Type Insn ( Op codes . CHECK CAST , Ġbox ed ValueType . internal Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valueType Ġ!= Ġbox ed ValueType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun box Value ( valueType , Ġbox ed ValueType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Method ( owner : ĠString , Ġname : ĠString , Ġdescriptor : ĠString ): ĠPsi Method ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Class Ġ= Ġfind Class ( owner ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġif Ġ( name Ġ== Ġ"< init >") Ġdeclaring Class . construct ors Ġelse Ġdeclaring Class . find Methods ByName ( name , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Descriptor Ġ= ĠClass Util . get Asm Method Signature ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Descriptor Ġ== Ġdescriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠResolved MethodCall ( ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Class : ĠPsi Class , ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring ClassType : ĠType , ĊĠĠĠĠĠĠĠ Ġval Ġparameter Types : ĠList < Type >, ĊĠĠĠĠĠĠĠ Ġval Ġbox ed Parameter Types : ĠList < Type > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Applicable MethodCall ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString , Ġdescriptor : ĠString ): ĠResolved MethodCall ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( opcode Ġ!= ĠOp codes . IN VOKE VIRTUAL Ġ&& Ġopcode Ġ!= ĠOp codes . IN VOKE STATIC Ġ&& Ġopcode Ġ!= ĠOp codes . INV OK ES PE CIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . startsWith ("< ") Ġ&& Ġname Ġ!= Ġ"< init >") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( name Ġ== Ġ"< init >") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstructors Ġare Ġfiltered Ġout Ġhere Ġas Ġthey Ġneed Ġto Ġbe Ġproperly Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( for Ġinstance , Ġwe Ġneed Ġto Ġdeal Ġwith Ġthe Ġpreceding ĠNEW Ġinstruction Ġsomehow ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġfind Method ( owner , Ġname , Ġdescriptor ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Class Ġ= Ġmethod ?. containing Class ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġnull Ġ|| Ġmethod . has Modifier Property ( Psi Modifier . PUBLIC ) Ġ|| Ġdeclaring Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdeclaring ClassType Ġ= ĠPsi Element Factory . getInstance ( project ). create Type ( decl aring Class ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Class TypeDescriptor Ġ= ĠClass Util . get Binary Presentation ( decl aring ClassType ). take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdeclaring Class Asm Type Ġ= ĠType . getType ( decl aring Class TypeDescriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparameter Count Ġ= Ġmethod . parameter List . parameters Count ĊĠĠĠĠĠĠĠ Ġval Ġparameter Types Ġ= ĠArrayList < Type >( parameter Count ) ĊĠĠĠĠĠĠĠ Ġval Ġbox ed Parameter Types Ġ= ĠArrayList < Type >( parameter Count ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġparameter Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġmethod . parameter List . getParameter ( index ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter TypeDescriptor Ġ= ĠClass Util . get Binary Presentation ( parameter . type ). take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= ĠType . getType ( parameter TypeDescriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Types Ġ+= Ġparameter Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed Parameter Types Ġ+= Ġbox ( parameter Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResolved MethodCall ( decl aring Class , Ġdeclaring Class Asm Type , Ġparameter Types , Ġbox ed Parameter Types ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Reflection Method ( name : ĠString , Ġresolved Call : ĠResolved MethodCall ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Constructor Ġ= Ġname Ġ== Ġ"< init >" ĊĊĠĠĠĠĠĠĠ Ġpush Class Literal ( resolved Call . decl aring ClassType , Ġresolved Call . decl aring Class ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPut Ġargument Ġtypes Ġto Ġan Ġarray ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( resolved Call . parameter Types . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Type Insn ( Op codes . ANE WAR R AY , Ġ" java / lang / Class ") Ġ/// Ġ..., Ġtypes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġresolved Call . parameter Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= Ġresolved Call . parameter Types [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox ed ParameterType Ġ= Ġresolved Call . boxed Parameter Types [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . DUP ) Ġ/// Ġ..., Ġtypes , Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( index ) Ġ/// Ġ..., Ġtypes , Ġtypes , Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter Type Ġ!= Ġbox ed ParameterType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Field Insn ( Op codes . GET STATIC , Ġbox ed ParameterType . internal Name , Ġ" TYPE ", Ġ" Ljava / lang / Class ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Class Literal ( parameter Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġ..., Ġtypes , Ġtypes , Ġindex , Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . AA STORE ) Ġ/// Ġ..., Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġget MethodName Ġ= Ġif Ġ( is Constructor ) Ġ" getDeclared Constructor " Ġelse Ġ" getDeclared Method " ĊĠĠĠĠĠĠĠ Ġval Ġget Method Signature Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Constructor ) Ġ" ([ Ljava / lang / Class ;) Ljava / lang / reflect / Constructor ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"( Ljava / lang / String ; [ Ljava / lang / Class ;) Ljava / lang / reflect / Method ;" ĊĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġ" java / lang / Class ", Ġget MethodName , Ġget Method Signature , Ġfalse ) Ġ/// Ġ..., Ġmethod ĊĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . DUP ) Ġ/// Ġ..., Ġmethod , Ġmethod ĊĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( 1 ) Ġ/// Ġ..., Ġmethod , Ġmethod , Ġ' true ' ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE VIRTUAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java / lang / reflect / Accessible Object ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" setAccessible ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"( Z ) V ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ/// Ġ..., Ġmethod ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Method Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString , Ġdescriptor : ĠString , Ġis Interface : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġresolve Applicable MethodCall ( opcode , Ġowner , Ġname , Ġdescriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved Call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( opcode , Ġowner , Ġname , Ġdescriptor , Ġis Interface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Constructor Ġ= Ġname Ġ== Ġ"< init >" ĊĠĠĠĠĠĠĠ Ġval Ġis Static Ġ= Ġopcode Ġ== ĠOp codes . IN VOKE STATIC ĊĠĠĠĠĠĠĠ Ġval Ġparameter Count Ġ= Ġresolved Call . parameter Types . size ĊĊĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( parameter Count ) ĊĠĠĠĠĠĠĠ Ġsuper . visit Type Insn ( Op codes . ANE WAR R AY , Ġ" java / lang / Object ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠPut Ġbox ed Ġarguments Ġto Ġan Ġarray ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ( parameter Count Ġ- Ġ 1 ) Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= Ġresolved Call . parameter Types [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox ed ParameterType Ġ= Ġresolved Call . boxed Parameter Types [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġcurrent Value , Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . DUP ) Ġ/// Ġcurrent Value , Ġargs , Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( if Ġ( parameter Type . size Ġ== Ġ 2 ) ĠOp codes . DUP 2 _ X 2 Ġelse ĠOp codes . DUP 2 _ X 1 ) Ġ/// Ġargs , Ġargs , Ġcurrent Value , Ġargs , Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . POP 2 ) Ġ/// Ġargs , Ġargs , Ġcurrent Value ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter Type Ġ!= Ġbox ed ParameterType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox Value ( parameter Type , Ġbox ed ParameterType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit L dc Insn ( index ) Ġ/// Ġargs , Ġargs , Ġcurrent Value , Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . SWAP ) Ġ/// Ġargs , Ġargs , Ġindex , Ġcurrent Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . AA STORE ) Ġ/// Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . AC ON ST _ NULL ) Ġ/// Ġargs , Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . SWAP ) Ġ/// Ġreceiver , Ġargs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġaccessible ĠMethod / Constructor Ġinstance ĊĠĠĠĠĠĠĠ Ġfetch Reflection Method ( name , Ġresolved Call ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . SWAP ) Ġ/// Ġmethod , Ġargs ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . DUP _ X 2 ) Ġ/// Ġmethod , Ġreceiver , Ġargs , Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Insn ( Op codes . POP ) Ġ/// Ġmethod , Ġreceiver , Ġargs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinvoke Receiver Type Ġ= Ġif Ġ( is Constructor ) Ġ" java / lang / reflect / Constructor " Ġelse Ġ" java / lang / reflect / Method " ĊĠĠĠĠĠĠĠ Ġval Ġinvoke MethodName Ġ= Ġif Ġ( is Constructor ) Ġ" newInstance " Ġelse Ġ" invoke " ĊĠĠĠĠĠĠĠ Ġval Ġinvoke Method Signature Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Constructor ) Ġ" ([ Ljava / lang / Object ;) Ljava / lang / Object ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"( Ljava / lang / Object ; [ Ljava / lang / Object ;) Ljava / lang / Object ;" ĊĊĠĠĠĠĠĠĠ Ġ/// Ġmethod , Ġ[ receiver ], Ġargs ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( Op codes . IN VOKE VIRTUAL , Ġinvoke Receiver Type , Ġinvoke MethodName , Ġinvoke Method Signature , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġif Ġ( is Constructor ) Ġresolved Call . decl aring ClassType Ġelse ĠType . getMethod Type ( descriptor ). returnType ĊĠĠĠĠĠĠĠ Ġval Ġbox ed ReturnType Ġ= Ġbox ( returnType ) ĊĊĠĠĠĠĠĠĠ Ġsuper . visit Type Insn ( Op codes . CHECK CAST , Ġbox ed ReturnType . internal Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType Ġ!= Ġbox ed ReturnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun box Value ( returnType , Ġbox ed ReturnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }