package Ġnet . n ich olas gw ong . tol u . rt . impl . vm Ċ Ċ import Ġnet . n ich olas gw ong . mis ck t . ext . format Exception Ċ import Ġnet . n ich olas gw ong . mis ck t . ext . slf 4 j Logger Ċ import Ġnet . n ich olas gw ong . tol u . rt . impl . vm . dispatch . DISPATCH Ċ import Ġnet . n ich olas gw ong . tol u . rt . impl . vm . dispatch . verify Dispatch Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġnet . n ich olas gw ong . tol u .* Ċ import Ġnet . n ich olas gw ong . tol u . rt .* Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ Ċ private Ġconst Ġval ĠDEFAULT _ TIME _ S LIC E Ġ= Ġ 6 0 Ċ private Ġconst Ġval ĠMAX _ STACK _ LEVEL Ġ= Ġ 2 5 6 Ċ Ċ class ĠT ol u Stack Exception ( s : ĠString ) Ġ: ĠRuntimeException ( s ) Ċ class ĠT ol u No Active Frame Exception Ġ: ĠIllegalStateException (" No Ġactive Ġframe ") Ċ class ĠT ol u Stack Level Too Deep Exception Ġ: ĠIllegalStateException (" Stack Ġlevel Ġhas Ġexceeded Ġmax Ġ$ MAX _ STACK _ LEVEL ") Ċ Ċ type alias ĠExt Fn Ġ= Ġ( VM State , ĠCor outine Scope , ĠList < Variable >) Ġ-> ĠUnit Ċ Ċ data Ġclass ĠExt Invocation ( val Ġc : ĠCor outine Scope ) Ċ Ċ private Ġdata Ġclass ĠT ol u VM Frame ( val Ġparent Frame : ĠT ol u VM Frame ?, Ġval Ġfn Id : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġip : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġval Ġstack : ĠDe que < Variable > Ġ= ĠArray Deque () ĊĠĠĠ Ġval Ġlocals : ĠMutable Map < Int , ĠVariable > Ġ= ĠHashMap () Ċ } Ċ Ċ private Ġclass ĠT ol u VM State ( val Ġprogram : ĠComp iled Program , Ġprivate Ġval Ġext Fns : ĠMap < String , ĠExt Fn >) Ġ: ĠVM State Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRETURN _ OFFSET : ĠInt Ġ= Ġ- 1 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġs lf 4 j Logger ( T ol u VM State :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġcurrent State : ĠT ol u Program State Ġ= ĠT ol u Program State . Inactive ĊĠĠĠ Ġoverride Ġvar ĠreturnValue : ĠVariable ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġframes Ġ: ĠArray Deque < T ol u VM Frame > Ġ= ĠArray Deque () ĊĠĠĠ Ġvar Ġip Offset : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġadditional : ĠAny ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġexec Done Callback : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġstate Mutex Ġ= ĠMutex ( false ) ĊĊĊĠĠĠ Ġfun Ġcurrent Frame (): ĠT ol u VM Frame ? Ġ= Ġframes . peek () ĊĊĠĠĠ Ġfun Ġnew Frame ( fn Id : ĠInt ): ĠT ol u VM Frame Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . debug (" New Ġframe : Ġ$ fn Id ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( frames . size Ġ== ĠMAX _ STACK _ LEVEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠT ol u Stack Level Too Deep Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnf Ġ= ĠT ol u VM Frame ( current Frame (), Ġfn Id ) ĊĠĠĠĠĠĠĠ Ġframes . add ( nf ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnf ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Frame () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc frame Ġ= Ġcurrent Frame () ĊĠĠĠĠĠĠĠ Ġif Ġ( c frame Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c frame . parent Frame Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Pop ĠFrame : ĠHas ĠParent ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframes . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( returnValue Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= ĠreturnValue !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( returnValue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . returnValue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Pop ĠFrame : ĠNo ĠParent . ĠBy e Ġby e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Inactive ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠT ol u No Active Frame Exception () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġset Finished Callback ( callback : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . lock () ĊĊĠĠĠĠĠĠĠ Ġexec Done Callback Ġ= Ġcallback ĊĊĠĠĠĠĠĠĠ Ġstate Mutex . unlock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġset Additional Data ( additional : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . lock () ĊĊĠĠĠĠĠĠĠ Ġthis . additional Ġ= Ġadditional ĊĊĠĠĠĠĠĠĠ Ġstate Mutex . unlock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Local ( i : ĠInt ): ĠVariable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġ( current Frame ()?. locals Ġ?: Ġthrow ĠT ol u No Active Frame Exception ())[ i ] Ġ?: Ġthrow ĠT ol u NoSuch Local Exception ( i ) ĊĠĠĠĠĠĠĠ ĠLOG . debug (" Ġ ĠGet Local Ġ$ i Ġ=> Ġ$ l ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Local ( i : ĠInt , Ġv : ĠVariable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . debug (" Ġ ĠSet Local Ġ$ i : Ġ$ v ") ĊĠĠĠĠĠĠĠ Ġcurrent Frame ()?. locals ?. put ( i , Ġv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpush ( v : ĠVariable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Frame ()?. stack ?. push ( v ) Ġ?: ĠT ol u No Active Frame Exception () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpop (): ĠVariable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( current Frame ()?. stack Ġ?: Ġthrow ĠT ol u No Active Frame Exception ()). pop () Ġ?: Ġthrow ĠT ol u Stack Exception (" Cannot Ġpop . ĠStack ĠEmpty ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetString ( i : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprogram . str Table [ i ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Next Instr Offset ( new Offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġip Offset Ġ= Ġnew Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenter Function ( id : ĠInt , Ġvars : ĠList < Variable >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . debug (" Enter Ġfunction : Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġnew Frame ( id ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvc Ġ= Ġv . copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Local ( i , Ġvc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexit Function () Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . debug (" Exit Ġfunction ") ĊĠĠĠĠĠĠĠ Ġip Offset Ġ= ĠRETURN _ OFFSET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġext Call ( fn Name : ĠString , Ġc : ĠCor outine Scope , Ġvars : ĠList < Variable >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ext Fns . containsKey ( fn Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġext Fns [ fn Name ] !! ( this , Ġc , Ġvars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Sleep ing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwake () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Running ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrestart ( fn Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . lock () ĊĊĠĠĠĠĠĠĠ Ġframes . clear () ĊĊĠĠĠĠĠĠĠ Ġnew Frame ( fn Id ) ĊĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Running ĊĊĠĠĠĠĠĠĠ Ġstate Mutex . unlock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfinalize Process () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . lock () ĊĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Final izing ĊĊĠĠĠĠĠĠĠ Ġstate Mutex . unlock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( c : ĠCor outine Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfn Ġ= Ġprogram . fn Table [ current Frame ()?. fn Id Ġ?: Ġthrow ĠT ol u No Active Frame Exception ()] ĊĠĠĠĠĠĠĠ Ġwhen Ġ( fn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocal Function Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġcurrent Frame () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġframe . ip ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip Ġ>= Ġfn . ops . size Ġ|| Ġip Ġ== ĠRETURN _ OFFSET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġwe Ġshould Ġreturn Ġor Ġjust Ġend Ġthe Ġprogram ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Function Ġexit Ġdetected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Frame () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Op ( c , Ġfn . ops [ ip ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . ip Ġ= Ġthis . ip Offset Ġ?: Ġ++ frame . ip ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Execute ĠIP : Ġ$ ip Ġ= Ġ${ fn . ops [ ip ] }. ĠNext : Ġ${ frame . ip }") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ip Offset Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠImport ed Function Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Inactive ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Imported Ġfunctions Ġare Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid Function Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Done Callback Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠT ol u Program State . Inactive ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġfunction Ġtable Ġentry Ġdetected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Op ( c : ĠCor outine Scope , Ġop : ĠOp ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDIS PATCH [ op . instruction . op . toInt ()]. execute ( op , Ġc , this ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠT ol u VM V 1 Ġ: ĠT ol u VM Submit ter , ĠT ol u VM Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġs lf 4 j Logger ( T ol u VM V 1 :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandles : ĠMutable Map < T ol u VM Handle , ĠT ol u VM State > Ġ= ĠHashMap () ĊĊĠĠĠ Ġprivate Ġvar Ġis Running : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġvm Coroutine Handle : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġhandle Table Lock : ĠMutex Ġ= ĠMutex ( false ) ĊĠĠĠ Ġprivate Ġval Ġloop Channel : ĠChannel < Unit > Ġ= ĠChannel () ĊĠĠĠ Ġprivate Ġvar Ġext Fns : ĠMutable Map < String , ĠExt Fn > Ġ= ĠHashMap () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġverify Dispatch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ( program : ĠComp iled Program ): ĠT ol u VM Handle Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Id Ġ= Ġhandles . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandles [ new Id ] Ġ= ĠT ol u VM State ( program , Ġext Fns ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( handle : ĠT ol u VM Handle , Ġentry Point : ĠString , Ġcallback : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġhandles [ handle ] Ġ?: Ġthrow ĠT ol u NoSuch Process Exception ( handle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Id Ġ= Ġstate . program . fn Name Table [ entry Point ] Ġ?: Ġthrow ĠT ol u NoSuch Function Exception ( entry Point ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . set Finished Callback ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . restart ( fn Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loop Channel . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Que uing Ġnew Ġexecution . ĠW aking Ġup .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Channel . send ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Additional Data ( handle : ĠT ol u VM Handle , Ġdata : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġhandles [ handle ] Ġ?: Ġthrow ĠT ol u NoSuch Process Exception ( handle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . set Additional Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve ReturnValue ( handle : ĠT ol u VM Handle ): ĠVariable ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġhandles [ handle ] Ġ?: Ġthrow ĠT ol u NoSuch Process Exception ( handle ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . state Mutex . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= Ġstate . returnValue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . returnValue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . state Mutex . unlock () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause ( handle : ĠT ol u VM Handle ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwake ( handle : ĠT ol u VM Handle ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisActive ( handle : ĠT ol u VM Handle ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġhandles [ handle ] Ġ?: Ġthrow ĠT ol u NoSuch Process Exception ( handle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . currentState Ġ== ĠT ol u Program State . Running ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose Process ( handle : ĠT ol u VM Handle , Ġforce : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! force ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandles [ handle ]?. finalize Process () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandles . remove ( handle ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( vm Coroutine Handle Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Coroutine Handle Ġ= Ġvm Coroutine Handle !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm Coroutine Handle . cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġuntil ĠT ol u vm Ġis Ġdone Ġclosing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġvm Coroutine Handle . join () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vm Coroutine Handle Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop Channel . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Loader (): ĠT ol u Loader Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠT ol u V 1 Loader () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun VM () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" T ol u VM Ġis Ġalready Ġrunning ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġvm Coroutine Handle Ġ= ĠGlobal Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm Process ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind External Function ( fn Name : ĠString , Ġfn Impl : ĠExt Fn ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" TODO : ĠBinding Ġexternal Ġfunctions Ġwhen ĠVM Ġis Ġrunning Ġis Ġnot Ġallowed Ġin Ġthis Ġimpl . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Make Ġsure Ġyou Ġbind Ġall Ġneeded Ġfunctions Ġbefore Ġcalling Ġrun VM ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġext Fns [ fn Name ] Ġ= Ġfn Impl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġvm Process ( c : ĠCor outine Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal ized Processes Ġ: ĠMutable List < T ol u VM Handle > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( c . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . lock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnum Still Aw ake Ġ= Ġhandles . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( process Entry Ġin Ġhandles . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġprocess Entry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . state Mutex . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠDEFAULT _ TIME _ S LIC E ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process . currentState Ġ!= ĠT ol u Program State . Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Still Aw ake Ġ-= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . execute ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdo Ġsome Ġreporting . Ġexception Ġshould Ġbe Ġshown Ġin ĠUI Ġsomehow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" Script Ġfailed : Ġ${ format Exception ( e )} ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . exec Done Callback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . currentState Ġ= ĠT ol u Program State . Inactive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process . currentState Ġ== ĠT ol u Program State . Final izing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ized Processes . add ( process Entry . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . state Mutex . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( process Ġin Ġfinal ized Processes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandles . remove ( process ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ized Processes . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Table Lock . unlock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Still Aw ake Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsleep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" No Ġmore Ġprocesses Ġto Ġrun Ġfor Ġnow . ĠGood Ġnight .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Channel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }