package Ġcom . ree va js . ree va . transformer Ċ Ċ import Ġcom . ree va js . ree va . parsing . lexer . Source Location Ċ import Ġcom . ree va js . ree va . transformer . op codes .* Ċ import Ġcom . ree va js . ree va . utils . expect Ċ Ċ @ Jvm Inline Ċ value Ġclass ĠLocal ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġvalue . toString () Ċ } Ċ Ċ data Ġclass ĠHandler ( ĊĠĠĠ Ġval Ġstart : ĠInt , ĊĠĠĠ Ġval Ġend : ĠInt , ĊĠĠĠ Ġval Ġhandler : ĠInt , Ċ ) Ċ Ċ data Ġclass ĠIR ( ĊĠĠĠ Ġval Ġarg Count : ĠInt , ĊĠĠĠ Ġval Ġop codes : ĠList < Opcode >, ĊĠĠĠ Ġval Ġlocals : ĠList < Local Kind >, ĊĠĠĠ Ġval Ġhandlers : ĠList < Handler >, ĊĠĠĠ Ġval Ġlocation Table : ĠMap < Int , ĠSource Location >, ĊĊĠĠĠ Ġ// ĠJust Ġso Ġwe Ġcan Ġprint Ġthem Ġwith Ġthe Ġtop - level Ġscript , Ġnot Ġactually ĊĠĠĠ Ġ// Ġnecessary Ġfor Ġfunction . ĊĠĠĠ Ġval Ġnested Functions : ĠList < Function Info >, Ċ ) Ċ Ċ class ĠIR Builder ( ĊĠĠĠ Ġval Ġarg Count : ĠInt , ĊĠĠĠ Ġadditional Reserved Local s : ĠInt , ĊĠĠĠ Ġval Ġis Derived Class Constructor : ĠBoolean , ĊĠĠĠ Ġval Ġis Generator : ĠBoolean , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġop codes Ġ= Ġmutable ListOf < Opcode >() ĊĠĠĠ Ġprivate Ġval Ġlocals Ġ= Ġmutable ListOf < Local Kind >() ĊĠĠĠ Ġprivate Ġval Ġnested Functions Ġ= Ġmutable ListOf < Function Info >() ĊĠĠĠ Ġprivate Ġval Ġhandlers Ġ= Ġmutable ListOf < Handler >() ĊĠĠĠ Ġprivate Ġval Ġlocation Table Ġ= Ġmutable Map Of < Int , ĠSource Location >() ĊĊĠĠĠ Ġvar Ġstack Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġgenerator Jump Table Ġ= Ġmutable Map Of < Int , ĠInt >() ĊĠĠĠ Ġprivate Ġvar Ġgenerator Phase Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġis Done : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġop codes . last OrNull () Ġ=== ĠReturn ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠReceiver Ġ+ Ġnew . target ĊĠĠĠĠĠĠĠ Ġlocals . add ( Local Kind . Value ) ĊĠĠĠĠĠĠĠ Ġlocals . add ( Local Kind . Value ) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( additional Reserved Local s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocals . add ( Local Kind . Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Handler ( start : ĠInt , Ġend : ĠInt , Ġhandler : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . add ( Handler ( start , Ġend , Ġhandler )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Nested Function ( function : ĠFunction Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnested Functions . add ( function ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize Jump Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Opcode ( Jump Table ( generator Jump Table )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Jump Table Target ( phase : ĠInt , Ġtarget : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( generator Jump Table [ phase ] Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġgenerator Jump Table [ phase ] Ġ= Ġtarget ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġincrement AndGet Generator Phase () Ġ= Ġ++ generator Phase ĊĊĠĠĠ Ġprivate Ġfun Ġfinalize Op codes (): ĠList < Opcode > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠFigure Ġout Ġhow Ġto Ġdo Ġthis Ġhere Ġbut Ġalso Ġprint ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġthe Ġop codes Ġfor Ġdebugging Ġpurposes ĊĠĠĠĠĠĠĠ Ġ// ĠIR Validator ( op codes ). validate () ĊĠĠĠĠĠĠĠ Ġreturn Ġop codes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Opcode ( opcode : ĠOpcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġop codes . add ( opcode ) ĊĠĠĠĠĠĠĠ Ġstack Height Ġ+= Ġopcode . stack Height Modifier ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Last Opcode Location ( location : ĠSource Location ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation Table [ op codes . last Index ] Ġ= Ġlocation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopcode Count (): ĠInt Ġ= Ġop codes . size ĊĊĠĠĠ Ġfun Ġif Helper ( jump Builder : Ġ( to : ĠInt ) Ġ-> ĠJump Instr , Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjump Ġ= Ġjump Builder (- 1 ) ĊĠĠĠĠĠĠĠ Ġadd Opcode ( jump ) ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġjump . to Ġ= Ġopcode Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġif Else Helper ( jump Builder : Ġ( to : ĠInt ) Ġ-> ĠJump Instr , Ġfirst Block : Ġ() Ġ-> ĠUnit , Ġsecond Block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Jump Ġ= Ġjump Builder (- 1 ) ĊĠĠĠĠĠĠĠ Ġadd Opcode ( first Jump ) ĊĠĠĠĠĠĠĠ Ġfirst Block () ĊĊĠĠĠĠĠĠĠ Ġval Ġsecond Jump Ġ= ĠJump (- 1 ) ĊĠĠĠĠĠĠĠ Ġadd Opcode ( second Jump ) ĊĠĠĠĠĠĠĠ Ġfirst Jump . to Ġ= Ġopcode Count () ĊĠĠĠĠĠĠĠ Ġsecond Block () ĊĠĠĠĠĠĠĠ Ġsecond Jump . to Ġ= Ġopcode Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Local Slot ( kind : ĠLocal Kind ): ĠLocal Ġ{ ĊĠĠĠĠĠĠĠ Ġlocals . add ( kind ) ĊĠĠĠĠĠĠĠ Ġreturn ĠLocal ( locals . last Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild () Ġ= ĠIR ( ĊĠĠĠĠĠĠĠ Ġarg Count , ĊĠĠĠĠĠĠĠ Ġfinalize Op codes (), ĊĠĠĠĠĠĠĠ Ġlocals , ĊĠĠĠĠĠĠĠ Ġhandlers , ĊĠĠĠĠĠĠĠ Ġlocation Table , ĊĠĠĠĠĠĠĠ Ġnested Functions , ĊĠĠĠ Ġ) Ċ } Ċ