/* Ċ Ġ* Ġ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 . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . is Inline Parameter Ċ import Ġorg . jetbrains . kotlin . codegen . Ir Expression Lambda Ċ import Ġorg . jetbrains . kotlin . codegen . Jvm Kotlin Type Ċ import Ġorg . jetbrains . kotlin . codegen . Stack Value Ċ import Ġorg . jetbrains . kotlin . codegen . Value Kind Ċ import Ġorg . jetbrains . kotlin . codegen . inline .* Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Member Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . descriptors .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . class OrNull Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrFail Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Signature Ċ import Ġorg . jetbrains . kotlin . util . Operator Name Con ventions Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġorg . jetbrains . org . object web . asm . commons . Method Ċ import Ġorg . jetbrains . org . object web . asm . tree . Method Node Ċ Ċ class ĠIr Inline Code gen ( ĊĠĠĠ Ġcodegen : ĠExpression Code gen , ĊĠĠĠ Ġstate : ĠGeneration State , ĊĠĠĠ Ġprivate Ġval Ġfunction : ĠIr Function , ĊĠĠĠ Ġmethod Owner : ĠType , ĊĠĠĠ Ġsignature : ĠJ vm Method Signature , ĊĠĠĠ Ġtype Parameter Mappings : ĠType Parameter Mappings < Ir Type >, ĊĠĠĠ Ġsource Compiler : ĠSource Compiler For Inline , ĊĠĠĠ Ġre ified Type In liner : ĠRe ified Type In liner < Ir Type > Ċ ) Ġ: ĊĠĠĠ ĠInline Code gen < Expression Code gen >( ĊĠĠĠĠĠĠĠ Ġcodegen , Ġstate , Ġfunction . to Ir Based Descriptor (), Ġmethod Owner , Ġsignature , Ġtype Parameter Mappings , Ġsource Compiler , Ġre ified Type In liner ĊĠĠĠ Ġ), ĊĠĠĠ ĠIr Inline Call Generator Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Assert Field IfNeeded ( info : ĠRoot Inlining Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( info . generate Assert Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMay Ġbe Ġin lining Ġcode Ġinto Ġ`< cl init >`, Ġin Ġwhich Ġcase Ġit 's Ġtoo Ġlate Ġto Ġmodify Ġthe ĠIR Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` generate Assert Field IfNeeded ` Ġwill Ġreturn Ġa Ġstatement Ġfor Ġwhich Ġwe Ġneed Ġto Ġemit Ġbytecode . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Cl Init Ġ= Ġinfo . call Site Info . function Name Ġ== Ġ"< cl init >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . class Code gen . generate Assert Field IfNeeded ( is Cl Init )?. accept ( codegen , ĠBlock Info ()) ?. discard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġput Closure Parameters On Stack ( next : ĠLambda Info , Ġfunction Reference Receiver : ĠStack Value ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Lambda Ġ= Ġnext ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Expression Lambda Impl Ġ-> Ġnext . reference . get Arguments With Ir (). forEach Indexed Ġ{ Ġindex , Ġ(_, Ġir ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Capt ured Value On Stack ( ir , Ġnext . captured Params In Desc [ index ], Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Default Lambda Ġ-> Ġremember Capt ured For Default Lambda ( next ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġlambda : Ġ$ next ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġactive Lambda Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgen Value And Put ( ĊĠĠĠĠĠĠĠ Ġir Value Parameter : ĠIr Value Parameter , ĊĠĠĠĠĠĠĠ Ġargument Expression : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġparameter Type : ĠType , ĊĠĠĠĠĠĠĠ Ġcodegen : ĠExpression Code gen , ĊĠĠĠĠĠĠĠ Ġblock Info : ĠBlock Info ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Inline Parameter Ġ= Ġir Value Parameter . is Inline Parameter () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Inline Parameter Ġ&& Ġargument Expression . is Inline Ir Expression ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Reference Ġ= Ġ( argument Expression Ġas ĠIr Block ). statements . filter Is Instance < Ir Function Reference >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Info Ġ= ĠIr Expression Lambda Impl ( codegen , Ġir Reference , Ġir Value Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclosure Info Ġ= Ġinvocation Param Builder . add Next Value Parameter ( parameter Type , Ġtrue , Ġnull , Ġir Value Parameter . index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosure Info . functional Argument Ġ= Ġlambda Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Map [ closure Info . index ] Ġ= Ġlambda Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbound Receiver Ġ= Ġir Reference . extension Receiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bound Receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Lambda Ġ= Ġlambda Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Capt ured Value On Stack ( bound Receiver , Ġlambda Info . captured Params In Desc . single (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Lambda Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( ir Value Parameter . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . MASK _ FOR _ DEFAULT _ FUNCTION Ġ-> ĠValue Kind . DEFAULT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . METHOD _ HANDLER _ IN _ DEFAULT _ FUNCTION Ġ-> ĠValue Kind . METHOD _ HANDLE _ IN _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Expression Ġis ĠIr Container Expression Ġ&& Ġargument Expression . origin Ġ== ĠIr Statement Origin . DEFAULT _ VALUE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValue Kind . DEFAULT _ PARAMETER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠValue Kind . NON _ INLINE ABLE _ ARGUMENT _ FOR _ INLINE _ PARAMETER _ CAL LED _ IN _ SUS PEND ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline Parameter Ġ&& Ġir Value Parameter . type . is Suspend FunctionType Or Subtype () Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValue Kind . NON _ INLINE ABLE _ ARGUMENT _ FOR _ INLINE _ SUS PEND _ PARAMETER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠValue Kind . GENERAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġon Stack Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ== ĠValue Kind . METHOD _ HANDLE _ IN _ DEFAULT Ġ-> ĠStack Value . constant ( null , ĠA sm Types . OBJECT _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ== ĠValue Kind . DEFAULT _ MASK Ġ-> ĠStack Value . constant (( argument Expression Ġas ĠIr Const < *> ). value , ĠType . INT _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ== ĠValue Kind . DEFAULT _ PARAMETER Ġ-> ĠStack Value . constant ( null , ĠA sm Types . OBJECT _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Value Parameter . index Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe use Ġan Ġexisting Ġlocal Ġif Ġpossible . ĠNOTE : Ġwhen Ġstopping Ġat Ġa Ġbreakpoint Ġplaced ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġan Ġinline Ġfunction , Ġarguments Ġwhich Ġreuse Ġan Ġexisting Ġlocal Ġwill Ġnot Ġbe Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġdebugger . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġcodegen . gen Or Get Local ( argument Expression , Ġparameter Type , Ġir Value Parameter . type , Ġblock Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġreuse Ġlocals Ġfor Ġreceiv ers . ĠWhile Ġit 's Ġactually Ġcompletely Ġfine , Ġthe Ġnon - IR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbackend Ġdoes Ġnot Ġdo Ġit Ġfor Ġinternal Ġreasons , Ġand Ġhere Ġwe Ġreplicate Ġthe Ġdebugging ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexperience . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġcodegen . gen ( argument Expression , Ġparameter Type , Ġir Value Parameter . type , Ġblock Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġsupport Ġdefault Ġargument Ġer asure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! process Default Mask Or Method Handler ( on Stack , Ġkind )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= ĠJ vm Kotlin Type ( parameter Type , Ġir Value Parameter . type . to Ir Based Kotlin Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Argument Or Capt ured ToLocal Val ( expected Type , Ġon Stack , Ġ- 1 , Ġir Value Parameter . index , Ġkind ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġput Capt ured Value On Stack ( argument Expression : ĠIr Expression , Ġvalue Type : ĠType , Ġcaptured Param Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġon Stack Ġ= Ġcodegen . gen Or Get Local ( argument Expression , Ġvalue Type , Ġargument Expression . type , ĠBlock Info ()) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= ĠJ vm Kotlin Type ( valueType , Ġargument Expression . type . to Ir Based Kotlin Type ()) ĊĠĠĠĠĠĠĠ Ġput Argument Or Capt ured ToLocal Val ( expected Type , Ġon Stack , Ġcaptured Param Index , Ġcaptured Param Index , ĠValue Kind . CAPTURE D ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Value Parameters Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġinvocation Param Builder . mark Value Parameters Start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgen Inline Call ( ĊĠĠĠĠĠĠĠ Ġcallable Method : ĠIr Callable Method , ĊĠĠĠĠĠĠĠ Ġcodegen : ĠExpression Code gen , ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Function Access Expression , ĊĠĠĠĠĠĠĠ Ġis Inside If Condition : ĠBoolean , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġperform Inline ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . symbol . owner . type Parameters . map Ġ{ Ġit . symbol Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġlook Ġfor Ġdefault Ġlamb das Ġto Ġallow Ġcustom Ġdefault Ġargument Ġhandling Ġin Ġcompiler Ġplugins . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . type Mapper . type System , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister LineNumber After wards Ġ= Ġis Inside If Condition , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract Default L amb das ( node : ĠMethod Node ): ĠList < Default Lambda > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mask StartIndex Ġ== Ġ- 1 ) Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġreturn Ġexpand Mask Conditions AndUpdate Variable Nodes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode , Ġmask StartIndex , Ġmask Values , Ġmethod Handle In Default Method Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Default Lambda Offset And Descriptor ( jvm Signature , Ġfunction ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: Ir Default Lambda ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdescriptor Is Deserial ized ( member Descriptor : ĠCallable Member Descriptor ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġ(( member Descriptor Ġas ĠIr Based Declaration Descriptor < *> ). owner Ġas ĠIr Member With Container Source ). parent Class Id Ġ!= Ġnull Ċ } Ċ Ċ class ĠIr Expression Lambda Impl ( ĊĠĠĠ Ġcodegen : ĠExpression Code gen , ĊĠĠĠ Ġval Ġreference : ĠIr Function Reference , ĊĠĠĠ Ġir Value Parameter : ĠIr Value Parameter Ċ ) Ġ: ĠExpression Lambda ( ir Value Parameter . is Cross inline ), ĠIr Expression Lambda Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Extension Lambda : ĠBoolean Ġ= Ġir Value Parameter . type . is Extension FunctionType ĊĊĠĠĠ Ġval Ġfunction : ĠIr Function ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġreference . symbol . owner ĊĊĠĠĠ Ġoverride Ġval Ġis Bound Callable Reference : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġreference . extension Receiver Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġis Suspend : ĠBoolean Ġ= Ġfunction . is Suspend ĊĊĠĠĠ Ġ// ĠThis Ġname Ġdoesn 't Ġactually Ġmatter : Ġit Ġis Ġused Ġinternally Ġto Ġtell Ġthis Ġlambda 's Ġcaptured ĊĠĠĠ Ġ// Ġarguments Ġapart Ġfrom Ġany Ġother Ġscope 's . ĠSo Ġlong Ġas Ġit 's Ġunique , Ġany Ġvalue Ġis Ġfine . ĊĠĠĠ Ġ// ĠThis Ġparticular Ġstring Ġslightly Ġa ids Ġin Ġdebugging Ġinternal Ġcompiler Ġerrors Ġas Ġit Ġat Ġleast ĊĠĠĠ Ġ// Ġpoints Ġtowards Ġthe Ġfunction Ġcontaining Ġthe Ġlambda . ĊĠĠĠ Ġoverride Ġval Ġlambda ClassType : ĠType Ġ= Ġcodegen . context . getLocal ClassType ( reference ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" callable Ġreference Ġ${ reference . dump ()} Ġhas Ġno Ġname Ġin Ġcontext ") ĊĊĠĠĠ Ġprivate Ġval Ġcaptured Parameters : ĠMap < Capt ured Param Desc , ĠIr Value Parameter > Ġ= ĊĠĠĠĠĠĠĠ Ġreference . get Arguments With Ir (). associate Ġ{ Ġ( param , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Param Desc ( param . name . asString (), Ġcodegen . type Mapper . map Type ( param . type )) Ġto Ġparam ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcaptured Vars : ĠList < Capt ured Param Desc > Ġ= Ġcaptured Parameters . keys . toList () ĊĊĠĠĠ Ġprivate Ġval Ġlower ed Method Ġ= Ġcodegen . method Signature Mapper . map Asm Method ( function ) ĊĊĠĠĠ Ġval Ġcaptured Params In Desc : ĠList < Type > Ġ= Ġif Ġ( is Bound Callable Reference ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlower ed Method . argument Types . take ( 1 ) ĊĠĠĠ Ġ} Ġelse Ġlower ed Method . argument Types . drop ( if Ġ( is Extension Lambda ) Ġ 1 Ġelse Ġ 0 ). take ( captured Vars . size ) ĊĊĠĠĠ Ġoverride Ġval Ġinvoke Method : ĠMethod Ġ= Ġlower ed Method . let Ġ{ ĊĠĠĠĠĠĠĠ ĠMethod ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Bound Callable Reference ) Ġit . argument Types . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( if Ġ( is Extension Lambda ) Ġit . argument Types . take ( 1 ) Ġelse Ġempty List ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . argument Types . drop (( if Ġ( is Extension Lambda ) Ġ 1 Ġelse Ġ 0 ) Ġ+ Ġcaptured Vars . size )). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠNeed Ġthe Ġdescriptor Ġwithout Ġcaptured Ġparameters Ġhere . ĊĠĠĠ Ġoverride Ġval Ġinvoke MethodDescriptor : ĠFunction Descriptor Ġ= Ġfunction . original Function . to Ir Based Descriptor () ĊĊĠĠĠ Ġoverride Ġval Ġhas Dispatch Receiver : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġget Inline Suspend Lambda View Descriptor (): ĠFunction Descriptor Ġ= Ġfunction . to Ir Based Descriptor () ĊĊĠĠĠ Ġoverride Ġfun Ġis Capt ured Suspend ( desc : ĠCapt ured Param Desc ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcaptured Parameters [ desc ]?. let Ġ{ Ġit . is Inline Parameter () Ġ&& Ġit . type . is Suspend FunctionType Or Subtype () Ġ} Ġ== Ġtrue Ċ } Ċ Ċ class ĠIr Default Lambda ( ĊĠĠĠ Ġlambda ClassType : ĠType , ĊĠĠĠ Ġcaptured Args : ĠArray < Type >, ĊĠĠĠ Ġprivate Ġval Ġir Value Parameter : ĠIr Value Parameter , ĊĠĠĠ Ġoffset : ĠInt , ĊĠĠĠ Ġneed Re ification : ĠBoolean Ċ ) Ġ: ĠDefault Lambda ( ĊĠĠĠ Ġlambda ClassType , Ġcaptured Args , Ġir Value Parameter . to Ir Based Descriptor () Ġas ĠValue Parameter Descriptor , Ġoffset , Ġneed Re ification Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġmap Asm Signature ( source Compiler : ĠSource Compiler For Inline ): ĠMethod Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvoke Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Value Parameter . type . class OrNull !!. owner . declarations . filter Is Instance < Ir Function >(). single Ġ{ Ġit . name . asString () Ġ== Ġ" invoke " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( source Compiler Ġas ĠIr Source Compiler For Inline ). codegen . context . method Signature Mapper . map Signature Skip Generic ( invoke ). asm Method ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Invoke MethodDescriptor (): ĠFunction Descriptor Ġ= ĊĠĠĠĠĠĠĠ Ġ( ir Value Parameter . type . classifier OrFail . owner Ġas ĠIr Class ). functions . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġ== ĠOperator Name Con ventions . IN VOKE ĊĠĠĠĠĠĠĠ Ġ}. to Ir Based Descriptor () Ċ } Ċ Ċ fun ĠIr Expression . is Inline Ir Expression () Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Block Ġ-> Ġorigin . is Inline Ir Expression () ĊĠĠĠĠĠĠĠ Ġis ĠIr Callable Reference < *> Ġ-> Ġtrue . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( 0 Ġuntil Ġvalue Arguments Count ). count Ġ{ ĠgetValue Argument ( it ) Ġ!= Ġnull Ġ} Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expecting Ġ 0 Ġvalue Ġarguments Ġfor Ġbounded Ġcallable Ġreference : Ġ${ dump () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ Ċ fun ĠIr Statement Origin ?. is Inline Ir Expression () Ġ= ĊĠĠĠ Ġis Lambda Ġ|| Ġthis Ġ== ĠIr Statement Origin . ADAP TED _ FUNCTION _ REFERENCE Ġ|| Ġthis Ġ== ĠIr Statement Origin . SUS PEND _ CONVERSION Ċ Ċ fun ĠIr Function . is Inline Function Call ( context : ĠJ vm Backend Context ) Ġ= ĊĠĠĠ Ġ(! context . state . is Inline Disabled Ġ|| Ġtype Parameters . any Ġ{ Ġit . is Re ified Ġ}) Ġ&& Ġis Inline Ċ