/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . common . lower . loops Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Common Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . matchers . Quant ifier Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . matchers . Simple Cal lee Matcher Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . matchers . create Ir Call Matcher Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . matchers . single Argument Extension Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Get Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Int Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . getClass Ċ import Ġorg . jetbrains . kotlin . ir . types . to Kotlin Type Ċ import Ġorg . jetbrains . kotlin . ir . util . properties Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Visitor Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . types . Simple Type Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġprogress ions Ġbuilt Ġusing Ġthe Ġ` range To ` Ġfunction . Ġ*/ Ċ internal Ġclass ĠRange To Handler ( private Ġval Ġcontext : ĠCommon Backend Context , Ġprivate Ġval Ġprogress ion Element Types : ĠCollection < Simple Type >) Ġ: ĊĠĠĠ ĠPro gression Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmatcher Ġ= ĠSimple Cal lee Matcher Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit . type . to Kotlin Type () Ġin Ġprogress ion Element Types Ġ} ĊĠĠĠĠĠĠĠ Ġfq Name Ġ{ Ġit . path Segments (). last () Ġ== ĠName . identifier (" range To ") Ġ} ĊĠĠĠĠĠĠĠ Ġparameter Count Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġparameter ( 0 ) Ġ{ Ġit . type . to Kotlin Type () Ġin Ġprogress ion Element Types Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Call , Ġdata : ĠPro gression Type , Ġscope Owner : ĠIr Symbol ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġexpression . dispatch Receiver !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġexpression . getValue Argument ( 0 ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġir Int ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġprogress ions Ġbuilt Ġusing Ġthe Ġ` down To ` Ġextension Ġfunction . Ġ*/ Ċ internal Ġclass ĠDown To Handler ( private Ġval Ġcontext : ĠCommon Backend Context , Ġprivate Ġval Ġprogress ion Element Types : ĠCollection < Simple Type >) Ġ: ĊĠĠĠ ĠPro gression Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmatcher Ġ= ĠSimple Cal lee Matcher Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle Argument Extension ( Fq Name (" kotlin . ranges . down To "), Ġprogress ion Element Types ) ĊĠĠĠĠĠĠĠ Ġparameter Count Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġparameter ( 0 ) Ġ{ Ġit . type . to Kotlin Type () Ġin Ġprogress ion Element Types Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Call , Ġdata : ĠPro gression Type , Ġscope Owner : ĠIr Symbol ): ĠHeader Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġexpression . extension Receiver !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġexpression . getValue Argument ( 0 ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġir Int (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġprogress ions Ġbuilt Ġusing Ġthe Ġ` until ` Ġextension Ġfunction . Ġ*/ Ċ internal Ġclass ĠUnt il Handler ( private Ġval Ġcontext : ĠCommon Backend Context , Ġprivate Ġval Ġprogress ion Element Types : ĠCollection < Simple Type >) Ġ: ĊĠĠĠ ĠPro gression Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmatcher Ġ= ĠSimple Cal lee Matcher Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle Argument Extension ( Fq Name (" kotlin . ranges . until "), Ġprogress ion Element Types ) ĊĠĠĠĠĠĠĠ Ġparameter Count Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġparameter ( 0 ) Ġ{ Ġit . type . to Kotlin Type () Ġin Ġprogress ion Element Types Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Call , Ġdata : ĠPro gression Type , Ġscope Owner : ĠIr Symbol ): ĠHeader Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġexpression . extension Receiver !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġexpression . getValue Argument ( 0 ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġir Int ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Inclusive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġprogress ions Ġbuilt Ġusing Ġthe Ġ` indices ` Ġextension Ġproperty . Ġ*/ Ċ internal Ġclass ĠInd ices Handler ( val Ġcontext : ĠCommon Backend Context ) Ġ: ĠPro gression Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmatcher Ġ= ĠSimple Cal lee Matcher Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle ĠCollection <* >. indices ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle ĠCharSequence . indices ĊĠĠĠĠĠĠĠ Ġextension Receiver Ġ{ Ġit Ġ!= Ġnull Ġ&& ĠKotlin Built Ins . isArray Or Primitive Array ( it . type . to Kotlin Type ()) Ġ} ĊĠĠĠĠĠĠĠ Ġfq Name Ġ{ Ġit Ġ== ĠF q Name (" kotlin . collections .< get - indices >") Ġ} ĊĠĠĠĠĠĠĠ Ġparameter Count Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Call , Ġdata : ĠPro gression Type , Ġscope Owner : ĠIr Symbol ): ĠHeader Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` last Ġ= Ġarray . size ` Ġfor Ġthe Ġloop Ġ` for Ġ( i Ġin Ġarray . indices )`. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Size Property Ġ= Ġexpression . extension Receiver !!. type . getClass () !!. properties . first Ġ{ Ġit . name . asString () Ġ== Ġ" size " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġir Call ( array Size Property . getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġexpression . extension Receiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġir Int ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġlast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġir Int ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Inclusive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġcalls Ġto Ġreverse Ġan Ġiterable . Ġ*/ Ċ internal Ġclass ĠRe versed Handler ( context : ĠCommon Backend Context , Ġval Ġvisitor : ĠIr Element Visitor < Header Info ?, ĠNothing ?> ) Ġ: ĊĠĠĠ ĠHeader Info From Call Handler < Nothing ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsymbols Ġ= Ġcontext . ir . symbols ĊĊĠĠĠ Ġ// ĠUse ĠQuant ifier . ANY Ġso Ġwe Ġcan Ġhandle Ġall Ġreversed Ġiter ables Ġin Ġthe Ġsame Ġmanner . ĊĠĠĠ Ġoverride Ġval Ġmatcher Ġ= Ġcreate Ir Call Matcher ( Quant ifier . ANY ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMatcher Ġfor Ġreversed Ġprogress ion . ĊĠĠĠĠĠĠĠ Ġcal lee Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ{ Ġit Ġ== ĠF q Name (" kotlin . ranges . reversed ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit . type . to Kotlin Type () Ġin Ġsymbols . progress ion Classes Types Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Count Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġreversed ĠString , ĠPro gression . with Index (), Ġetc . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReverse Ġthe ĠHeader Info Ġfrom Ġthe Ġunderlying Ġprogress ion Ġor Ġarray Ġ( if Ġany ). ĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Call , Ġdata : ĠNothing ?, Ġscope Owner : ĠIr Symbol ) Ġ= ĊĠĠĠĠĠĠĠ Ġexpression . extension Receiver !!. accept ( visitor , Ġnull )?. as Re versed () Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġprogress ions Ġnot Ġhandled Ġby Ġmore Ġspecialized Ġhandlers . Ġ*/ Ċ internal Ġclass ĠDefault Progress ion Handler ( private Ġval Ġcontext : ĠCommon Backend Context ) Ġ: ĠExpression Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsymbols Ġ= Ġcontext . ir . symbols ĊĊĠĠĠ Ġoverride Ġfun Ġmatch ( expression : ĠIr Expression ) Ġ= ĠPro gression Type . from Ir Type ( expression . type , Ġsymbols ) Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Expression , Ġscope Owner : ĠIr Symbol ): ĠHeader Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDirect ly Ġuse Ġthe Ġ` first / last / step ` Ġproperties Ġof Ġthe Ġprogress ion . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress ion Ġ= Ġscope . create Temporary Variable ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress ion Class Ġ= Ġprogress ion . type . getClass () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Property Ġ= Ġprogress ion Class . properties . first Ġ{ Ġit . name . asString () Ġ== Ġ" first " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġir Call ( first Property . getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( progress ion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Property Ġ= Ġprogress ion Class . properties . first Ġ{ Ġit . name . asString () Ġ== Ġ" last " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġir Call ( last Property . getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( progress ion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Property Ġ= Ġprogress ion Class . properties . first Ġ{ Ġit . name . asString () Ġ== Ġ" step " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġir Call ( step Property . getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( progress ion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro gression Type . from Ir Type ( progress ion . type , Ġsymbols ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Variables Ġ= ĠlistOf ( progress ion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠBuilds Ġa Ġ[ Header Info ] Ġfor Ġarrays . Ġ*/ Ċ internal Ġclass ĠArray Iteration Handler ( private Ġval Ġcontext : ĠCommon Backend Context ) Ġ: ĠExpression Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġmatch ( expression : ĠIr Expression ) Ġ= ĠKotlin Built Ins . isArray Or Primitive Array ( expression . type . to Kotlin Type ()) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( expression : ĠIr Expression , Ġscope Owner : ĠIr Symbol ): ĠHeader Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( context . create Ir Builder ( scope Owner , Ġexpression . start Offset , Ġexpression . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConsider Ġthe Ġcase Ġlike : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġfor Ġ( elem Ġin ĠA ) Ġ{ Ġf ( elem ) Ġ}` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġlower Ġit Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġfor Ġ( i Ġin ĠA . indices ) Ġ{ Ġf ( A [ i ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... then Ġwe Ġwill Ġbreak Ġprogram Ġbehaviour Ġif Ġ` A ` Ġis Ġan Ġexpression Ġwith Ġside - effect . ĠInstead , Ġwe Ġlower Ġit Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġval Ġa Ġ= ĠA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġfor Ġ( i Ġin Ġa . indices ) Ġ{ Ġf ( a [ i ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġalso Ġensures Ġthat Ġthe Ġsemantics Ġof Ġre - assignment Ġof Ġarray Ġvariables Ġused Ġin Ġthe Ġloop Ġis Ġconsistent Ġwith Ġthe Ġsemantics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproposed Ġin Ġhttps :// yout rack . jetbrains . com / issue / KT - 2 1 3 5 4 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Reference Ġ= Ġscope . create Temporary Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression , Ġname Hint Ġ= Ġ" array ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . FOR _ LOOP _ IMP LICIT _ VARIABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` last Ġ= Ġarray . size ` Ġfor Ġthe Ġloop Ġ` for Ġ( i Ġin Ġarray . indices )`. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Size Property Ġ= Ġarray Reference . type . getClass () !!. properties . first Ġ{ Ġit . name . asString () Ġ== Ġ" size " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġir Call ( array Size Property . getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray Header Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġir Int ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġlast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġir Int ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Variable Ġ= Ġarray Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ }