/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġkotlin TestData . fixes . IDE A _ 5 7 6 9 5 Ċ Ċ import Ġkotlin TestData . fixes . IDE A _ 5 7 6 9 5 . Generator ClassLoader . foo Ċ import Ġorg . jetbrains . annotations . NotNull Ċ import Ġorg . jetbrains . coverage . org . object web . asm . Class Writer Ċ import Ġorg . jetbrains . coverage . org . object web . asm . Label Ċ import Ġorg . jetbrains . coverage . org . object web . asm . Op codes Ċ Ċ /** Ċ Ġ* ĠThis Ġloader Ġgenerates Ġbytecode Ġequivalent Ġto Ġ[ foo ]. Ċ Ġ*/ Ċ private Ġobject ĠGenerator ClassLoader Ġ: ĠClassLoader () Ġ{ ĊĠĠĠ Ġconst Ġval ĠBASE _ NAME Ġ= Ġ" kotlin TestData . fixes . IDE A _ 5 7 6 9 5 " ĊĠĠĠ Ġconst Ġval ĠMETHOD _ NAME Ġ= Ġ" foo " ĊĠĠĠ Ġprivate Ġconst Ġval ĠREPORT _ NULL _ NAME Ġ= Ġ"\ $\ $\ $ report Null \ $\ $\ $" ĊĠĠĠ Ġprivate Ġconst Ġval ĠREPORT _ NULL _ SIGNATURE Ġ= Ġ"( I ) V " ĊĠĠĠ Ġprivate Ġconst Ġval ĠOBJECT Ġ= Ġ" java / lang / Object " ĊĊĠĠĠ Ġ@ NotNull ĊĠĠĠ Ġfun Ġfoo ( x : ĠAny ?): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( x Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġelse Ġx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Class ( name : ĠString ?): ĠClass < *> ? Ġ= Ġif Ġ( name Ġ!= Ġnull Ġ&& Ġname . startsWith ( BASE _ NAME )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate ( name . replace ('.', Ġ'/ ')) ĊĠĠĠĠĠĠĠ Ġdefine Class ( name , Ġgenerated , Ġ 0 , Ġgenerated . size ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . load Class ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate ( name : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcw Ġ= ĠClass Writer ( 0 ) ĊĠĠĠĠĠĠĠ Ġcw . visit ( 4 9 , ĠOp codes . ACC _ PUBLIC , Ġname , Ġnull , ĠOBJECT , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmv 1 Ġ= Ġcw . visit Method ( Op codes . ACC _ PUBLIC Ġor ĠOp codes . ACC _ STATIC , ĠREPORT _ NULL _ NAME , ĠREPORT _ NULL _ SIGNATURE , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġmv 1 . visit Insn ( Op codes . RETURN ) ĊĠĠĠĠĠĠĠ Ġmv 1 . visit Max s ( 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġmv 1 . visit End () ĊĊĠĠĠĠĠĠĠ Ġval Ġmv 2 Ġ= Ġcw . visit Method ( Op codes . ACC _ PUBLIC Ġor ĠOp codes . ACC _ STATIC , ĠMETHOD _ NAME , Ġ"( L $ OBJECT ;) L $ OBJECT ;", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġline 1 Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Label ( line 1 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit LineNumber ( 1 , Ġline 1 ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġif Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġval Ġreturn On Line 1 Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Jump Insn ( Op codes . IF NULL , Ġif Label ) ĊĊĠĠĠĠĠĠĠ Ġval Ġline 2 Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Label ( line 2 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit LineNumber ( 2 , Ġline 2 ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Jump Insn ( Op codes . GOTO , Ġreturn On Line 1 ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Label ( if Label ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Insn ( Op codes . AC ON ST _ NULL ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Label ( return On Line 1 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit LineNumber ( 1 , Ġreturn On Line 1 ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Insn ( Op codes . DUP ) ĊĠĠĠĠĠĠĠ Ġval Ġreturn Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Jump Insn ( Op codes . IF NONNULL , Ġreturn Label ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Insn ( Op codes . ICON ST _ 0 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Method Insn ( Op codes . IN VOKE STATIC , Ġname , ĠREPORT _ NULL _ NAME , ĠREPORT _ NULL _ SIGNATURE , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġmv 2 . visit Label ( return Label ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Insn ( Op codes . ARE T URN ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit Max s ( 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġmv 2 . visit End () ĊĊĠĠĠĠĠĠĠ Ġcw . visit End () ĊĠĠĠĠĠĠĠ Ġreturn Ġcw . toByteArray () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtest () Ġ{ ĊĠĠĠ Ġval Ġclazz Ġ= ĠGenerator ClassLoader . load Class ("${ Generator ClassLoader . BASE _ NAME }. TestClass ") !! ĊĠĠĠ Ġclazz . getMethod ( Generator ClassLoader . METHOD _ NAME , ĠAny :: class . java ). invoke ( null , ĠAny ()) Ċ } Ċ Ċ object ĠTest Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest () ĊĠĠĠ Ġ} Ċ } Ċ