/* Ċ Ġ* ĠĠĠĠĠ ĠK ores - Byte code Reader Ġ- ĠTrans lates ĠJVM ĠByte code Ġto ĠK ores ĠStructure Ġ< https :// github . com / Jon athan xD / Code API - Byte code Writer > Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠThe Real Bug gy / Jon athan xD Ġ( https :// github . com / Jon athan xD /) Ġ< jon athan . script er @ program mer . net > Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠĠĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠĠĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠĠĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠĠĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠĠĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠĠĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠĠĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . github . jon athan xd . k ores . byte coder e ader . env Ċ Ċ import Ġcom . github . jon athan xd . i utils . map . List HashMap Ċ import Ġcom . github . jon athan xd . k ores . Instruction Ċ import Ġorg . object web . asm . tree . Label Node Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util .* Ċ Ċ class ĠLocal Variable Table Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtable Ġ= ĠHashMap < Int , ĠInstruction >() ĊĠĠĠ Ġprivate Ġval Ġvariable Table Ġ= ĠList HashMap < Int , ĠVariable Info >() ĊĠĠĠ Ġprivate Ġval Ġcurrent Variables Ġ= ĠHashMap < Int , ĠVariable Info >() ĊĊĠĠĠ Ġfun Ġstore ( part : ĠInstruction , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . table [ index ] Ġ= Ġpart ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Variable Names () Ġ= Ġvariable Table . values . flatMap Ġ{ Ġit Ġ}. map Ġ{ Ġit . name Ġ} ĊĊĠĠĠ Ġfun Ġget OrNull ( index : ĠInt ): ĠInstruction ? Ġ= Ġthis . table [ index ] ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠInstruction Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . table . containsKey ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException (" The Ġslot Ġ'$ index ' Ġis Ġempty .") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . table [ index ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains Slot ( slot : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . table . containsKey ( slot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Label ( label : ĠLabel Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . variable Table . forEach Ġ{ Ġslot , Ġvariables Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . start ?. label Ġ== Ġlabel . label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Variables [ slot ] Ġ= Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . end ?. label Ġ== Ġlabel . label Ġ&& Ġthis . current Variables [ slot ] Ġ== Ġvariable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Variables . remove ( slot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstore Variable Info ( ĊĠĠĠĠĠĠĠ Ġslot : ĠInt , ĊĠĠĠĠĠĠĠ Ġvariable Type : ĠType , ĊĠĠĠĠĠĠĠ Ġvariable Name : ĠString , ĊĠĠĠĠĠĠĠ Ġstart : ĠLabel Node ?, ĊĠĠĠĠĠĠĠ Ġend : ĠLabel Node ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= ĠVariable Info ( variable Type , Ġvariable Name , Ġstart , Ġend ) ĊĠĠĠĠĠĠĠ Ġthis . variable Table . put ToList ( slot , Ġvariable ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Variables [ slot ] Ġ= Ġvariable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Info ( slot : ĠInt ): ĠVariable Info ? Ġ= Ġthis . variable Table [ slot ]?. last OrNull () ĊĊĠĠĠ Ġdata Ġclass ĠVariable Info Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠType , ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġstart : ĠLabel Node ?, ĊĠĠĠĠĠĠĠ Ġval Ġend : ĠLabel Node ? ĊĠĠĠ Ġ) Ċ } Ċ