package Ġas mb le . run . jvm . interpret Ċ Ċ import Ġas mb le . ast . Node Ċ import Ġas mb le . compile . jvm .* Ċ import Ġas mb le . run . jvm . Run Err Ċ import Ġas mb le . util . Either Ċ import Ġas mb le . util . Logger Ċ import Ġas mb le . util . to Unsigned Int Ċ import Ġas mb le . util . to Unsigned Long Ċ import Ġjava . lang . invoke . Method Handle Ċ import Ġjava . lang . invoke . Method Handles Ċ import Ġjava . lang . invoke . MethodType Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ Ċ // ĠThis Ġis Ġnot Ġintended Ġto Ġbe Ġfast , Ġrather Ġclear Ġand Ġeasy Ġto Ġread . ĠVery Ġlittle Ġcached / memo ized , Ġlots Ġof Ġextra Ġcycles . Ċ open Ġclass ĠInterpreter Ġ{ ĊĊĠĠĠ Ġopen Ġfun Ġexec Func ( ĊĠĠĠĠĠĠĠ Ġctx : ĠContext , ĊĠĠĠĠĠĠĠ Ġfunc Index : ĠInt Ġ= Ġctx . mod . start Func Index Ġ?: Ġerror (" No Ġstart Ġfunc Ġindex "), ĊĠĠĠĠĠĠĠ Ġvar arg Ġfunc Args : ĠNumber ĊĠĠĠ Ġ): ĠNumber ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġparams ĊĠĠĠĠĠĠĠ Ġval Ġfunc Type Ġ= Ġctx . func Type AtIndex ( func Index ) ĊĠĠĠĠĠĠĠ Ġfunc Args . map NotNull Ġ{ Ġit . valueType Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġfunc Type . params ) Ġthrow ĠInter pret Err . Start Func Param Mismatch ( func Type . params , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠImport Ġfunctions Ġare Ġexecuted Ġinline Ġand Ġreturned ĊĠĠĠĠĠĠĠ Ġctx . import Funcs . get OrNull ( func Index )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . imports . invoke Function ( it . module , Ġit . field , Ġfunc Type , Ġfunc Args . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġcall Ġstack Ġwe Ġneed Ġto Ġstop Ġat ĊĠĠĠĠĠĠĠ Ġval Ġstarting Call Stack Size Ġ= Ġctx . call Stack . size ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġthe Ġcall Ġon Ġthe Ġcontext ĊĠĠĠĠĠĠĠ Ġvar Ġlast Step : ĠStep Result Ġ= ĠStep Result . Call ( func Index , Ġfunc Args . toList (), Ġfunc Type ) ĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġuntil Ġdone ĊĠĠĠĠĠĠĠ Ġwhile Ġ( last Step Ġ! is ĠStep Result . Return Ġ|| Ġctx . call Stack . size Ġ> Ġstarting Call Stack Size Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( ctx , Ġlast Step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Step Ġ= Ġstep ( ctx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġctx . call Stack . sub List ( starting Call Stack Size , Ġctx . call Stack . size ). clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Step . v ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġstep ( ctx : ĠContext ): ĠStep Result Ġ= Ġctx . curr Func Ctx . run Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġinsn Ġis Ġout Ġof Ġbounds , Ġit 's Ġan Ġimplicit Ġreturn , Ġotherwise Ġjust Ġexecute Ġthe Ġinsn ĊĠĠĠĠĠĠĠ Ġif Ġ( insn Index Ġ>= Ġfunc . instructions . size ) ĠStep Result . Return ( func . type . ret ?. let Ġ{ Ġpop ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġelse Ġinvoke Single ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠErrors Ġwith ĠInter pret Err . End Reached Ġif Ġthere Ġis Ġno Ġnext Ġstep Ġto Ġbe Ġhad ĊĠĠĠ Ġopen Ġfun Ġnext ( ctx : ĠContext , Ġstep : ĠStep Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . logger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Name Ġ= Ġctx . maybe Curr Func Ctx ?. func Index ?. let Ġ{ Ġctx . mod . names ?. func Names ?. get ( it ) Ġ?: Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" NEXT ĠON Ġ$ fn Name (${ ctx . maybe Curr Func Ctx ?. func Index }:${ ctx . maybe Curr Func Ctx ?. insn Index }): Ġ$ step Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ VAL ĠSTACK : Ġ${ ctx . maybe Curr Func Ctx ?. value Stack }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ CALL ĠSTACK ĠDEP TH : Ġ${ ctx . call Stack . size }] " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġjust Ġmoves Ġthe Ġcounter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Next Ġ-> Ġctx . curr Func Ctx . insn Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBranch Ġupdates Ġthe Ġstack Ġand Ġmoves Ġthe Ġinsn Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Branch Ġ-> Ġctx . curr Func Ctx . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġfailed Ġif Ġjust Ġjumps Ġto Ġthe Ġelse Ġor Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step . failed If ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( step . block Depth Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġblock Stack . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block . else Index Ġ!= Ġnull ) Ġinsn Index Ġ= Ġblock . else Index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Index Ġ= Ġblock . end Index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stack . remove At ( block Stack . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġall Ġblocks Ġuntil Ġthe Ġdepth Ġrequested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stack . sub List ( block Stack . size Ġ- Ġstep . block Depth , Ġblock Stack . size ). clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcan Ġbreak Ġout Ġof Ġthe Ġentire Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGrab Ġthe Ġstack Ġitem Ġif Ġpresent , Ġblow Ġaway Ġstack , Ġput Ġback , Ġand Ġmove Ġto Ġend Ġof Ġfunc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠretVal Ġ= Ġfunc . type . ret ?. let Ġ{ Ġpop ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Stack . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠretVal ?. also Ġ{ Ġpush ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Index Ġ= Ġfunc . instructions . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( block Stack . last (). insn Ġis ĠNode . Instr . Loop Ġ&& Ġ! step . force End On Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġjust Ġa Ġloop Ġcontinuation , Ġgo Ġback Ġto Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Index Ġ= Ġblock Stack . last (). startIndex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġone Ġat Ġthe Ġdepth Ġrequested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġblock Stack . remove At ( block Stack . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPop Ġvalue Ġif Ġapplicable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Val Ġ= Ġblock . insn . type ?. let Ġ{ Ġpop ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrim Ġthe Ġstack Ġdown Ġto Ġrequired Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Stack . sub List ( block . stack Size At Start , Ġvalue Stack . size ). clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPut Ġthe Ġvalue Ġback Ġon Ġif Ġapplicable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Val ?. also Ġ{ Ġpush ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJump Ġpast Ġthe Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Index Ġ= Ġblock . end Index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall , Ġif Ġimport , Ġinvokes Ġit Ġand Ġputs Ġresult Ġon Ġstack . ĠIf Ġnot , Ġjust Ġp ushes Ġa Ġnew Ġfunc Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Call Ġ-> Ġctx . func AtIndex ( step . func Index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġimport , Ġcall Ġand Ġjust Ġput Ġon Ġstack Ġand Ġadvance Ġinsn Ġif Ġcame Ġfrom Ġinsn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . imports . invoke Function ( it . v . module , Ġit . v . field , Ġstep . type , Ġstep . args ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġresult Ġtype Ġis Ġaccurate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . valueType Ġ!= Ġstep . type . ret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInter pret Err . Invalid Call Result ( step . type . ret , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. also Ġ{ Ġctx . curr Func Ctx . push ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . curr Func Ctx . insn Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġinside Ġthe Ġmodule , Ġcreate Ġnew Ġcontext Ġto Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġctx . call Stack Ġ+= ĠFunc Context ( step . func Index , Ġit . v ). also Ġ{ Ġfunc Ctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . logger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"> ". repeat ( ctx . call Stack . size ) Ġ+ Ġ" Ġ" Ġ+ Ġctx . mod . names ?. func Names ?. get ( func Ctx . func Index ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": ${ func Ctx . func Index } Ġ- Ġargs : Ġ" Ġ+ Ġstep . args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . args . forEach Indexed Ġ{ Ġindex , Ġarg Ġ-> Ġfunc Ctx . locals [ index ] Ġ= Ġarg Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġindirect Ġis Ġjust Ġan ĠM H Ġinvocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Call Indirect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm h Ġ= Ġctx . table ?. get OrNull ( step . table Index ) Ġ?: Ġerror (" Missing Ġtable Ġentry ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġm h . invoke With Arguments ( step . args ) Ġas ? ĠNumber ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . valueType Ġ!= Ġstep . type . ret ) Ġthrow ĠInter pret Err . Invalid Call Result ( step . type . ret , Ġres ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres ?. also Ġ{ Ġctx . curr Func Ctx . push ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . curr Func Ctx . insn Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn reachable Ġthrows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Un reachable Ġ-> Ġthrow ĠUnsupportedOperationException (" Un reachable ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġp ops Ġcurr Ġfunc Ġfrom Ġthe Ġcall Ġstack , Ġpush Ġret Ġand Ġmove Ġinsn Ġon Ġprev Ġone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStep Result . Return Ġ-> Ġctx . call Stack . remove At ( ctx . call Stack . last Index ). let Ġ{ Ġreturned From Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . call Stack . isEmpty ()) Ġthrow ĠInter pret Err . End Reached ( step . v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( returned From . value Stack . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCompile Err . Unused Stack On Return ( returned From . value Stack . map Ġ{ Ġit :: class . ref Ġ} Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . v ?. also Ġ{ Ġctx . curr Func Ctx . push ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . curr Func Ctx . insn Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġinvoke Single ( ctx : ĠContext ): ĠStep Result Ġ= Ġctx . curr Func Ctx . run Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġvalidation ? ĊĠĠĠĠĠĠĠ Ġfunc . instructions [ insn Index ]. let Ġ{ Ġinsn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . logger . trace Ġ{ Ġ" IN SN Ġ#$ insn Index : Ġ$ insn Ġ[ STACK : Ġ$ value Stack ]" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( insn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Un reachable Ġ-> ĠStep Result . Un reachable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . N op Ġ-> Ġnext Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Block , Ġis ĠNode . Instr . Loop Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stack Ġ+= ĠBlock ( insn Index , Ġinsn Ġas ĠNode . Instr . Args . Type , Ġvalue Stack . size , Ġcurrent Block End () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . If Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stack Ġ+= ĠBlock ( insn Index , Ġinsn , Ġvalue Stack . size Ġ- Ġ 1 , Ġcurrent Block End () !! , Ġcurrent Block Else ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pop Int () Ġ== Ġ 0 ) ĠStep Result . Branch ( 0 , Ġfailed If Ġ= Ġtrue ) Ġelse ĠStep Result . Next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Else Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJump Ġover Ġthe Ġwhole Ġthing Ġand Ġto Ġthe Ġend , Ġthis Ġcan Ġonly Ġbe Ġgotten Ġhere Ġvia Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result . Branch ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . End Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġwe Ġreached Ġthe Ġend Ġby Ġmanually Ġrunning Ġthrough Ġit , Ġjump Ġto Ġend Ġeven Ġon Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result . Branch ( 0 , Ġforce End On Loop Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Br Ġ-> ĠStep Result . Branch ( insn . relative Depth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Br If Ġ-> Ġif Ġ( pop Int () Ġ!= Ġ 0 ) ĠStep Result . Branch ( insn . relative Depth ) Ġelse ĠStep Result . Next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Br Table Ġ-> ĠStep Result . Branch ( insn . target Table . get OrNull ( pop Int ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġinsn . default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Return Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result . Return ( func . type . ret ?. let Ġ{ Ġpop ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Call Ġ-> Ġctx . func Type AtIndex ( insn . index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . check Next Is nt Stack Overflow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result . Call ( insn . index , Ġpop Call Args ( it ), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Call Indirect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . check Next Is nt Stack Overflow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Index Ġ= Ġpop Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= Ġctx . type AtIndex ( insn . index ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable M h Ġ= Ġctx . table ?. get OrNull ( table Index ) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInter pret Err . Undefined Element ( table Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠNode . Type . Func ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġtable M h . type (). parameter List (). map Ġ{ Ġit . valueType !! Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtable M h . type (). returnType (). valueType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġactual Type ) Ġthrow ĠInter pret Err . Indirect Call Type Mismatch ( it , Ġactual Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep Result . Call Indirect ( table Index , Ġpop Call Args ( expected Type ), Ġexpected Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Drop Ġ-> Ġnext Ġ{ Ġpop () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Select Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Int (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġpop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġpop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 1 :: class Ġ!= Ġv 2 :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCompile Err . Select Mismatch ( v 1 . valueType !!. type Ref , Ġv 2 . valueType !!. type Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġ 0 ) Ġpush ( v 1 ) Ġelse Ġpush ( v 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Get Local Ġ-> Ġnext Ġ{ Ġpush ( locals [ insn . index ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Set Local Ġ-> Ġnext Ġ{ Ġlocals [ insn . index ] Ġ= Ġpop ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . T ee Local Ġ-> Ġnext Ġ{ Ġlocals [ insn . index ] Ġ= Ġpeek () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Get Global Ġ-> Ġnext Ġ{ Ġpush ( ctx . getGlobal ( insn . index )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Set Global Ġ-> Ġnext Ġ{ Ġctx . set Global ( insn . index , Ġpop ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Load Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . getInt ( insn . pop Mem Addr ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . getLong ( insn . pop Mem Addr ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Load Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get Float ( insn . pop Mem Addr ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Load Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . getDouble ( insn . pop Mem Addr ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Load 8 S Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get ( insn . pop Mem Addr ()). toInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Load 8 U Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get ( insn . pop Mem Addr ()). to Unsigned Int ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Load 1 6 S Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get Short ( insn . pop Mem Addr ()). toInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Load 1 6 U Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get Short ( insn . pop Mem Addr ()). to Unsigned Int ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 8 S Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get ( insn . pop Mem Addr ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 8 U Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get ( insn . pop Mem Addr ()). to Unsigned Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 1 6 S Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get Short ( insn . pop Mem Addr ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 1 6 U Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . get Short ( insn . pop Mem Addr ()). to Unsigned Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 3 2 S Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . getInt ( insn . pop Mem Addr ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Load 3 2 U Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . getInt ( insn . pop Mem Addr ()). to Unsigned Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Store Ġ-> Ġnext Ġ{ Ġpop Int (). let Ġ{ Ġctx . mem . put Int ( insn . pop Mem Addr (), Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Store Ġ-> Ġnext Ġ{ Ġpop Long (). let Ġ{ Ġctx . mem . put Long ( insn . pop Mem Addr (), Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Store Ġ-> Ġnext Ġ{ Ġpop Float (). let Ġ{ Ġctx . mem . put Float ( insn . pop Mem Addr (), Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Store Ġ-> Ġnext Ġ{ Ġ Ġpop Double (). let Ġ{ Ġctx . mem . put Double ( insn . pop Mem Addr (), Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Store 8 Ġ-> Ġnext Ġ{ Ġpop Int (). let Ġ{ Ġctx . mem . put ( insn . pop Mem Addr (), Ġit . to Byte ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Store 1 6 Ġ-> Ġnext Ġ{ Ġpop Int (). let Ġ{ Ġctx . mem . put Short ( insn . pop Mem Addr (), Ġit . to Short ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Store 8 Ġ-> Ġnext Ġ{ Ġpop Long (). let Ġ{ Ġctx . mem . put ( insn . pop Mem Addr (), Ġit . to Byte ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Store 1 6 Ġ-> Ġnext Ġ{ Ġpop Long (). let Ġ{ Ġctx . mem . put Short ( insn . pop Mem Addr (), Ġit . to Short ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Store 3 2 Ġ-> Ġnext Ġ{ Ġpop Long (). let Ġ{ Ġctx . mem . put Int ( insn . pop Mem Addr (), Ġit . toInt ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Memory Size Ġ-> Ġnext Ġ{ Ġpush ( ctx . mem . limit () Ġ/ ĠMem . PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Memory Grow Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Lim Ġ= Ġctx . mem . limit (). to Long () Ġ+ Ġ( pop Int (). to Long () Ġ* ĠMem . PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Lim Ġ> Ġctx . mem . capacity ()) Ġpush (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( ctx . mem . limit () Ġ/ ĠMem . PAGE _ SIZE ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . mem . limit ( new Lim . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Const Ġ-> Ġnext Ġ{ Ġpush ( insn . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Const Ġ-> Ġnext Ġ{ Ġpush ( insn . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Const Ġ-> Ġnext Ġ{ Ġpush ( insn . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Const Ġ-> Ġnext Ġ{ Ġpush ( insn . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Eq z Ġ-> Ġnext Ġ{ Ġpush ( pop Int () Ġ== Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Eq Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Ne Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ!= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Lt S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ< Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Lt U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . compare Unsigned ( a , Ġb ) Ġ< Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Gt S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ> Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Gt U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . compare Unsigned ( a , Ġb ) Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Le S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ<= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Le U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . compare Unsigned ( a , Ġb ) Ġ<= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Ge S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ>= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Ge U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . compare Unsigned ( a , Ġb ) Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Eq z Ġ-> Ġnext Ġ{ Ġpush ( pop Long () Ġ== Ġ 0 L ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Eq Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Ne Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ!= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Lt S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ< Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Lt U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . compare Unsigned ( a , Ġb ) Ġ< Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Gt S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ> Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Gt U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . compare Unsigned ( a , Ġb ) Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Le S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ<= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Le U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . compare Unsigned ( a , Ġb ) Ġ<= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Ge S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ>= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Ge U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . compare Unsigned ( a , Ġb ) Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Eq Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Ne Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ!= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Lt Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ< Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Gt Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ> Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Le Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ<= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Ge Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ>= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Eq Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Ne Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ!= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Lt Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ< Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Gt Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ> Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Le Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ<= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Ge Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ>= Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Cl z Ġ-> Ġnext Ġ{ Ġpush ( Integer . numberOf Leading Z eros ( pop Int ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 C tz Ġ-> Ġnext Ġ{ Ġpush ( Integer . numberOf Trailing Z eros ( pop Int ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Pop cnt Ġ-> Ġnext Ġ{ Ġpush ( Integer . bit Count ( pop Int ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Add Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Sub Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Mul Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Div S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . checked Signed Div Integer ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ/ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Div U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . divide Unsigned ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Rem S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ% Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Rem U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . remainder Unsigned ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 And Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġand Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Or Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġor Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Xor Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġxor Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Sh l Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġshl Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Sh r S Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġshr Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Sh r U Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ ush r Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Rot l Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . rotate Left ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Ro tr Ġ-> Ġnext Bin Op ( pop Int (), Ġpop Int ()) Ġ{ Ġa , Ġb Ġ-> ĠInteger . rotate Right ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Cl z Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Long . numberOf Leading Z eros ( pop Long ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 C tz Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Long . numberOf Trailing Z eros ( pop Long ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Pop cnt Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Long . bit Count ( pop Long ()). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Add Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Sub Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Mul Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Div S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . checked Signed Div Integer ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ/ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Div U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . divide Unsigned ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Rem S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ% Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Rem U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . remainder Unsigned ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 And Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġand Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Or Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġor Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Xor Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġxor Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Sh l Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġshl Ġb . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Sh r S Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġshr Ġb . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Sh r U Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ ush r Ġb . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Rot l Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . rotate Left ( a , Ġb . toInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Ro tr Ġ-> Ġnext Bin Op ( pop Long (), Ġpop Long ()) Ġ{ Ġa , Ġb Ġ-> Ġjava . lang . Long . rotate Right ( a , Ġb . toInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Abs Ġ-> Ġnext Ġ{ Ġpush ( Math . abs ( pop Float ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Neg Ġ-> Ġnext Ġ{ Ġpush (- pop Float ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Ce il Ġ-> Ġnext Ġ{ Ġpush ( Math . ceil ( pop Float (). toDouble ()). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Floor Ġ-> Ġnext Ġ{ Ġpush ( Math . floor ( pop Float (). toDouble ()). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Trunc Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Float (). toDouble (). let Ġ{ Ġpush (( if Ġ( it Ġ>= Ġ 0 . 0 ) ĠMath . floor ( it ) Ġelse ĠMath . ceil ( it )). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Nearest Ġ-> Ġnext Ġ{ Ġpush ( Math . rint ( pop Float (). toDouble ()). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Sqrt Ġ-> Ġnext Ġ{ Ġpush ( Math . sqrt ( pop Float (). toDouble ()). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Add Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Sub Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Mul Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Div Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ/ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Min Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . min ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Max Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . max ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Copy Sign Ġ-> Ġnext Bin Op ( pop Float (), Ġpop Float ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . copy Sign ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Abs Ġ-> Ġnext Ġ{ Ġpush ( Math . abs ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Neg Ġ-> Ġnext Ġ{ Ġpush (- pop Double ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Ce il Ġ-> Ġnext Ġ{ Ġpush ( Math . ceil ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Floor Ġ-> Ġnext Ġ{ Ġpush ( Math . floor ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Trunc Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Double (). let Ġ{ Ġpush (( if Ġ( it Ġ>= Ġ 0 . 0 ) ĠMath . floor ( it ) Ġelse ĠMath . ceil ( it ))) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Nearest Ġ-> Ġnext Ġ{ Ġpush ( Math . rint ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Sqrt Ġ-> Ġnext Ġ{ Ġpush ( Math . sqrt ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Add Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Sub Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Mul Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Div Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ/ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Min Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . min ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Max Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . max ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Copy Sign Ġ-> Ġnext Bin Op ( pop Double (), Ġpop Double ()) Ġ{ Ġa , Ġb Ġ-> ĠMath . copy Sign ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Wrap I 6 4 Ġ-> Ġnext Ġ{ Ġpush ( pop Long (). toInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġtrunc Ġtr aps Ġon Ġoverflow ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Trunc SF 3 2 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Float (), Ġtrue ) Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Trunc UF 3 2 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Float (), Ġfalse ) Ġ{ Ġit . to Long (). toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Trunc SF 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Double (), Ġtrue ) Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Trunc UF 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Double (), Ġfalse ) Ġ{ Ġit . to Long (). toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Extend SI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Extend UI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). to Unsigned Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Trunc SF 3 2 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Float (), Ġtrue ) Ġ{ Ġit . to Long () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Trunc UF 3 2 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Float (), Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġover Ġmax Ġlong , Ġsubtract Ġand Ġneg ate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 f ) Ġit . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ(- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 8 f Ġ+ Ġ( it Ġ- Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 f )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Trunc SF 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Double (), Ġtrue ) Ġ{ Ġit . to Long () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Trunc UF 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( ctx . checked Trunc ( pop Double (), Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġover Ġmax Ġlong , Ġsubtract Ġand Ġneg ate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 . 0 ) Ġit . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ(- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 8 . 0 Ġ+ Ġ( it Ġ- Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 . 0 )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Convert SI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Convert UI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). to Unsigned Long (). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Convert SI 6 4 Ġ-> Ġnext Ġ{ Ġpush ( pop Long (). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Convert UI 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( pop Long (). let Ġ{ Ġif Ġ( it Ġ>= Ġ 0 ) Ġit . toFloat () Ġelse Ġ( it Ġ ush r Ġ 1 ). toFloat () Ġ* Ġ 2 f Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Dem ote F 6 4 Ġ-> Ġnext Ġ{ Ġpush ( pop Double (). toFloat ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Convert SI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). toDouble ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Convert UI 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Int (). to Unsigned Long (). toDouble ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Convert SI 6 4 Ġ-> Ġnext Ġ{ Ġpush ( pop Long (). toDouble ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Convert UI 6 4 Ġ-> Ġnext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( pop Long (). let Ġ{ Ġif Ġ( it Ġ>= Ġ 0 ) Ġit . toDouble () Ġelse Ġ(( it Ġ ush r Ġ 1 ) Ġor Ġ( it Ġand Ġ 1 )) Ġ* Ġ 2 . 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Prom ote F 3 2 Ġ-> Ġnext Ġ{ Ġpush ( pop Float (). toDouble ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Re interpret F 3 2 Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Float . float To Raw Int Bits ( pop Float ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Re interpret F 6 4 Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Double . double To Raw Long Bits ( pop Double ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Re interpret I 3 2 Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Float . int Bits To Float ( pop Int ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Re interpret I 6 4 Ġ-> Ġnext Ġ{ Ġpush ( java . lang . Double . long Bits ToDouble ( pop Long ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠInterpreter () ĊĊĠĠĠ Ġ// ĠCreating Ġthis Ġdoes Ġall Ġthe Ġinitialization Ġexcept Ġexecute Ġthe Ġstart Ġfunction ĊĠĠĠ Ġdata Ġclass ĠContext ( ĊĠĠĠĠĠĠĠ Ġval Ġmod : ĠNode . Module , ĊĠĠĠĠĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLogger . Print ( Logger . Level . OFF ), ĊĠĠĠĠĠĠĠ Ġval Ġinterpreter : ĠInterpreter Ġ= ĠInterpreter . Companion , ĊĠĠĠĠĠĠĠ Ġval Ġimports : ĠImports Ġ= ĠImports . None , ĊĠĠĠĠĠĠĠ Ġval Ġdefault Max Mem Pages : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġval Ġmem ByteBuffer Direct : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġcheck Trunc Overflow : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġcheck Signed Div Integer Overflow : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġmaximum Call Stack Depth : ĠInt Ġ= Ġ 3 0 0 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= Ġmutable ListOf < Func Context >() ĊĠĠĠĠĠĠĠ Ġval Ġcurr Func Ctx Ġget () Ġ= Ġcall Stack . last () ĊĠĠĠĠĠĠĠ Ġval Ġmaybe Curr Func Ctx Ġget () Ġ= Ġcall Stack . last OrNull () ĊĊĠĠĠĠĠĠĠ Ġval Ġexports ByName Ġ= Ġmod . exports . map Ġ{ Ġit . field Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġfun Ġexport Index ( field : ĠString , Ġkind : ĠNode . External Kind ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexports ByName [ field ]?. take If Ġ{ Ġit . kind Ġ== Ġkind Ġ} ?. index ĊĊĠĠĠĠĠĠĠ Ġval Ġimport Globals Ġ= Ġmod . imports . filter Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Global Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġsingle Constant ( instr s : ĠList < Node . Instr >): ĠNumber ? Ġ= Ġinstr s . single OrNull (). let Ġ{ Ġinstr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( instr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Args . Const < *> Ġ-> Ġinstr . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Get Global Ġ-> Ġimport Globals . get OrNull ( instr . index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ?: Ġthrow ĠCompile Err . Unknown Global ( instr . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimports . getGlobal ( it . module , Ġit . field , Ġ( it . kind Ġas ĠNode . Import . Kind . Global ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmaybe Mem Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImport Ġit Ġif Ġwe Ġcan , Ġotherwise Ġmake Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Import Ġ= Ġmod . imports . single OrNull Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Memory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġvalidate Ġimported Ġmemory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mem Import Ġ!= Ġnull ) Ġimports . get Memory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Import . module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Import . field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( mem Import . kind Ġas ĠNode . Import . Kind . Memory ). type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġmod . mem ories . single OrNull ()?. let Ġ{ Ġmem Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġ( mem Type . limits . maximum Ġ?: Ġdefault Max Mem Pages ) Ġ* ĠMem . PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Ġ= Ġif Ġ( mem ByteBuffer Direct ) ĠByteBuffer . allocate Direct ( max ) Ġelse ĠByteBuffer . allocate ( max ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit ( mem Type . limits . initial Ġ* ĠMem . PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem ?. also Ġ{ Ġmem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġall Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod . data . forEach Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġsingle Constant ( data . offset ) Ġas ? ĠInt Ġ?: Ġthrow ĠCompile Err . Offset Not Constant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ< Ġ 0 Ġ|| Ġpos Ġ+ Ġdata . data . size Ġ> Ġmem . limit ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Invalid Data Index ( pos , Ġdata . data . size , Ġmem . limit ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem . duplicate (). apply Ġ{ Ġposition ( pos ) Ġ}. put ( data . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmem Ġget () Ġ= Ġmaybe Mem Ġ?: Ġthrow ĠCompile Err . Unknown Memory ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsome Ġof Ġthis Ġshares Ġwith Ġthe Ġcompiler 's Ġcontext , Ġso Ġhow Ġabout Ġsome Ġcode Ġreuse ? ĊĠĠĠĠĠĠĠ Ġval Ġimport Funcs Ġ= Ġmod . imports . filter Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Func Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġtype AtIndex ( index : ĠInt ) Ġ= Ġmod . types . get OrNull ( index ) Ġ?: Ġthrow ĠCompile Err . Unknown Type ( index ) ĊĠĠĠĠĠĠĠ Ġfun Ġfunc AtIndex ( index : ĠInt ) Ġ= Ġimport Funcs . get OrNull ( index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠEither . Right ( mod . funcs . get OrNull ( index Ġ- Ġimport Funcs . size ) Ġ?: Ġthrow ĠCompile Err . Unknown Func ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠEither . Left ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġfunc Type AtIndex ( index : ĠInt ) Ġ= Ġfunc AtIndex ( index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> Ġtype AtIndex (( it . v . kind Ġas ĠNode . Import . Kind . Func ). type Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġit . v . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġbound Func Method Handle AtIndex ( index : ĠInt ): ĠMethod Handle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġfunc Type AtIndex ( index ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Type . method Type ( it . ret ?. j class Ġ?: ĠVoid . TYPE , Ġit . params . map Ġ{ Ġit . j class Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig M h Ġ= ĠMethod Handles . lookup (). bind ( interpreter , Ġ" exec Func ", ĠMethod Type . method Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNumber :: class . java , ĠContext :: class . java , ĠInt :: class . java , ĠArray < Number >:: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . insert Arguments ( orig M h , Ġ 0 , Ġthis , Ġindex ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Var args Collector ( Array < Number >:: class . java ). as Type ( type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Globals Ġ= Ġmod . globals . map Indexed Ġ{ Ġindex , Ġglobal Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn ĠM VP Ġall Ġglobals Ġhave Ġan Ġinit , Ġit 's Ġeither Ġa Ġconst Ġor Ġan Ġimport Ġread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Val Ġ= Ġsingle Constant ( global . init ) Ġ?: Ġthrow ĠCompile Err . Global Init Not Constant ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( init Val . valueType Ġ!= Ġglobal . type . contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCompile Err . Global Constant Mismatch ( index , Ġglobal . type . contentType . type Ref , Ġinit Val :: class . ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Val ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġfun Ġglobal Type AtIndex ( index : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( import Globals . get OrNull ( index )?. kind Ġas ? ĠNode . Import . Kind . Global )?. type Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod . globals [ index Ġ- Ġimport Globals . size ]. type ĊĠĠĠĠĠĠĠ Ġfun Ġget Global ( index : ĠInt ): ĠNumber Ġ= Ġimport Globals . get OrNull ( index ). let Ġ{ Ġimport Global Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import Global Ġ!= Ġnull ) Ġimports . getGlobal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Global . module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Global . field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( import Global . kind Ġas ĠNode . Import . Kind . Global ). type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġmodule Globals . get OrNull ( index Ġ- Ġimport Globals . size ) Ġ?: Ġerror (" No Ġglobal ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Global ( index : ĠInt , Ġv : ĠNumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Global Ġ= Ġimport Globals . get OrNull ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import Global Ġ!= Ġnull ) Ġimports . set Global ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Global . module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Global . field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( import Global . kind Ġas ĠNode . Import . Kind . Global ). type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ( index Ġ- Ġimport Globals . size ). also Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( index Ġ< Ġmodule Globals . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Globals [ index ] Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Table Ġ= Ġmod . imports . single OrNull Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Table Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġ( import Table ?. kind Ġas ? ĠNode . Import . Kind . Table )?. type Ġ?: Ġmod . tables . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( table Ġ== Ġnull Ġ&& Ġmod . elems . isNotEmpty ()) Ġthrow ĠCompile Err . Unknown Table ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable ?. let Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġarray Ġeither Ġcloned Ġfrom Ġimport Ġor Ġfresh ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġimport Table ?. let Ġ{ Ġimports . getTable ( it . module , Ġit . field , Ġtable ) Ġ} Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf Null s ( table . limits . initial ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġput Ġall Ġthe Ġelements Ġin Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod . elems . forEach Ġ{ Ġelem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( elem . index Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOffset Ġindex Ġalways Ġa Ġconstant Ġor Ġimport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Val Ġ= Ġsingle Constant ( elem . offset ) Ġas ? ĠInt Ġ?: Ġthrow ĠCompile Err . Offset Not Constant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStill Ġhave Ġto Ġvalidate Ġoffset Ġeven Ġif Ġno Ġfunc Ġindexes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Val Ġ< Ġ 0 Ġ|| Ġoffset Val Ġ+ Ġelem . func Indices . size Ġ> Ġarr . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Invalid Elem Index ( offset Val , Ġelem . func Indices . size , Ġarr . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelem . func Indices . forEach Indexed Ġ{ Ġindex , Ġfunc Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarr [ offset Val Ġ+ Ġindex ] Ġ= Ġbound Func Method Handle AtIndex ( func Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠNumber > Ġchecked Trunc ( orig : ĠFloat , Ġsigned : ĠBoolean , Ġto : Ġ( Float ) Ġ-> ĠT ) Ġ= Ġto ( orig ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Trunc Overflow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orig . isNaN ()) Ġthrow ĠInter pret Err . Trunc Integer NaN ( orig , Ġit . valueType !! , Ġsigned ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠInt Ġ&& Ġsigned Ġ&& Ġ( orig Ġ< Ġ- 2 1 4 7 4 8 3 6 4 8 f Ġ|| Ġorig Ġ>= Ġ 2 1 4 7 4 8 3 6 4 8 f )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠInt Ġ&& Ġ! signed Ġ&& Ġ( orig . toInt () Ġ< Ġ 0 Ġ|| Ġorig Ġ>= Ġ 4 2 9 4 9 6 7 2 9 6 f )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠLong Ġ&& Ġsigned Ġ&& Ġ( orig Ġ< Ġ- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 f Ġ|| Ġorig Ġ>= Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 f )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠLong Ġ&& Ġ! signed Ġ&& Ġ( orig . toInt () Ġ< Ġ 0 Ġ|| Ġorig Ġ>= Ġ 1 8 4 4 6 7 4 4 0 7 3 7 0 9 5 5 1 6 1 6 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invalid ) Ġthrow ĠInter pret Err . Trunc Integer Overflow ( orig , Ġit . valueType !! , Ġsigned ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠNumber > Ġchecked Trunc ( orig : ĠDouble , Ġsigned : ĠBoolean , Ġto : Ġ( Double ) Ġ-> ĠT ) Ġ= Ġto ( orig ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Trunc Overflow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orig . isNaN ()) Ġthrow ĠInter pret Err . Trunc Integer NaN ( orig , Ġit . valueType !! , Ġsigned ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠInt Ġ&& Ġsigned Ġ&& Ġ( orig Ġ< Ġ- 2 1 4 7 4 8 3 6 4 8 . 0 Ġ|| Ġorig Ġ>= Ġ 2 1 4 7 4 8 3 6 4 8 . 0 )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠInt Ġ&& Ġ! signed Ġ&& Ġ( orig . toInt () Ġ< Ġ 0 Ġ|| Ġorig Ġ>= Ġ 4 2 9 4 9 6 7 2 9 6 . 0 )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠLong Ġ&& Ġsigned Ġ&& Ġ( orig Ġ< Ġ- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 . 0 Ġ|| Ġorig Ġ>= Ġ 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 . 0 )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġis ĠLong Ġ&& Ġ! signed Ġ&& Ġ( orig . toInt () Ġ< Ġ 0 Ġ|| Ġorig Ġ>= Ġ 1 8 4 4 6 7 4 4 0 7 3 7 0 9 5 5 1 6 1 6 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invalid ) Ġthrow ĠInter pret Err . Trunc Integer Overflow ( orig , Ġit . valueType !! , Ġsigned ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġchecked Signed Div Integer ( a : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Signed Div Integer Overflow Ġ&& Ġ( a Ġ== ĠInt . MIN _ VALUE Ġ&& Ġb Ġ== Ġ- 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInter pret Err . Signed Div Overflow ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġchecked Signed Div Integer ( a : ĠLong , Ġb : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Signed Div Integer Overflow Ġ&& Ġ( a Ġ== ĠLong . MIN _ VALUE Ġ&& Ġb Ġ== Ġ- 1 L )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInter pret Err . Signed Div Overflow ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Next Is nt Stack Overflow () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġnote Ġthis Ġdoesn 't Ġkeep Ġcount Ġof Ġimports Ġand Ġtheir Ġcall Ġstack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Stack . size Ġ+ Ġ 1 Ġ>= Ġmaximum Call Stack Depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġblow Ġaway Ġthe Ġentire Ġstack Ġhere Ġso Ġcode Ġcan Ġcontinue ... could Ġprovide Ġstack Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexception Ġif Ġwe Ġwanted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Stack . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInter pret Err . Stack Overflow ( maximum Call Stack Depth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFunc Context ( ĊĠĠĠĠĠĠĠ Ġval Ġfunc Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġfunc : ĠNode . Func , ĊĠĠĠĠĠĠĠ Ġval Ġvalue Stack : ĠMutable List < Number > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠ Ġval Ġblock Stack : ĠMutable List < Block > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠ Ġvar Ġinsn Index : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocals Ġ= Ġ( func . type . params Ġ+ Ġfunc . locals ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . I 3 2 Ġ-> Ġ 0 Ġas ĠNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . I 6 4 Ġ-> Ġ 0 L Ġas ĠNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . F 3 2 Ġ-> Ġ 0 f Ġas ĠNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . F 6 4 Ġ-> Ġ 0 . 0 Ġas ĠNumber ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġfun Ġpeek () Ġ= Ġvalue Stack . last () ĊĠĠĠĠĠĠĠ Ġfun Ġpop () Ġ= Ġvalue Stack . remove At ( value Stack . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġfun Ġpop Int () Ġ= Ġpop () Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġpop Long () Ġ= Ġpop () Ġas ĠLong ĊĠĠĠĠĠĠĠ Ġfun Ġpop Float () Ġ= Ġpop () Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġfun Ġpop Double () Ġ= Ġpop () Ġas ĠDouble ĊĠĠĠĠĠĠĠ Ġfun ĠNode . Instr . Args . Align Offset . pop Mem Addr (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġpop Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ> ĠInt . MAX _ VALUE Ġ|| Ġoffset Ġ+ Ġv Ġ> ĠInt . MAX _ VALUE ) Ġthrow ĠInter pret Err . OutOfBounds Memory ( v , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv Ġ+ Ġoffset . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġpop ( type : ĠNode . Type . Value ): ĠNumber Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . I 3 2 Ġ-> Ġpop Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . I 6 4 Ġ-> Ġpop Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . F 3 2 Ġ-> Ġpop Float () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Type . Value . F 6 4 Ġ-> Ġpop Double () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġpop Call Args ( type : ĠNode . Type . Func ) Ġ= Ġtype . params . reversed (). map (:: pop ). reversed () ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( v : ĠNumber ) Ġ{ Ġvalue Stack Ġ+= Ġv Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( v : ĠBoolean ) Ġ{ Ġvalue Stack Ġ+= Ġif Ġ( v ) Ġ 1 Ġelse Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcurrent Block End OrElse ( end : ĠBoolean ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġnext Ġend / else ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblock Depth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġfunc . instructions . drop ( insn Index Ġ+ Ġ 1 ). indexOf First Ġ{ Ġinsn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIncrease Ġblock Ġdepth Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( insn ) Ġ{ Ġis ĠNode . Instr . Block , Ġis ĠNode . Instr . Loop , Ġis ĠNode . Instr . If Ġ-> Ġblock Depth ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġat Ġthe Ġend Ġof Ġour self Ġbut Ġnot Ġlooking Ġfor Ġend , Ġshort - circuit Ġa Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Depth Ġ== Ġ 0 Ġ&& Ġ! end Ġ&& Ġinsn Ġis ĠNode . Instr . End ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDid Ġwe Ġfind Ġan Ġend Ġor Ġan Ġelse Ġon Ġour self ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġblock Depth Ġ== Ġ 0 Ġ&& Ġ(( end Ġ&& Ġinsn Ġis ĠNode . Instr . End ) Ġ|| Ġ(! end Ġ&& Ġinsn Ġis ĠNode . Instr . Else )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Depth Ġ> Ġ 0 Ġ&& Ġinsn Ġis ĠNode . Instr . End ) Ġblock Depth -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( index Ġ== Ġ- 1 ) Ġnull Ġelse Ġindex Ġ+ Ġinsn Index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġcurrent Block End () Ġ= Ġcurrent Block End OrElse ( true ) ĊĠĠĠĠĠĠĠ Ġfun Ġcurrent Block Else (): ĠInt ? Ġ= Ġcurrent Block End OrElse ( false ) ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġnext ( cross inline Ġf : Ġ() Ġ-> ĠUnit ) Ġ= ĠStep Result . Next . also Ġ{ Ġf () Ġ} ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< T , ĠU > Ġnext Bin Op ( second : ĠT , Ġfirst : ĠU , Ġcross inline Ġf : Ġ( U , ĠT ) Ġ-> ĠAny ) Ġ= ĠStep Result . Next . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġf ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġis ĠBoolean ) Ġpush ( v ) Ġelse Ġpush ( v Ġas ĠNumber ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBlock ( ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġinsn : ĠNode . Instr . Args . Type , ĊĠĠĠĠĠĠĠ Ġval Ġstack Size At Start : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġend Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġelse Index : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġsealed Ġclass ĠStep Result Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠNext Ġ: ĠStep Result () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠBranch ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Depth : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailed If : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforce End On Loop : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠStep Result () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠCall ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs : ĠList < Number >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠNode . Type . Func ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠStep Result () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠCall Indirect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs : ĠList < Number >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠNode . Type . Func ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠStep Result () ĊĠĠĠĠĠĠĠ Ġobject ĠUn reachable Ġ: ĠStep Result () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠReturn ( val Ġv : ĠNumber ?) Ġ: ĠStep Result () ĊĠĠĠ Ġ} Ċ }