/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common .* Ċ import Ġorg . jetbrains . kotlin . backend . common . descriptors . get Function Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . create Over ridden Descriptor Ċ import Ġorg . jetbrains . kotlin . backend . common . lower .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . Context Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . synt hesized Name Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . Ir Suspend able Expression Impl Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . Ir Sus pension Point Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . Ir Sus pension Point Impl Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir as descriptors . type With Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotations Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Class Constructor Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Class Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Simple Function Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl .* Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Ir Temporary Variable Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Constructor Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Simple Function Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Variable Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s .* Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . storage . Lock Based Storage Manager Ċ Ċ internal Ġclass ĠS uspend Functions Lower ing ( val Ġcontext : ĠContext ): ĠFile Lower ing Pass Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠSTATE MENT _ ORIGIN _ COR OUT INE _ IMPL Ġ: ĠIr Statement Origin Impl (" COR OUT INE _ IMPL ") ĊĠĠĠ Ġprivate Ġobject ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL Ġ: ĠIr Declaration Origin Impl (" COR OUT INE _ IMPL ") ĊĊĠĠĠ Ġprivate Ġval Ġbuilt Cor outines Ġ= Ġmutable Map Of < Function Descriptor , ĠBuilt Coroutine >() ĊĠĠĠ Ġprivate Ġval Ġsuspend L amb das Ġ= Ġmutable Map Of < Function Descriptor , ĠIr Function Reference >() ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmark Suspend L amb das ( ir File ) ĊĠĠĠĠĠĠĠ Ġbuild Cor outines ( ir File ) ĊĠĠĠĠĠĠĠ Ġtransform Callable References ToS uspend L amb das ( ir File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Cor outines ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir File . declarations . transform Flat (:: try Transform Suspend Function ) ĊĠĠĠĠĠĠĠ Ġir File . accept Void ( object : ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class ( declaration : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . declarations . transform Flat (:: try Transform Suspend Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Transform Suspend Function ( element : ĠIr Element ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠIr Function Ġ&& Ġelement . descriptor . is Suspend Ġ&& Ġelement . descriptor . modal ity Ġ!= ĠMod ality . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Suspend Function ( element , Ġsuspend L amb das [ element . descriptor ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġmark Suspend L amb das ( ir Element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir Element . accept Children Void ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function Reference ( expression : ĠIr Function Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġexpression . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend L amb das . put ( descriptor , Ġexpression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtransform Callable References ToS uspend L amb das ( ir Element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir Element . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function Reference ( expression : ĠIr Function Reference ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġexpression . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Ġ= Ġbuilt Cor outines [ descriptor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠError (" The Ġcoroutine Ġfor Ġ$ descriptor Ġhas Ġnot Ġbeen Ġbuilt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Parameters Ġ= Ġcoroutine . coroutine Constructor . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Arguments Ġ= Ġexpression . get Arguments (). map Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( constructor Parameters . size Ġ== Ġexpression Arguments . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" In consistency Ġbetween Ġcallable Ġreference Ġto Ġsuspend Ġlambda Ġand Ġthe Ġcorresponding Ġcoroutine " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( expression . symbol , Ġexpression . start Offset , Ġexpression . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Builder . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Call ( coroutine . coroutine Constructor . symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Arguments . forEach Indexed Ġ{ Ġindex , Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġargument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠS uspend Function Kind Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠNO _ SUS PEND _ CALL S Ġ: ĠS uspend Function Kind () ĊĠĠĠĠĠĠĠ Ġclass ĠDE LEG ATING ( val Ġdeleg ating Call : ĠIr Call ) Ġ: ĠS uspend Function Kind () ĊĠĠĠĠĠĠĠ Ġobject ĠNE ED S _ STATE _ MACHINE Ġ: ĠS uspend Function Kind () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtransform Suspend Function ( ir Function : ĠIr Function , Ġfunction Reference : ĠIr Function Reference ?): ĠList < Ir Declaration >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuspend Function Kind Ġ= Ġget Suspend Function Kind ( ir Function ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( suspend Function Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS uspend Function Kind . NO _ SUS PEND _ CALL S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġsuspend Ġfunction Ġcalls Ġ- Ġjust Ġan Ġordinary Ġfunction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS uspend Function Kind . DE LEG ATING Ġ-> Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalls Ġanother Ġsuspend Ġfunction Ġat Ġthe Ġend . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Return If Sus pended Call And Simpl ify Delegating Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function , Ġsuspend Function Kind . deleg ating Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġin Ġstate Ġmachine . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS uspend Function Kind . NEED S _ STATE _ MACHINE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Ġ= Ġbuild Coroutine ( ir Function , Ġfunction Reference ) ĠĠ Ġ// ĠCor outine Ġimplementation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suspend L amb das . contains ( ir Function . descriptor )) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS uspend Ġlamb das Ġare Ġcalled Ġthrough Ġfactory Ġmethod Ġ< create >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( coroutine ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthus Ġwe Ġcan Ġeliminate Ġoriginal Ġbody . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf < Ir Declaration >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Suspend Function Kind ( ir Function : ĠIr Function ): ĠS uspend Function Kind Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( suspend L amb das . contains ( ir Function . descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS uspend Function Kind . NEED S _ STATE _ MACHINE ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS uspend Ġlamb das Ġalways Ġneed Ġcoroutine Ġimplementation . ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġir Function . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠS uspend Function Kind . NO _ SUS PEND _ CALL S ĊĊĠĠĠĠĠĠĠ Ġvar ĠnumberOf Suspend Calls Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġbody . accept Void ( object : ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . descriptor . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ numberOf Suspend Calls ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġimportant Ġto Ġoptimize Ġthe Ġcase Ġwhere Ġthere Ġis Ġonly Ġone Ġsuspend Ġcall Ġand Ġit Ġis Ġthe Ġlast Ġstatement ĊĠĠĠĠĠĠĠ Ġ// Ġbecause Ġwe Ġdon 't Ġneed Ġto Ġbuild Ġa Ġfat Ġcoroutine Ġclass Ġin Ġthat Ġcase . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġhappens Ġa Ġlot Ġin Ġpract ise Ġbecause Ġof Ġsuspend Ġfunctions Ġwith Ġdefault Ġarguments . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġuse ĠTail Recursion Calls Collector . ĊĠĠĠĠĠĠĠ Ġval Ġlast Statement Ġ= Ġ( body Ġas ĠIr Block Body ). statements . last OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġlast Call Ġ= Ġwhen Ġ( last Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Call Ġ-> Ġlast Statement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Return Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠIr Element Ġ= Ġlast Statement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġif Ġmatches Ġthis Ġpattern : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġblock / return Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġblock / return Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ.. Ġsuspend Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ while Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġis ĠIr Block Ġ&& Ġvalue . statements . size Ġ== Ġ 1 Ġ-> Ġvalue Ġ= Ġvalue . statements . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġis ĠIr Return Ġ-> Ġvalue Ġ= Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġas ? ĠIr Call ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuspend Call At End Ġ= Ġlast Call Ġ!= Ġnull Ġ&& Ġlast Call . descriptor . is Suspend ĠĠĠĠ Ġ// ĠS uspend Ġcall . ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Suspend Calls Ġ== Ġ 0 ĠĠ Ġ-> ĠS uspend Function Kind . NO _ SUS PEND _ CALL S ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Suspend Calls Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġsuspend Call At End Ġ-> ĠS uspend Function Kind . DE LEG ATING ( last Call !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠS uspend Function Kind . NEED S _ STATE _ MACHINE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsymbols Ġ= Ġcontext . ir . symbols ĊĠĠĠ Ġprivate Ġval Ġget Continuation Ġ= Ġsymbols . get Continuation . owner ĊĠĠĠ Ġprivate Ġval Ġcontinuation Class Symbol Ġ= Ġget Continuation . returnType . classifier OrFail Ġas ĠIr Class Symbol ĊĠĠĠ Ġprivate Ġval Ġreturn If Sus pended Descriptor Ġ= Ġcontext . get Internal Functions (" return If Sus pended "). single () ĊĊĠĠĠ Ġprivate Ġfun Ġremove Return If Sus pended Call And Simpl ify Delegating Call ( ir Function : ĠIr Function , Ġdeleg ating Call : ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deleg ating Call . descriptor . original Ġ== Ġreturn If Sus pended Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ating Call . getValue Argument ( 0 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġdeleg ating Call ĊĠĠĠĠĠĠĠ Ġcontext . create Ir Builder ( ir Function . symbol ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġ( ir Function . body Ġas ĠIr Block Body ). statements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Statement Ġ= Ġstatements . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ( last Statement Ġ== Ġdeleg ating Call Ġ|| Ġlast Statement Ġis ĠIr Return ) Ġ{ Ġ" Unexpected Ġstatement Ġ$ last Statement " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements [ statements . size Ġ- Ġ 1 ] Ġ= Ġir Return ( returnValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Coroutine ( ir Function : ĠIr Function , Ġfunction Reference : ĠIr Function Reference ?): ĠIr Class Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġir Function . descriptor ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Ġ= ĠCor outine Builder ( ir Function , Ġfunction Reference ). build () ĊĠĠĠĠĠĠĠ Ġbuilt Cor outines . put ( descriptor , Ġcoroutine ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( function Reference Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġnot Ġa Ġlambda Ġ- Ġreplace Ġoriginal Ġfunction Ġwith Ġa Ġcall Ġto Ġconstructor Ġof Ġthe Ġbuilt Ġcoroutine . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( ir Function . symbol , Ġir Function . start Offset , Ġir Function . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . body Ġ= Ġir Builder . ir Block Body ( ir Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( coroutine . do Resume Function . symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Call ( coroutine . coroutine Constructor . symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Parameters Ġ= Ġir Function . explicit Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameters . forEach Indexed Ġ{ Ġindex , Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġir Get ( argument )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( function Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( get Continuation , ĠlistOf ( ir Function . returnType ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir GetObject ( symbols . unit )) Ġ// Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġir Null ()) Ġ// Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcoroutine . coroutine Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠBuilt Coroutine ( val Ġcoroutine Class : ĠIr Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Constructor : ĠIr Constructor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Resume Function : ĠIr Function ) ĊĊĠĠĠ Ġprivate Ġvar Ġcoroutine Id Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠCOR OUT IN ES _ FQ _ NAME ĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠF q Name . from Segments ( listOf (" kotlin ", Ġ" coroutines ", Ġ" experimental ")) ĊĠĠĠ Ġprivate Ġval ĠK OT LIN _ FQ _ NAME ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠF q Name (" kotlin ") ĊĊĠĠĠ Ġprivate Ġval Ġcor outines Scope ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcontext . ir Module !!. descriptor . get Package ( COR OUT IN ES _ FQ _ NAME ). member Scope ĊĠĠĠ Ġprivate Ġval Ġkotlin Package Scope ĠĠĠĠĠĠĠ Ġ= Ġcontext . ir Module !!. descriptor . get Package ( K OT LIN _ FQ _ NAME ). member Scope ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠCor outine Builder ( val Ġir Function : ĠIr Function , Ġval Ġfunction Reference : ĠIr Function Reference ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfunction Parameters Ġ= Ġir Function . explicit Parameters ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbound Function Parameters Ġ= Ġfunction Reference ?. get Arguments With Ir ()?. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġun bound Function Parameters Ġ= Ġbound Function Parameters ?. let Ġ{ Ġfunction Parameters Ġ- Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtemp Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsus pension Point Id Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġsuspend Result : ĠIr Variable ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġdata Argument : ĠIr Value Parameter ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġexception Argument : ĠIr Value Parameter ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġcoroutine Class Descriptor : ĠClass Descriptor Impl ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġcoroutine Class : ĠIr Class Impl ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġcoroutine Class This : ĠIr Value Parameter ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġargument To Properties Map : ĠMap < Parameter Descriptor , ĠIr Field > ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Impl Symbol Ġ= Ġsymbols . coroutine Impl ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Impl Constructor Symbol Ġ= Ġcoroutine Impl Symbol . construct ors . single () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Impl Class Descriptor Ġ= Ġcoroutine Impl Symbol . descriptor ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcreate 1 Function Ġ= Ġcoroutine Impl Symbol . owner . simple Functions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . name . asString () Ġ== Ġ" create " Ġ&& Ġit . value Parameters . size Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcreate 1 Completion Parameter Ġ= Ġcreate 1 Function . value Parameters [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Impl Label Getter Symbol Ġ= Ġcoroutine Impl Symbol . getProperty Getter (" label ") !! ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Impl Label Setter Symbol Ġ= Ġcoroutine Impl Symbol . getProperty Setter (" label ") !! ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠBuilt Coroutine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Types Ġ= Ġmutable ListOf < Ir Type >( coroutine Impl Symbol . owner . default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuspend Function Class : ĠIr Class ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfunction Class : ĠIr Class ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuspend Function ClassType Arguments : ĠList < Ir Type >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfunction ClassType Arguments : ĠList < Ir Type >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un bound Function Parameters Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS uspend Ġlambda Ġinherits ĠS uspend Function . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Parameters Ġ= Ġun bound Function Parameters . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Function Class Ġ= Ġcontext . ir . symbols . suspend Functions [ numberOf Parameters ]. owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun bound Parameter Types Ġ= Ġun bound Function Parameters . map Ġ{ Ġit . type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Function ClassType Arguments Ġ= Ġun bound Parameter Types Ġ+ Ġir Function . returnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Types Ġ+= Ġsuspend Function Class . type With ( suspend Function ClassType Arguments ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Class Ġ= Ġcontext . ir . symbols . functions [ numberOf Parameters Ġ+ Ġ 1 ]. owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontinuation Type Ġ= Ġcontinuation Class Symbol . type With ( ir Function . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ClassType Arguments Ġ= Ġun bound Parameter Types Ġ+ Ġcontinuation Type Ġ+ Ġcontext . ir Built Ins . any N Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Types Ġ+= Ġfunction Class . type With ( function ClassType Arguments ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class Descriptor Ġ= ĠClass Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcontaining Declaration Ġ= Ġ*/ Ġir Function . descriptor . containing Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġname ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġ"${ ir Function . descriptor . name }\ $ ${ coroutine Id ++ }". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġmod ality ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠMod ality . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġkind ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠClass Kind . CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsuper Types ĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġsuper Types . map Ġ{ Ġit . to Kotlin Type () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠSource Element . NO _ SOURCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġis External ĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġstorage Manager ĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠLock Based Storage Manager . NO _ LOCK S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initialize ( stub (" coroutine Ġclass "), Ġstub (" coroutine Ġclass Ġconstructors "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class Ġ= ĠIr Class Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġir Function . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġir Function . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Ġ Ġ= Ġcoroutine Class Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . parent Ġ= Ġir Function . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . create Parameter Declarations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class This Ġ= Ġcoroutine Class . this Receiver !! ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverridden Map Ġ= Ġmutable Map Of < Callable Member Descriptor , ĠCallable Member Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Constructor Builder Ġ= Ġcreate Constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Constructor Builder . initialize () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Resume Function Ġ= Ġcoroutine Impl Symbol . owner . simple Functions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . name . asString () Ġ== Ġ" do Resume " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Resume Method Builder Ġ= Ġcreate Do Resume Method Builder ( do Resume Function , Ġcoroutine Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Method Builder . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Map Ġ+= Ġdo Resume Function . descriptor Ġto Ġdo Resume Method Builder . symbol . descriptor ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcoroutine Factory Constructor Builder : ĠSymbol With Ir Builder < Ir Constructor Symbol , ĠIr Constructor >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcreate Method Builder : ĠSymbol With Ir Builder < Ir Simple Function Symbol , ĠIr Simple Function >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinvoke Method Builder : ĠSymbol With Ir Builder < Ir Simple Function Symbol , ĠIr Simple Function >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS uspend Ġlambda Ġ- Ġcreate Ġfactory Ġmethods . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Factory Constructor Builder Ġ= Ġcreate Factory Constructor Builder ( bound Function Parameters !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Function Descriptor Ġ= Ġcoroutine Impl Class Descriptor . un subst it uted Member Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Cont ributed Functions ( Name . identifier (" create "), ĠNo Lookup Location . FROM _ BACKEND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. at Most One Ġ{ Ġit . value Parameters . size Ġ== Ġun bound Function Parameters !!. size Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Method Builder Ġ= Ġcreate Create Method Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Args ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġun bound Function Parameters !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Function Descriptor ĠĠĠĠĠĠĠ Ġ= Ġcreate Function Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Constructor ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcoroutine Constructor Builder . ir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcoroutine Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Method Builder . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( create Function Descriptor Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Map Ġ+= Ġcreate Function Descriptor Ġto Ġcreate Method Builder . symbol . descriptor ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvoke Function Descriptor Ġ= Ġfunction Class !!. descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Function (" invoke ", Ġfunction ClassType Arguments !!. map Ġ{ Ġit . to Kotlin Type () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuspend Invoke Function Descriptor Ġ= Ġsuspend Function Class !!. descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Function (" invoke ", Ġsuspend Function ClassType Arguments !!. map Ġ{ Ġit . to Kotlin Type () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Method Builder Ġ= Ġcreate Invoke Method Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Function Invoke Function Descriptor Ġ= Ġsuspend Invoke Function Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Invoke Function Descriptor ĠĠĠĠĠĠĠ Ġ= Ġinvoke Function Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Function ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcreate Method Builder . ir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Function ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġdo Resume Method Builder . ir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcoroutine Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( coroutine Constructor Builder . ir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Factory Constructor Builder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( it . ir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Method Builder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( it . ir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Method Builder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( it . ir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( do Resume Method Builder . ir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . set Super Symbols And Add Fake Overrides ( super Types ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilt Coroutine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class ĠĠĠĠĠĠ Ġ= Ġcoroutine Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Constructor Ġ= Ġcoroutine Factory Constructor Builder ?. ir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcoroutine Constructor Builder . ir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Function ĠĠĠĠ Ġ= Ġdo Resume Method Builder . ir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject Ġ: ĠSymbol With Ir Builder < Ir Constructor Symbol , ĠIr Constructor >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Symbol () Ġ= ĠIr Constructor Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Constructor Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcontaining Declaration Ġ= Ġ*/ Ġcoroutine Class Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġannotations ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġis Primary ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠSource Element . NO _ SOURCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġconstructor Parameters : ĠList < Ir Value Parameter > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Initialize () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠClass Constructor Descriptor Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Parameters Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġcoroutine Impl Constructor Symbol . owner . value Parameters [ 0 ] Ġ// Ġcompletion . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Descriptor Ġ= Ġparameter . descriptor . copy As Value Parameter ( descriptor , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . copy ( parameter Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Parameters . map Ġ{ Ġit . descriptor Ġas ĠValue Parameter Descriptor Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . returnType Ġ= Ġcoroutine Class Descriptor . default Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Ir (): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġall Ġarguments Ġto Ġfields . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument To Properties Map Ġ= Ġfunction Parameters . associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . descriptor Ġto Ġadd Field ( it . name , Ġit . type , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Function . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Function . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ Ġ= Ġcoroutine Class . default Type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Parameters Ġ+= Ġconstructor Parameters ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( symbol , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Builder . ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion Parameter Ġ= Ġvalue Parameters . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Delegating Constructor Call Impl ( start Offset , Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Impl Constructor Symbol , Ġcoroutine Impl Constructor Symbol . descriptor ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( completion Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Instance Initializer Call Impl ( start Offset , Ġend Offset , Ġcoroutine Class . symbol , Ġcontext . ir Built Ins . unit Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameters . forEach Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( coroutine Class This ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument To Properties Map [ parameter . descriptor ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( value Parameters [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Factory Constructor Builder ( bound Params : ĠList < Ir Value Parameter >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject Ġ: ĠSymbol With Ir Builder < Ir Constructor Symbol , ĠIr Constructor >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Symbol () Ġ= ĠIr Constructor Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Constructor Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcontaining Declaration Ġ= Ġ*/ Ġcoroutine Class Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġannotations ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġis Primary ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠSource Element . NO _ SOURCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġconstructor Parameters : ĠList < Ir Value Parameter > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Initialize () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠClass Constructor Descriptor Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Parameters Ġ= Ġbound Params . map Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Descriptor Ġ= Ġparameter . descriptor . copy As Value Parameter ( descriptor , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . copy ( parameter Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Parameters . map Ġ{ Ġit . descriptor Ġas ĠValue Parameter Descriptor Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . returnType Ġ= Ġcoroutine Class Descriptor . default Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Ir (): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Function . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Function . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġcoroutine Class . default Type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Parameters Ġ+= Ġconstructor Parameters ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( symbol , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Builder . ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Delegating Constructor Call Impl ( start Offset , Ġend Offset , Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Impl Constructor Symbol , Ġcoroutine Impl Constructor Symbol . descriptor ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Null ()) Ġ// ĠCompletion . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Instance Initializer Call Impl ( start Offset , Ġend Offset , Ġcoroutine Class . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġall Ġarguments Ġto Ġfields . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound Params . forEach Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Field ( ir Get ( coroutine Class This ), Ġargument To Properties Map [ parameter . descriptor ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( value Parameters [ index ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Create Method Builder ( un bound Args : ĠList < Ir Value Parameter >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Function Descriptor : ĠFunction Descriptor ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Constructor : ĠIr Constructor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class : ĠIr Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject : ĠSymbol With Ir Builder < Ir Simple Function Symbol , ĠIr Simple Function >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Symbol () Ġ= ĠIr Simple Function Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Function Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcontaining Declaration Ġ= Ġ*/ Ġcoroutine Class Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġannotations ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġname ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠName . identifier (" create "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġkind ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠCallable Member Descriptor . Kind . DECL AR ATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠSource Element . NO _ SOURCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġparameters : ĠList < Ir Value Parameter > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Initialize () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠSimple Function Descriptor Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Args Ġ+ Ġcreate 1 Completion Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . copy ( parameter . descriptor . copy As Value Parameter ( descriptor , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġreceiver ParameterType ĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġdispatch Receiver Parameter ĠĠĠ Ġ= Ġ*/ Ġcoroutine Class Descriptor . this As Receiver Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġtype Parameters ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġun subst it uted Value Parameters Ġ= Ġ*/ Ġparameters . map Ġ{ Ġit . descriptor Ġas ĠValue Parameter Descriptor Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġun subst it uted ReturnType ĠĠĠĠĠ Ġ= Ġ*/ Ġcoroutine Class Descriptor . default Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġmod ality ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠMod ality . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġvisibility ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠVis ibilities . PRIVATE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Function Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Descriptors ĠĠĠĠĠĠĠĠĠĠ Ġ+= ĠĠ Ġsuper Function Descriptor . over ridden Descriptors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Descriptors ĠĠĠĠĠĠĠĠĠĠ Ġ+= ĠĠ Ġsuper Function Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Ir (): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Function . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Function . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ Ġ= Ġcoroutine Class . default Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġcoroutine Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Parameters Ġ+= Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Dispatch Receiver Parameter () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Receiver Ġ= Ġthis . dispatch Receiver Parameter !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( symbol , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Builder . ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( coroutine Constructor ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġun bound Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun bound Args Set Ġ= Ġun bound Args . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameters . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un bound Args Set . contains ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( value Parameters [ un bound Index ++ ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir GetField ( ir Get ( this Receiver ), Ġargument To Properties Map [ it . descriptor ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Indexed Ġ{ Ġindex , Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġargument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( function Parameters . size , Ġir Get ( value Parameters [ un bound Index ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( un bound Index Ġ== Ġvalue Parameters . size Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Not Ġall Ġarguments Ġof Ġ< create > Ġare Ġused " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Invoke Method Builder ( suspend Function Invoke Function Descriptor : ĠFunction Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Invoke Function Descriptor : ĠFunction Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Function : ĠIr Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Function : ĠIr Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class : ĠIr Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject : ĠSymbol With Ir Builder < Ir Simple Function Symbol , ĠIr Simple Function >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Symbol () Ġ= ĠIr Simple Function Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Function Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcontaining Declaration Ġ= Ġ*/ Ġcoroutine Class Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġannotations ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġname ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠName . identifier (" invoke "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġkind ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠCallable Member Descriptor . Kind . DECL AR ATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠSource Element . NO _ SOURCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġparameters : ĠList < Ir Value Parameter > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Initialize () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠSimple Function Descriptor Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġcreate Function . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġcompletion Ġ- Ġinvoke () Ġalready Ġhas Ġit Ġimplicitly Ġas Ġa Ġsuspend Ġfunction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( create Function . value Parameters . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . copy ( it . descriptor . copy As Value Parameter ( descriptor , Ġit . index )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġreceiver ParameterType ĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġdispatch Receiver Parameter ĠĠĠ Ġ= Ġ*/ Ġcoroutine Class Descriptor . this As Receiver Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġtype Parameters ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġun subst it uted Value Parameters Ġ= Ġ*/ Ġparameters . map Ġ{ Ġit . descriptor Ġas ĠValue Parameter Descriptor Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġun subst it uted ReturnType ĠĠĠĠĠ Ġ= Ġ*/ Ġir Function . descriptor . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġmod ality ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠMod ality . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġvisibility ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ*/ ĠVis ibilities . PRIVATE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Descriptors ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+= ĠĠ Ġsuspend Function Invoke Function Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Descriptors ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+= ĠĠ Ġfunction Invoke Function Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Suspend ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Ir (): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Function . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Function . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ Ġ= Ġir Function . returnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġcoroutine Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ+= Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Dispatch Receiver Parameter () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Receiver Ġ= Ġthis . dispatch Receiver Parameter !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( symbol , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Builder . ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( do Resume Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Call ( create Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( this Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . forEach Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġir Get ( parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( value Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( get Continuation , ĠlistOf ( returnType ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir GetObject ( symbols . unit )) ĠĠĠĠĠĠ Ġ// Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġir Null ()) ĠĠĠĠĠĠ Ġ// Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Field ( name : ĠName , Ġtype : ĠIr Type , Ġis Mutable : ĠBoolean ): ĠIr Field Ġ= Ġcreate Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mutable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class Descriptor ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Class . addChild ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Do Resume Method Builder ( do Resume Function : ĠIr Function , Ġcoroutine Class : ĠIr Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject : ĠSymbol With Ir Builder < Ir Simple Function Symbol , ĠIr Simple Function >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Symbol () Ġ= ĠIr Simple Function Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Function . descriptor . create Over ridden Descriptor ( coroutine Class Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Initialize () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild Ir (): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Body Ġ= Ġir Function . body !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Function . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Function . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ Ġ= Ġcontext . ir Built Ins . any N Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġcoroutine Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Dispatch Receiver Parameter () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Resume Function . value Parameters . map Indexed To ( this . value Parameters ) Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( descriptor . value Parameters [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Argument Ġ= Ġfunction . value Parameters [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Argument Ġ= Ġfunction . value Parameters [ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġcoroutine Impl Symbol . owner . declarations . filter Is Instance < Ir Property >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . name . asString () Ġ== Ġ" label " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( function . symbol , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . body Ġ= Ġir Builder . ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Result Ġ= Ġir Var ( Ir Temporary Variable Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Declaration Ġ= Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ" suspend Result ". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Type ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcontext . built Ins . nullable Any Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mutable ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcontext . ir Built Ins . any N Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtract Ġall Ġsuspend Ġcalls Ġto Ġtempor aries Ġin Ġorder Ġto Ġmake Ġcorrect Ġjumps Ġto Ġthem . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Body . transform Children Void ( Expression S licer ( label . getter !!. returnType )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Local s Ġ= Ġcompute L iveness At Sus pension Points ( original Body ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimmutable Live Local s Ġ= Ġlive Local s . values . flatten (). filter Not Ġ{ Ġit . descriptor . is Var Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocals Map Ġ= Ġimmutable Live Local s . associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠRemove Ġ. descriptor Ġas Ġsoon Ġas Ġall Ġsymbols Ġare Ġbound . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= ĠIr Variable Symbol Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Temporary Variable Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Declaration Ġ= Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . descriptor . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Type Ġ= Ġit . descriptor . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mutable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= ĠIr Variable Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġit . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġit . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= Ġit . origin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠ Ġ= Ġit . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . descriptor Ġto Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locals Map . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Variables ( original Body , Ġlocals Map ) ĠĠĠ Ġ// ĠMake Ġvariables Ġmutable Ġin Ġorder Ġto Ġsave / restore Ġthem . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal To Property Map Ġ= Ġmutable Map Of < Ir Variable Symbol , ĠIr Field >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġoptimize Ġby Ġusing Ġthe Ġsame Ġproperty Ġfor Ġdifferent Ġlocals . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Local s . values . forEach Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal To Property Map . get Or Put ( it . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Field ( it . descriptor . name , Ġit . type , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Body . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġthis Receiver Ġ= Ġfunction . dispatch Receiver Parameter !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReplace Ġreturns Ġto Ġrefer Ġto Ġthe Ġnew Ġfunction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Return ( expression : ĠIr Return ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression . return Target Ġ!= Ġir Function . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Return ( expression . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReplace Ġfunction Ġarguments Ġloading Ġwith Ġproperties Ġreading . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaptured Value Ġ= Ġargument To Properties Map [ expression . descriptor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir GetField ( ir Get ( this Receiver ), Ġcaptured Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave / restore Ġstate Ġat Ġsus pension Ġpoints . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( expression : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pension Point Ġ= Ġexpression Ġas ? ĠIr Sus pension Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pension Point . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave State . symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġlive Local s [ sus pension Point ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġlocals Map [ it . descriptor ] Ġ?: Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Field ( ir Get ( this Receiver ), Ġlocal To Property Map [ it . symbol ] !! , Ġir Get ( variable )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( coroutine Impl Label Setter Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( this Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( sus pension Point . sus pension Point Id Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore State . symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġlive Local s [ sus pension Point ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Var ( locals Map [ it . descriptor ] Ġ?: Ġit , Ġir GetField ( ir Get ( this Receiver ), Ġlocal To Property Map [ it . symbol ] !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsus pension Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġ( original Body Ġas ĠIr Block Body ). statements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ suspend Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Suspend able Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset ĠĠĠĠĠĠ Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠĠĠĠĠĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pension Point Id Ġ= Ġir Call ( coroutine Impl Label Getter Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( function . dispatch Receiver Parameter !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġir Block ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir ThrowIf NotNull ( exception Argument ) ĠĠĠ Ġ// ĠCor outine Ġmight Ġstart Ġwith Ġan Ġexception . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Function . returnType . is Unit ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir GetObject ( symbols . unit )) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġexplicit Ġreturn Ġfor ĠUnit Ġfunctions . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtransform Variables ( element : ĠIr Element , Ġvariables Map : ĠMap < Variable Descriptor , ĠIr Variable >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . transform Children Void ( object : ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Variable Ġ= Ġvariables Map [ expression . symbol . descriptor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr GetValue Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠ Ġ= Ġnew Variable . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġnew Variable . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= Ġexpression . origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Set Variable ( expression : ĠIr Set Variable ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Variable Ġ= Ġvariables Map [ expression . symbol . descriptor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Set Variable Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠ Ġ= Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠ Ġ= Ġnew Variable . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĠĠĠĠĠĠ Ġ= Ġexpression . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= Ġexpression . origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Variable Ġ= Ġvariables Map [ declaration . symbol . descriptor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġdeclaration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Variable . initializer Ġ= Ġdeclaration . initializer ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompute L iveness At Sus pension Points ( body : ĠIr Body ): ĠMap < Ir Sus pension Point , ĠList < Ir Variable >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdata Ġflow Ġanalysis . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġsave Ġall Ġvisible Ġfor Ġnow . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Ir Sus pension Point , ĠList < Ir Variable >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . accept Children Void ( object : ĠVariables Scope Tracker () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( expression : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pension Point Ġ= Ġexpression Ġas ? ĠIr Sus pension Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sus pension Point Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pension Point . result . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pension Point . resume Result . accept Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible Variables Ġ= Ġmutable ListOf < Ir Variable >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . forEach Ġ{ Ġvisible Variables Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put ( sus pension Point , Ġvisible Variables ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġare Ġmarker Ġdescriptors Ġto Ġsplit Ġup Ġthe Ġlower ing Ġon Ġtwo Ġparts . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsave State Ġ= ĠIr Function Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĠIr Declaration Origin . DEFINED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Function Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" save State ". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Member Descriptor . Kind . SYN TH ES IZED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Element . NO _ SOURCE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize ( null , Ġnull , Ġempty List (), Ġempty List (), Ġcontext . built Ins . unit Type , ĠMod ality . AB STR ACT , ĠVis ibilities . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrestore State Ġ= ĠIr Function Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĠIr Declaration Origin . DEFINED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Function Descriptor Impl . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAn notations . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" restore State ". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Member Descriptor . Kind . SYN TH ES IZED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Element . NO _ SOURCE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize ( null , Ġnull , Ġempty List (), Ġempty List (), Ġcontext . built Ins . unit Type , ĠMod ality . AB STR ACT , ĠVis ibilities . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠExpression S licer ( val Ġsus pension Point IdType : ĠIr Type ): ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġoptimize Ġ- Ġit Ġhas Ġsquare Ġcomplexity . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Set Field ( expression : ĠIr Set Field ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġslice Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Member Access ( expression : ĠIr Member Access Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġslice Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġslice Expression ( expression : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( ir Function . symbol , Ġexpression . start Offset , Ġexpression . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Builder . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Set Field Ġ-> ĠlistOf ( expression . receiver , Ġexpression . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Member Access Expression Ġ-> Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( expression . dispatch Receiver , Ġexpression . extension Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġexpression . descriptor . value Parameters . map Ġ{ Ġexpression . getValue Argument ( it . index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠError (" Unexpected Ġexpression : Ġ$ expression ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Children Ġ= Ġchildren . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Suspend Call In Tail Ġ= ĠBoolean Array ( numberOf Children Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠnumberOf Children Ġ- Ġ 1 Ġdown To Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Suspend Call In Tail [ i ] Ġ= Ġhas Suspend Call In Tail [ i Ġ+ Ġ 1 ] Ġ|| Ġchildren [ i ]. let Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit . has Suspend Calls () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Children Ġ= ĠarrayOf Null s < Ir Expression ? >( numberOf Children ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Statements Ġ= Ġmutable ListOf < Ir Statement >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchild ) Ġin Ġchildren . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġ== Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformed Child Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! child . is Special Block ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġ( child Ġas ĠIr Block ). statements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Statements Ġ+= Ġstatements . take ( statements . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . last () Ġas ĠIr Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ&& Ġ! has Suspend Call In Tail [ index Ġ+ Ġ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġextract Ġsuspend Ġcall Ġto Ġa Ġtemporary Ġif Ġit Ġis Ġthe Ġfirst Ġargument Ġand Ġis Ġthe Ġonly Ġsuspend Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children [ index ] Ġ= Ġtransformed Child ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transformed Child . is Pure () Ġ|| Ġ! has Suspend Call In Tail [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children [ index ] Ġ= Ġtransformed Child ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġto Ġtemporary Ġin Ġorder Ġto Ġsave Ġexecution Ġorder . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġir Var ( transformed Child ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Statements Ġ+= Ġtmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children [ index ] Ġ= Ġir Get ( tmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcalled Save State Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuspend Call : ĠIr Expression ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . is Return If Sus pended Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalled Save State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Argument Ġ= Ġnew Children [ 2 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children [ 2 ] Ġ= Ġir Block ( first Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( save State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ first Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Call Ġ= Ġnew Children [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . is Suspend Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Child Ġ= Ġnew Children . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Child Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġstate Ġas Ġlate Ġas Ġpossible . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalled Save State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children [ numberOf Children Ġ- Ġ 1 ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Block ( last Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Child . is Pure ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( save State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ last Child ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġir Var ( last Child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ tmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( save State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( tmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Call Ġ= Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Set Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . receiver Ġ= Ġnew Children [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . value Ġ= Ġnew Children [ 1 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Member Access Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver Ġ= Ġnew Children [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver Ġ= Ġnew Children [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Children . drop ( 2 ). forEach Indexed Ġ{ Ġindex , Ġnew Child Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . put Value Argument ( index , Ġnew Child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suspend Call Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Wrap ( expression , Ġtemp Statements ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pension Point Id Parameter Ġ= ĠIr Temporary Variable Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Declaration Ġ= Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ" sus pension Point Id ${ sus pension Point Id Index ++ }". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Type ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsus pension Point IdType . to Kotlin Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pension Point Ġ= ĠIr Sus pension Point Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcontext . ir Built Ins . any N Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pension Point Id Parameter Ġ= Ġir Var ( sus pension Point Id Parameter , Ġsus pension Point IdType ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġir Block ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! called Save State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( save State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Var ( suspend Result . symbol , Ġsuspend Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return If Sus pended ( suspend Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( suspend Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume Result ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġir Block ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( restore State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir ThrowIf NotNull ( exception Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( data Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Result Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Call . type . is Unit () Ġ-> Ġir Implicit Co erc ion To Unit ( sus pension Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġir As ( sus pension Point , Ġsuspend Call . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Statements . forEach Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ expression Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir Wrap ( expression : ĠIr Expression , Ġtemp Statements : ĠList < Ir Statement >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġif Ġ( temp Statements . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġir Block ( expression , ĠSTATE MENT _ ORIGIN _ COR OUT INE _ IMPL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Statements . forEach Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠIr Expression . is Suspend Call : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis Ġis ĠIr Call Ġ&& Ġthis . descriptor . is Suspend ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Element . is Special Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis Ġis ĠIr Block Ġ&& Ġthis . origin Ġ== ĠSTATE MENT _ ORIGIN _ COR OUT INE _ IMPL ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Element . has Suspend Calls (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas Suspend Calls Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Void ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Suspend Calls Ġ= Ġhas Suspend Calls Ġ|| Ġexpression . is Suspend Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( expression : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Suspend Calls Ġ= Ġhas Suspend Calls Ġ|| Ġexpression Ġis ĠIr Sus pension Point Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhas Suspend Calls ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Expression . is Pure (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Const < *> Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Call Ġ-> Ġfalse Ġ// ĠTODO : Ġskip Ġbuiltin Ġoperators . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Operator Call Ġ-> Ġthis . argument . is Pure () Ġ&& Ġthis . operator Ġ!= ĠIr Type Operator . CAST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetValue Ġ-> Ġ! this . descriptor . let Ġ{ Ġit Ġis ĠVariable Descriptor Ġ&& Ġit . is Var Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠIr Expression . is Return If Sus pended Call : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis Ġis ĠIr Call Ġ&& Ġthis . descriptor . original Ġ== Ġreturn If Sus pended Descriptor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir Var ( initializer : ĠIr Expression ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Var ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Temporary Variable Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Declaration Ġ= Ġir Function . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" tmp ${ temp Index ++ }". synt hesized Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Type Ġ= Ġinitializer . type . to Kotlin Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġthis . initializer Ġ= Ġinitializer Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir Var ( descriptor : ĠVariable Descriptor , Ġtype : ĠIr Type ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Variable Impl ( start Offset , Ġend Offset , ĠDECL AR ATION _ ORIGIN _ COR OUT INE _ IMPL , Ġdescriptor , Ġtype ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir Return If Sus pended ( value : ĠIr Value Declaration ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir If Then ( ir Eq eq eq ( ir Get ( value ), Ġir Call ( symbols . coroutine Sus pended Getter )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Return ( ir Get ( value ))) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir ThrowIf NotNull ( exception : ĠIr Value Declaration ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir If Then ( ir Not ( ir Eq eq eq ( ir Get ( exception ), Ġir Null ())), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Throw ( ir Implicit Cast ( ir Get ( exception ), Ġexception . type . make NotNull ()))) ĊĊĠĠĠĠĠĠĠ Ġfun ĠIr Builder With Scope . ir Debug Output ( value : ĠIr Expression ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( symbols . println ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Call ( symbols . any N ToString ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠVariables Scope Tracker : ĠIr Element Visitor Void Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġscope Stack Ġ= Ġmutable ListOf < Mutable Set < Ir Variable >>( mutable Set Of ()) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Container Expression ( expression : ĠIr Container Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expression . is Transparent Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . push ( mutable Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Container Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expression . is Transparent Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Catch ( aC atch : ĠIr Catch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . push ( mutable Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Catch ( aC atch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Variable ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Stack . peek () !!. add ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }