/* Ċ Ġ* ĠChecked Method . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 1 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . avail . optimizer . jvm Ċ Ċ import Ġorg . object web . asm . Method Visitor Ċ import Ġorg . object web . asm . Op codes Ċ import Ġorg . object web . asm . Type Ċ import Ġjava . lang . reflect . Constructor Ċ import Ġjava . lang . reflect . Modifier Ċ Ċ /** Ċ Ġ* ĠA Ġhelper Ġclass Ġfor Ġreferring Ġto Ġa Ġconstructor . Ġ ĠIt Ġverifies Ġat Ġconstruction Ċ Ġ* Ġtime Ġthat Ġthe Ġreferenced Ġmethod Ġis Ġmarked Ġwith Ġthe Ċ Ġ* Ġ[ Referenced In GeneratedCode ] Ġannotation , Ġand Ġthat Ġthe Ġspecified Ġargument Ġtypes Ċ Ġ* Ġare Ġcorrect . Ġ ĠWhen Ġit Ġgenerates Ġa Ġcall , Ġit Ġuses Ġthe Ġappropriate Ġinvoke Ċ Ġ* Ġinstruction . Ċ Ġ* Ċ Ġ* ĠThe Ġmain Ġpower Ġthis Ġclass Ġbrings Ġis Ġthe Ġability Ġto Ġcheck Ġthe Ġtype Ġsignature Ċ Ġ* Ġprior Ġto Ġcode Ġgeneration , Ġrather Ġthan Ġhave Ġthe ĠJVM Ġverifier Ġbe Ġthe Ġfailure Ċ Ġ* Ġpoint . Ġ ĠIt Ġalso Ġfails Ġearly Ġif Ġthe Ġreferenced Ġmethod Ġisn 't Ġmarked Ġwith Ċ Ġ* Ġ[ Referenced In GeneratedCode ], Ġhelping Ġto Ġkeep Ġcritical Ġmethods Ġfrom Ġchanging Ċ Ġ* Ġor Ġdis appear ing Ġunder Ġmaintenance . Ġ ĠIt Ġalso Ġkeeps Ġmethod Ġnames Ġout Ġof Ġthe Ċ Ġ* Ġcode Ġgenerator , Ġmaking Ġit Ġeasier Ġto Ġfind Ġthe Ġreal Ġuses Ġof Ġmethods Ġin Ċ Ġ* Ġgenerator Ġcode . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠFactory Ġmethods Ġthat Ġindicate Ġthe Ġmethod Ġis Ġpart Ġof Ġthe ĠJava Ġlibrary Ġare Ġnot Ċ Ġ* Ġexpected Ġto Ġhave Ġthe Ġ[ Referenced In GeneratedCode ] Ġannotation . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark Ġvan ĠG ul ik Ġ& lt ; mark @ avail lang . org & gt ; Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org & gt ; Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* ĠCreate Ġa Ġ` Checked Constructor `, Ġreflect ing Ġas Ġneeded Ġto Ġverify Ġand Ċ Ġ* Ġpre compute Ġas Ġmuch Ġas Ġpossible . Ċ Ġ* Ċ Ġ* Ġ@ param Ġverify Annotation Ċ Ġ* ĠĠ ĠWhether Ġto Ġlook Ġfor Ġthe Ġ[ Referenced In GeneratedCode ] Ġannotation . Ċ Ġ* Ġ@ param Ġreceiver Class Ċ Ġ* ĠĠ ĠThe Ġtype Ġof Ġthe Ġreceiver Ġof Ġthe Ġmethod . Ċ Ġ* Ġ@ param Ġargument Types Ċ Ġ* ĠĠ ĠA Ġvar arg Ġarray Ġof Ġargument Ġtypes . Ċ Ġ*/ Ċ class ĠChecked Constructor Ġprivate Ġconstructor ( Ċ ĉ verify Annotation : ĠBoolean , Ċ ĉ receiver Class : ĠClass <* >, Ċ ĉ var arg Ġargument Types : ĠClass <* >) Ċ { Ċ ĉ /** ĠThe Ġsimple Ġname Ġof Ġthe Ġmethod . Ġ*/ Ċ ĉ private Ġval ĠmethodName String Ġ= Ġ"< init >" ĊĊ ĉ /** ĠThe Ġcanonical Ġname Ġof Ġthe Ġclass Ġin Ġwhich Ġthe Ġmethod Ġis Ġdefined . Ġ*/ Ċ ĉ private Ġval Ġreceiver Class Internal Name : ĠString ĊĊ ĉ /** ĠThe Ġcanonical Ġname Ġof Ġthe Ġmethod Ġarguments . Ġ*/ Ċ ĉ private Ġval Ġmethod Descriptor String : ĠString ĊĊ ĉ /** Ċĉ Ġ* ĠEmit Ġa Ġcall Ġto Ġthis Ġmethod Ġon Ġthe Ġgiven Ġ[ Method Visitor ]. ĠThe Ġarguments Ċĉ Ġ* Ġmust Ġalready Ġbe Ġready Ġon Ġthe Ġstack . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġmethod Visitor Ċĉ Ġ* ĠĠ ĠWhere Ġto Ġwrite Ġthe Ġcall . Ċĉ Ġ*/ Ċ ĉ fun Ġgenerate Call ( method Visitor : ĠMethod Visitor ) Ċ ĉ { Ċĉ ĉ method Visitor . visit Method Insn ( Ċĉĉ ĉ Op codes . INV OK ES PE CIAL , Ċĉĉ ĉ receiver Class Internal Name , Ċĉĉ ĉ methodName String , Ċĉĉ ĉ method Descriptor String , Ċĉĉ ĉ false ) Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġa Ġ` Checked Method ` Ġfor Ġinvoking Ġa Ġconstructor Ġmethod Ġthat Ġhas Ċĉĉ Ġ* Ġbeen Ġannotated Ġwith Ġ[ Referenced In GeneratedCode ], Ġfailing Ġif Ġthere Ġis Ċĉĉ Ġ* Ġa Ġproblem . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġreceiver Class Ċĉĉ Ġ* ĠĠ ĠThe Ġtype Ġof Ġthe Ġreceiver Ġof Ġthe Ġmethod . Ċĉĉ Ġ* Ġ@ param Ġargument Types Ċĉĉ Ġ* ĠĠ ĠA Ġvar arg Ġarray Ġof Ġargument Ġtypes . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġ` Checked Method `. Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġconstructor Method ( Ċĉĉ ĉ receiver Class : ĠClass <* >, Ċĉĉ ĉ var arg Ġargument Types : ĠClass < *> ): ĠChecked Constructor Ġ= Ċĉĉĉ ĉ Checked Constructor ( Ċĉĉĉĉ ĉ true , Ċĉĉĉĉ ĉ receiver Class , Ċĉĉĉĉ ĉ * argument Types ) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġa Ġ` Checked Method ` Ġfor Ġinvoking Ġan Ġinstance Ġmethod Ġthat Ġcannot Ċĉĉ Ġ* Ġhave Ġa Ġ[ Referenced In GeneratedCode ] Ġannotation , Ġfailing Ġif Ġthere Ġis Ġa Ċĉĉ Ġ* Ġproblem . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġreceiver Class Ċĉĉ Ġ* ĠĠ ĠThe Ġtype Ġof Ġthe Ġreceiver Ġof Ġthe Ġmethod . Ċĉĉ Ġ* Ġ@ param Ġargument Types Ċĉĉ Ġ* ĠĠ ĠA Ġvar arg Ġarray Ġof Ġargument Ġtypes . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġ` Checked Method `. Ċĉĉ Ġ*/ Ċĉ ĉ @ Suppress (" unused ") Ċĉ ĉ fun Ġjava Library Constructor Method ( Ċĉĉ ĉ receiver Class : ĠClass <* >, Ċĉĉ ĉ var arg Ġargument Types : ĠClass < *> ): ĠChecked Constructor Ġ= Ċĉĉĉ ĉ Checked Constructor ( Ċĉĉĉĉ ĉ false , Ċĉĉĉĉ ĉ receiver Class , Ċĉĉĉĉ ĉ * argument Types ) Ċ ĉ } ĊĊ ĉ init Ċ ĉ { Ċĉ ĉ val Ġconstructor : ĠConstructor < *> Ġ= Ċĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ receiver Class . get Constructor (* argument Types ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠNoSuch Method Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ throw ĠRuntimeException ( e ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠSecurity Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ throw ĠRuntimeException ( e ) Ċĉĉ ĉ } Ċĉ ĉ if Ġ( verify Annotation ) Ċĉ ĉ { Ċĉĉ ĉ // ĠCheck Ġthe Ġannotation Ġbefore Ġanything Ġelse , Ġin Ġcase Ġwe Ġselected Ċĉĉ ĉ // Ġthe Ġwrong Ġconstructor . Ċĉĉ ĉ @ Suppress (" UNUSED _ VARIABLE ") Ċĉĉ ĉ val Ġannotation Ġ= Ċĉĉĉ ĉ constructor . getAnnotation ( Referenced In GeneratedCode :: class . java ) Ċĉĉĉĉ ĉ ?: Ġerror ( Ċĉĉĉĉĉ ĉ " Constructor Ġshould Ġhave Ġhad ĠRefer enced In GeneratedCode Ġ" Ċĉĉĉĉĉĉ ĉ + Ġ" annotation ") Ċĉ ĉ } Ċĉ ĉ val Ġmodifiers Ġ= Ġconstructor . modifiers Ċĉ ĉ assert ( modifiers Ġand ĠModifier . PUBLIC Ġ!= Ġ 0 ) Ċĉ ĉ receiver Class Internal Name Ġ= Ċĉĉ ĉ Type . get Internal Name ( constructor . decl aring Class ) Ċĉ ĉ method Descriptor String Ġ= Ċĉĉ ĉ Type . get Constructor Descriptor ( constructor ) Ċ ĉ } Ċ } Ċ