package Ġcom . an ata wa 1 2 . de compiler . statements Gen Ċ Ċ import Ġcom . an ata wa 1 2 . de compiler . instructions . Stack Type Ċ import Ġcom . an ata wa 1 2 . de compiler . util . Property Ċ import Ġcom . an ata wa 1 2 . de compiler . util . identity Set Of Ċ import Ġorg . object web . asm . Type Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠI Producer > Ġvariable Cast In ( variable : ĠVariable < *> ): ĠVariable < in ĠT >? Ġ= ĊĠĠĠ Ġvariable Cast In ( variable , ĠT :: class . java ) Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T Ġ: ĠI Producer > Ġvariable Cast In ( variable : ĠVariable <* >, Ġtype : ĠClass < T >): ĠVariable < in ĠT >? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( variable . least Type . isAssignableFrom ( type )) Ġvariable Ġas ĠVariable < in ĠT > ĊĠĠĠ Ġelse Ġnull Ċ } Ċ Ċ sealed Ġclass ĠIdentifier Variable Identifier < Identifier , ĠVariable Impl , ĠProducer > ĊĠĠĠĠĠĠĠ Ġwhere ĠIdentifier Ġ: ĠIdentifier Variable Identifier < Identifier , ĠVariable Impl , ĠProducer >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariable Impl Ġ: ĠIdentifier Variable < Identifier , ĠVariable Impl , ĠProducer >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProducer Ġ: ĠI Producer Ġ{ ĊĊĠĠĠ Ġinternal Ġfun Ġmerge ( b : ĠIdentifier ): ĠIdentifier Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġb ) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġcheck ( this . stack Type Ġ== Ġb . stack Type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Type Ġ= Ġthis . type Ġ?: Ġb . type ĊĠĠĠĠĠĠĠ Ġval Ġmerge On to : ĠIdentifier ĊĠĠĠĠĠĠĠ Ġval Ġcurrent : ĠIdentifier ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġif Ġ( b . used By . size Ġ< Ġthis . used By . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge On to Ġ= Ġthis Ġas ĠIdentifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġb ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge On to Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġthis Ġas ĠIdentifier ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmerge On to . type Ġ= Ġnew Type ĊĠĠĠĠĠĠĠ Ġmerge On to . consumer Expressions . addAll ( current . consumer Expressions ) ĊĠĠĠĠĠĠĠ Ġmerge On to . pro ducers . addAll ( current . pro ducers ) ĊĠĠĠĠĠĠĠ Ġmerge On to . consumer Statements . addAll ( current . consumer Statements ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( local Variable Ġin Ġcurrent . used By . toList ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Variable . identifier Ġ= Ġmerge On to ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent . consumer Statements . clear () ĊĠĠĠĠĠĠĠ Ġcurrent . consumer Expressions . clear () ĊĠĠĠĠĠĠĠ Ġcurrent . pro ducers . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġmerge On to ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpro ducers Ġ= Ġidentity Set Of < Producer >() ĊĠĠĠ Ġval Ġconsumer Expressions Ġ= Ġmutable Set Of < Value Property < out ĠValue , ĠValue >>() ĊĠĠĠ Ġval Ġconsumer Statements Ġ= Ġmutable Set Of < Value Property < out ĠValue , ĠStatement >>() ĊĠĠĠ Ġval Ġconsumers Ġget () Ġ= Ġconsumer Expressions Ġ+ Ġconsumer Statements ĊĊĠĠĠ Ġval Ġid Ġ= Ġ( next Id ++ ). toString (). pad Start ( 5 , Ġ' 0 ') ĊĠĠĠ Ġval Ġused By Ġ= Ġidentity Set Of < Variable Impl >() ĊĊĠĠĠ Ġabstract Ġvar Ġtype : ĠType ? ĊĠĠĠ Ġabstract Ġval Ġstack Type : ĠStack Type ĊĊĠĠĠ Ġval Ġconsumer Count Ġget () Ġ= Ġ( consumer Expressions . size Ġ+ Ġconsumer Statements . size ) ĊĠĠĠ Ġval Ġproducer Count Ġget () Ġ= Ġpro ducers . size ĊĊĠĠĠ Ġval Ġis Single Consume Single Produce Ġget () Ġ= Ġconsumer Count Ġ== Ġ 1 Ġ&& Ġproducer Count Ġ== Ġ 1 ĊĊĠĠĠ Ġfun Ġsp Info () Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconsume Count Ġ= Ġconsumer Count ĊĠĠĠĠĠĠĠ Ġval Ġproduce Count Ġ= Ġproducer Count ĊĠĠĠĠĠĠĠ Ġappend (' (' ) ĊĠĠĠĠĠĠĠ Ġif Ġ( consume Count Ġ== Ġ 0 ) Ġappend (' n ') ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( consume Count Ġ== Ġ 1 ) Ġappend (' s ') ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( consume Count Ġ<= Ġ 9 ) Ġappend ( consume Count ) ĊĠĠĠĠĠĠĠ Ġelse Ġappend (' m ') ĊĠĠĠĠĠĠĠ Ġappend (' C ') ĊĠĠĠĠĠĠĠ Ġif Ġ( produce Count Ġ== Ġ 0 ) Ġappend (' n ') ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( produce Count Ġ== Ġ 1 ) Ġappend (' s ') ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( produce Count Ġ<= Ġ 9 ) Ġappend ( produce Count ) ĊĠĠĠĠĠĠĠ Ġelse Ġappend (' m ') ĊĠĠĠĠĠĠĠ Ġappend (' P ') ĊĠĠĠĠĠĠĠ Ġappend (' )') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnext Id Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLocal Variable Identifier ( val Ġindex : ĠInt , Ġoverride Ġval Ġstack Type : ĠStack Type , Ġtype : ĠType ?) Ġ: ĊĠĠĠ ĠIdentifier Variable Identifier < Local Variable Identifier , ĠLocal Variable , ĠI Producer >() Ġ{ ĊĠĠĠ Ġvar Ġinfo : ĠLocal Variable Info ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġcheck ( field Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġvalue ?. descriptor ?. let ( Type :: getType ) Ġ?: Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( index : ĠInt , Ġstack Type : ĠStack Type ) Ġ: Ġthis ( index , Ġstack Type , Ġnull ) ĊĠĠĠ Ġconstructor ( index : ĠInt , Ġtype : ĠType ) Ġ: Ġthis ( index , ĠStack Type . by Type ( type ), Ġtype ) ĊĊĠĠĠ Ġoverride Ġvar Ġtype : ĠType ? Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( stack Type Ġ== ĠStack Type . by Type ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠStack Variable Identifier ( override Ġval Ġstack Type : ĠStack Type , Ġoverride Ġvar Ġtype : ĠType ?) Ġ: ĊĠĠĠ ĠIdentifier Variable Identifier < Stack Variable Identifier , ĠStack Variable , ĠI Stack Producer >() Ġ{ ĊĠĠĠ Ġfun Ġvalue () Ġ= ĠStack Variable ( this ) Ċ } Ċ Ċ class ĠValue Property < T Ġ: ĠValue , Ġout ĠA >( ĊĠĠĠ Ġvalue : ĠT , ĊĠĠĠ Ġthis Ref : ĠA , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġprivate Ġval Ġexpected Type Getter : Ġ() Ġ-> ĠExpect Types Ċ ) Ġ: ĊĠĠĠ ĠProperty < T , ĠA >( value , Ġthis Ref , Ġtype ) Ġ{ ĊĠĠĠ Ġval Ġexpected Type Ġget () Ġ= Ġexpected Type Getter () Ċ } Ċ Ċ enum Ġclass ĠBi Condition () Ġ{ ĊĠĠĠ ĠE Q , ĊĠĠĠ ĠNE , ĊĠĠĠ ĠLE , ĊĠĠĠ ĠLT , ĊĠĠĠ ĠGE , ĊĠĠĠ ĠGT , Ċ } Ċ Ċ enum Ġclass ĠIn De crement Type Ġ{ ĊĠĠĠ ĠPrefix Increment , ĊĠĠĠ ĠPrefix De crement , ĊĠĠĠ ĠS uffix Increment , ĊĠĠĠ ĠS uffix De crement , Ċ } Ċ Ċ enum Ġclass ĠExpect Types Ġ{ ĊĠĠĠ ĠBoolean , ĊĠĠĠ ĠChar , ĊĠĠĠ ĠByte , ĊĠĠĠ ĠShort , ĊĠĠĠ ĠAny Integer , ĊĠĠĠ ĠLong , ĊĠĠĠ ĠDouble , ĊĠĠĠ ĠFloat , ĊĠĠĠ ĠObject , ĊĠĠĠ ĠUnknown , ĊĊĠĠĠ Ġ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġby ( t : ĠType ): ĠExpect Types Ġ= Ġwhen Ġ( t . sort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . BOOLEAN Ġ-> ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . CHAR Ġ-> ĠChar ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . BYTE Ġ-> ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . SHORT Ġ-> ĠShort ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . INT Ġ-> ĠAny Integer ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . FLOAT Ġ-> ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . LONG Ġ-> ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . DOUBLE Ġ-> ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . ARRAY Ġ-> ĠObject ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . OBJECT Ġ-> ĠObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" unsupported Ġtype : Ġ$ t ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠI Producer Ċ interface ĠI Stack Producer Ġ: ĠI Producer Ċ Ċ inline Ġfun Ġ< V , Ġre ified ĠT > ĠV . mut ating Prop ( value : ĠT , Ġconsume s : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġwhere ĠV Ġ: ĠI Producer , ĠV Ġ: ĠValue , ĠT Ġ: ĠVariable < in ĠV > Ġ= Ġmut ating Prop ( value , Ġconsume s , ĠT :: class . java ) Ċ Ċ fun Ġ< V , ĠT > ĠV . mut ating Prop ( value : ĠT , Ġconsume s : ĠBoolean , Ġtype : ĠClass < T >) ĊĠĠĠĠĠĠĠ Ġwhere ĠV Ġ: ĠValue , ĠV Ġ: ĠI Producer , ĠT Ġ: ĠVariable < in ĠV > Ġ= ĊĠĠĠ ĠValue Property ( value , Ġthis , Ġtype , Ġ{ ĠExpect Types . Unknown Ġ}). also Ġ{ Ġprop Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( consume s ) Ġthis . consume s Ġ+= Ġprop ĊĠĠĠĠĠĠĠ Ġproduces Ġ+= Ġprop ĊĠĠĠĠĠĠĠ Ġif Ġ( consume s ) Ġvalue . consume By Expression ( prop ) ĊĠĠĠĠĠĠĠ Ġvalue . add Producer ( this ) ĊĠĠĠĠĠĠĠ Ġprop . onChange Ġ= Ġ{ Ġfrom , Ġto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( consume s ) Ġfrom . un Consume By Expression ( prop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom . remove Producer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( consume s ) Ġto . consume By Expression ( prop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto . add Producer ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun ĠExpression Value . compute Expected Of Bi Op () Ġ= Ġwhen Ġ( any Consumer ?. expected Type Ġ?: ĠExpect Types . Unknown ) Ġ{ ĊĠĠĠ ĠExpect Types . Boolean Ġ-> ĠExpect Types . Boolean ĊĠĠĠ ĠExpect Types . Char Ġ-> Ġerror (" cannot Ġexpect Ġchar Ġfor Ġbi Ġoperation ") ĊĠĠĠ ĠExpect Types . Byte Ġ-> Ġerror (" cannot Ġexpect Ġbyte Ġfor Ġbi Ġoperation ") ĊĠĠĠ ĠExpect Types . Short Ġ-> Ġerror (" cannot Ġexpect Ġshort Ġfor Ġbi Ġoperation ") ĊĠĠĠ ĠExpect Types . Any Integer Ġ-> ĠExpect Types . Any Integer ĊĠĠĠ ĠExpect Types . Long Ġ-> ĠExpect Types . Long ĊĠĠĠ ĠExpect Types . Double Ġ-> ĠExpect Types . Double ĊĠĠĠ ĠExpect Types . Float Ġ-> ĠExpect Types . Float ĊĠĠĠ ĠExpect Types . Object Ġ-> Ġerror (" cannot Ġexpect Ġobject Ġfor Ġbi Ġoperation ") ĊĠĠĠ ĠExpect Types . Unknown Ġ-> ĠExpect Types . Unknown Ċ } Ċ Ċ fun ĠExpression Value . compute Expected Of Shift Op () Ġ= Ġwhen Ġ( any Consumer ?. expected Type Ġ?: ĠExpect Types . Unknown ) Ġ{ ĊĠĠĠ ĠExpect Types . Boolean Ġ-> Ġerror (" cannot Ġexpect Ġboolean Ġfor Ġshift Ġoperation ") ĊĠĠĠ ĠExpect Types . Char Ġ-> Ġerror (" cannot Ġexpect Ġchar Ġfor Ġshift Ġoperation ") ĊĠĠĠ ĠExpect Types . Byte Ġ-> Ġerror (" cannot Ġexpect Ġbyte Ġfor Ġshift Ġoperation ") ĊĠĠĠ ĠExpect Types . Short Ġ-> Ġerror (" cannot Ġexpect Ġshort Ġfor Ġshift Ġoperation ") ĊĠĠĠ ĠExpect Types . Any Integer Ġ-> ĠExpect Types . Any Integer ĊĠĠĠ ĠExpect Types . Long Ġ-> ĠExpect Types . Long ĊĠĠĠ ĠExpect Types . Double Ġ-> ĠExpect Types . Double ĊĠĠĠ ĠExpect Types . Float Ġ-> ĠExpect Types . Float ĊĠĠĠ ĠExpect Types . Object Ġ-> Ġerror (" cannot Ġexpect Ġobject Ġfor Ġshift Ġoperation ") ĊĠĠĠ ĠExpect Types . Unknown Ġ-> ĠExpect Types . Unknown Ċ } Ċ Ċ fun ĠExpression Value . compute Expected Of Negative Operation () Ġ= Ġwhen Ġ( any Consumer ?. expected Type Ġ?: ĠExpect Types . Unknown ) Ġ{ ĊĠĠĠ ĠExpect Types . Boolean Ġ-> Ġerror (" cannot Ġexpect Ġboolean Ġfor Ġnegative Ġoperation ") ĊĠĠĠ ĠExpect Types . Char Ġ-> ĠExpect Types . Char ĊĠĠĠ ĠExpect Types . Byte Ġ-> ĠExpect Types . Byte ĊĠĠĠ ĠExpect Types . Short Ġ-> ĠExpect Types . Short ĊĠĠĠ ĠExpect Types . Any Integer Ġ-> ĠExpect Types . Any Integer ĊĠĠĠ ĠExpect Types . Long Ġ-> ĠExpect Types . Long ĊĠĠĠ ĠExpect Types . Double Ġ-> ĠExpect Types . Double ĊĠĠĠ ĠExpect Types . Float Ġ-> ĠExpect Types . Float ĊĠĠĠ ĠExpect Types . Object Ġ-> Ġerror (" cannot Ġexpect Ġobject Ġfor Ġnegative Ġoperation ") ĊĠĠĠ ĠExpect Types . Unknown Ġ-> ĠExpect Types . Unknown Ċ } Ċ Ċ fun Ġcompute Type By Stack ( stack Type : ĠStack Type , Ġop : ĠString ) Ġ= Ġwhen Ġ( stack Type ) Ġ{ ĊĠĠĠ ĠStack Type . Integer Ġ-> ĠType . INT _ TYPE ĊĠĠĠ ĠStack Type . Long Ġ-> ĠType . LONG _ TYPE ĊĠĠĠ ĠStack Type . Double Ġ-> ĠType . DOUBLE _ TYPE ĊĠĠĠ ĠStack Type . Float Ġ-> ĠType . FLOAT _ TYPE ĊĠĠĠ ĠStack Type . Object Ġ-> Ġerror (" object Ġis Ġnot Ġvalid Ġtype Ġfor Ġ$ op ") Ċ } ĊĊ