/* Ċ Ġ* Ġ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 . ir . interpreter . state Ċ Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . stack . Variable Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . Ir Interpreter Environment Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . handle User Exception Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ Ċ internal Ġinterface ĠState Ġ{ ĊĠĠĠ Ġval Ġfields : ĠMutable List < Variable > ĊĠĠĠ Ġval Ġir Class : ĠIr Class ĊĊĠĠĠ Ġfun Ġget Field ( symbol : ĠIr Symbol ): ĠState ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfields . first OrNull Ġ{ Ġit . symbol Ġ== Ġsymbol Ġ} ?. state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Field ( new Var : ĠVariable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġold State Ġ= Ġfields . first OrNull Ġ{ Ġit . symbol Ġ== Ġnew Var . symbol Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġfields . add ( new Var ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnew Var Ġisn 't Ġpresent Ġin Ġvalue Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfields [ fields . indexOf ( old State )]. state Ġ= Ġnew Var . state ĠĠ Ġ// Ġnew Var Ġalready Ġpresent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Ir Function By Ir Call ( expression : ĠIr Call ): ĠIr Function ? Ċ } Ċ Ċ internal Ġfun ĠState . isNull () Ġ= Ġthis Ġis ĠPrimitive < *> Ġ&& Ġthis . value Ġ== Ġnull Ċ internal Ġfun ĠState ?. is Unit () Ġ= Ġthis Ġis ĠCommon Ġ&& Ġthis . ir Class Fq Name () Ġ== Ġ" kotlin . Unit " Ċ Ċ internal Ġfun ĠState . as Int () Ġ= Ġ( this Ġas ĠPrimitive < *> ). value Ġas ĠInt Ċ internal Ġfun ĠState . as Boolean () Ġ= Ġ( this Ġas ĠPrimitive < *> ). value Ġas ĠBoolean Ċ internal Ġfun ĠState . asString () Ġ= Ġ( this Ġas ĠPrimitive < *> ). value . toString () Ċ Ċ internal Ġfun ĠState . as Boolean OrNull () Ġ= Ġ( this Ġas ? ĠPrimitive <* >) ?. value Ġas ? ĠBoolean Ċ internal Ġfun ĠState . asString OrNull () Ġ= Ġ( this Ġas ĠPrimitive < *> ). value Ġas ? ĠString Ċ Ċ internal Ġfun ĠState . is Subtype Of ( other : ĠIr Type ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠPrimitive < *> Ġ&& Ġthis . value Ġ== Ġnull ) Ġreturn Ġother . is Nullable () ĊĠĠĠ Ġif Ġ( this Ġis ĠException State ) Ġreturn Ġthis . is Subtype Of ( other . class OrNull !!. owner ) ĊĊĠĠĠ Ġif Ġ( this Ġis ĠPrimitive < *> Ġ&& Ġthis . type . isArray () Ġ&& Ġother . isArray ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠIr Type . array Subtype Check ( other : ĠIr Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠIr Simple Type Ġ|| Ġthis Ġ! is ĠIr Simple Type ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Argument Ġ= Ġthis . arguments . single (). type OrNull Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Argument Ġ= Ġother . arguments . single (). type OrNull Ġ?: Ġreturn Ġother . arguments . single () Ġis ĠIr Star Projection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Argument . isArray () Ġ&& Ġother Argument . isArray ()) Ġreturn Ġthis Argument . array Subtype Check ( other Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Argument . class OrNull Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Argument . class OrNull ?. is Subtype Of Class ( other Argument . class OrNull !! ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . type . array Subtype Check ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . ir Class . default Type . is Subtype Of Class ( other . class OrNull !! ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġmethod Ġused Ġto Ġcheck Ġif Ġfor Ġnot Ġnull Ġparameter Ġthere Ġwas Ġpassed Ġnull Ġargument . Ċ Ġ*/ Ċ internal Ġfun ĠState . check Null ability ( ĊĠĠĠ Ġir Type : ĠIr Type ?, Ġenvironment : ĠIr Interpreter Environment , Ġexception To Throw : Ġ() Ġ-> ĠThrowable Ġ= Ġ{ ĠNullPointerException () Ġ} Ċ ): ĠState ? Ġ{ ĊĠĠĠ Ġif Ġ( ir Type Ġ! is ĠIr Simple Type ) Ġreturn Ġthis ĊĠĠĠ Ġif Ġ( this . isNull () Ġ&& Ġ! ir Type . is Nullable ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġexception To Throw (). handle User Exception ( environment ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ }