/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 . codegen Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Resolved Call Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ Ċ enum Ġclass ĠValue Kind Ġ{ ĊĠĠĠ ĠGENER AL , ĊĠĠĠ ĠGENER AL _ VAR ARG , ĊĠĠĠ ĠDEFAULT _ PARAMETER , ĊĠĠĠ ĠDEFAULT _ MASK , ĊĠĠĠ ĠMETHOD _ HANDLE _ IN _ DEFAULT , ĊĠĠĠ ĠCAP TURE D , ĊĠĠĠ ĠDEFAULT _ L AMBDA _ CAPTURE D _ PARAMETER Ċ } Ċ Ċ interface ĠCall Generator Ġ{ ĊĊĠĠĠ Ġclass ĠDefault Call Generator ( private Ġval Ġcodegen : ĠExpression Code gen ) Ġ: ĠCall Generator Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Call Inner ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Method : ĠCallable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Call : ĠResolved Call < *> ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Default : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen : ĠExpression Code gen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! call Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Method . gen Invoke Instruction ( codegen . v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( callable Method Ġas ĠCallable Method ). gen Invoke Default Instruction ( codegen . v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess And Put Hidden Parameters ( just Process : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġput Hidden Params Into Local s () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Value And Put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter Descriptor : ĠValue Parameter Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Expression : ĠK t Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcodegen . gen ( argument Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . put ( parameter Type , Ġcodegen . v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġput Capt ured Value On Stack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Value : ĠStack Value , Ġvalue Type : ĠType , Ġparam Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Value . put ( stack Value . type , Ġcodegen . v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġput Value IfNeeded ( parameter Type : ĠType , Ġvalue : ĠStack Value , Ġkind : ĠValue Kind , Ġparameter Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . put ( value . type , Ġcodegen . v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreorder Arguments IfNeeded ( actual Args With Decl Index : ĠList < Argument And Decl Index >, Ġvalue Parameter Types : ĠList < Type >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmark Ġ= Ġcodegen . my Frame Map . mark () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreordered Ġ= Ġactual Args With Decl Index . with Index (). drop While Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . decl Index Ġ== Ġit . index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreordered . reversed (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument And Decl Index Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġvalue Parameter Types . get ( argument And Decl Index . decl Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Value Ġ= ĠStack Value . local ( codegen . frame Map . enter Temp ( type ), Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Value . store ( Stack Value . on Stack ( type ), Ġcodegen . v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( argument And Decl Index . decl Index , Ġstack Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . put ( value Parameter Types . get ( it . first ), Ġcodegen . v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . drop To () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgen Call ( callable Method : ĠCallable , Ġresolved Call : ĠResolved Call < *> ?, Ġcall Default : ĠBoolean , Ġcodegen : ĠExpression Code gen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Expression Ġ= Ġresolved Call . call . callee Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee Expression Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . mark Start LineNumber ( callee Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgen Call Inner ( callable Method , Ġresolved Call , Ġcall Default , Ġcodegen ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgen Call Inner ( callable Method : ĠCallable , Ġresolved Call : ĠResolved Call < *> ?, Ġcall Default : ĠBoolean , Ġcodegen : ĠExpression Code gen ) ĊĊĠĠĠ Ġfun Ġgen Value And Put ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter Descriptor : ĠValue Parameter Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargument Expression : ĠK t Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Index : ĠInt ) ĊĊĠĠĠ Ġfun Ġput Value IfNeeded ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠStack Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Value IfNeeded ( parameter Type , Ġvalue , ĠValue Kind . GENERAL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Value IfNeeded ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠStack Value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkind : ĠValue Kind Ġ= ĠValue Kind . GENERAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Index : ĠInt Ġ= Ġ- 1 ) ĊĊĠĠĠ Ġfun Ġput Capt ured Value On Stack ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Value : ĠStack Value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type : ĠType , Ġparam Index : ĠInt ) ĊĊĠĠĠ Ġfun Ġprocess And Put Hidden Parameters ( just Process : ĠBoolean ) ĊĊĠĠĠ Ġ/* should Ġbe Ġcalled Ġif Ġjust Process Ġ= Ġtrue Ġin Ġprocess And Put Hidden Parameters */ ĊĠĠĠ Ġfun Ġput Hidden Params Into Local s () ĊĊĠĠĠ Ġfun Ġreorder Arguments IfNeeded ( actual Args With Decl Index : ĠList < Argument And Decl Index >, Ġvalue Parameter Types : ĠList < Type >) Ċ } Ċ