/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . jvm . codegen Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . BOUND _ RECE IVER _ PARAMETER Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . SYN TH ES IZED _ INIT _ BLOCK Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Lower ed Declaration Origin Ċ import Ġorg . jetbrains . kotlin . backend . jvm . intr insics . Ir Intr insic Methods Ċ import Ġorg . jetbrains . kotlin . backend . jvm . intr insics . Java Class Property Ċ import Ġorg . jetbrains . kotlin . backend . jvm . lower . Mult if ile Facade File Entry Ċ import Ġorg . jetbrains . kotlin . backend . jvm . lower . constant Value Ċ import Ġorg . jetbrains . kotlin . backend . jvm . lower . inline classes . un box Inline Class Ċ import Ġorg . jetbrains . kotlin . codegen .* Ċ import Ġorg . jetbrains . kotlin . codegen . Asm Util .* Ċ import Ġorg . jetbrains . kotlin . codegen . coroutines . Sus pension Point Kind Ċ import Ġorg . jetbrains . kotlin . codegen . inline .* Ċ import Ġorg . jetbrains . kotlin . codegen . inline . Re ified Type In liner . Companion . put Need Class Re ification Marker Ċ import Ġorg . jetbrains . kotlin . codegen . inline . Re ified Type In liner . Operation Kind . AS Ċ import Ġorg . jetbrains . kotlin . codegen . inline . Re ified Type In liner . Operation Kind . SAFE _ AS Ċ import Ġorg . jetbrains . kotlin . codegen . intr insics . Type Intr insics Ċ import Ġorg . jetbrains . kotlin . codegen . pseudo Ins ns . fake Always False I fe q Ċ import Ġorg . jetbrains . kotlin . codegen . pseudo Ins ns . fix Stack And Jump Ċ import Ġorg . jetbrains . kotlin . codegen . signature . Both Signature Writer Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . config . is Release Cor outines Ċ import Ġorg . jetbrains . kotlin . config . language Version Settings Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Value Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Visitor Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types . OBJECT _ TYPE Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Parameter Kind Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Signature Ċ import Ġorg . jetbrains . kotlin . types . Type System Common Backend Context Ċ import Ġorg . jetbrains . kotlin . types . model . Type Parameter Marker Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance OrNull Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ import Ġorg . jetbrains . kotlin . utils . keys ToMap Ċ import Ġorg . jetbrains . org . object web . asm . Label Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġorg . jetbrains . org . object web . asm . commons . Instruction Adapter Ċ import Ġjava . util .* Ċ Ċ sealed Ġclass ĠExpression Info Ċ Ċ class ĠLoop Info ( val Ġloop : ĠIr Loop , Ġval Ġcontinue Label : ĠLabel , Ġval Ġbreak Label : ĠLabel ) Ġ: ĠExpression Info () Ċ Ċ open Ġclass ĠTry Info Ġ: ĠExpression Info () Ġ{ ĊĠĠĠ Ġ// ĠReg ions Ġcorresponding Ġto Ġcopy - past ed Ġcontents Ġof Ġthe Ġ` finally ` Ġblock . ĊĠĠĠ Ġ// ĠThese Ġshould Ġnot Ġbe Ġcovered Ġby Ġ` catch ` Ġclauses . ĊĠĠĠ Ġval Ġg aps Ġ= Ġmutable ListOf < Pair < Label , ĠLabel >>() Ċ } Ċ Ċ class ĠTry With Finally Info ( val Ġon Exit : ĠIr Expression ) Ġ: ĠTry Info () Ċ Ċ class ĠBlock Info ( val Ġparent : ĠBlock Info ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġvariables Ġ= Ġmutable ListOf < Variable Info >() ĊĠĠĠ Ġprivate Ġval Ġinfos : ĠStack < Expression Info > Ġ= Ġparent ?. infos Ġ?: ĠStack () ĊĊĠĠĠ Ġfun Ġhas Finally Blocks (): ĠBoolean Ġ= Ġinfos . first Is Instance OrNull < Try With Finally Info >() Ġ!= Ġnull ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġ< T Ġ: ĠExpression Info , ĠR > Ġwith Block ( info : ĠT , Ġf : Ġ( T ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġinfos . add ( info ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ( info ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġ< R > Ġhandle Block ( f : Ġ( Expression Info ) Ġ-> ĠR ): ĠR ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( infos . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġinfos . pop () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ( top ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . add ( top ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠVariable Info ( val Ġdeclaration : ĠIr Variable , Ġval Ġindex : ĠInt , Ġval Ġtype : ĠType , Ġval Ġstart Label : ĠLabel ) Ċ Ċ class ĠExpression Code gen ( ĊĠĠĠ Ġval Ġir Function : ĠIr Function , ĊĠĠĠ Ġval Ġsignature : ĠJ vm Method Signature , ĊĠĠĠ Ġoverride Ġval Ġframe Map : ĠIr Frame Map , ĊĠĠĠ Ġval Ġmv : ĠInstruction Adapter , ĊĠĠĠ Ġval Ġclass Code gen : ĠClass Code gen , ĊĠĠĠ Ġval Ġin lined Into : ĠExpression Code gen ?, ĊĠĠĠ Ġval Ġs map : ĠSource Mapper Ċ ) Ġ: ĠIr Element Visitor < Promise d Value , ĠBlock Info >, ĠBase Expression Code gen Ġ{ ĊĊĠĠĠ Ġvar Ġfinally Depth Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġcontext Ġ= Ġclass Code gen . context ĊĠĠĠ Ġval Ġtype Mapper Ġ= Ġcontext . type Mapper ĊĠĠĠ Ġval Ġmethod Signature Mapper Ġ= Ġcontext . method Signature Mapper ĊĊĠĠĠ Ġval Ġstate Ġ= Ġcontext . state ĊĊĠĠĠ Ġprivate Ġval Ġfile Entry Ġ= Ġclass Code gen . context . psi Source Manager . getFile Entry ( ir Function . file Parent ) ĊĊĠĠĠ Ġoverride Ġval Ġvisitor : ĠInstruction Adapter ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmv ĊĊĠĠĠ Ġoverride Ġval Ġinline Name Generator : ĠName Generator Ġ= Ġclass Code gen . get Re generated ObjectName Generator ( ir Function ) ĊĊĠĠĠ Ġoverride Ġval Ġtype System : ĠType System Common Backend Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtype Mapper . type System ĊĊĠĠĠ Ġoverride Ġvar Ġlast LineNumber : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġprivate Ġval Ġclosure Re ified Markers Ġ= Ġhash Map Of < Ir Class , ĠRe ified Type Parameters Usage s >() ĊĊĠĠĠ Ġprivate Ġval ĠIr Type . asm Type : ĠType ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtype Mapper . map Type ( this ) ĊĊĠĠĠ Ġval ĠIr Expression . asm Type : ĠType ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtype . asm Type ĊĊĠĠĠ Ġval ĠIr Value Declaration . asm Type : ĠType ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtype . asm Type ĊĊĠĠĠ Ġ// ĠAssume Ġthis Ġexpression 's Ġresult Ġhas Ġalready Ġbeen Ġmaterial ized Ġon Ġthe Ġstack ĊĠĠĠ Ġ// Ġwith Ġthe Ġcorrect Ġtype . ĊĠĠĠ Ġval ĠIr Expression . on Stack : ĠMaterial Value ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠMaterial Value ( this @ Expression Code gen , Ġasm Type , Ġtype ) ĊĊĠĠĠ Ġprivate Ġfun Ġmark New Label () Ġ= ĠLabel (). apply Ġ{ Ġmv . visit Label ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmark New Linked Label () Ġ= Ġlinked Label (). apply Ġ{ Ġmv . visit Label ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget LineNumber For Offset ( offset : ĠInt ): ĠInt Ġ= Ġfile Entry ?. get LineNumber ( offset )?. plus ( 1 ) Ġ?: Ġ- 1 ĊĊĠĠĠ Ġprivate Ġfun ĠIr Element . mark LineNumber ( start Offset : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġif Ġ( start Offset ) Ġthis . start Offset Ġelse Ġend Offset ĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( file Entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineNumber Ġ= Ġget LineNumber For Offset ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( line Number Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last LineNumber Ġ!= ĠlineNumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast LineNumber Ġ= ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit LineNumber ( line Number , Ġmark New Label ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark LineNumber ( element : ĠIr Element ) Ġ= Ġelement . mark LineNumber ( true ) ĊĊĠĠĠ Ġ// ĠTODO Ġremove ĊĠĠĠ Ġfun Ġgen ( expression : ĠIr Expression , Ġtype : ĠType , Ġir Type : ĠIr Type , Ġdata : ĠBlock Info ): ĠStack Value Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . attribute OwnerId Ġ=== Ġcontext . fake Continuation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fake Continuation Marker ( mv ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept ( this , Ġdata ). material ize At ( type , Ġir Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠStack Value . on Stack ( type , Ġir Type . to Kotlin Type ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġgen Or Get Local ( expression : ĠIr Expression , Ġdata : ĠBlock Info ): ĠStack Value Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Function . origin Ġ== ĠIr Declaration Origin . FUNCTION _ FOR _ DEFAULT _ PARAMETER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Type Operator Call Ġ&& Ġexpression . operator Ġ== ĠIr Type Operator . IMP LICIT _ CAST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinline Ġlambda Ġparameters Ġare Ġpassed Ġfrom Ġ` foo $ default ` Ġto Ġ` foo ` Ġcall Ġwith Ġimplicit Ġcast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġreturn Ġpure ĠStack Value . local Ġvalue Ġto Ġbe Ġable Ġproper Ġinline Ġthis Ġparameter Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . type . make Nullable () Ġ== Ġexpression . argument . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgen Or Get Local ( expression . argument , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression Ġis ĠIr GetValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Value . local ( find Local Index ( expression . symbol ), Ġframe Map . type Of ( expression . symbol ), Ġexpression . type . to Kotlin Type ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen ( expression , Ġtype Mapper . map Type ( expression . type ), Ġexpression . type , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġmv . visit Code () ĊĠĠĠĠĠĠĠ Ġval Ġstart Label Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠBlock Info () ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġir Function . body !! ĊĠĠĠĠĠĠĠ Ġgenerate NonNull Assertions () ĊĠĠĠĠĠĠĠ Ġgenerate Fake Continuation Constructor IfNeeded () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbody . accept ( this , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġfunction Ġhas Ġan Ġexpression Ġbody , Ġreturn Ġthe Ġresult Ġof Ġthat Ġexpression . ĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġif Ġit Ġdoes Ġnot Ġend Ġin Ġa Ġreturn Ġstatement , Ġit Ġmust Ġbe Ġvoid - return ing , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġan Ġexplicit Ġreturn Ġinstruction Ġat Ġthe Ġend Ġis Ġstill Ġrequired Ġto Ġpass Ġvalidation . ĊĠĠĠĠĠĠĠ Ġif Ġ( body Ġ! is ĠIr Statement Container Ġ|| Ġbody . statements . last OrNull () Ġ! is ĠIr Return ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAllow Ġsetting Ġa Ġbreakpoint Ġon Ġthe Ġclosing Ġbr ace Ġof Ġa Ġvoid - return ing Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġan Ġexplicit Ġreturn , Ġor Ġthe Ġ` class ĠSomething (` Ġline Ġof Ġa Ġprimary Ġconstructor . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Function . origin Ġ!= ĠJ vm Lower ed Declaration Origin . CLASS _ STATIC _ INITIAL IZER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . mark LineNumber ( start Offset Ġ= Ġir Function Ġis ĠIr Constructor Ġ&& Ġir Function . is Primary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġsignature . returnType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Ir Type Ġ= Ġif Ġ( ir Function Ġ! is ĠIr Constructor ) Ġir Function . returnType Ġelse Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . material ize At ( returnType , Ġreturn Ir Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . are turn ( returnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġend Label Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġwrite Local Variables In Table ( info , Ġend Label ) ĊĠĠĠĠĠĠĠ Ġwrite Parameter In Local Variable Table ( start Label , Ġend Label ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Fake Continuation Constructor IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Class Ġ= Ġir Function . continu ation Class () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Type Ġ= Ġtype Mapper . map Class ( continu ation Class ) ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Index Ġ= Ġframe Map . getIndex ( ir Function . continu ation Parameter () !!. symbol ) ĊĠĠĠĠĠĠĠ Ġwith ( mv ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fake Continuation Constructor Call Marker ( this , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan ew ( continu ation Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Function . dispatch Receiver Parameter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( 0 , ĠOBJECT _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( continu ation Index , ĠType . get ObjectType (" kotlin / coroutines / Continuation ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvok espec ial ( continu ation Type . internal Name , Ġ"< init >", Ġ" (${ class Code gen . type } L kotlin / coroutines / Continuation ;) V ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( continu ation Index , ĠType . get ObjectType (" kotlin / coroutines / Continuation ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvok espec ial ( continu ation Type . internal Name , Ġ"< init >", Ġ"( L kotlin / coroutines / Continuation ;) V ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fake Continuation Constructor Call Marker ( this , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate NonNull Assertions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . is Param Assertions Disabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġnot Callable From Java Ġ= Ġin lined Into Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Vis ibilities . is Private ( ir Function . visibility ) Ġ&& Ġ!( ir Function Ġis ĠIr Simple Function Ġ&& Ġir Function . is Operator )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin . is Synt hetic Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġref ine Ġthis Ġcondition Ġto Ġnot Ġgenerate Ġnull ability Ġassertions Ġon Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġcorresponding Ġto Ġcaptured Ġvariables Ġand Ġanonymous Ġobject Ġsuper Ġconstructor Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ir Function Ġis ĠIr Constructor Ġ&& Ġir Function . parent As Class . is Anonymous Object ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠImplement Ġthis Ġas Ġa Ġlower ing , Ġso Ġthat Ġwe Ġcan Ġmore Ġeasily Ġexclude Ġgenerated Ġmethods . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin Ġ== ĠJ vm Lower ed Declaration Origin . INLINE _ CLASS _ GENERATED _ IMPL _ METHOD Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlthough Ġthese Ġare Ġaccessible Ġfrom ĠJava , Ġthe Ġfunctions Ġthey Ġbridge Ġto Ġalready Ġhave Ġthe Ġassertions . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin Ġ== ĠIr Declaration Origin . BR ID GE _ SPECIAL Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin Ġ== ĠJ vm Lower ed Declaration Origin . DEFAULT _ IMP LS _ BR ID GE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin Ġ== ĠJ vm Lower ed Declaration Origin . JVM _ STATIC _ WRAPPER Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . origin Ġ== ĠJ vm Lower ed Declaration Origin . MULTI FILE _ BR ID GE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . parent As Class . origin Ġ== ĠJ vm Lower ed Declaration Origin . CONT IN UATION _ CLASS Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . parent As Class . origin Ġ== ĠJ vm Lower ed Declaration Origin . SUS PEND _ L AMBDA ĊĊĠĠĠĠĠĠĠ Ġif Ġ( not Callable From Java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġgenerate Ġnon - null Ġchecks Ġfor Ġsuspend Ġfunctions . ĠWhen Ġres umed Ġthe Ġarguments ĊĠĠĠĠĠĠĠ Ġ// Ġwill Ġbe Ġnull Ġand Ġthe Ġactual Ġvalues Ġare Ġtaken Ġfrom Ġthe Ġcontinuation . ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ir Function . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġir Function . extension Receiver Parameter ?. let Ġ{ Ġgenerate NonNull Assertion ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġir Function . value Parameters . forEach (:: generate NonNull Assertion ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate NonNull Assertion ( param : ĠIr Value Parameter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasm Type Ġ= Ġparam . type . asm Type ĊĠĠĠĠĠĠĠ Ġif Ġ(! param . type . un box Inline Class (). is Nullable () Ġ&& Ġ! is Primitive ( asm Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . load ( find Local Index ( param . symbol ), Ġasm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . acon st ( param . name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġif Ġ( state . unified Null Checks ) Ġ" checkNotNull Parameter " Ġelse Ġ" check Parameter IsNotNull " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . inv ok est atic ( Ir Intr insic Methods . INTR INS ICS _ CLASS _ NAME , ĠmethodName , Ġ"( Ljava / lang / Object ; Ljava / lang / String ;) V ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Parameter In Local Variable Table ( start Label : ĠLabel , Ġend Label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Function . origin Ġ== ĠIr Declaration Origin . FUNCTION _ FOR _ DEFAULT _ PARAMETER ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Function . is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Local Variable (" this ", Ġclass Code gen . type . descriptor , Ġnull , Ġstart Label , Ġend Label , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġextension Receiver Parameter Ġ= Ġir Function . extension Receiver Parameter ĊĠĠĠĠĠĠĠ Ġif Ġ( extension Receiver Parameter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value Parameter In Local Variable Table ( extension Receiver Parameter , Ġstart Label , Ġend Label , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( param Ġin Ġir Function . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value Parameter In Local Variable Table ( param , Ġstart Label , Ġend Label , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Value Parameter In Local Variable Table ( param : ĠIr Value Parameter , Ġstart Label : ĠLabel , Ġend Label : ĠLabel , Ġis Receiver : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġold Ġcode Ġhas Ġa Ġspecial Ġtreatment Ġfor Ġdestruct uring Ġlambda Ġparameters . ĊĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġno Ġ( easy ) Ġway Ġto Ġreproduce Ġit Ġwith ĠIR Ġstructures . ĊĠĠĠĠĠĠĠ Ġ// ĠDoes Ġnot Ġshow Ġup Ġin Ġtests , Ġbut Ġmight Ġcome Ġto Ġb ite Ġus Ġat Ġsome Ġpoint . ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġparameter Ġis Ġan Ġextension Ġreceiver Ġparameter Ġor Ġa Ġcaptured Ġextension Ġreceiver Ġfrom Ġen closing , ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġgenerate Ġname Ġaccordingly . ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( param . origin Ġ== ĠBO UND _ RECE IVER _ PARAMETER Ġ|| Ġis Receiver ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetName For Receiver Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . binding Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . configuration . language Version Settings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . name . asString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Mapper . map Type ( param ) ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : Ġwe Ġexpect Ġall Ġvalue Ġparameters Ġto Ġbe Ġpresent Ġin Ġthe Ġframe . ĊĠĠĠĠĠĠĠ Ġmv . visit Local Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , Ġtype . descriptor , Ġnull , Ġstart Label , Ġend Label , Ġfind Local Index ( param . symbol ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Block ( expression : ĠIr Block , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( expression Ġ! is ĠIr Return able Block ) Ġ{ Ġ" un lower ed Ġreturn able Ġblock : Ġ${ expression . dump () }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis Synt hesized Init Block Ġ= Ġexpression . origin Ġ== ĠSYN TH ES IZED _ INIT _ BLOCK ĊĠĠĠĠĠĠĠ Ġif Ġ( is Synt hesized Init Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . nop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . is Transparent Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Block ( expression , Ġdata ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠBlock Info ( data ) ĊĠĠĠĠĠĠĠ Ġ// ĠForce Ġmaterial ization Ġto Ġavoid Ġreading Ġfrom Ġout - of - scope Ġvariables . ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġsuper . visit Block ( expression , Ġinfo ). material ized (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . variables . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Local Variables In Table ( info , Ġmark New Label ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Synt hesized Init Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . nop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠIr Variable . isVisible In L VT : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġorigin Ġ!= ĠIr Declaration Origin . IR _ TEMP OR ARY _ VARIABLE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ!= ĠIr Declaration Origin . FOR _ LOOP _ ITERATOR ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Local Variables In Table ( info : ĠBlock Info , Ġend Label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo . variables . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . declaration . isVisible In L VT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Local Variable ( it . declaration . name . asString (), Ġit . type . descriptor , Ġnull , Ġit . start Label , Ġend Label , Ġit . index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinfo . variables . reversed (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave ( it . declaration . symbol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Statement Container ( container : ĠIr Statement Container , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġcontainer . statements . fold ( unit Value ) Ġ{ Ġprev , Ġexp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev . discard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexp . accept ( this , Ġdata ). also Ġ{ Ġ( exp Ġas ? ĠIr Expression )?. mark EndOf Statement IfNeeded () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Block Body ( body : ĠIr Block Body , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Statement Container ( body , Ġdata ). discard () ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Container Expression ( expression : ĠIr Container Expression , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġvisit Statement Container ( expression , Ġdata ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Function Access ( expression : ĠIr Function Access Expression , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Code gen . context . ir Intr insics . get Intr insic ( expression . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . invoke ( expression , Ġthis , Ġdata )?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠ Ġrequire ( callee . parent Ġis ĠIr Class ) Ġ{ Ġ" Unhandled Ġintr insic Ġin ĠExpression Code gen : Ġ${ callee . render () }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcallable Ġ= Ġmethod Signature Mapper . map To Callable Method ( ir Function , Ġexpression ) ĊĠĠĠĠĠĠĠ Ġval Ġcall Generator Ġ= Ġget OrCreate Call Generator ( expression , Ġdata , Ġcallable . signature ) ĊĠĠĠĠĠĠĠ Ġval Ġasm Type Ġ= Ġif Ġ( expression Ġis ĠIr Constructor Call ) Ġtype Mapper . map Type As Declaration ( expression . type ) Ġelse Ġexpression . asm Type ĊĠĠĠĠĠĠĠ Ġval Ġis Sus pension Point Ġ= Ġexpression . is Sus pension Point () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Sus pension Point Ġ!= ĠS us pension Point Kind . NE VER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Inline Marker ( mv , Ġis Start Not End Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġis ĠIr Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosure Re ified Markers [ expression . symbol . owner . parent As Class ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . w ere Used Re ified Parameters ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Need Class Re ification Marker ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpropagate Child Re ified Type Parameters Usage s ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIR Ġconstructors Ġhave Ġno Ġreceiver Ġand Ġreturn Ġthe Ġnew Ġinstance , Ġbut Ġon ĠJVM Ġthey Ġare Ġvoid - return ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstance Ġmethods Ġnamed Ġ< init >. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . an ew ( asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . dup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġis ĠIr Delegating Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġcase Ġthe Ġreceiver Ġis Ġ` this ` Ġ( not Ġspecified Ġin ĠIR ) Ġand Ġthe Ġreturn Ġvalue Ġis Ġdiscarded Ġanyway . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . load ( 0 , ĠOBJECT _ TYPE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Index Ġin Ġ 0 Ġuntil Ġexpression . type Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġexpression . getType Argument ( argument Index )?. classifier OrNull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classifier Ġis ĠIr Type Parameter Symbol Ġ&& Ġclassifier . owner . is Re ified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Re ified Operation Marker ( classifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . symbol . descriptor Ġis ĠConstructor Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Ir Call Ġwith ĠConstructor Descriptor : Ġ${ expression . java Class . simple Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver ?. let Ġ{ Ġreceiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġif Ġ(( expression Ġas ? ĠIr Call )?. super Qualifier Symbol Ġ!= Ġnull ) Ġreceiver . asm Type Ġelse Ġcallable . owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Generator . gen Value And Put ( callee . dispatch Receiver Parameter !! , Ġreceiver , Ġtype , Ġthis , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpression . extension Receiver ?. let Ġ{ Ġreceiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġcallable . signature . value Parameters . single OrNull Ġ{ Ġit . kind Ġ== ĠJ vm Method Parameter Kind . RECE IVER Ġ} ?. asm Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" No Ġsingle Ġextension Ġreceiver Ġparameter : Ġ${ callable . signature . value Parameters }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Generator . gen Value And Put ( callee . extension Receiver Parameter !! , Ġreceiver , Ġtype , Ġthis , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall Generator . before Value Parameters Start () ĊĠĠĠĠĠĠĠ Ġexpression . symbol . owner . value Parameters . forEach Indexed Ġ{ Ġi , Ġir Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getValue Argument ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= Ġcallable . value Parameter Types [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( arg Ġ!= Ġnull ) Ġ{ Ġ" Null Ġargument Ġin ĠExpression Code gen Ġfor Ġparameter Ġ${ ir Parameter . render () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Generator . gen Value And Put ( ir Parameter , Ġarg , Ġparameter Type , Ġthis , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( true ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Sus pension Point Ġ!= ĠS us pension Point Kind . NE VER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Suspend Marker ( mv , Ġis Start Not End Ġ= Ġtrue , Ġis Sus pension Point Ġ== ĠS us pension Point Kind . NOT _ INLINE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ir Function . is Invoke Suspend Of Continuation ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġinline Ġcal lee Ġto Ġcontinuation , Ġinstead , Ġcall Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( callable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Method Insn ( invoke Opcode , Ġowner . internal Name , Ġasm Method . name , Ġasm Method . descriptor , Ġis Interface Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Generator . gen Call ( callable , Ġthis , Ġexpression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Sus pension Point Ġ!= ĠS us pension Point Kind . NE VER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Suspend Marker ( mv , Ġis Start Not End Ġ= Ġfalse , Ġis Sus pension Point Ġ== ĠS us pension Point Kind . NOT _ INLINE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Inline Marker ( mv , Ġis Start Not End Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġis ĠIr Constructor Call Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , Ġasm Type , Ġexpression . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( expression . type . is Nothing () Ġ|| Ġexpression . type . is Unit ()) Ġ&& Ġir Function . should Contain Suspend Markers () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNew Inference Ġallows Ġcasting Ġ` () Ġ-> ĠT ` Ġto Ġ` () Ġ-> ĠUnit `. ĠA ĠCHECK CAST Ġhere Ġwill Ġfail . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlso , Ġif Ġthe Ġcal lee Ġis Ġa Ġsuspend Ġfunction Ġwith Ġa Ġsus pending Ġtail Ġcall , Ġthe Ġnext Ġ` resume With ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġcontinue Ġfrom Ġhere , Ġbut Ġthe Ġvalue Ġpassed Ġto Ġit Ġmight Ġnot Ġhave Ġbeen Ġ` Unit `. ĠAn Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġmethods Ġthat Ġdo Ġnot Ġpass Ġthrough Ġthe Ġstate Ġmachine Ġgenerating ĠMethod Visitor , Ġsince Ġgetting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCOR OUT INE _ SUS PEN DED Ġhere Ġis Ġstill Ġpossible ; Ġluck ily , Ġall Ġthose Ġmethods Ġare Ġb rid ges . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callable . asm Method . returnType Ġ!= ĠType . VOID _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , Ġcallable . asm Method . returnType , Ġcal lee . returnType ). discard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġgenerate Ġredundant ĠUNIT / pop Ġinstructions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal lee . parent As Class . is Annotation Class Ġ&& Ġcallable . asm Method . returnType Ġ== ĠA sm Types . JAVA _ CLASS _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Java Class Into K Class ( mv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , ĠA sm Types . K _ CLASS _ TYPE , Ġexpression . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal lee . parent As Class . is Annotation Class Ġ&& Ġcallable . asm Method . returnType Ġ== ĠA sm Types . JAVA _ CLASS _ ARRAY _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Java Classes Into K Classes ( mv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , ĠA sm Types . K _ CLASS _ ARRAY _ TYPE , Ġexpression . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , Ġcallable . asm Method . returnType , Ġcal lee . returnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function Access Expression . is Sus pension Point (): ĠS us pension Point Kind Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! symbol . owner . is Suspend Ġ|| Ġ! ir Function . should Contain Suspend Markers () Ġ-> ĠS us pension Point Kind . NE VER ĊĠĠĠĠĠĠĠ Ġ// ĠCopy - past ed Ġbytecode Ġblocks Ġare Ġnot Ġsus pension Ġpoints . ĊĠĠĠĠĠĠĠ Ġsymbol . owner . is Inline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol . owner . name . asString () Ġ== Ġ" suspend Coroutine Un intercept ed Or Return " Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . owner . get Package Fragment ()?. fq Name Ġ== ĠF q Name (" kotlin . coroutines . intr insics ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠS us pension Point Kind . ALWAYS Ġelse ĠS us pension Point Kind . NE VER ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġincludes Ġinline Ġlamb das , Ġbut Ġonly Ġin Ġfunctions Ġintended Ġfor Ġthe Ġin liner ; Ġin Ġothers , Ġthey Ġstay Ġas Ġ` f . invoke ()`. ĊĠĠĠĠĠĠĠ Ġdispatch Receiver . is Read Of Inline Lambda () Ġ-> ĠS us pension Point Kind . NOT _ INLINE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠS us pension Point Kind . ALWAYS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvar Type Ġ= Ġtype Mapper . map Type ( declaration ) ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġframe Map . enter ( declaration . symbol , Ġvar Type ) ĊĊĠĠĠĠĠĠĠ Ġdeclaration . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġdeclaration . initializer ĊĠĠĠĠĠĠĠ Ġif Ġ( initializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġinitializer . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . material ize At ( var Type , Ġdeclaration . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( index , Ġvar Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( declaration . isVisible In L VT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush DefaultValue On Stack ( var Type , Ġmv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( index , Ġvar Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata . variables . add ( Variable Info ( declaration , Ġindex , Ġvar Type , Ġmark New Label ())) ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġgenerate Ġline Ġnumber Ġinformation Ġfor Ġloads Ġfrom Ġcompiler - generated ĊĠĠĠĠĠĠĠ Ġ// Ġtemporary Ġvariables . ĠThey Ġdo Ġnot Ġcorrespond Ġto Ġvariable Ġloads Ġin Ġuser Ġcode . ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol . owner . origin Ġ!= ĠIr Declaration Origin . IR _ TEMP OR ARY _ VARIABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġframe Map . type Of ( expression . symbol ) ĊĠĠĠĠĠĠĠ Ġmv . load ( find Local Index ( expression . symbol ), Ġtype ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMaterial Value ( this , Ġtype , Ġexpression . type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Field Access ( expression : ĠIr Field Access Expression , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠ Ġif Ġ( context . state . should Inline Const Vals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConst Ġfields Ġshould Ġonly Ġhave Ġreads , Ġand Ġthose Ġshould Ġhave Ġbeen Ġtransformed Ġby ĠConst Lower ing . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( callee . constant Value () Ġ== Ġnull ) Ġ{ Ġ" access Ġof Ġconst Ġval : Ġ${ expression . dump () }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġtype Mapper . map Type ( callee . type ) ĊĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġcal lee . name . asString () ĊĠĠĠĠĠĠĠ Ġval Ġis Static Ġ= Ġexpression . receiver Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Type Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . super Qualifier Symbol Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Mapper . map Class ( expression . super Qualifier Symbol !!. owner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . receiver Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Mapper . map Type As Declaration ( expression . receiver !!. type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtype Mapper . map Class ( callee . parent As Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Name Ġ= Ġowner Type . internal Name ĊĊĠĠĠĠĠĠĠ Ġexpression . receiver ?. let Ġ{ Ġreceiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver . accept ( this , Ġdata ). material ize At ( owner Type , Ġreceiver . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression Ġis ĠIr Set Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġexpression . value . accept ( this , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġinitialize Ġenum Ġentries Ġwith Ġa Ġsubtype Ġof Ġ` fieldType ` Ġand Ġcan Ġavoid Ġthe ĠCHECK CAST . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġimportant Ġfor Ġsome Ġtools Ġwhich Ġanalyze Ġbytecode Ġfor Ġenum Ġclasses Ġby Ġlooking Ġat Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinitializer Ġof Ġthe Ġ$ VALUES Ġfield . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee . origin Ġ== ĠIr Declaration Origin . FIELD _ FOR _ ENUM _ ENTRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . material ize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . material ize At ( fieldType , Ġcal lee . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ-> Ġmv . put static ( owner Name , ĠfieldName , ĠfieldType . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmv . put field ( owner Name , ĠfieldName , ĠfieldType . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( expression . type . is Unit ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Value ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ-> Ġmv . get static ( owner Name , ĠfieldName , ĠfieldType . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmv . getfield ( owner Name , ĠfieldName , ĠfieldType . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , ĠfieldType , Ġcal lee . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Set Field ( expression : ĠIr Set Field , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Value Ġ= Ġexpression . value ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġadd Ġredundant Ġfield Ġinitial izers Ġthat Ġinitialize Ġto Ġdefault Ġvalues . ĊĠĠĠĠĠĠĠ Ġval Ġin Class Init Ġ= Ġir Function . origin Ġ== ĠJ vm Lower ed Declaration Origin . CLASS _ STATIC _ INITIAL IZER ĊĠĠĠĠĠĠĠ Ġval Ġis Field Initializer Ġ= Ġexpression . origin Ġ== ĠIr Statement Origin . INITIAL IZE _ FIELD ĊĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġ( ir Function Ġis ĠIr Constructor Ġ|| Ġin Class Init ) Ġ&& Ġis Field Initializer Ġ&& Ġexpression Value Ġis ĠIr Const < *> Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis DefaultValue ForType ( expression . symbol . owner . type . asm Type , Ġexpression Value . value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( skip ) Ġunit Value Ġelse Ġsuper . visit Set Field ( expression , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġgiven Ġconstant Ġvalue Ġis Ġthe ĠJVM 's Ġdefault Ġvalue Ġfor Ġthe Ġgiven Ġtype . ĊĠĠĠĠ Ġ* ĠSee : Ġhttps :// docs . oracle . com / javase / specs / jv ms / se 8 / html / jv ms - 2 . html # jv ms - 2 . 3 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis DefaultValue ForType ( type : ĠType , Ġvalue : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . BOOLEAN _ TYPE Ġ-> Ġvalue Ġis ĠBoolean Ġ&& Ġ! value ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . CHAR _ TYPE Ġ-> Ġvalue Ġis ĠChar Ġ&& Ġvalue . toInt () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . BYTE _ TYPE , ĠType . SHORT _ TYPE , ĠType . INT _ TYPE , ĠType . LONG _ TYPE Ġ-> Ġvalue Ġis ĠNumber Ġ&& Ġvalue . to Long () Ġ== Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMust Ġuse Ġ` equals ` Ġfor Ġthese Ġtwo Ġto Ġdifferent iate Ġbetween Ġ+ 0 . 0 Ġand Ġ- 0 . 0 : ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . FLOAT _ TYPE Ġ-> Ġvalue Ġis ĠNumber Ġ&& Ġvalue . toFloat (). equals ( 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . DOUBLE _ TYPE Ġ-> Ġvalue Ġis ĠNumber Ġ&& Ġvalue . toDouble (). equals ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ! is Primitive ( type ) Ġ&& Ġvalue Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Local Index ( ir Symbol : ĠIr Symbol ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġframe Map . getIndex ( ir Symbol ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Non - mapped Ġlocal Ġdeclaration : Ġ$ ir Symbol \ n Ġin Ġ${ ir Function . dump () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Plus Minus ( expression : ĠIr Set Variable , Ġvalue : ĠIr Expression ?, Ġis Minus : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠIr Const < *> Ġ&& Ġvalue . kind Ġ== ĠIr Const Kind . Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġ( value Ġas ĠIr Const < Int >). value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Bound Ġ= ĠByte . MAX _ VALUE . toInt () Ġ+ Ġ( if Ġ( is Minus ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Bound Ġ= ĠByte . MIN _ VALUE . toInt () Ġ+ Ġ( if Ġ( is Minus ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delta Ġin Ġlower Bound .. upper Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . i inc ( find Local Index ( expression . symbol ), Ġif Ġ( is Minus ) Ġ- delta Ġelse Ġdelta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Same LineNumber ( element 0 : ĠIr Element , Ġelement 1 : ĠIr Element ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġget LineNumber For Offset ( element 0 . start Offset ) Ġ== Ġget LineNumber For Offset ( element 1 . start Offset ) ĊĊĠĠĠ Ġ// ĠUse Ġi inc Ġfor Ġall Ġfor Ġthe Ġset Ġvar Ġint Ġspecial Ġcases Ġwhere Ġwe Ġcan . ĊĠĠĠ Ġ// ĠBe Ġcareful Ġto Ġmake Ġsure Ġthat Ġdebugging Ġbehavior Ġdoes Ġnot Ġchange Ġand ĊĠĠĠ Ġ// Ġonly Ġperform Ġthe Ġoptimization Ġif Ġthat Ġcan Ġbe Ġdone Ġwithout Ġlo sing ĊĠĠĠ Ġ// Ġline Ġnumber Ġinformation . ĊĠĠĠ Ġprivate Ġfun Ġhandle Int Variable Special Cases ( expression : ĠIr Set Variable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol . owner . type . is Int ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . PREFIX _ IN CR , ĠIr Statement Origin . PREFIX _ DE CR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . i inc ( find Local Index ( expression . symbol ), Ġif Ġ( expression . origin Ġ== ĠIr Statement Origin . PREFIX _ IN CR ) Ġ 1 Ġelse Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . PL USE Q , ĠIr Statement Origin . MIN USE Q Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġ( expression . value Ġas ĠIr Call ). getValue Argument ( 0 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Same LineNumber ( argument , Ġexpression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Plus Minus ( expression , Ġargument , Ġexpression . origin Ġis ĠIr Statement Origin . MIN USE Q ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . EQ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġexpression . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Same LineNumber ( value , Ġexpression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġvalue . dispatch Receiver Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġexpression . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Same LineNumber ( receiver , Ġexpression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . origin Ġ== ĠIr Statement Origin . PLUS Ġ|| Ġvalue . origin Ġ== ĠIr Statement Origin . MINUS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġvalue . getValue Argument ( 0 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġis ĠIr GetValue Ġ&& Ġreceiver . symbol Ġ== Ġsymbol Ġ&& Ġhas Same LineNumber ( argument , Ġexpression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Plus Minus ( expression , Ġargument , Ġvalue . origin Ġ== ĠIr Statement Origin . MINUS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Set Variable ( expression : ĠIr Set Variable , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! handle Int Variable Special Cases ( expression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . value . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . value . accept ( this , Ġdata ). material ize At ( expression . symbol . owner . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( find Local Index ( expression . symbol ), Ġexpression . symbol . owner . asm Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Variable ( symbol : ĠIr Value Symbol , Ġvalue : ĠIr Expression , Ġdata : ĠBlock Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġvalue . accept ( this , Ġdata ). material ize At ( symbol . owner . type ) ĊĠĠĠĠĠĠĠ Ġmv . store ( find Local Index ( symbol ), Ġsymbol . owner . asm Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġvisit Const ( expression : ĠIr Const < T >, Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġexpression . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBoolean Constants Ġ_ may Ġnot _ Ġbe Ġmaterial ized , Ġso Ġwe Ġensure Ġan Ġinstruction Ġfor Ġthe Ġline Ġnumber . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . nop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBoolean Constant ( this , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Ġ-> Ġmv . iconst ( value . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġmv . l const ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġmv . f const ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġmv . d const ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber Ġ-> Ġmv . iconst ( value . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmv . acon st ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexpression . on Stack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Expression Body ( body : ĠIr Expression Body , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġbody . expression . accept ( this , Ġdata ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected ĠIR Ġelement Ġfound Ġduring Ġcode Ġgeneration . ĠEither Ġcode Ġgeneration Ġfor Ġit Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is Ġnot Ġimplemented , Ġor Ġit Ġshould Ġhave Ġbeen Ġlower ed :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . render () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( declaration : ĠIr Class , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . origin Ġ!= ĠJ vm Lower ed Declaration Origin . CONT IN UATION _ CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosure Re ified Markers [ declaration ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Code gen . get OrCreate ( declaration , Ġcontext , Ġgenerate Sequence ( this ) Ġ{ Ġit . in lined Into Ġ}. last (). ir Function ). generate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Return ( expression : ĠIr Return , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreturn Target Ġ= Ġexpression . return Target Symbol . owner ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Target Ġas ? ĠIr Function ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ( return Target Ġas ? ĠIr Return able Block )?. inline Function Symbol ?. owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Unsupported ĠIr Return Target : Ġ$ return Target ") ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġshould Ġbe Ġowner Ġ!= Ġir Function ĊĠĠĠĠĠĠĠ Ġval Ġis Non Local Return Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Signature Mapper . map FunctionName ( owner ) Ġ!= Ġmethod Signature Mapper . map FunctionName ( ir Function ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Non Local Return Ġ&& Ġstate . is Inline Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . psi Error Builder . at ( expression , Ġowner ). report ( Errors . NON _ LOCAL _ RETURN _ IN _ DISABLED _ INLINE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen Throw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv , Ġ" java / lang / Unsupported OperationException ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non - local Ġreturns Ġare Ġnot Ġallowed Ġwith Ġin lining Ġdisabled " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġif Ġ( owner Ġ== Ġir Function ) Ġsignature . returnType Ġelse Ġmethod Signature Mapper . map ReturnType ( owner ) ĊĠĠĠĠĠĠĠ Ġval Ġafter Return Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġexpression . value . accept ( this , Ġdata ). material ize At ( returnType , Ġowner . returnType ) ĊĠĠĠĠĠĠĠ Ġgenerate Finally Blocks IfNeeded ( returnType , Ġafter Return Label , Ġdata ) ĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Non Local Return ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Global Return Flag ( mv , Ġowner . name . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmv . are turn ( returnType ) ĊĠĠĠĠĠĠĠ Ġmv . mark ( after Return Label ) ĊĠĠĠĠĠĠĠ Ġmv . nop () /* TODO Ġcheck ĠREST ORE _ STACK _ IN _ TRY _ CATCH Ġprocessor */ ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit When ( expression : ĠIr When , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ ĠSwitch Generator ( expression , Ġdata , Ġthis ). generate ()?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġend Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġval Ġex haustive Ġ= Ġexpression . branches . any Ġ{ Ġit . condition . isTrue Const () Ġ} Ġ&& Ġ! expression . type . is Unit () ĊĠĠĠĠĠĠĠ Ġassert ( exhaustive Ġ|| Ġexpression . type . is Unit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" non - exhaustive Ġconditional Ġshould Ġreturn ĠUnit : Ġ${ expression . dump () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlast Branch Ġ= Ġexpression . branches . last OrNull () ĊĠĠĠĠĠĠĠ Ġfor Ġ( branch Ġin Ġexpression . branches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch . condition . isFalse Const () Ġ|| Ġbranch . condition . isTrue Const ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrue Ġor Ġfalse Ġconditions Ġknown Ġat Ġcompile Ġtime Ġneed Ġnot Ġbe Ġgenerated . ĠA Ġlin enumber Ġand Ġnop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġstill Ġrequired Ġfor Ġa Ġdebugger Ġto Ġbreak Ġon Ġthe Ġline Ġof Ġthe Ġcondition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Ġ! is ĠIr Else Branch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . condition . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . nop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch . condition . isFalse Const ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Ġ// ĠThe Ġbranch Ġbody Ġis Ġdead Ġcode . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . condition . accept ( this , Ġdata ). coerce To Boolean (). jump If False ( else Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbranch . result . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exhaustive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . discard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial ized Result Ġ= Ġresult . material ized At ( expression . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch . condition . isTrue Const ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġrest Ġof Ġthe Ġexpression Ġis Ġdead Ġcode . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . mark ( end Label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmaterial ized Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Ġ!= Ġlast Branch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . goTo ( end Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . mark ( else Label ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmv . mark ( end Label ) ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Operator ( expression : ĠIr Type Operator Call , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Operand Ġ= Ġexpression . type Operand ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Type Ġ= Ġtype Operand . to Kotlin Type () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression . operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . IMP LICIT _ CAST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . argument . accept ( this , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . CAST , ĠIr Type Operator . SAFE _ CAST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexpression . argument . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox ed Left Type Ġ= Ġtype Mapper . box Type ( result . ir Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . material ize At ( boxed Left Type , Ġexpression . argument . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox ed Right Type Ġ= Ġtype Mapper . box Type ( type Operand ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Operand . is Re ified Type Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Kind Ġ= Ġif Ġ( expression . operator Ġ== ĠIr Type Operator . CAST ) ĠAS Ġelse ĠSA FE _ AS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Re ified Operation Marker If Type Is Re ified Parameter ( type Operand , Ġoperation Kind ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . check cast ( boxed Right Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( expression . operator Ġ== ĠIr Type Operator . CAST ) Ġ{ Ġ" Ir Type Operator . SAFE _ CAST Ġshould Ġhave Ġbeen Ġlower ed ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Intr insics . check cast ( mv , Ġkotlin Type , Ġbox ed Right Type , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Value ( this , Ġbox ed Right Type , Ġexpression . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . INSTANCE OF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . argument . accept ( this , Ġdata ). material ize At ( context . ir Built Ins . any N Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Mapper . box Type ( type Operand ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Operand . is Re ified Type Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Re ified Operation Marker If Type Is Re ified Parameter ( type Operand , ĠRe ified Type In liner . Operation Kind . IS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . instance Of ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Intr insics . instance Of ( mv , Ġkotlin Type , Ġtype , Ġstate . language Version Settings . is Release Cor outines ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . on Stack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" type Ġoperator Ġ${ expression . operator } Ġshould Ġhave Ġbeen Ġlower ed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Expression . mark EndOf Statement IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr When Ġ-> Ġif Ġ( this . branches . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mark LineNumber ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Try Ġ-> Ġthis . mark LineNumber ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Container Expression Ġ-> Ġwhen Ġ( this . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . WHEN , ĠIr Statement Origin . IF Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mark LineNumber ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit While Loop ( loop : ĠIr While Loop , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontinue Label Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġval Ġend Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġstack Ġdepth Ġfor Ġbreak ĊĠĠĠĠĠĠĠ Ġmv . fake Always False I fe q ( end Label ) ĊĠĠĠĠĠĠĠ Ġloop . condition . mark LineNumber ( true ) ĊĠĠĠĠĠĠĠ Ġloop . condition . accept ( this , Ġdata ). coerce To Boolean (). jump If False ( end Label ) ĊĠĠĠĠĠĠĠ Ġdata . with Block ( Loop Info ( loop , Ġcontinue Label , Ġend Label )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop . body ?. accept ( this , Ġdata )?. discard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmv . goTo ( continue Label ) ĊĠĠĠĠĠĠĠ Ġmv . mark ( end Label ) ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Do While Loop ( loop : ĠIr Do While Loop , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġval Ġend Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġval Ġcontinue Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġstack Ġdepth Ġfor Ġbreak / continue ĊĠĠĠĠĠĠĠ Ġmv . fake Always False I fe q ( continue Label ) ĊĠĠĠĠĠĠĠ Ġmv . fake Always False I fe q ( end Label ) ĊĠĠĠĠĠĠĠ Ġdata . with Block ( Loop Info ( loop , Ġcontinue Label , Ġend Label )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop . body ?. accept ( this , Ġdata )?. discard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmv . visit Label ( continue Label ) ĊĠĠĠĠĠĠĠ Ġloop . condition . mark LineNumber ( true ) ĊĠĠĠĠĠĠĠ Ġloop . condition . accept ( this , Ġdata ). coerce To Boolean (). jump If True ( entry ) ĊĠĠĠĠĠĠĠ Ġmv . mark ( end Label ) ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun wind Block Stack ( ĊĠĠĠĠĠĠĠ Ġend Label : ĠLabel , ĊĠĠĠĠĠĠĠ Ġdata : ĠBlock Info , ĊĠĠĠĠĠĠĠ Ġnested Try Without Finally : ĠMutable List < Try Info > Ġ= Ġarray ListOf (), ĊĠĠĠĠĠĠĠ Ġstop : Ġ( Expression Info ) Ġ-> ĠBoolean Ġ= Ġ{ Ġfalse Ġ} ĊĠĠĠ Ġ): ĠExpression Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . handle Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠTry With Finally Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Finally Block ( it , Ġnull , Ġend Label , Ġdata , Ġnested Try Without Finally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Try Without Finally . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġis ĠTry Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Try Without Finally . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( stop ( it )) Ġit Ġelse Ġun wind Block Stack ( end Label , Ġdata , Ġnested Try Without Finally , Ġstop ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Break Continue ( jump : ĠIr Break Continue , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġjump . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġend Label Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġval Ġstack Element Ġ= Ġun wind Block Stack ( end Label , Ġdata ) Ġ{ Ġit Ġis ĠLoop Info Ġ&& Ġit . loop Ġ== Ġjump . loop Ġ} Ġas ĠLoop Info ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" Target Ġlabel Ġfor Ġbreak / continue Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġmv . fix Stack And Jump ( if Ġ( jump Ġis ĠIr Break ) Ġstack Element . break Label Ġelse Ġstack Element . continue Label ) ĊĠĠĠĠĠĠĠ Ġmv . mark ( end Label ) ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Try ( a Try : ĠIr Try , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġa Try . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . with Block ( if Ġ( a Try . finally Expression Ġ!= Ġnull ) ĠTry With Finally Info ( a Try . finally Expression !! ) Ġelse ĠTry Info ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Try With Info ( a Try , Ġdata , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Try With Info ( a Try : ĠIr Try , Ġdata : ĠBlock Info , Ġtry Info : ĠTry Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtry Block Start Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġmv . nop () ĊĠĠĠĠĠĠĠ Ġval Ġtry Asm Type Ġ= Ġa Try . asm Type ĊĠĠĠĠĠĠĠ Ġval Ġtry Result Ġ= Ġa Try . try Result . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġval Ġis Expression Ġ= Ġ! a Try . type . is Unit () ĊĠĠĠĠĠĠĠ Ġvar Ġsaved Value : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( is Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Result . material ize At ( try Asm Type , Ġa Try . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Value Ġ= Ġframe Map . enter Temp ( try Asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( saved Value , Ġtry Asm Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Result . discard () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtry Block End Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġval Ġtry Block G aps Ġ= Ġtry Info . g aps . toList () ĊĠĠĠĠĠĠĠ Ġval Ġtry Catch Block End Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġif Ġ( try Info Ġis ĠTry With Finally Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . handle Block Ġ{ Ġgen Finally Block ( try Info , Ġtry Catch Block End , Ġnull , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . goTo ( try Catch Block End ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcat ches Ġ= Ġa Try . cat ches ĊĠĠĠĠĠĠĠ Ġfor Ġ( clause Ġin Ġcat ches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclause Start Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġclause . catch Parameter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Type Ġ= Ġparameter . asm Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġframe Map . enter ( clause . catch Parameter , Ġdescriptor Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclause . mark LineNumber ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( index , Ġdescriptor Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Store Ġ= Ġmark New Label () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Body Ġ= Ġclause . result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Result Ġ= Ġcatch Body . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( saved Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Result . material ize At ( try Asm Type , Ġa Try . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( saved Value , Ġtry Asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Result . discard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave ( clause . catch Parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclause End Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Local Variable ( parameter . name . asString (), Ġdescriptor Type . descriptor , Ġnull , Ġafter Store , Ġclause End , Ġindex ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( try Info Ġis ĠTry With Finally Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . handle Block Ġ{ Ġgen Finally Block ( try Info , Ġtry Catch Block End , Ġnull , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( clause Ġ!= Ġcat ches . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . goTo ( try Catch Block End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen Try Catch Cover ( clause Start , Ġtry Block Start , Ġtry Block End , Ġtry Block G aps , Ġdescriptor Type . internal Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( try Info Ġis ĠTry With Finally Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġ` try Ġ{ Ġ... Ġ} Ġcatch Ġ( e : ĠAny ?) Ġ{ Ġ< finally >; Ġthrow Ġe Ġ}` Ġaround Ġevery Ġpart Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtry - catch Ġthat Ġis Ġnot Ġa Ġcopy - past ed Ġ` finally ` Ġblock . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Catch Start Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhile Ġkeeping Ġthis Ġvalue Ġon Ġthe Ġstack Ġshould Ġbe Ġenough , Ġthe Ġbytecode Ġvalidator Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompl ain Ġif Ġa Ġcatch Ġblock Ġdoes Ġnot Ġstart Ġwith ĠA STORE . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Exception Ġ= Ġframe Map . enter Temp ( Asm Types . JAVA _ THROW ABLE _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( saved Exception , ĠA sm Types . JAVA _ THROW ABLE _ TYPE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinally Start Ġ= Ġmark New Label () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinally G aps Ġ= Ġtry Info . g aps . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . handle Block Ġ{ Ġgen Finally Block ( try Info , Ġnull , Ġnull , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . load ( saved Exception , ĠA sm Types . JAVA _ THROW ABLE _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave Temp ( Asm Types . JAVA _ THROW ABLE _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . ath row () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInclude Ġthe ĠA STORE Ġinto Ġthe Ġcovered Ġregion . ĠThis Ġis Ġused Ġby Ġthe Ġin liner Ġto Ġdetect Ġtry - finally . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen Try Catch Cover ( default Catch Start , Ġtry Block Start , Ġfinally Start , Ġfinally G aps , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmv . mark ( try Catch Block End ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġgenerate Ġa Ġcommon Ġ` finally ` Ġfor Ġtry Ġ& Ġcatch Ġblocks Ġhere ? ĠRight Ġnow Ġthis Ġbreaks Ġthe Ġin liner . ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠPromise d Value ( this , Ġtry Asm Type , Ġa Try . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmaterial ize At ( target : ĠType , Ġir Target : ĠIr Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( saved Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . load ( saved Value , Ġtry Asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave Temp ( try Asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . material ize At ( target , Ġir Target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit Value . material ize At ( target , Ġir Target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdiscard () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( saved Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave Temp ( try Asm Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgen Try Catch Cover ( catch Start : ĠLabel , Ġtry Start : ĠLabel , Ġtry End : ĠLabel , Ġtry G aps : ĠList < Pair < Label , ĠLabel >>, Ġtype : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Region Start Ġ= Ġtry G aps . fold ( try Start ) Ġ{ Ġregion Start , Ġ( gap Start , Ġgap End ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . visit Try Catch Block ( region Start , Ġgap Start , Ġcatch Start , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgap End ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmv . visit Try Catch Block ( last Region Start , Ġtry End , Ġcatch Start , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgen Finally Block ( ĊĠĠĠĠĠĠĠ Ġtry With Finally Info : ĠTry With Finally Info , ĊĠĠĠĠĠĠĠ Ġtry Catch Block End : ĠLabel ?, ĊĠĠĠĠĠĠĠ Ġafter Jump Label : ĠLabel ?, ĊĠĠĠĠĠĠĠ Ġdata : ĠBlock Info , ĊĠĠĠĠĠĠĠ Ġnested Try Without Finally : ĠMutable List < Try Info > Ġ= Ġarray ListOf () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgap Start Ġ= Ġmark New Linked Label () ĊĠĠĠĠĠĠĠ Ġfinally Depth ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Finally Marker Required ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Finally Marker ( mv , Ġfinally Depth , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry With Finally Info . on Exit . accept ( this , Ġdata ). discard () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Finally Marker Required ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Finally Marker ( mv , Ġfinally Depth , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Depth -- ĊĠĠĠĠĠĠĠ Ġif Ġ( try Catch Block End Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry With Finally Info . on Exit . mark LineNumber ( start Offset Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmv . goTo ( try Catch Block End ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgap End Ġ= Ġafter Jump Label Ġ?: Ġmark New Label () ĊĠĠĠĠĠĠĠ Ġtry With Finally Info . g aps . add ( gap Start Ġto Ġgap End ) ĊĠĠĠĠĠĠĠ Ġif Ġ( state . language Version Settings . supports Feature ( Language Feature . Pro per Finally )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġnested Try Without Finally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . g aps . add ( gap Start Ġto Ġgap End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Finally Blocks IfNeeded ( returnType : ĠType , Ġafter Return Label : ĠLabel , Ġdata : ĠBlock Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Finally Blocks ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Type . VOID _ TYPE Ġ!= ĠreturnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Val Index Ġ= Ġframe Map . enter Temp ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . store ( return Val Index , ĠreturnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun wind Block Stack ( after Return Label , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . load ( return Val Index , ĠreturnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Map . leave Temp ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun wind Block Stack ( after Return Label , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Throw ( expression : ĠIr Throw , Ġdata : ĠBlock Info ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . mark LineNumber ( start Offset Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġexpression . value . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġune cessary ĠCHECK CAST s Ġto Ġjava / lang / Throwable . ĠIf Ġthe Ġexception Ġis Ġnot Ġof Ġtype ĠObject ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġit Ġmust Ġbe Ġsome Ġsubtype Ġof Ġthrowable Ġand Ġwe Ġdon 't Ġneed Ġto Ġco erce Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ( exception . type Ġ== ĠOBJECT _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . material ize At ( context . ir Built Ins . throwable Type ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . material ize () ĊĠĠĠĠĠĠĠ Ġmv . ath row () ĊĠĠĠĠĠĠĠ Ġreturn Ġunit Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit GetClass ( expression : ĠIr GetClass , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Class Literal Reference ( expression , Ġtrue , Ġdata ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class Reference ( expression : ĠIr Class Reference , Ġdata : ĠBlock Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Class Literal Reference ( expression , Ġtrue , Ġdata ) ĊĊĠĠĠ Ġfun Ġgenerate Class Literal Reference ( ĊĠĠĠĠĠĠĠ Ġclass Reference : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġwrap Into K Class : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġdata : ĠBlock Info ĊĠĠĠ Ġ): ĠPromise d Value Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( class Reference Ġis ĠIr GetClass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġtransform Ġone Ġsort Ġof Ġaccess Ġinto Ġthe Ġother ? ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJava Class Property . invoke With ( class Reference . argument . accept ( this , Ġdata )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( class Reference Ġis ĠIr Class Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Type Ġ= Ġclass Reference . class Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġclass Type . classifier OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classifier Ġis ĠIr Type Parameter Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( classifier . owner . is Re ified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non - re ified Ġtype Ġparameter Ġunder Ġ:: class Ġshould Ġbe Ġrejected Ġby Ġtype Ġchecker : Ġ${ classifier . owner . dump () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Re ified Operation Marker If Type Is Re ified Parameter ( class Type , ĠRe ified Type In liner . Operation Kind . JAVA _ CLASS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Class Instance ( mv , Ġclass Type , Ġtype Mapper ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" not Ġan ĠIr GetClass Ġor ĠIr Class Reference : Ġ${ class Reference . dump () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( wrap Into K Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Java Class Into K Class ( mv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclass Reference . on Stack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget OrCreate Call Generator ( ĊĠĠĠĠĠĠĠ Ġelement : ĠIr Function Access Expression , Ġdata : ĠBlock Info , Ġsignature : ĠJ vm Method Signature ĊĠĠĠ Ġ): ĠIr Call Generator Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! element . symbol . owner . is Inline Function Call ( context ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Code gen . ir Class . file Parent . file Entry Ġis ĠMult if ile Facade File Entry ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Call Generator . Default Call Generator ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġelement . symbol . owner ĊĠĠĠĠĠĠĠ Ġval Ġtype Argument Container Ġ= Ġif Ġ( callee Ġis ĠIr Constructor ) Ġcal lee . parent As Class Ġelse Ġcal lee ĊĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . type Arguments Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// avoid Ġamb iguity Ġwith Ġtype Ġconstructor Ġtype Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtype Argument Container . type Parameters . keys ToMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getType Argument OrDefault ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmappings Ġ= ĠType Parameter Mappings < Ir Type >() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġtype ) Ġin Ġtype Arguments . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre ification Argument Ġ= Ġtype Mapper . type System . extract Re ification Argument ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re ification Argument Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtype Ġis Ġnot Ġgeneric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Writer Ġ= ĠBoth Signature Writer ( Both Signature Writer . Mode . TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasm Type Ġ= Ġtype Mapper . map Type Parameter ( type , Ġsignature Writer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmappings . add Parameter Mapping To Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . name . identifier , Ġtype , Ġasm Type , Ġsignature Writer . toString (), Ġkey . is Re ified ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmappings . add Parameter Mapping For Further Re ification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . name . identifier , Ġtype , Ġre ification Argument . second , Ġkey . is Re ified ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Owner Ġ= Ġtype Mapper . map Class ( callee . parent As Class ) ĊĠĠĠĠĠĠĠ Ġval Ġsource Compiler Ġ= ĠIr Source Compiler For Inline ( state , Ġelement , Ġcal lee , Ġthis , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġval Ġre ified Type In liner Ġ= ĠRe ified Type In liner ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmappings , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Inline Intr insics Support ( context , Ġtype Mapper ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Checker Context ( context . ir Built Ins ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . language Version Settings ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠIr Inline Code gen ( this , Ġstate , Ġcal lee , Ġmethod Owner , Ġsignature , Ġmappings , Ġsource Compiler , Ġre ified Type In liner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Re ified Operation Marker ( type Parameter : ĠType Parameter Marker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( type Parameter Ġis ĠIr Type Parameter Symbol ) ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġhack Ġto Ġwork Ġaround Ġthe Ġproblem Ġin ĠLocal Declarations Lower ing . ĠSpecific ally , Ġsuppose Ġan Ġinline ĊĠĠĠĠĠĠĠ Ġ// Ġlambda Ġuses Ġa Ġre ified Ġtype Ġparameter Ġdeclared Ġby Ġa Ġfunction : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġf () Ġ= Ġrun Ġ{ ĠT :: class . java . getName () Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠLocal Declarations Lower ing Ġwould Ġextract Ġthat Ġlambda Ġinto Ġa Ġmethod Ġof Ġthe Ġen closing Ġtype , Ġbut Ġwill Ġnot Ġcreate ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġre ified Ġtype Ġparameter Ġin Ġit Ġ( in Ġfact , Ġthe Ġlambda Ġmethod Ġisn 't Ġeven Ġmarked Ġas Ġinline ): ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġ/* Ġstatic Ġ*/ Ġprivate Ġfun Ġ` f $ lambda - 0 `() Ġ= ĠT :: class . java . getName () ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġf () Ġ= Ġrun (:: ` f $ lambda - 0 `) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġparent Ġof Ġthe Ġtype Ġparameter Ġthen Ġis Ġnot Ġ` ir Function ` Ġ( i . e . Ġthe Ġlambda Ġitself ), Ġbut Ġthe Ġfunction ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġis Ġin lined Ġinto . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġmake ĠLocal Declarations Lower ing Ġhandle Ġcaptured Ġtype Ġparameters Ġand Ġonly Ġcompare Ġwith Ġ` ir Function `. ĊĠĠĠĠĠĠĠ Ġif Ġ( generate Sequence ( this ) Ġ{ Ġit . in lined Into Ġ}. none Ġ{ Ġit . ir Function Ġ== Ġtype Parameter . owner . parent Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Code gen . re ified Type Parameters Usage s . add Used Re ified Parameter ( type Parameter . owner . name . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpropagate Child Re ified Type Parameters Usage s ( re ified Type Parameters Usage s : ĠRe ified Type Parameters Usage s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Code gen . re ified Type Parameters Usage s . propagate Child Usage sWith in Context ( re ified Type Parameters Usage s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . type Parameters . filter Ġ{ Ġit . is Re ified Ġ}. map Ġ{ Ġit . name . asString () Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpush Closure On Stack ( ĊĠĠĠĠĠĠĠ Ġclass Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠ Ġput This : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġcall Generator : ĠCall Generator , ĊĠĠĠĠĠĠĠ Ġfunction Reference Receiver : ĠStack Value ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark LineNumber After Inline IfNeeded ( register LineNumber After wards : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInline Ġfunction Ġhas Ġits Ġown Ġline Ġnumber Ġwhich Ġis Ġin Ġa Ġseparate Ġinstance Ġof Ġcodegen , ĊĠĠĠĠĠĠĠ Ġ// Ġtherefore Ġwe Ġneed Ġto Ġreset Ġlast LineNumber Ġto Ġforce Ġa Ġline Ġnumber Ġgeneration Ġafter Ġvisit ing Ġinline Ġfunction . ĊĠĠĠĠĠĠĠ Ġlast LineNumber Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Finally Marker Required (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġir Function . is Inline Ġ|| Ġin lined Into Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠIr Type . is Re ified Type Parameter : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . classifier OrNull ?. safe As < Ir Type Parameter Symbol >() ?. owner ?. is Re ified Ġ== Ġtrue ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġgenerate Class Instance ( v : ĠInstruction Adapter , Ġclass Type : ĠIr Type , Ġtype Mapper : ĠIr Type Mapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasm Type Ġ= Ġtype Mapper . map Type ( class Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Type . getClass ()?. is Inline Ġ== Ġtrue Ġ|| Ġ! is Primitive ( asm Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . acon st ( type Mapper . box Type ( class Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . get static ( box Type ( asm Type ). internal Name , Ġ" TYPE ", Ġ" Ljava / lang / Class ; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ