package Ġme . sem oro . parse kt . instrument Ċ Ċ import Ġorg . object web . asm .* Ċ import Ġkotlin . coroutines . Continuation Ċ Ċ private Ġval Ġit f Type Ġ= ĠType . get ObjectType (" me / sem oro / parse kt / ex / Instrument ed Copy ") Ċ Ċ private Ġclass ĠField Info ( val Ġowner : ĠString , Ġval Ġname : ĠString , Ġval Ġdescriptor : ĠString ) Ċ Ċ private Ġinline Ġclass ĠMVC tx ( val Ġvisitor : ĠMethod Visitor ) Ġ{ ĊĠĠĠ Ġfun ĠField Info . load From This () Ġ= Ġwith ( visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġload () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠField Info . copy ToLocal () Ġ= Ġwith ( visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . DUP ) Ġ// Ġdup Ġcopy ĊĠĠĠĠĠĠĠ Ġload From This () Ġ// Ġ-> Ġvalue ĊĠĠĠĠĠĠĠ Ġstore () Ġ// Ġkill Ġvalue , Ġcopy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠField Info . load Or Store ( opcode : ĠInt ) Ġ= Ġwith ( visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Field Insn ( opcode , Ġowner , Ġname , Ġdescriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠField Info . store () Ġ= Ġload Or Store ( Op codes . PUT FIELD ) ĊĠĠĠ Ġfun ĠField Info . load () Ġ= Ġload Or Store ( Op codes . GET FIELD ) Ċ } Ċ Ċ private Ġconst Ġval Ġcontinuation Impl Fq Name Ġ= Ġ" kotlin / coroutines / jvm / internal / Continuation Impl " Ċ private Ġval Ġcopy Name Ġ= Ġ" copy " Ċ private Ġval Ġcopy Desc Ġ= ĠType . getMethod Descriptor ( itf Type ) Ċ private Ġval Ġcontinuation Type Ġ= ĠType . getType ( Continuation :: class . java ) Ċ Ċ private Ġval Ġbase Continuation Impl Ġ= Ġ" kotlin / coroutines / jvm / internal / Base Continuation Impl " Ċ Ċ // private Ġval Ġcompletion Field Ġ= ĠField Info (" kotlin / coroutines / jvm / internal / Base Continuation Impl ", Ġ" completion ", Ġcontinuation Type . descriptor ) Ċ private Ġval Ġintercept ed Field Ġ= ĠField Info ( continu ation Impl Fq Name , Ġ" intercept ed ", Ġcontinuation Type . descriptor ) ĊĊĊ Ċ class ĠClass Transformer ( api : ĠInt , Ġclass Visitor : ĠClass Visitor ?) Ġ: ĠClass Visitor ( api , Ġclass Visitor ) Ġ{ ĊĊĠĠĠ Ġvar ĠclassName Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠ Ġversion : ĠInt , ĊĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠ Ġsuper Name : ĠString ?, ĊĠĠĠĠĠĠĠ Ġinterfaces : ĠArray < out ĠString >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Interfaces Ġ= Ġif Ġ( interfaces Ġ== Ġnull ) ĠarrayOf ( itf Type . internal Name ) Ġelse ĠarrayOf (* interfaces , Ġit f Type . internal Name ) ĊĠĠĠĠĠĠĠ Ġsuper . visit ( version , Ġaccess , Ġname , Ġsignature , Ġsuper Name , Ġnew Interfaces ) ĊĠĠĠĠĠĠĠ ĠclassName Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġother Fields . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġother Fields Ġ= Ġmutable ListOf < Field Info >() ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Field ( ĊĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠString , ĊĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠ Ġvalue : ĠAny ? ĊĠĠĠ Ġ): ĠField Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġother Fields . add ( Field Info ( className , Ġname , Ġdescriptor )) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Field ( access , Ġname , Ġdescriptor , Ġsignature , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġfun Ġgenerate Copy Method () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= Ġvisit Method ( Op codes . ACC _ PUBLIC , Ġcopy Name , Ġcopy Desc , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġvisitor . visit Code () ĊĠĠĠĠĠĠĠ Ġvisitor . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMVC tx ( visitor ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . DUP ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE VIRTUAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Continuation Impl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Completion ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . getMethod Descriptor ( continu ation Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// Ġret Ġvalue Ġ-> Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . DUP ) Ġ// Ġdup Ġvalue Ġ-> Ġvalue , Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump Over Ġ= ĠLabel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ( completion Ġis ĠInstrument ed Copy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Type Insn ( Op codes . INSTANCE OF , Ġit f Type . internal Name ) Ġ// Ġkill Ġvalue , Ġadd Ġres Ġ-> Ġvalue , Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Jump Insn ( Op codes . IF EQ , Ġjump Over ) Ġ// Ġkill Ġres Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġnew Completion Ġ= Ġcompletion . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Method Insn ( Op codes . IN VOKE INTERFACE , Ġit f Type . internal Name , Ġcopy Name , Ġcopy Desc , Ġtrue ) Ġ// Ġkill Ġvalue , Ġadd Ġvalue _ copy Ġ-> Ġvalue _ copy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Type Insn ( Op codes . CHECK CAST , Ġcontinuation Type . internal Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Label ( jump Over ) ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Method Insn ( Op codes . IN VOKE VIRTUAL , ĠclassName , Ġ" create ", ĠType . getMethod Descriptor ( continu ation Type , Ġcontinuation Type ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Type Insn ( Op codes . CHECK CAST , ĠclassName ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġother Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . copy ToLocal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . ARE T URN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisitor . visit Max s ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisitor . visit End () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Copy Method () ĊĠĠĠĠĠĠĠ Ġsuper . visit End () ĊĠĠĠ Ġ} Ċ } ĊĊ