/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . optim izations Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . at Most One Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . ir 2 string Whole Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . simple Functions Ċ import Ġorg . jetbrains . kotlin . backend . common . peek Ċ import Ġorg . jetbrains . kotlin . backend . common . pop Ċ import Ġorg . jetbrains . kotlin . backend . common . push Ċ import Ġorg . jetbrains . kotlin . backend . kon an .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . all Over ridden Functions Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . is Interface Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . target Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . llvm . function Name Ċ import Ġorg . jetbrains . kotlin . backend . kon an . llvm . local Hash Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . util . construct ors Ċ import Ġorg . jetbrains . kotlin . ir . util . get Arguments Ċ import Ġorg . jetbrains . kotlin . ir . util . parent As Class Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Visitor Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . accept Children Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . accept Void Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . util . Operator Name Con ventions Ċ Ċ private Ġfun ĠIr Class . get Over riding Of ( function : ĠIr Function ) Ġ= Ġ( function Ġas ? ĠIr Simple Function )?. let Ġ{ ĊĠĠĠ Ġit . all Over ridden Functions . at Most One Ġ{ Ġit . parent Ġ== Ġthis Ġ} Ċ } Ċ Ċ private Ġfun ĠIr Type Operator . is Cast () Ġ= ĊĠĠĠĠĠĠĠ Ġthis Ġ== ĠIr Type Operator . CAST Ġ|| Ġthis Ġ== ĠIr Type Operator . IMP LICIT _ CAST Ġ|| Ġthis Ġ== ĠIr Type Operator . SAFE _ CAST ĊĊ Ċ private Ġclass ĠVariable Values Ġ{ ĊĠĠĠ Ġval Ġelement Data Ġ= ĠHashMap < Ir Variable , ĠMutable Set < Ir Expression >>() ĊĊĠĠĠ Ġfun Ġadd Empty ( variable : ĠIr Variable ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Data . get Or Put ( variable , Ġ{ Ġmutable Set Of () Ġ}) ĊĊĠĠĠ Ġfun Ġadd ( variable : ĠIr Variable , Ġelement : ĠIr Expression ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Data [ variable ]?. add ( element ) ĊĊĠĠĠ Ġfun Ġadd ( variable : ĠIr Variable , Ġelements : ĠSet < Ir Expression >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Data [ variable ]?. addAll ( elements ) ĊĊĠĠĠ Ġfun Ġget ( variable : ĠIr Variable ): ĠSet < Ir Expression >? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Data [ variable ] ĊĊĠĠĠ Ġfun Ġcompute Closure () Ġ{ ĊĠĠĠĠĠĠĠ Ġelement Data . forEach Ġ{ Ġkey , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( key , Ġcompute Value Closure ( key )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠComputes Ġclosure Ġof Ġall Ġpossible Ġvalues Ġfor Ġgiven Ġvariable . ĊĠĠĠ Ġprivate Ġfun Ġcompute Value Closure ( value : ĠIr Variable ): ĠSet < Ir Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Ir Expression >() ĊĠĠĠĠĠĠĠ Ġval Ġseen Ġ= Ġmutable Set Of < Ir Variable >() ĊĠĠĠĠĠĠĠ Ġdfs ( value , Ġseen , Ġresult ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdfs ( value : ĠIr Variable , Ġseen : ĠMutable Set < Ir Variable >, Ġresult : ĠMutable Set < Ir Expression >) Ġ{ ĊĠĠĠĠĠĠĠ Ġseen Ġ+= Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġelement Data [ value ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠIr GetValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġelement . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Variable Ġ&& Ġ! seen . contains ( declaration )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdfs ( declaration , Ġseen , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠExpression Values Extractor ( val Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn able Block Values : ĠMap < Ir Return able Block , ĠList < Ir Expression >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuspend able Expression Values : ĠMap < Ir Suspend able Expression , ĠList < Ir Sus pension Point >>) Ġ{ ĊĊĠĠĠ Ġfun ĠforEach Value ( expression : ĠIr Expression , Ġblock : Ġ( Ir Expression ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Return able Block Ġ-> Ġreturn able Block Values [ expression ] !!. forEach Ġ{ ĠforEach Value ( it , Ġblock ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Suspend able Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( suspend able Expression Values [ expression ] !! Ġ+ Ġexpression . result ). forEach Ġ{ ĠforEach Value ( it , Ġblock ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Sus pension Point Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Value ( expression . result , Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Value ( expression . resume Result , Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Container Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . statements . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġ( expression . statements . last () Ġas ? ĠIr Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠIr GetObject Value Impl ( expression . start Offset , Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , Ġcontext . ir . symbols . unit ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ĠĠĠĠĠ Ġ= Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr When Ġ-> Ġexpression . branches . forEach Ġ{ ĠforEach Value ( it . result , Ġblock ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Member Access Expression Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetValue Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetField Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Var arg Ġ-> Ġ/* ĠSometimes , Ġwe Ġkeep Ġvar arg Ġtill Ġcodegen Ġphase Ġ( for Ġconstant Ġarrays ). Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Const < *> Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Operator Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expression . operator . is Cast ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġ// ĠPro pag ate Ġcast Ġto Ġsub - values . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Value ( expression . argument ) Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( Ir Type Operator Call Impl ( start Offset , Ġend Offset , Ġtype , Ġoperator , Ġtype Operand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Operand . classifier OrFail , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Try Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Value ( expression . try Result , Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . cat ches . forEach Ġ{ ĠforEach Value ( it . result , Ġblock ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetObject Value Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Function Reference Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Set Field Ġ-> Ġblock ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Symbol Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type . is Unit () Ġ-> Ġcontext . ir . symbols . unit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type . is Nothing () Ġ-> Ġcontext . ir . symbols . nothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( ir 2 string Whole ( expression )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( Ir GetObject Value Impl ( expression . start Offset , Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , Ġclass Symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠModule DF G ( val Ġfunctions : ĠMap < Data Flow IR . Function Symbol , ĠData Flow IR . Function >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Table : ĠData Flow IR . Symbol Table ) Ċ Ċ internal Ġclass ĠModule DF G Builder ( val Ġcontext : ĠContext , Ġval Ġir Module : ĠIr Module Fragment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠDEBUG Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠDEBUG _ OUTPUT ( severity : ĠInt , Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG Ġ> Ġseverity ) Ġblock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠTA KE _ NAMES Ġ= Ġtrue Ġ// ĠTake Ġfq Names Ġfor Ġall Ġfunctions Ġand Ġtypes Ġ( for Ġdebug Ġpurposes ). ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġtake Name ( block : Ġ() Ġ-> ĠString ) Ġ= Ġif Ġ( TA KE _ NAMES ) Ġblock () Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġmodule Ġ= ĠData Flow IR . Module ( ir Module . descriptor ) ĊĠĠĠ Ġprivate Ġval Ġsymbol Table Ġ= ĠData Flow IR . Symbol Table ( context , Ġir Module , Ġmodule ) ĊĊĠĠĠ Ġ// ĠPossible Ġvalues Ġof Ġa Ġreturn able Ġblock . ĊĠĠĠ Ġprivate Ġval Ġreturn able Block Values Ġ= Ġmutable Map Of < Ir Return able Block , ĠMutable List < Ir Expression >>() ĊĊĠĠĠ Ġ// ĠAll Ġsus pension Ġpoints Ġwithin Ġspecified Ġsuspend able Ġexpression . ĊĠĠĠ Ġprivate Ġval Ġsuspend able Expression Values Ġ= Ġmutable Map Of < Ir Suspend able Expression , ĠMutable List < Ir Sus pension Point >>() ĊĊĠĠĠ Ġprivate Ġval Ġexpression Values Extractor Ġ= ĠExpression Values Extractor ( context , Ġreturn able Block Values , Ġsuspend able Expression Values ) ĊĊĠĠĠ Ġfun Ġbuild (): ĠModule DF G Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= Ġmutable Map Of < Data Flow IR . Function Symbol , ĠData Flow IR . Function >() ĊĠĠĠĠĠĠĠ Ġir Module . accept ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constructor ( declaration : ĠIr Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdeclaration . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ( body Ġ!= Ġnull Ġ|| Ġdeclaration . construct ed Class . is Non Generated Annotation ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non - annotation Ġclass Ġconstructor Ġhas Ġempty Ġbody " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" An alys ing Ġfunction Ġ${ declaration . descriptor }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IR : Ġ${ ir 2 string Whole ( declaration )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( declaration , Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function ( declaration : ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . body ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" An alys ing Ġfunction Ġ${ declaration . descriptor }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IR : Ġ${ ir 2 string Whole ( declaration )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( declaration , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Field ( declaration : ĠIr Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . initializer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" An alys ing Ġglobal Ġfield Ġ${ declaration . descriptor }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IR : Ġ${ ir 2 string Whole ( declaration )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( declaration , ĠIr Set Field Impl ( it . start Offset , Ġit . end Offset , Ġdeclaration . symbol , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . expression , Ġcontext . ir Built Ins . unit Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġanalyze ( declaration : ĠIr Declaration , Ġbody : ĠIr Element ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġall Ġinteresting Ġexpressions , Ġvariables Ġand Ġfunctions . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= ĠElement Finder Visitor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. accept Void ( visitor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" FIRST ĠPH ASE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . variable Values . element Data . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" VAR Ġ$ t :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ Ġ${ ir 2 string Whole ( it )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . expressions . forEach Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" EXP Ġ${ ir 2 string Whole ( t )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompute Ġtrans itive Ġclosure Ġof Ġpossible Ġvalues Ġfor Ġvariables . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . variable Values . compute Closure () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" SECOND ĠPH ASE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . variable Values . element Data . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" VAR Ġ$ t :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ Ġ${ ir 2 string Whole ( it )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠFunction DF G Builder ( expression Values Extractor , Ġvisitor . variable Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration , Ġvisitor . expressions , Ġvisitor . return Values , Ġvisitor . throw n Values , Ġvisitor . catch Parameters ). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . debug Output () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions . put ( function . symbol , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġdata Ġ= Ġnull ) ĊĊĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" SYMBOL ĠTABLE :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . class Map . forEach Ġ{ Ġir Class , Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ ĠDESCRIP TOR : Ġ${ ir Class . descriptor }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ ĠTYPE : Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ! is ĠData Flow IR . Type . Declared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠĠĠĠĠ ĠSUP ER ĠTY PES :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . super Types . forEach Ġ{ Ġprintln (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠĠĠĠĠ ĠV TABLE :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . v table . forEach Ġ{ Ġprintln (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠĠĠĠĠ ĠI TABLE :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . it able . forEach Ġ{ Ġprintln (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ${ it . key } Ġ-> Ġ${ it . value }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠModule DF G ( functions , Ġsymbol Table ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠElement Finder Visitor Ġ: ĠIr Element Visitor Void Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġexpressions Ġ= Ġmutable ListOf < Ir Expression >() ĊĠĠĠĠĠĠĠ Ġval Ġvariable Values Ġ= ĠVariable Values () ĊĠĠĠĠĠĠĠ Ġval Ġreturn Values Ġ= Ġmutable ListOf < Ir Expression >() ĊĠĠĠĠĠĠĠ Ġval Ġthrown Values Ġ= Ġmutable ListOf < Ir Expression >() ĊĠĠĠĠĠĠĠ Ġval Ġcatch Parameters Ġ= Ġmutable Set Of < Ir Variable >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsuspend able Expression Stack Ġ= Ġmutable ListOf < Ir Suspend able Expression >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġassign Variable ( variable : ĠIr Variable , Ġvalue : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Values Extractor . forEach Value ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Values . add ( variable , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( expression : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Member Access Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetField , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetObject Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Var arg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Const <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Operator Call Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Ġ+= Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Call Ġ&& Ġexpression . symbol Ġ== Ġexecute Impl Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProducer Ġand Ġjob Ġof Ġexecute Impl Ġare Ġcalled Ġextern ally , Ġwe Ġneed Ġto Ġreflect Ġthis Ġsomehow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproducer Invocation Ġ= ĠIr Call Impl ( expression . start Offset , Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Impl Producer Invoke . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Impl Producer Invoke . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproducer Invocation . dispatch Receiver Ġ= Ġexpression . getValue Argument ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Function Reference Ġ= Ġexpression . getValue Argument ( 3 ) Ġas ? ĠIr Function Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" A Ġfunction Ġreference Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Invocation Ġ= ĠIr Call Impl ( expression . start Offset , Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Function Reference . symbol . owner . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Function Reference . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Invocation . put Value Argument ( 0 , Ġproducer Invocation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Ġ+= Ġjob Invocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Return able Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn able Block Values . put ( expression , Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Suspend able Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend able Expression Stack . push ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend able Expression Values . put ( expression , Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Sus pension Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend able Expression Values [ suspend able Expression Stack . peek () !! ] !!. add ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Suspend able Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend able Expression Stack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Set Field ( expression : ĠIr Set Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Ġ+= Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Set Field ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Return ( expression : ĠIr Return ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn able Block Ġ= Ġexpression . return Target Symbol . owner Ġas ? ĠIr Return able Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return able Block Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn able Block Values [ return able Block ] !!. add ( expression . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠNon - local Ġreturn . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expression . type . is Unit ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Values Ġ+= Ġexpression . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Return ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Throw ( expression : ĠIr Throw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrown Values Ġ+= Ġexpression . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Throw ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Catch ( aC atch : ĠIr Catch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Parameters . add ( aC atch . catch Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Catch ( aC atch ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Set Variable ( expression : ĠIr Set Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Set Variable ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassign Variable ( expression . symbol . owner , Ġexpression . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Values . add Empty ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Variable ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . initializer ?. let Ġ{ Ġassign Variable ( declaration , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsymbols Ġ= Ġcontext . ir . symbols ĊĊĠĠĠ Ġprivate Ġval Ġinvoke Suspend Function Symbol Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . base Continuation Impl . owner . declarations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Ir Simple Function >(). single Ġ{ Ġit . name . asString () Ġ== Ġ" invoke Suspend " Ġ}. symbol ĊĊĠĠĠ Ġprivate Ġval Ġget Continuation Symbol Ġ= Ġsymbols . get Continuation ĊĠĠĠ Ġprivate Ġval Ġcontinuation Type Ġ= Ġget Continuation Symbol . owner . returnType ĊĊĠĠĠ Ġprivate Ġval Ġarray Get Symbol Ġ= Ġsymbols . array Get [ symbols . array ] ĊĠĠĠ Ġprivate Ġval Ġarray Set Symbol Ġ= Ġsymbols . array Set [ symbols . array ] ĊĠĠĠ Ġprivate Ġval Ġcreate Un initialized Instance Symbol Ġ= Ġsymbols . create Un initialized Instance ĊĠĠĠ Ġprivate Ġval Ġinit Instance Symbol Ġ= Ġsymbols . init Instance ĊĠĠĠ Ġprivate Ġval Ġexecute Impl Symbol Ġ= Ġsymbols . execute Impl ĊĠĠĠ Ġprivate Ġval Ġexecute Impl Producer Class Symbol Ġ= Ġsymbols . functions [ 0 ] ĊĠĠĠ Ġprivate Ġval Ġexecute Impl Producer Invoke Ġ= Ġexecute Impl Producer Class Symbol . owner . simple Functions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . name Ġ== ĠOperator Name Con ventions . IN VOKE Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFunction DF G Builder ( val Ġexpression Values Extractor : ĠExpression Values Extractor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Values : ĠVariable Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration : ĠIr Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpressions : ĠList < Ir Expression >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Values : ĠList < Ir Expression >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthrown Values : ĠList < Ir Expression >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Parameters : ĠSet < Ir Variable >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġall Parameters Ġ= Ġ( declaration Ġas ? ĠIr Function )?. all Parameters Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemplate Parameters Ġ= Ġall Parameters . with Index (). associate By ({ Ġit . value Ġ}, Ġ{ ĠData Flow IR . Node . Parameter ( it . index ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontinuation Parameter Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġ! is ĠIr Simple Function Ġ-> Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . is Suspend Ġ-> ĠData Flow IR . Node . Parameter ( all Parameters . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . overrides ( invoke Suspend Function Symbol . owner ) Ġ-> ĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ< this > Ġis Ġa ĠContinu ation Impl Ġin her itor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Parameters [ declaration . dispatch Receiver Parameter !! ] ĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġits Ġown Ġcontinuation . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Continuation () Ġ= Ġcontinuation Parameter Ġ?: Ġerror (" Function Ġ${ declaration . descriptor } Ġhas Ġno Ġcontinuation Ġparameter ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnodes Ġ= Ġmutable Map Of < Ir Expression , ĠData Flow IR . Node >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvariables Ġ= Ġvariable Values . element Data . keys . associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto ĠData Flow IR . Node . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠ Ġ= Ġsymbol Table . map Type ( it . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĠĠ Ġ= Ġif Ġ( catch Parameters . contains ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Variable Kind . Catch Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠData Flow IR . Variable Kind . Ord inary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠData Flow IR . Function Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Suspend Ġ= Ġdeclaration Ġis ĠIr Simple Function Ġ&& Ġdeclaration . is Suspend ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions . forEach Ġ{ ĠgetNode ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn NodeType Ġ= Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Field Ġ-> Ġdeclaration . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Function Ġ-> Ġdeclaration . returnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturns Node Ġ= ĠData Flow IR . Node . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġreturn Values . map Ġ{ Ġexpression To Edge ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠ Ġ= Ġsymbol Table . map Type ( return NodeType ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĠĠ Ġ= ĠData Flow IR . Variable Kind . Temporary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthrows Node Ġ= ĠData Flow IR . Node . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġthrown Values . map Ġ{ Ġexpression To Edge ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠ Ġ= Ġsymbol Table . map Class Reference Type ( symbols . throwable . owner ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĠĠ Ġ= ĠData Flow IR . Variable Kind . Temporary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariables . forEach Ġ{ Ġvariable , Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Values . element Data [ variable ] !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . values Ġ+= Ġexpression To Edge ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Nodes Ġ= Ġnodes . values Ġ+ Ġvariables . values Ġ+ Ġtemplate Parameters . values Ġ+ Ġreturns Node Ġ+ Ġthrows Node Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Suspend ) ĠlistOf ( continu ation Parameter !! ) Ġelse Ġempty List ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠData Flow IR . Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ĠĠĠĠĠĠĠĠ Ġ= Ġsymbol Table . map Function ( declaration ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ĠĠĠĠĠĠĠĠĠĠ Ġ= ĠData Flow IR . Function Body ( all Nodes . distinct (). toList (), Ġreturns Node , Ġthrows Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Type . er asure (): ĠIr Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ! is ĠIr Simple Type ) Ġreturn Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġthis . classifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Bound Ġ= Ġclassifier . owner . super Types . single OrNull () Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO ("${ classifier . descriptor } Ġ: Ġ${ classifier . descriptor . upper Bounds }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . has Question Mark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` T ?` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound . er asure (). make Nullable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound . er asure () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( classifier . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexpression To Edge ( expression : ĠIr Expression ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr Type Operator Call Ġ&& Ġexpression . operator . is Cast ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Edge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetNode ( expression . argument ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( expression . type Operand . er asure (). getClass () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠData Flow IR . Edge ( getNode ( expression ), Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetNode ( expression : ĠIr Expression ): ĠData Flow IR . Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠIr GetValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Declaration Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Declaration Ġis ĠIr Value Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtemplate Parameters [ value Declaration ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvariables [ value Declaration ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnodes . get Or Put ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ OUTPUT ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Con verting Ġexpression ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ir 2 string Whole ( expression )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmutable ListOf < Ir Expression >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Values Extractor . forEach Value ( expression ) Ġ{ Ġvalues Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġvalues . map Ġ{ Ġexpression To Edge ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠ Ġ= Ġsymbol Table . map Type ( expression . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĠĠ Ġ= ĠData Flow IR . Variable Kind . Temporary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalues [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġexpression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġexpression To Edge ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edge . cast To Type Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedge . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= ĠlistOf ( edge ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠ Ġ= Ġsymbol Table . map Type ( expression . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĠĠ Ġ= ĠData Flow IR . Variable Kind . Temporary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetValue Ġ-> ĠgetNode ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Var arg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Function Reference Ġ-> ĠData Flow IR . Node . Const ( symbol Table . map Type ( value . type )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Const < *> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . value Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Null ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Const ( symbol Table . map Type ( value . type )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetObject Value Ġ-> ĠData Flow IR . Node . Singleton ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Type ( value . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . type . is Nothing ()) Ġ// Ġ< Nothing > Ġis Ġnot Ġa Ġsingleton Ġthough Ġits Ġinstance Ġis Ġget Ġwith Ġ< Ir GetObject > Ġoperation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsymbol Table . map Function ( value . symbol . owner . construct ors . single ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġvalue . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġvalue . get Arguments (). map Ġ{ Ġexpression To Edge ( it . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . New Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( callee ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( callee . construct ed Class , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Call Ġ-> Ġwhen Ġ( value . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Continuation Symbol Ġ-> Ġget Continuation () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Get Symbol Ġ-> ĠData Flow IR . Node . Array Read ( expression To Edge ( value . dispatch Receiver !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression To Edge ( value . getValue Argument ( 0 ) !! ), Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Set Symbol Ġ-> ĠData Flow IR . Node . Array Write ( expression To Edge ( value . dispatch Receiver !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression To Edge ( value . getValue Argument ( 0 ) !! ), Ġexpression To Edge ( value . getValue Argument ( 1 ) !! )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Un initialized Instance Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Alloc Instance ( symbol Table . map Class Reference Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . getType Argument ( 0 ) !!. getClass () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Instance Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġth iz Ġ= Ġexpression To Edge ( value . getValue Argument ( 0 ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġvalue . getValue Argument ( 1 ) Ġas ĠIr Constructor Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠlistOf ( th iz ) Ġ+ Ġinitializer . get Arguments (). map Ġ{ Ġexpression To Edge ( it . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġinitializer . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Static Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( callee ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( callee . construct ed Class ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġvalue . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġvalue . get Arguments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġexpression To Edge ( it . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+ ĠData Flow IR . Edge ( get Continuation (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee Ġis ĠIr Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Constructor Ġcall Ġshould Ġbe Ġdone Ġwith ĠIr Constructor Call ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal lee Ġas ĠIr Simple Function ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee . is Over rid able Ġ&& Ġvalue . super Qualifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġcal lee . parent As Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Receiver Type Ġ= Ġvalue . dispatch Receiver !!. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Receiver Classifier Ġ= Ġactual Receiver Type . classifier OrFail ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Receiver Classifier Ġis ĠIr Type Parameter Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ! callee . is Real Ġ/* ĠCould Ġbe Ġa Ġbridge . Ġ*/) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Class At Call site Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( actual Receiver Classifier Ġas ĠIr Class Symbol ). descriptor Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ( Descriptor Utils . is Subclass ( actual Class At Call site , Ġowner . descriptor )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġan Ġin her itor Ġof Ġ${ owner . descriptor }, Ġbut Ġwas Ġ$ actual Class At Call site " Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Descriptor Utils . is Subclass ( actual Class At Call site , Ġowner . descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( actual Receiver Classifier . owner ) Ġ// ĠBox Ġif Ġinline Ġclass . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Class Reference Type ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Hash Ġ= Ġcal lee . function Name . local Hash . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . It able Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( callee . target ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal lee Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Table Builder Ġ= Ġcontext . get V table Builder ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv table Index Ġ= Ġv Table Builder . v table Index ( callee ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . V table Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( callee . target ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv table Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Cal lee Ġ= Ġ( value . super Qualifier Symbol ?. owner ?. get Over riding Of ( callee ) Ġ?: Ġcal lee ). target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Static Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( actual Cal lee ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Cal lee . dispatch Receiver Parameter ?. let Ġ{ Ġsymbol Table . map Type ( it . type ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Delegating Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Receiver Ġ= Ġ( declaration Ġas ĠIr Constructor ). construct ed Class . this Receiver !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġth iz Ġ= ĠIr GetValue Impl ( SYN TH ET IC _ OFFSET , ĠSYN TH ET IC _ OFFSET , Ġthis Receiver . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Receiver . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠlistOf ( th iz ) Ġ+ Ġvalue . get Arguments (). map Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Static Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Function ( value . symbol . owner ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . map Ġ{ Ġexpression To Edge ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Type ( th iz . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr GetField Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġvalue . receiver ?. let Ġ{ Ġexpression To Edge ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ġ= Ġvalue . receiver ?. let Ġ{ Ġsymbol Table . map Type ( it . type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvalue . symbol . owner . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Field Read ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Type ( value . symbol . owner . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . local Hash . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Name Ġ{ Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Set Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġvalue . receiver ?. let Ġ{ Ġexpression To Edge ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ġ= Ġvalue . receiver ?. let Ġ{ Ġsymbol Table . map Type ( it . type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvalue . symbol . owner . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Field Write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . map Type ( value . symbol . owner . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . local Hash . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Name Ġ{ Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression To Edge ( value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Operator Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! value . operator . is Cast ()) Ġ{ Ġ" Cast s Ġshould 've Ġbeen Ġhandled Ġearlier " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression To Edge ( value . argument ) Ġ// ĠPut Ġargument Ġas Ġa Ġseparate Ġvertex . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Flow IR . Node . Const ( symbol Table . map Type ( value . type )) Ġ// ĠAll Ġoperators Ġexcept Ġcast s Ġare Ġbasically Ġconstants . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" Unknown Ġexpression : Ġ${ ir 2 string Whole ( value )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }