package Ġorg . b aby fish . kim mer . runtime . asm . impl Ċ Ċ import Ġorg . b aby fish . kim mer . meta . Immutable Type Ċ import Ġorg . b aby fish . kim mer . runtime . Immutable Spi Ċ import Ġorg . b aby fish . kim mer . runtime . asm .* Ċ import Ġorg . springframework . asm . Class Visitor Ċ import Ġorg . springframework . asm . Op codes Ċ import Ġorg . springframework . asm . Type Ċ import Ġkotlin . reflect . jvm . java Method Ċ Ċ internal Ġfun ĠClass Visitor . write Constructor () Ġ{ ĊĠĠĠ Ġwrite Method ( ĊĠĠĠĠĠĠĠ ĠOp codes . ACC _ PUBLIC , ĊĠĠĠĠĠĠĠ Ġ"< init >", ĊĠĠĠĠĠĠĠ Ġ" () V ", ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INV OK ES PE CIAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOBJECT _ INTERNAL _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< init >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" () V ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . RETURN ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠClass Visitor . write Copy Constructor ( type : ĠImmutable Type ) Ġ{ ĊĊĠĠĠ Ġval Ġimpl Internal Name Ġ= Ġimpl Internal Name ( type ) ĊĊĠĠĠ Ġval Ġit f Internal Name Ġ= ĠType . get Internal Name ( type . kotlin Type . java ) ĊĊĠĠĠ Ġwrite Method ( ĊĠĠĠĠĠĠĠ ĠOp codes . ACC _ PUBLIC , ĊĠĠĠĠĠĠĠ Ġ"< init >", ĊĠĠĠĠĠĠĠ Ġ"( L $ itf Internal Name ;) V " ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimpl It f Internal Name Ġ= ĠType . get Internal Name ( Immutable Spi :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INV OK ES PE CIAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOBJECT _ INTERNAL _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< init >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" () V ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġloaded Slot Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( prop Ġin Ġtype . props . values ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgetter Ġ= Ġprop . kotlin Prop . getter . java Method !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Type Insn ( Op codes . CHECK CAST , Ġimpl It f Internal Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit L dc Insn ( prop . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE INTERFACE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimpl It f Internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ loaded }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( Ljava / lang / String ;) Z ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . IST ORE , Ġloaded Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . I LOAD , Ġloaded Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Field Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT FIELD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimpl Internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Name ( prop ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Z " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . I LOAD , Ġloaded Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Cond Not Matched ( Op codes . IF EQ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( Op codes . AL O AD , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE INTERFACE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit f Internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . getMethod Descriptor ( getter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getter . returnType Ġ!== Ġprop . java ReturnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Type Insn ( Op codes . CHECK CAST , ĠType . get Internal Name ( prop . java ReturnType )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Field Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT FIELD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimpl Internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . get Descriptor ( prop . java ReturnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Insn ( Op codes . RETURN ) ĊĠĠĠ Ġ} Ċ }