package Ġcom . so y wiz . wasm . exporter Ċ Ċ import Ġcom . so y wiz . kor io . error .* Ċ import Ġcom . so y wiz . kor io . util .* Ċ import Ġcom . so y wiz . wasm .* Ċ import Ġcom . so y wiz . wasm . util . Ind enter Ċ import Ġcom . so y wiz . wasm . util .* Ċ import Ġjava . util .* Ċ Ċ data Ġclass ĠExport Config ( ĊĠĠĠ Ġval ĠclassName : ĠString , ĊĠĠĠ Ġval ĠpackageName : ĠString Ġ= Ġ"" Ċ ) Ċ Ċ open Ġclass ĠExport er ( val Ġmodule : ĠW asm Module ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠJAVA _ KEYWORD S Ġ= Ġset Of (" do ", Ġ" while ", Ġ" if ", Ġ" else ", Ġ" void ", Ġ" int ", Ġ" this ") Ġ// Ġ... ĊĠĠĠĠĠĠĠ Ġval ĠP HI _ NAMES Ġ= Ġset Of (" phi _ i 3 2 ", Ġ" phi _ i 6 4 ", Ġ" phi _ f 3 2 ", Ġ" phi _ f 6 4 ", Ġ" java ") ĊĠĠĠĠĠĠĠ Ġval ĠRES ER VED _ LOCAL S Ġ= Ġset Of (" index ") ĊĠĠĠĠĠĠĠ Ġval ĠJAVA _ DEFINED _ NAMES : ĠSet < String > Ġ= ĠJAVA _ KEYWORD S Ġ+ ĠP HI _ NAMES Ġ+ ĠRES ER VED _ LOCAL S ĊĊĠĠĠĠĠĠĠ Ġval ĠO _ RD ONLY Ġ= Ġ 0 x 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠO _ WR ONLY Ġ= Ġ 0 x 0 0 0 1 ĊĠĠĠĠĠĠĠ Ġval ĠO _ RD WR Ġ= Ġ 0 x 0 0 0 2 ĊĠĠĠĠĠĠĠ Ġval ĠO _ CRE AT Ġ= Ġ 0 x 4 0 ĊĠĠĠĠĠĠĠ Ġval ĠO _ EXCL Ġ= Ġ 0 x 8 0 ĊĠĠĠĠĠĠĠ Ġval ĠO _ TRUNC Ġ= Ġ 0 x 2 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠO _ APPEND Ġ= Ġ 0 x 4 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠO _ D SYNC Ġ= Ġ 0 x 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġvoid Ġ= ĠW asm Type . void ĊĠĠĠĠĠĠĠ Ġval Ġi 8 Ġ= ĠW asm Type ._ i 8 ĊĠĠĠĠĠĠĠ Ġval Ġi 1 6 Ġ= ĠW asm Type ._ i 1 6 ĊĠĠĠĠĠĠĠ Ġval Ġi 3 2 Ġ= ĠW asm Type . i 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġi 6 4 Ġ= ĠW asm Type . i 6 4 ĊĠĠĠĠĠĠĠ Ġval Ġf 3 2 Ġ= ĠW asm Type . f 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġf 6 4 Ġ= ĠW asm Type . f 6 4 ĊĊĠĠĠĠĠĠĠ Ġfun Ġtype ( name : ĠString ) Ġ= Ġobject Ġ: ĠW asm Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġid : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsignature : ĠString Ġ= Ġ" ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġarray Type ( type : ĠW asm Type ) Ġ= ĠW asm Type ._ ARRAY ( type ) ĊĠĠĠĠĠĠĠ Ġfun ĠVAR ARG ( type : ĠW asm Type ) Ġ= ĠW asm Type ._ VAR ARG ( type ) ĊĠĠĠĠĠĠĠ Ġval ĠTHROW ABLE Ġ= Ġtype (" Throwable ") ĊĠĠĠĠĠĠĠ Ġval ĠRT EXCEPTION Ġ= Ġtype (" RuntimeException ") ĊĠĠĠĠĠĠĠ Ġval ĠS BUILDER Ġ= Ġtype (" StringBuilder ") ĊĠĠĠĠĠĠĠ Ġval ĠSTR Ġ= Ġtype (" String ") ĊĠĠĠĠĠĠĠ Ġval ĠCHARSET Ġ= Ġtype (" java . nio . charset . Charset ") ĊĠĠĠĠĠĠĠ Ġval ĠB A Ġ= Ġarray Type ( W asm Type ._ i 8 ) ĊĠĠĠĠĠĠĠ Ġval ĠIA Ġ= Ġarray Type ( W asm Type . i 3 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġbool Ġ= ĠW asm Type ._ boolean ĊĠĠĠĠĠĠĠ Ġval Ġint Ġ= ĠW asm Type . i 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġlong Ġ= ĠW asm Type . i 6 4 ĊĠĠĠĠĠĠĠ Ġval Ġfloat Ġ= ĠW asm Type . f 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġdouble Ġ= ĠW asm Type . f 6 4 ĊĠĠĠĠĠĠĠ Ġval ĠFILE Ġ= Ġtype (" java . io . File ") ĊĠĠĠĠĠĠĠ Ġval ĠRA FILE Ġ= Ġtype (" java . io . Random Access File ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval ĠDEFIN ED _ NAMES Ġ= ĠJAVA _ DEFINED _ NAMES ĊĊĠĠĠ Ġopen Ġfun Ġlang Name Allocator () Ġ= ĠName Allocator Ġ{ ĊĠĠĠĠĠĠĠ Ġ// var Ġres Ġ= Ġit . replace ('$ ', Ġ'_ '). replace ('- ', Ġ'_ ') ĊĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġit . replace ('- ', Ġ'_ ') ĊĠĠĠĠĠĠĠ Ġwhile Ġ( res Ġin ĠDEFIN ED _ NAMES ) Ġres Ġ= Ġ"_ $ res " ĊĠĠĠĠĠĠĠ Ġres ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġmodule Ctx Ġ= ĠModule Dump Context () ĊĠĠĠ Ġval Ġfunctions With Import Ġ= Ġmodule . functions . filter Ġ{ Ġit . import Ġ!= Ġnull Ġ} ĊĠĠĠ Ġval Ġfunctions By Import Ġ= Ġfunctions With Import . map Ġ{ Ġit . import !!. import Pair Ġto Ġit Ġ}. toMap () ĊĠĠĠ Ġval Ġhandled Function sWith Import Ġ= ĠLinked HashSet < W asm Func >() ĊĊĠĠĠ Ġval Ġglobal sWith Import Ġ= Ġmodule . globals . filter Ġ{ Ġit . import Ġ!= Ġnull Ġ} ĊĠĠĠ Ġval Ġglobal sBy Import Ġ= Ġglobal sWith Import . map Ġ{ Ġit . import !!. import Pair Ġto Ġit Ġ}. toMap () ĊĊĠĠĠ Ġval Ġhandled Global sWith Import Ġ= ĠLinked HashSet < W asm Global >() ĊĊĠĠĠ Ġval ĠSTACK TOP Ġby Ġlazy Ġ{ get Import Global (" env ", Ġ" STACK TOP ") Ġ?: Ġ" STACK TOP " Ġ} ĊĠĠĠ Ġval ĠSTACK _ MAX Ġby Ġlazy Ġ{ get Import Global (" env ", Ġ" STACK _ MAX ") Ġ?: Ġ" STACK _ MAX " Ġ} ĊĠĠĠ Ġval ĠD Y NA MI CT OP _ PTR Ġby Ġlazy Ġ{ get Import Global (" env ", Ġ" DY NA MI CT OP _ PTR ") Ġ?: Ġ" DY NA MI CT OP _ PTR " Ġ} ĊĠĠĠ Ġval Ġtemp Double Ptr Ġby Ġlazy Ġ{ get Import Global (" env ", Ġ" temp Double Ptr ") Ġ?: Ġ" temp Double Ptr " Ġ} ĊĊĠĠĠ Ġopen Ġval ĠString . as ize Ġget () Ġ= Ġ"$ this . length " ĊĠĠĠ Ġval ĠString . c byte Ġget () Ġ= Ġcast ( i 8 , Ġthis ) ĊĠĠĠ Ġval ĠString . c short Ġget () Ġ= Ġcast ( i 1 6 , Ġthis ) ĊĠĠĠ Ġval ĠString . c int Ġget () Ġ= Ġcast ( i 3 2 , Ġthis ) ĊĠĠĠ Ġval ĠString . cl ong Ġget () Ġ= Ġcast ( i 6 4 , Ġthis ) ĊĠĠĠ Ġval ĠString . c float Ġget () Ġ= Ġcast ( f 3 2 , Ġthis ) ĊĠĠĠ Ġval ĠString . c double Ġget () Ġ= Ġcast ( f 6 4 , Ġthis ) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . un op _ float ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġun op ( op , Ġf 3 2 , Ġf 3 2 , Ġexpr ()) ĊĠĠĠ Ġinline Ġfun ĠInd enter . un op _ double ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġun op ( op , Ġf 6 4 , Ġf 6 4 , Ġexpr ()) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ int _ bool ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġi 3 2 , Ġi 3 2 , Ġ" b 2 i (${ expr () }) ") ĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ int ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġi 3 2 , Ġi 3 2 , Ġexpr ()) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ long _ bool ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġi 6 4 , Ġi 3 2 , Ġ" b 2 i (${ expr () }) ") ĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ long ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġi 6 4 , Ġi 6 4 , Ġexpr ()) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ float _ bool ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġf 3 2 , Ġi 3 2 , Ġ" b 2 i (${ expr () }) ") ĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ float ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġf 3 2 , Ġf 3 2 , Ġexpr ()) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ double _ bool ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġf 6 4 , Ġi 3 2 , Ġ" b 2 i (${ expr () }) ") ĊĠĠĠ Ġinline Ġfun ĠInd enter . bin op _ double ( op : ĠW asm Op , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġbin op ( op , Ġf 6 4 , Ġf 6 4 , Ġexpr ()) ĊĊĠĠĠ Ġinline Ġfun ĠInd enter . un op ( op : ĠW asm Op , Ġarg : ĠW asm Type , Ġret : ĠW asm Type , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= Ġun op ( op , Ġarg , Ġret , Ġexpr ()) ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . bin op ( op : ĠW asm Op , Ġarg : ĠW asm Type , Ġret : ĠW asm Type , Ġexpr : ĠString ) Ġ= ĠFUNC _ INLINE ("$ op ", Ġret , Ġarg (" l "), Ġarg (" r ")) Ġ{ Ġexpr Ġ} ĊĠĠĠ Ġopen Ġfun ĠInd enter . un op ( op : ĠW asm Op , Ġarg : ĠW asm Type , Ġret : ĠW asm Type , Ġexpr : ĠString ) Ġ= ĠFUNC _ INLINE ("$ op ", Ġret , Ġarg (" v ")) Ġ{ Ġexpr Ġ} ĊĊĠĠĠ Ġfun Ġter op ( op : ĠW asm Op , Ġcond : ĠString , Ġstr ue : ĠString , Ġs false : ĠString ) Ġ= Ġt ernary ( cond , Ġstr ue , Ġs false ) ĊĠĠĠ Ġopen Ġfun Ġt ernary ( cond : ĠString , Ġstr ue : ĠString , Ġs false : ĠString ) Ġ= Ġ"( ($ cond ) Ġ? Ġ($ str ue ) Ġ: Ġ($ s false )) " ĊĠĠĠ Ġopen Ġfun Ġcast ( type : ĠW asm Type , Ġexpr : ĠString ) Ġ= Ġ"( (${ type . type () }) ($ expr )) " ĊĠĠĠ Ġopen Ġval ĠAND Ġ= Ġ"& " ĊĠĠĠ Ġopen Ġval ĠOR Ġ= Ġ" |" ĊĠĠĠ Ġopen Ġval ĠXOR Ġ= Ġ"^ " ĊĠĠĠ Ġopen Ġval ĠSH L Ġ= Ġ" <<" ĊĠĠĠ Ġopen Ġval ĠS HR Ġ= Ġ" >> " ĊĠĠĠ Ġopen Ġval ĠU SH R Ġ= Ġ" >> >" ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠInd enter . write Imported Funcs () Ġ{ ĊĠĠĠĠĠĠĠ Ġig lob (" global ", Ġ" NaN ", Ġdouble ) Ġ{ Ġ" java . lang . Double . NaN " Ġ} ĊĠĠĠĠĠĠĠ Ġig lob (" global ", Ġ" Infinity ", Ġdouble ) Ġ{ Ġ" java . lang . Double . POSITIVE _ INFINITY " Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" global . Math ", Ġ" pow ", Ġdouble , Ġdouble (" a "), Ġdouble (" b ")) Ġ{ ĠRETURN (" java . lang . Math . pow ( a , Ġb )") Ġ} ĊĊĠĠĠĠĠĠĠ Ġig lob (" env ", Ġ" table Base ", Ġint ) Ġ{ Ġ" 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġig lob (" env ", Ġ" ABORT ", Ġint ) Ġ{ Ġ"- 1 " Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" getTotal Memory ", Ġint ) Ġ{ ĠRETURN (" heap . limit () ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" en large Memory ", Ġint ) Ġ{ ĠRETURN (""" TODO _ i 3 2 (" en large Memory ") """) Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" abort On Cannot Grow Memory ", Ġvoid ) Ġ{ Ġline (""" TODO (" abort On Cannot Grow Memory "); """) Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" abort Stack Overflow ", Ġvoid , Ġint (" arg ")) Ġ{ Ġline (""" TODO (" abort Stack Overflow "); """) Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" abort ", Ġvoid , Ġint (" v ")) Ġ{ Ġline (""" TODO (" ABORT : Ġ" Ġ+ Ġv ); """) Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ"_ abort ", Ġvoid ) Ġ{ Ġline (" TODO (\" ABORT \ "); ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ i ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ ii ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ iii ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ ii ii ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ v ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ vi ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ v ii ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" null Func _ v iii ", Ġint , Ġint (" v ")) Ġ{ ĠRETURN (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" ___ assert _ fail ", Ġvoid , Ġint (" a "), Ġint (" b "), Ġint (" c "), Ġint (" d ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" TODO (\" ___ assert _ fail \") ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" ___ lock ", Ġvoid , Ġint (" addr ")) Ġ{ Ġline ("") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" ___ unlock ", Ġvoid , Ġint (" addr ")) Ġ{ Ġline ("") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ"_ em scripten _ memcpy _ big ", Ġint , Ġint (" dst "), Ġint (" src "), Ġint (" count ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" System . arraycopy ( heap Bytes , Ġsrc , Ġheap Bytes , Ġdst , Ġcount )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" dst ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ" ___ set Err No ", Ġvoid , Ġint (" error ")) Ġ{ Ġline ("") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ"_ exit ", Ġvoid , Ġint (" code ")) Ġ{ Ġline (" System . exit ( code ); ") Ġ} ĊĠĠĠĠĠĠĠ Ġif unc (" env ", Ġ"_ time ", Ġint , Ġint (" addr ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" time "), Ġ"( System . currentTimeMillis () Ġ/ Ġ 1 0 0 0 L ) ". c int ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" addr Ġ!= Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" sw ( addr , Ġtime )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" time ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( func Ġin Ġfunctions With Import Ġ- Ġhandled Function sWith Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Un imported Ġfunction Ġ${ func . import }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠInd enter . write Base Ops () Ġ{ ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 3 2 _ load , Ġint ) Ġ{ Ġ" heap . getInt ( check A Read ( address , Ġoffset , Ġalign , Ġ 4 )) " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load , Ġlong ) Ġ{ Ġ" heap . getLong ( check A Read ( address , Ġoffset , Ġalign , Ġ 8 )) " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ f 3 2 _ load , Ġfloat ) Ġ{ Ġ" heap . get Float ( check A Read ( address , Ġoffset , Ġalign , Ġ 4 )) " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ f 6 4 _ load , Ġdouble ) Ġ{ Ġ" heap . getDouble ( check A Read ( address , Ġoffset , Ġalign , Ġ 8 )) " Ġ} ĊĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 3 2 _ load 8 _ s , Ġint ) Ġ{ Ġ" heap . get ( check A Read ( address , Ġoffset , Ġalign , Ġ 1 )) ". c int Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 3 2 _ load 8 _ u , Ġint ) Ġ{ Ġ"${ " heap . get ( check A Read ( address , Ġoffset , Ġalign , Ġ 1 )) ". c int } Ġ$ AND Ġ 0 xFF " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 3 2 _ load 1 6 _ s , Ġint ) Ġ{ Ġ" heap . get Short ( check A Read ( address , Ġoffset , Ġalign , Ġ 2 )) ". c int Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 3 2 _ load 1 6 _ u , Ġint ) Ġ{ Ġ"${ " heap . get Short ( check A Read ( address , Ġoffset , Ġalign , Ġ 2 )) ". c int } Ġ$ AND Ġ 0 xFFFF " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 8 _ s , Ġlong ) Ġ{ Ġ" heap . get ( check A Read ( address , Ġoffset , Ġalign , Ġ 1 )) ". cl ong Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 8 _ u , Ġlong ) Ġ{ Ġ"${ " heap . get ( check A Read ( address , Ġoffset , Ġalign , Ġ 1 )) ". cl ong } Ġ$ AND Ġ 0 xFF L " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 1 6 _ s , Ġlong ) Ġ{ Ġ" heap . get Short ( check A Read ( address , Ġoffset , Ġalign , Ġ 2 )) ". cl ong Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 1 6 _ u , Ġlong ) Ġ{ Ġ"${ " heap . get Short ( check A Read ( address , Ġoffset , Ġalign , Ġ 2 )) ". cl ong } Ġ$ AND Ġ 0 xFFFF L " Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 3 2 _ s , Ġlong ) Ġ{ Ġ" heap . getInt ( check A Read ( address , Ġoffset , Ġalign , Ġ 4 )) ". cl ong Ġ} ĊĠĠĠĠĠĠĠ Ġi op r ( W asm Op . Op _ i 6 4 _ load 3 2 _ u , Ġlong ) Ġ{ Ġ"${ " heap . getInt ( check A Read ( address , Ġoffset , Ġalign , Ġ 4 )) ". cl ong } Ġ$ AND Ġ 0 xFFFFFFFF L " Ġ} ĊĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 3 2 _ store 8 , Ġint ) Ġ{ Ġ" heap . put ( check A Write ( address , Ġoffset , Ġalign , Ġ 1 ), Ġ${ " value ". c byte }); " Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 3 2 _ store 1 6 , Ġint ) Ġ{ Ġ" heap . put Short ( check A Write ( address , Ġoffset , Ġalign , Ġ 2 ), Ġ${ " value ". c short }); " Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 3 2 _ store , Ġint ) Ġ{ Ġ" heap . put Int ( check A Write ( address , Ġoffset , Ġalign , Ġ 4 ), Ġvalue );" Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 6 4 _ store , Ġlong ) Ġ{ Ġ" heap . put Long ( check A Write ( address , Ġoffset , Ġalign , Ġ 8 ), Ġvalue );" Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ f 3 2 _ store , Ġfloat ) Ġ{ Ġ" heap . put Float ( check A Write ( address , Ġoffset , Ġalign , Ġ 4 ), Ġvalue );" Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ f 6 4 _ store , Ġdouble ) Ġ{ Ġ" heap . put Double ( check A Write ( address , Ġoffset , Ġalign , Ġ 8 ), Ġvalue );" Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 6 4 _ store 8 , Ġlong ) Ġ{ Ġ" Op _ i 3 2 _ store 8 ( address , Ġoffset , Ġalign , Ġ${ " value ". c int }); " Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 6 4 _ store 1 6 , Ġlong ) Ġ{ Ġ" Op _ i 3 2 _ store 1 6 ( address , Ġoffset , Ġalign , Ġ${ " value ". c int }); " Ġ} ĊĠĠĠĠĠĠĠ Ġi op w ( W asm Op . Op _ i 6 4 _ store 3 2 , Ġlong ) Ġ{ Ġ" Op _ i 3 2 _ store ( address , Ġoffset , Ġalign , Ġ${ " value ". c int }); " Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ eq z , Ġi 3 2 , Ġi 3 2 ) Ġ{ Ġ" b 2 i ( v Ġ== Ġ 0 )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ eq z , Ġi 6 4 , Ġi 3 2 ) Ġ{ Ġ" b 2 i ( v Ġ== Ġ 0 L )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ eq ) Ġ{ Ġ" l Ġ== Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ ne ) Ġ{ Ġ" l Ġ!= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ lt _ s ) Ġ{ Ġ" l Ġ< Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ lt _ u ) Ġ{ Ġ" java . lang . Integer . compare Unsigned ( l , Ġr ) Ġ< Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ gt _ s ) Ġ{ Ġ" l Ġ> Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ gt _ u ) Ġ{ Ġ" java . lang . Integer . compare Unsigned ( l , Ġr ) Ġ> Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ le _ s ) Ġ{ Ġ" l Ġ<= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ le _ u ) Ġ{ Ġ" java . lang . Integer . compare Unsigned ( l , Ġr ) Ġ<= Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ ge _ s ) Ġ{ Ġ" l Ġ>= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int _ bool ( W asm Op . Op _ i 3 2 _ ge _ u ) Ġ{ Ġ" java . lang . Integer . compare Unsigned ( l , Ġr ) Ġ>= Ġ 0 " Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ eq ) Ġ{ Ġ" l Ġ== Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ ne ) Ġ{ Ġ" l Ġ!= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ lt _ s ) Ġ{ Ġ" l Ġ< Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ lt _ u ) Ġ{ Ġ" java . lang . Long . compare Unsigned ( l , Ġr ) Ġ< Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ gt _ s ) Ġ{ Ġ" l Ġ> Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ gt _ u ) Ġ{ Ġ" java . lang . Long . compare Unsigned ( l , Ġr ) Ġ> Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ le _ s ) Ġ{ Ġ" l Ġ<= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ le _ u ) Ġ{ Ġ" java . lang . Long . compare Unsigned ( l , Ġr ) Ġ<= Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ ge _ s ) Ġ{ Ġ" l Ġ>= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long _ bool ( W asm Op . Op _ i 6 4 _ ge _ u ) Ġ{ Ġ" java . lang . Long . compare Unsigned ( l , Ġr ) Ġ>= Ġ 0 " Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ eq ) Ġ{ Ġ" l Ġ== Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ ne ) Ġ{ Ġ" l Ġ!= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ lt ) Ġ{ Ġ" l Ġ< Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ gt ) Ġ{ Ġ" l Ġ> Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ le ) Ġ{ Ġ" l Ġ<= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float _ bool ( W asm Op . Op _ f 3 2 _ ge ) Ġ{ Ġ" l Ġ>= Ġr " Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ eq ) Ġ{ Ġ" l Ġ== Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ ne ) Ġ{ Ġ" l Ġ!= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ lt ) Ġ{ Ġ" l Ġ< Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ gt ) Ġ{ Ġ" l Ġ> Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ le ) Ġ{ Ġ" l Ġ<= Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double _ bool ( W asm Op . Op _ f 6 4 _ ge ) Ġ{ Ġ" l Ġ>= Ġr " Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ cl z , Ġi 3 2 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Integer . numberOf Leading Z eros ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ ct z , Ġi 3 2 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Integer . numberOf Trailing Z eros ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ pop cnt , Ġi 3 2 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Integer . bit Count ( v )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ add ) Ġ{ Ġ" l Ġ+ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ sub ) Ġ{ Ġ" l Ġ- Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ mul ) Ġ{ Ġ" l Ġ* Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ div _ s ) Ġ{ Ġ" l Ġ/ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ div _ u ) Ġ{ Ġ" java . lang . Integer . divide Unsigned ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ rem _ s ) Ġ{ Ġ" l Ġ% Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ rem _ u ) Ġ{ Ġ" java . lang . Integer . remainder Unsigned ( l , Ġr )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ and ) Ġ{ Ġ" l Ġ$ AND Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ or ) Ġ{ Ġ" l Ġ$ OR Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ xor ) Ġ{ Ġ" l Ġ$ XOR Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ sh l ) Ġ{ Ġ" l Ġ$ SH L Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ shr _ s ) Ġ{ Ġ" l Ġ$ SH R Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ shr _ u ) Ġ{ Ġ" l Ġ$ US HR Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ rot l ) Ġ{ Ġ" java . lang . Integer . rotate Left ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ int ( W asm Op . Op _ i 3 2 _ ro tr ) Ġ{ Ġ" java . lang . Integer . rotate Right ( l , Ġr )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ cl z , Ġi 6 4 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Long . numberOf Leading Z eros ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ ct z , Ġi 6 4 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Long . numberOf Trailing Z eros ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ pop cnt , Ġi 6 4 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Long . bit Count ( v )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ add ) Ġ{ Ġ" l Ġ+ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ sub ) Ġ{ Ġ" l Ġ- Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ mul ) Ġ{ Ġ" l Ġ* Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ div _ s ) Ġ{ Ġ" l Ġ/ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ div _ u ) Ġ{ Ġ" java . lang . Long . divide Unsigned ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ rem _ s ) Ġ{ Ġ" l Ġ% Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ rem _ u ) Ġ{ Ġ" java . lang . Long . remainder Unsigned ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ and ) Ġ{ Ġ" l Ġ$ AND Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ or ) Ġ{ Ġ" l Ġ$ OR Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ xor ) Ġ{ Ġ" l Ġ$ XOR Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ sh l ) Ġ{ Ġ" l Ġ$ SH L Ġ${ " r ". c int }" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ shr _ s ) Ġ{ Ġ" l Ġ$ SH R Ġ${ " r ". c int }" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ shr _ u ) Ġ{ Ġ" l Ġ$ US HR Ġ${ " r ". c int }" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ rot l ) Ġ{ Ġ" java . lang . Long . rotate Left ( l , Ġ${ " r ". c int })" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ long ( W asm Op . Op _ i 6 4 _ ro tr ) Ġ{ Ġ" java . lang . Long . rotate Right ( l , Ġ${ " r ". c int })" Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ abs ) Ġ{ Ġ" java . lang . Math . abs ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ neg ) Ġ{ Ġ"- v " Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ ceil ) Ġ{ Ġ" java . lang . Math . ceil ($ {" v ". c double }) ". c float Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ floor ) Ġ{ Ġ" java . lang . Math . floor ($ {" v ". c double }) ". c float Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ trunc ) Ġ{ Ġ" v ". cl ong . c float Ġ} Ġ// Ġ@ TODO : ĠTODO ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ nearest ) Ġ{ Ġ" java . lang . Math . round ($ {" v ". c double }) ". c float Ġ} Ġ// Ġ@ TODO : ĠTODO ĊĠĠĠĠĠĠĠ Ġun op _ float ( W asm Op . Op _ f 3 2 _ sqrt ) Ġ{ Ġ" java . lang . Math . sqrt ($ {" v ". c double }) ". c float Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ add ) Ġ{ Ġ" l Ġ+ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ sub ) Ġ{ Ġ" l Ġ- Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ mul ) Ġ{ Ġ" l Ġ* Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ div ) Ġ{ Ġ" l Ġ/ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ min ) Ġ{ Ġ" java . lang . Math . min ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ max ) Ġ{ Ġ" java . lang . Math . max ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ float ( W asm Op . Op _ f 3 2 _ copy sign ) Ġ{ Ġ" java . lang . Math . copy Sign ( l , Ġr )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ abs ) Ġ{ Ġ" java . lang . Math . abs ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ neg ) Ġ{ Ġ"- v " Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ ceil ) Ġ{ Ġ" java . lang . Math . ceil ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ floor ) Ġ{ Ġ" java . lang . Math . floor ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ trunc ) Ġ{ Ġ" v ". cl ong . c double Ġ} Ġ// Ġ@ TODO : ĠTODO ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ nearest ) Ġ{ Ġ" java . lang . Math . round ( v ) ". c double Ġ} Ġ// Ġ@ TODO : ĠTODO ĊĠĠĠĠĠĠĠ Ġun op _ double ( W asm Op . Op _ f 6 4 _ sqrt ) Ġ{ Ġ" java . lang . Math . sqrt ( v )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ add ) Ġ{ Ġ" l Ġ+ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ sub ) Ġ{ Ġ" l Ġ- Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ mul ) Ġ{ Ġ" l Ġ* Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ div ) Ġ{ Ġ" l Ġ/ Ġr " Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ min ) Ġ{ Ġ" java . lang . Math . min ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ max ) Ġ{ Ġ" java . lang . Math . max ( l , Ġr )" Ġ} ĊĠĠĠĠĠĠĠ Ġbin op _ double ( W asm Op . Op _ f 6 4 _ copy sign ) Ġ{ Ġ" java . lang . Math . copy Sign ( l , Ġr )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ wrap _ i 6 4 , Ġi 6 4 , Ġi 3 2 , Ġ"( v Ġ$ AND Ġ 0 xFFFFFFFF L ) ". c int ) ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ trunc _ s _ f 3 2 , Ġf 3 2 , Ġi 3 2 , Ġ" v ". c int ) Ġ// Ġ@ TODO : ĠVERIFY ! ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ trunc _ u _ f 3 2 , Ġf 3 2 , Ġi 3 2 , Ġ" v ". cl ong . c int ) Ġ// Ġ@ TODO : ĠVERIFY ! ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ trunc _ s _ f 6 4 , Ġf 6 4 , Ġi 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt ernary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v Ġ<= Ġ${ " java . lang . Integer . MIN _ VALUE ". c double }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . lang . Integer . MIN _ VALUE ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ernary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v Ġ>= Ġ${ " java . lang . Integer . MAX _ VALUE ". c double }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . lang . Integer . MAX _ VALUE ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v ". c int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ trunc _ u _ f 6 4 , Ġf 6 4 , Ġi 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt ernary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v Ġ<= Ġ 0 . 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ernary (" v Ġ>= Ġ 4 2 9 4 9 6 7 2 9 6 . 0 ", Ġ" 4 2 9 4 9 6 7 2 9 6 L ". c int , Ġ" v ". c int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ extend _ s _ i 3 2 , Ġi 3 2 , Ġi 6 4 ) Ġ{ Ġ" v ". cl ong Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ extend _ u _ i 3 2 , Ġi 3 2 , Ġi 6 4 ) Ġ{ Ġ"${ " v ". cl ong } Ġ$ AND Ġ 0 xFFFFFFFF L " Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ trunc _ s _ f 3 2 , Ġf 3 2 , Ġi 6 4 ) Ġ{ Ġ" v ". cl ong Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ trunc _ u _ f 3 2 , Ġf 3 2 , Ġi 6 4 ) Ġ{ Ġ" v ". cl ong Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ trunc _ s _ f 6 4 , Ġf 6 4 , Ġi 6 4 ) Ġ{ Ġ" v ". cl ong Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ trunc _ u _ f 6 4 , Ġf 6 4 , Ġi 6 4 ) Ġ{ Ġ" v ". cl ong Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 3 2 _ convert _ s _ i 3 2 , Ġi 3 2 , Ġf 3 2 ) Ġ{ Ġ" v ". c float Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĠĠĠĠĠĠĠ Ġun op ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 3 2 _ convert _ u _ i 3 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi 3 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 3 2 ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ"${ " v ". cl ong } Ġ$ AND Ġ 0 xFFFFFFFF L ". c float Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 3 2 _ convert _ s _ i 6 4 , Ġi 6 4 , Ġf 3 2 ) Ġ{ Ġ" v ". c float Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 3 2 _ convert _ u _ i 6 4 , Ġi 6 4 , Ġf 3 2 ) Ġ{ Ġ" v ". c float Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 3 2 _ dem ote _ f 6 4 , Ġf 6 4 , Ġf 3 2 ) Ġ{ Ġ" v ". c float Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ prom ote _ f 3 2 , Ġf 3 2 , Ġf 6 4 ) Ġ{ Ġ" v ". c double Ġ} ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ convert _ s _ i 3 2 , Ġi 3 2 , Ġf 6 4 ) Ġ{ Ġ" v ". c double Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ convert _ u _ i 3 2 , Ġi 3 2 , Ġf 6 4 ) Ġ{ Ġ"${ " v ". cl ong } Ġ$ AND Ġ 0 xFFFFFFFF L ". c double Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ convert _ s _ i 6 4 , Ġi 6 4 , Ġf 6 4 ) Ġ{ Ġ" v ". c double Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ convert _ u _ i 6 4 , Ġi 6 4 , Ġf 6 4 ) Ġ{ Ġ" v ". c double Ġ} Ġ// Ġ@ TODO : ĠFIXME ! ĊĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 3 2 _ reinterpret _ f 3 2 , Ġf 3 2 , Ġi 3 2 ) Ġ{ Ġ" java . lang . Float . float To Raw Int Bits ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ i 6 4 _ reinterpret _ f 6 4 , Ġf 6 4 , Ġi 6 4 ) Ġ{ Ġ" java . lang . Double . double To Raw Long Bits ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 3 2 _ reinterpret _ i 3 2 , Ġi 3 2 , Ġf 3 2 ) Ġ{ Ġ" java . lang . Float . int Bits To Float ( v )" Ġ} ĊĠĠĠĠĠĠĠ Ġun op ( W asm Op . Op _ f 6 4 _ reinterpret _ i 6 4 , Ġi 6 4 , Ġf 6 4 ) Ġ{ Ġ" java . lang . Double . long Bits ToDouble ( v )" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . iop w ( op : ĠW asm Op , Ġtype : ĠW asm Type , Ġgen : Ġ() Ġ-> ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġi op ( op , Ġvoid , Ġint (" address "), Ġint (" offset "), Ġint (" align "), Ġtype (" value ")) Ġ{ Ġgen () Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . iop r ( op : ĠW asm Op , Ġtype : ĠW asm Type , Ġgen : Ġ() Ġ-> ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġi op ( op , Ġtype , Ġint (" address "), Ġint (" offset "), Ġint (" align ")) Ġ{ Ġgen () Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . iop ( op : ĠW asm Op , Ġret : ĠW asm Type , Ġvar arg Ġargs : ĠMy Arg , Ġexpr : Ġ() Ġ-> ĠString ) Ġ= ĠFUNC _ INLINE ("$ op ", Ġret , Ġ* args ) Ġ{ Ġexpr () Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠInd enter . write Main ( className : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmain Func Ġ= Ġmodule . functions . first OrNull Ġ{ Ġit . export ?. name Ġ== Ġ"_ main " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( main Func Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Name Ġ= Ġmodule Ctx . getName ( main Func ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline (" static Ġpublic Ġvoid Ġmain ( String [] Ġargs )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ("$ className Ġmodule Ġ= Ġnew Ġ$ className (); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" int Ġresult Ġ= Ġ 0 ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" for Ġ( int Ġm Ġ= Ġ 0 ; Ġm Ġ< Ġ 1 0 0 ; Ġm ++) ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Ar ity Ġ= Ġmain Func . type . args . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( main Ar ity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġline (" result Ġ= Ġmodule .$ func Name (); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" int [] Ġarray Ġ= Ġnew Ġint [ args . length Ġ+ Ġ 1 ]; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" array [ 0 ] Ġ= Ġmodule . alloc String z (\" $ className \ "); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" for Ġ( int Ġn Ġ= Ġ 1 ; Ġn Ġ< Ġarray . length ; Ġn ++) ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" array [ n ] Ġ= Ġmodule . alloc String z ( args [ n Ġ- Ġ 1 ]); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" result Ġ= Ġmodule .$ func Name ( array . length , Ġmodule . alloc Ints ( array )); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinvalid Op (" Invalid Ġfunction Ġmain Ġwith Ġar ity Ġ$ main Ar ity ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" System . exit ( result ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . ig lob ( ns : ĠString , Ġname : ĠString , Ġret : ĠW asm Type , Ġcallback : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Import Global ( ns , Ġname )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( ret , Ġit , Ġcallback ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠMy Arg ( val Ġname : ĠString , Ġval Ġtype : ĠW asm Type ) ĊĊĠĠĠ Ġfun ĠList < Ast Local >. to Args ( ctx : ĠDump Context ): ĠArray < My Arg > Ġ= Ġthis . map Ġ{ Ġit . type ( ctx . getName ( it )) Ġ}. to Typed Array () ĊĊĠĠĠ Ġoperator Ġfun ĠW asm Type . invoke ( name : ĠString ) Ġ= ĠMy Arg ( name , Ġthis ) ĊĊĠĠĠ Ġopen Ġfun ĠArray < out ĠMy Arg >. arg str () Ġ= Ġthis . join ToString (", Ġ") Ġ{ Ġit . type . type () Ġ+ Ġ" Ġ" Ġ+ Ġit . name Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . if unc ( ns : ĠString , Ġname : ĠString , Ġret : ĠW asm Type , Ġvar arg Ġargs : ĠMy Arg , Ġcallback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Import Func ( ns , Ġname )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER ( it , Ġret , Ġ* args , Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠInd enter . syscall ( syscall : ĠW asm Sy scall , Ġhandler : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Import Func (" env ", Ġ" ___ syscall ${ syscall . id }") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER ( it , Ġint , Ġint (" syscall "), Ġint (" address ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTR Y Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCATCH ( THROW ABLE (" e ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTHROW ( RT EXCEPTION . new (" e ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . missing Sy sc alls () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( func Ġin Ġfunctions With Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Ġ= Ġfunc . import Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import . moduleName Ġ== Ġ" env " Ġ&& Ġimport . name . startsWith (" ___ syscall ") Ġ&& Ġfunc Ġ! in Ġhandled Function sWith Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsyscall Id Ġ= Ġimport . name . remove Prefix (" ___ syscall "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsyscall Ġ= ĠW asm Sy scall . SYSCALL _ BY _ ID [ syscall Id ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyscall ( syscall ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (""" TODO _ i 3 2 (" un implemented Ġsyscall Ġ$ syscall Id ") """) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Import Func ( ns : ĠString , Ġname : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimport Ġ= ĠPair ( ns , Ġname ) ĊĠĠĠĠĠĠĠ Ġval Ġfunc Ġ= Ġfunctions By Import [ import ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( func Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Function sWith Import Ġ+= Ġfunc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ctx . getName ( func ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Import Global ( ns : ĠString , Ġname : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimport Ġ= ĠPair ( ns , Ġname ) ĊĠĠĠĠĠĠĠ Ġval Ġglobal Ġ= Ġglobal sBy Import [ import ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( global Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Global sWith Import Ġ+= Ġglobal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ctx . getName ( global ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinit BlockSize Ġ= Ġ 1 6 ĊĊĠĠĠ Ġval Ġnames Ġby Ġlazy Ġ{ Ġlang Name Allocator () Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . dump Constructor ( className : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" public Ġ$ className () ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( nn Ġin Ġ 0 Ġuntil Ġmodule . datas . size Ġstep Ġinit BlockSize ) Ġline (" init $ nn (); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline (" init D ynam ict op (); ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . static s ( callback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . memory Statics () Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" static Ġprivate Ġfinal Ġjava . nio . charset . Charset ĠUTF _ 8 Ġ= Ġjava . nio . charset . Charset . forName (\" UTF - 8 \ "); ") ĊĠĠĠĠĠĠĠ Ġline (" static Ġpublic Ġfinal Ġint ĠHEAP _ SIZE Ġ= Ġ 6 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ; Ġ// Ġ 6 4 ĠMB ") ĊĠĠĠĠĠĠĠ Ġline (" static Ġpublic Ġfinal Ġint ĠSTACK _ INITIAL _ SIZE Ġ= Ġ 1 2 8 Ġ* Ġ 1 0 2 4 ; Ġ// Ġ 1 2 8 ĠKB Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . memory Dynamics () Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" public Ġfinal Ġbyte [] Ġheap Bytes Ġ= Ġnew Ġbyte [ HEAP _ SIZE ]; ") ĊĠĠĠĠĠĠĠ Ġline (" public Ġfinal Ġjava . nio . ByteBuffer Ġheap Ġ= Ġjava . nio . ByteBuffer . wrap ( heap Bytes ). order ( java . nio . Byte Order . native Order ()); ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsup resses Ġ= ĠlistOf (" Remove Red undant Back ticks ", Ġ" Can Be Val ", Ġ" Red undant Explicit Type ", Ġ" Red undant Sem icolon ", Ġ" Red undant Unit ReturnType ") ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . pre Class () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdump ( config : ĠExport Config ): ĠInd enter Ġ= ĠInd enter Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġnames . allocate ( config . className ) ĊĠĠĠĠĠĠĠ Ġif Ġ( config . packageName . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline (" package Ġ${ config . packageName }; ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpre Class () ĊĠĠĠĠĠĠĠ Ġline (" public Ġfinal Ġclass Ġ$ className ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Dynamics () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Main ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Statics () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdump Constructor ( className ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Mem Ġ= Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Indices Ġ= ĠLinkedHashMap < Int , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġmodule . datas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" DATA : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġdata . to Ast ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ast Ġis ĠW ast . RETURN Ġ&& Ġast . expr Ġis ĠW ast . Const ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Base Ġ= Ġ( ast . expr . value Ġas ĠNumber ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Indices [ data . index ] Ġ= Ġ"$ mem Base " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Mem Ġ= ĠMath . max ( max Mem , Ġmem Base Ġ+ Ġdata . data . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" private Ġint Ġcompute Data Index ${ data . index }() ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ( ast . dump ( Dump Context ( module Ctx , Ġnull )). ind enter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Indices [ data . index ] Ġ= Ġ" compute Data Index ${ data . index } ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Memory Tools () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Ops () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Base Ops () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsy sc alls () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Sy sc alls () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax m Mem Align Ġ= Ġmax Mem . next Aligned To ( 1 0 2 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( int ( STACK TOP ), Ġ"$ max m Mem Align Ġ+ Ġ 1 0 2 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( int ( STACK _ MAX ), Ġ"$ STACK TOP Ġ+ ĠSTACK _ INITIAL _ SIZE ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( int (" STACK TOP _ REV "), Ġ" heap . limit () ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( int ( DY NA MI CT OP _ PTR ), Ġexpr Ġ= Ġ" 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( int ( temp Double Ptr ), Ġexpr Ġ= Ġ" 1 6 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" init D ynam ict op ", Ġvoid , Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" sw ($ DY NA MI CT OP _ PTR , Ġ$ STACK _ MAX ); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" sw ($ temp Double Ptr , Ġ$ max m Mem Align ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" stack Alloc Rev ", Ġint , Ġint (" count ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" STACK TOP _ REV Ġ-= Ġ( count Ġ+ Ġ 1 5 ) Ġ$ AND Ġ${ " 0 xF ". c inv }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" STACK TOP _ REV ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" alloc Bytes ", Ġint , ĠB A (" bytes ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" address "), Ġ" stack Alloc Rev ($ {" bytes ". as ize }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" put Bytes ( address , Ġbytes )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" address ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" alloc Ints ", Ġint , ĠIA (" ints ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" address "), Ġ" stack Alloc Rev ($ {" ints ". as ize } Ġ* Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" put Ints ( address , Ġints )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" address ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" alloc String z ", Ġint , ĠSTR (" str ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" alloc Bytes ($ {" ( str Ġ+ Ġ\" \\ u 0 0 0 0 \") ". string GetBytes (" UTF _ 8 ") }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Imported Funcs () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( nn Ġin Ġ 0 Ġuntil Ġmodule . datas . size Ġstep Ġinit BlockSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" init $ nn ", Ġvoid , Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( mm Ġin Ġ 0 Ġuntil Ġinit BlockSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġnn Ġ+ Ġmm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmodule . datas . get OrNull ( n ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase 6 4 Ġ= ĠBase 6 4 . get Encoder (). encode ToString ( data . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġbase 6 4 . split In Chunks ( 3 2 Ġ* Ġ 1 0 2 4 ). map Ġ{ Ġ"\" $ it \"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" put Bytes B 6 4 (${ data Indices [ data . index ]}, Ġ${ chunks . join ToString (", Ġ") }); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( global Ġin Ġmodule . globals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( global . import Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompute Name Ġ= Ġ" compute ${ module Ctx . getName ( global )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Type Ġ= ĠW asm Type . Function ( listOf (), ĠlistOf ( global . global Type . type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġast : ĠW ast . St m Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal . e Ġ!= Ġnull Ġ-> Ġglobal . e . to Ast ( module , ĠW asm Func (- 1 , Ġgetter Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal . ast Ġ!= Ġnull Ġ-> Ġglobal . ast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" Both Ġ${ global :: e . name } Ġand Ġ${ global :: ast . name } Ġare Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠDump Context ( module Ctx , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( ast Ġis ĠW ast . RETURN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast . expr . dump ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline (" private Ġ${ global . global Type . type . type ()} Ġ$ compute Name () ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ( ast . dump ( ctx ). ind enter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ compute Name ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIELD ( global . global Type . type , Ġmodule Ctx . getName ( global ), Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc To Indices Ġ= Ġmodule . elements . flatMap Ġ{ Ġit . func Refs Ġ}. with Index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmodule . get Function ( it . value ) Ġto Ġit . index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( type , Ġfunctions ) Ġin Ġmodule . functions . groupBy Ġ{ Ġit . type . without Arg Names () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠDump Context ( module Ctx , ĠW asm Func (- 1 , ĠW asm Type . Function ( listOf (), ĠlistOf ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġtype . args . map Ġ{ Ġ"${ it . type . type ()} Ġ${ ctx . getName ( it )}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Call Ġ= Ġtype . args . with Index (). map Ġ{ Ġctx . getName ( it . value ) Ġ}. join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr funcs Ġ= Ġfunctions . map Ġ{ Ġit Ġto Ġfunc To Indices [ it ] Ġ}. filter Ġ{ Ġit . second Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs With Index Ġ= Ġ( listOf (" int Ġindex ") Ġ+ Ġargs ). join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r funcs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr args Ġ= Ġ( listOf ( int (" index ")) Ġ+ Ġtype . args . to Args ( ctx )). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" invoke _${ type . signature }", Ġtype . ret Type , Ġ* r args , Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSW ITCH (" index ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( func , Ġfunc Indices ) Ġin Ġr funcs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( func Idx Ġin Ġ( func Indices Ġ?: Ġcontinue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE _ RETURN ( type . ret Type , Ġfunc Idx , Ġ" this .${ module Ctx . getName ( func )} ($ args Call )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTHROW ( RT EXCEPTION . new ("\" Invalid Ġfunction Ġ(${ type . signature }) Ġat Ġindex Ġ\" Ġ+ Ġindex ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( func Ġin Ġmodule . functions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ( dump ( func )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInd enter . FIELD ( arg : ĠMy Arg , Ġexpr : ĠString ) Ġ= ĠFIELD ( arg . type , Ġarg . name , Ġexpr ) ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . FIELD ( type : ĠW asm Type , Ġname : ĠString , Ġexpr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ("${ type . type ()} Ġ$ name Ġ= Ġ$ expr ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBreak s () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbreaks Ġ= ĠLinked HashSet < Ast Label >() ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcontains ( label : ĠAst Label ?) Ġ= Ġlabel Ġin Ġbreaks ĊĠĠĠĠĠĠĠ Ġfun Ġadd Label ( label : ĠAst Label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label . kind Ġ== ĠFlow Kind . BREAK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks Ġ+= Ġlabel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Label S ure ( label : ĠAst Label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks Ġ+= Ġlabel ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Break s ($ break s )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDump Result ( val Ġind enter : ĠInd enter , Ġval Ġbreaks : ĠBreak s , Ġval Ġunreachable : ĠBoolean ) ĊĊĠĠĠ Ġfun ĠBreak s . concat Result ( result : ĠDump Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . break s Ġ+= Ġresult . break s . break s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDump Result . append Break s ( break s : ĠBreak s ) Ġ= Ġthis . apply Ġ{ Ġbreaks . concat Result ( this ) Ġ} ĊĊĠĠĠ Ġclass ĠName Allocator ( val Ġfix er : Ġ( String ) Ġ-> ĠString Ġ= Ġ{ Ġit Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġallocated Names Ġ= ĠLinked HashSet < String >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġallocate ( name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġr name Ġ= Ġfix er ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( r name Ġin Ġallocated Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr name Ġ+= Ġ"_" Ġ// ĠTodo Ġuse Ġnumeric Ġprefixes ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallocated Names Ġ+= Ġr name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠModule Dump Context () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġused Names Ġ= Ġlang Name Allocator () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġglobal Names Ġ= ĠLinkedHashMap < Ast Global , ĠString >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfunction Names Ġ= ĠLinkedHashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( func : ĠW asm Func Ref ): ĠString Ġ= Ġfunction Names . get Or Put ( func . name ) Ġ{ Ġused Names . allocate ( func . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( func : ĠW asm Func WithType ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Names . get Or Put ( func . name ) Ġ{ Ġused Names . allocate ( func . name ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// fun ĠgetName ( func : ĠW asm Func ): ĠString Ġ= ĠgetName ( func . ftype ) ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( global : ĠAst Global ): ĠString Ġ= Ġglobal Names . get Or Put ( global ) Ġ{ Ġused Names . allocate ( global . name ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( global : ĠW asm Global ): ĠString Ġ= ĠgetName ( global . ast Global ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDump Context ( val Ġmodule Ctx : ĠModule Dump Context , Ġval Ġfunc : ĠW asm Func ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphi Types Ġ= ĠLinked HashSet < W asm Type >() ĊĠĠĠĠĠĠĠ Ġval Ġdebug Ġget () Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// val Ġdebug Ġget () Ġ= Ġfunc ?. name Ġ== Ġ"_ memset " ĊĠĠĠĠĠĠĠ Ġval Ġused Names Ġ= Ġlang Name Allocator () ĊĠĠĠĠĠĠĠ Ġval Ġlocal Names Ġ= ĠLinkedHashMap < Ast Local , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġlabel Names Ġ= ĠLinkedHashMap < Ast Label , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( local : ĠAst Local ): ĠString Ġ= Ġlocal Names . get Or Put ( local ) Ġ{ Ġused Names . allocate ( local . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( label : ĠAst Label ): ĠString Ġ= Ġlabel Names . get Or Put ( label ) Ġ{ Ġused Names . allocate ( label . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( global : ĠAst Global ): ĠString Ġ= Ġmodule Ctx . getName ( global ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdump ( ctx : ĠDump Context , Ġstm : ĠW ast . St m , Ġout : ĠInd enter Ġ= ĠInd enter Ġ{ Ġ}): ĠDump Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstm . dump ( ctx , Ġout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ@ TODO : ĠWe Ġshould Ġclean - up Ġthe ĠAST Ġbefore Ġin Ġother Ġphase Ġinstead Ġof Ġdirectly Ġwhile Ġgenerating Ġcode . ĊĠĠĠ Ġfun ĠW ast . St m . dump ( ctx : ĠDump Context , Ġout : ĠInd enter Ġ= ĠInd enter Ġ{ Ġ}): ĠDump Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbreaks Ġ= ĠBreak s () ĊĠĠĠĠĠĠĠ Ġvar Ġunreachable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . St ms Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġst ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġe . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . unreachable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ġ// ĠStop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Set Local Ġ-> Ġout . line ( write Set Local ( ctx . getName ( local ), Ġexpr . dump ( ctx ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Set Global Ġ-> Ġout . line ( write Set Global ( ctx . getName ( global ), Ġexpr . dump ( ctx ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . RETURN Ġ-> Ġrun Ġ{ Ġout . RETURN ( expr . dump ( ctx )); Ġunreachable Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . RETURN _ VOID Ġ-> Ġrun Ġ{ Ġout . RETURN _ VOID (); Ġunreachable Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . BLOCK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresult : ĠDump Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopt Label Ġ= Ġif Ġ( label Ġ!= Ġnull ) Ġ"${ ctx . getName ( label )} : Ġ" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( opt Label . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġstm . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// out . line ("${ opt Label } do ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġout . LABEL ( ctx . getName ( label )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . BLOCK Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġstm . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// out . line (" while Ġ( false ); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable Ġ= Ġresult . unreachable Ġ&& Ġ( label Ġ! in Ġbreaks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . debug ) Ġprintln (" BLOCK . Ġ${ ctx . func ?. name } Ġ( block _ label =${ label ?. name }). ĠUn reachable : Ġ$ unreachable , Ġ$ break s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . LOOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresult : ĠDump Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġout . LABEL ( ctx . getName ( label )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . WH ILE (" true ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġstm . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . unreachable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . line ("// break ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . BREAK () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġbreaks . add Label S ure ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable Ġ= Ġlabel Ġ! in Ġbreaks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . debug ) Ġprintln (" LOOP . Ġ${ ctx . func ?. name } Ġ( loop _ label =${ label ?. name }). ĠUn reachable : Ġ$ unreachable , Ġ$ break s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . IF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . IF ( dump Boolean ( cond , Ġctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġb true . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . IF _ ELSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . IF ( dump Boolean ( cond , Ġctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġb true . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . ELSE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġb false . dump ( ctx , Ġout ). append Break s ( break s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . BR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . line ( write G oto ( label , Ġctx )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks . add Label ( this . label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . BR _ IF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . IF ( dump Boolean ( cond , Ġctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ( write G oto ( label , Ġctx )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks . add Label ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . BR _ TABLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . SWITCH ( subject . dump ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġlabel ) Ġin Ġlabels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . CASE _ F STM ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR ( label . goto ( ctx )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks . add Label ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE _ DEFAULT _ F STM Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR ( default . goto ( ctx )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreaks . add Label ( default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . STM _ EXPR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpr Str Ġ= Ġthis . expr . dump ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// var Ġexpr Str Ġ= Ġthis . expr . dump ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// remove Paren @ while Ġ( expr Str . startsWith (" (" ) Ġ&& Ġexpr Str . endsWith (" ) ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġvar Ġopen Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġexpr Str . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġexpr Str [ n ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'(' ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġopen Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ') ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( open Count Ġ== Ġ 0 Ġ&& Ġn Ġ< Ġexpr Str . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ remove Paren ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġopen Count -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġexpr Str Ġ= Ġexpr Str . substring ( 1 , Ġexpr Str . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . expr Ġis ĠW ast . Const Ġ|| Ġthis . expr Ġis ĠW ast . Local Ġ|| Ġthis . expr Ġis ĠW ast . Global Ġ|| Ġthis . expr Ġis ĠW ast . Un op Ġ|| Ġthis . expr Ġis ĠW ast . Bin op Ġ|| Ġthis . expr Ġis ĠW ast . Ter op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . line ( write Expr Statement No St m ( expr Str )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . line ( write Expr Statement ( expr Str )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Write Memory Ġ-> Ġout . line ( write Write Memory ( op , Ġaddress . dump ( ctx ), Ġoffset , Ġalign , Ġvalue . dump ( ctx ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Set Phi Ġ-> Ġout . line ( write Set Phi (" phi _${ this . block Type }", Ġthis . value . dump ( ctx ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Un reachable Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . line ( write Un reachable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . NOP Ġ-> Ġout . line ( write N op ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġout . line (" ??? Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDump Result ( out , Ġbreaks , Ġunreachable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġdump Boolean ( expr : ĠW ast . Expr , Ġctx : ĠDump Context ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Un op Ġ-> Ġwhen Ġ( expr . op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ eq z , ĠW asm Op . Op _ i 6 4 _ eq z Ġ-> Ġreturn Ġ"${ expr . expr . dump ( ctx )} Ġ== Ġ 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Bin op Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġexpr . l . dump ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġexpr . r . dump ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr . op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ eq , ĠW asm Op . Op _ i 6 4 _ eq , ĠW asm Op . Op _ f 3 2 _ eq , ĠW asm Op . Op _ f 6 4 _ eq Ġ-> Ġreturn Ġ"$ l Ġ== Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ ne , ĠW asm Op . Op _ i 6 4 _ ne , ĠW asm Op . Op _ f 3 2 _ ne , ĠW asm Op . Op _ f 6 4 _ ne Ġ-> Ġreturn Ġ"$ l Ġ!= Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ gt _ s , ĠW asm Op . Op _ i 6 4 _ gt _ s , ĠW asm Op . Op _ f 3 2 _ gt , ĠW asm Op . Op _ f 6 4 _ gt Ġ-> Ġreturn Ġ"$ l Ġ> Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ lt _ s , ĠW asm Op . Op _ i 6 4 _ lt _ s , ĠW asm Op . Op _ f 3 2 _ lt , ĠW asm Op . Op _ f 6 4 _ lt Ġ-> Ġreturn Ġ"$ l Ġ< Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ ge _ s , ĠW asm Op . Op _ i 6 4 _ ge _ s , ĠW asm Op . Op _ f 3 2 _ ge , ĠW asm Op . Op _ f 6 4 _ ge Ġ-> Ġreturn Ġ"$ l Ġ>= Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ le _ s , ĠW asm Op . Op _ i 6 4 _ le _ s , ĠW asm Op . Op _ f 3 2 _ le , ĠW asm Op . Op _ f 6 4 _ le Ġ-> Ġreturn Ġ"$ l Ġ<= Ġ$ r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexpr . dump ( ctx ) Ġ+ Ġ" Ġ!= Ġ 0 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite G oto ( label : ĠAst Label , Ġctx : ĠDump Context ) Ġ= ĊĠĠĠĠĠĠĠ ĠInd enter ( label . goto ( ctx ) Ġ+ Ġ"; ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Set Local ( local Name : ĠString , Ġexpr : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠInd enter ("$ local Name Ġ= Ġ$ expr ; ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Set Global ( global Name : ĠString , Ġexpr : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠInd enter (" this .$ global Name Ġ= Ġ$ expr ; ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Expr Statement ( expr : ĠString ) Ġ= ĠInd enter ("$ expr ; ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Expr Statement No St m ( expr : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠInd enter ("// Ġ$ expr ; Ġ// ĠNot Ġa Ġstatement ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Un reachable () Ġ= ĠInd enter ("// Ġunreachable ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite N op () Ġ= ĠInd enter ("// Ġnop ") ĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Set Phi ( phi Name : ĠString , Ġexpr : ĠString ) Ġ= Ġwrite Set Local ( phi Name , Ġexpr ) ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġconst ( value : ĠInt ) Ġ= Ġ"$ value " ĊĠĠĠ Ġprotected Ġopen Ġfun Ġconst ( value : ĠLong ) Ġ= Ġ"${ value } L " ĊĠĠĠ Ġprotected Ġopen Ġfun Ġconst ( value : ĠFloat ) Ġ= Ġ"${ value } f " ĊĠĠĠ Ġprotected Ġopen Ġfun Ġconst ( value : ĠDouble ) Ġ= Ġ"$ value " ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġun op ( op : ĠW asm Op , Ġvd : ĠString ) Ġ= Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 3 2 _ neg , ĠW asm Op . Op _ f 6 4 _ neg Ġ-> Ġ"- ($ vd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 6 4 _ prom ote _ f 3 2 Ġ-> Ġvd . c double ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 3 2 _ dem ote _ f 6 4 Ġ-> Ġvd . c float ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ op ($ vd )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġbin op ( op : ĠW asm Op , Ġld : ĠString , Ġrd : ĠString ) Ġ= Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ add , ĠW asm Op . Op _ i 6 4 _ add , ĠW asm Op . Op _ f 3 2 _ add , ĠW asm Op . Op _ f 6 4 _ add Ġ-> Ġ" ($ ld Ġ+ Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ sub , ĠW asm Op . Op _ i 6 4 _ sub , ĠW asm Op . Op _ f 3 2 _ sub , ĠW asm Op . Op _ f 6 4 _ sub Ġ-> Ġ" ($ ld Ġ- Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ mul , ĠW asm Op . Op _ i 6 4 _ mul , ĠW asm Op . Op _ f 3 2 _ mul , ĠW asm Op . Op _ f 6 4 _ mul Ġ-> Ġ" ($ ld Ġ* Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ div _ s , ĠW asm Op . Op _ i 6 4 _ div _ s , ĠW asm Op . Op _ f 3 2 _ div , ĠW asm Op . Op _ f 6 4 _ div Ġ-> Ġ" ($ ld Ġ/ Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ rem _ s , ĠW asm Op . Op _ i 6 4 _ rem _ s Ġ-> Ġ" ($ ld Ġ% Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ and , ĠW asm Op . Op _ i 6 4 _ and Ġ-> Ġ" ($ ld Ġ$ AND Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ or , ĠW asm Op . Op _ i 6 4 _ or Ġ-> Ġ" ($ ld Ġ$ OR Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ xor , ĠW asm Op . Op _ i 6 4 _ xor Ġ-> Ġ" ($ ld Ġ$ XOR Ġ$ rd )" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ sh l Ġ-> Ġ" ($ ld Ġ$ SH L Ġ${ rd . c int })" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ shr _ s , ĠW asm Op . Op _ i 6 4 _ shr _ s Ġ-> Ġ" ($ ld Ġ$ SH R Ġ${ rd . c int })" ĊĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ shr _ u , ĠW asm Op . Op _ i 6 4 _ shr _ u Ġ-> Ġ" ($ ld Ġ$ US HR Ġ${ rd . c int })" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ op ($ ld , Ġ$ rd )" ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Global ( name : ĠString ) Ġ= Ġ" this .$ name " ĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Local ( name : ĠString ) Ġ= Ġname ĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Phi ( name : ĠString ) Ġ= Ġget Local ( name ) ĊĠĠĠ Ġprotected Ġopen Ġfun Ġread Memory ( op : ĠW asm Op , Ġaddress : ĠString , Ġoffset : ĠInt , Ġalign : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr addr Ġ= Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ"$ address Ġ+ Ġ$ offset " Ġelse Ġaddress ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ load 8 _ s Ġ-> Ġ" this . getByte ($ r addr )" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ load Ġ-> Ġ" this . getInt ($ r addr )" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 6 4 _ load Ġ-> Ġ" this . getLong ($ r addr )" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 3 2 _ load Ġ-> Ġ" this . get Float ($ r addr )" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 6 4 _ load Ġ-> Ġ" this . getDouble ($ r addr )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ op ($ address , Ġ$ offset , Ġ$ align )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite Write Memory ( op : ĠW asm Op , Ġaddress : ĠString , Ġoffset : ĠInt , Ġalign : ĠInt , Ġexpr : ĠString ): ĠInd enter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr addr Ġ= Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ"$ address Ġ+ Ġ$ offset " Ġelse Ġaddress ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ store Ġ-> ĠInd enter (" this . put Int ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ store 8 Ġ-> ĠInd enter (" this . put Byte ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 3 2 _ store 1 6 Ġ-> ĠInd enter (" this . put Short ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ i 6 4 _ store Ġ-> ĠInd enter (" this . put Long ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 3 2 _ store Ġ-> ĠInd enter (" this . put Float ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Op . Op _ f 6 4 _ store Ġ-> ĠInd enter (" this . put Double ($ r addr , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠInd enter ("$ op ($ address , Ġ$ offset , Ġ$ align , Ġ$ expr ); ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠW ast . Expr . dump ( ctx : ĠDump Context ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Const Ġ-> Ġwhen Ġ( this . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Type . i 3 2 Ġ-> Ġconst ( value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Type . i 6 4 Ġ-> Ġconst ( value Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Type . f 3 2 Ġ-> Ġconst ( value Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW asm Type . f 6 4 Ġ-> Ġconst ( value Ġas ĠDouble ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" (${ this . value })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . T ee Local Ġ-> Ġ" (${ ctx . getName ( local )} Ġ= Ġ${ this . expr . dump ( ctx )}) " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Local Ġ-> Ġget Local ( ctx . getName ( local )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Global Ġ-> Ġget Global ( ctx . getName ( global )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Un op Ġ-> Ġun op ( op , Ġexpr . dump ( ctx )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Ter op Ġ-> Ġter op ( op , Ġdump Boolean ( cond , Ġctx ), Ġe true . dump ( ctx ), Ġe false . dump ( ctx )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Bin op Ġ-> Ġbin op ( op , Ġl . dump ( ctx ), Ġr . dump ( ctx )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . CALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" this .${ ctx . module Ctx . getName ( func )} (${ this . args . join ToString (", Ġ") Ġ{ Ġit . dump ( ctx ) Ġ} })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// is ĠA . CALL _ IN DIRECT Ġ-> Ġ" (( Op _ get Function (${ this . address . dump () }) Ġas Ġ(${ this . type . type ()} )) " Ġ+ Ġ"(" Ġ+ Ġthis . args . map Ġ{ Ġit . dump () Ġ}. join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . CALL _ IN DIRECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invoke _${ type . signature } (${ address . dump ( ctx )}, Ġ" Ġ+ Ġargs . join ToString (", Ġ") Ġ{ Ġit . dump ( ctx ) Ġ} Ġ+ Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Read Memory Ġ-> Ġread Memory ( op , Ġaddress . dump ( ctx ), Ġoffset , Ġalign ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . Phi Ġ-> Ġrun Ġ{ Ġctx . phi Types Ġ+= Ġthis . type ; Ġget Phi (" phi _${ this . type }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ast . BLOCK _ EXPR Ġ-> Ġ" TODO _${ this . type }( \" BLOCK _ EXPR Ġnot Ġimplemented \") " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ??? ($ this )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . write Memory Tools () Ġ{ ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Bytes ", Ġvoid , Ġint (" address "), ĠB A (" data "), Ġint (" offset "), Ġint (" size ")) Ġ{ Ġ" System . arraycopy ( data , Ġoffset , Ġheap Bytes , Ġaddress , Ġsize );" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Bytes ", Ġvoid , Ġint (" address "), ĠB A (" data ")) Ġ{ Ġ" put Bytes ( address , Ġdata , Ġ 0 , Ġ${ " data ". as ize }); " Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" put Ints ", Ġvoid , Ġint (" address "), ĠIA (" data ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR (" n ", Ġ" 0 ", Ġ" data ". as ize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" heap . put Int ( address Ġ+ Ġn Ġ* Ġ 4 , Ġdata [ n ]) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" put Bytes B 6 4 ", Ġvoid , Ġint (" address "), ĠVAR ARG ( STR )(" datas ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( S BUILDER (" out "), ĠS BUILDER . new ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR (" n ", Ġfrom Ġ= Ġ" 0 ", Ġuntil Ġ= Ġ" datas ". as ize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" out . append ( datas [ n ]) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" put Bytes ( address , Ġjava . util . Base 6 4 . get Decoder (). decode ( out . toString ())) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" putString ", Ġvoid , Ġint (" address "), ĠSTR (" string "), ĠCHARSET (" charset ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" put Bytes ( address , Ġ${ " string ". string GetBytes (" charset ") }) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" getBytes ", ĠB A , Ġint (" address "), Ġint (" size ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" java . util . Arrays . copyOf Range ( heap Bytes , Ġaddress , Ġaddress Ġ+ Ġsize )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" getByte z ", ĠB A , Ġint (" address ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" getByte z ( address , Ġjava . lang . Integer . MAX _ VALUE )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" strlen ", Ġint , Ġint (" address ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" n "), Ġexpr Ġ= Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWH ILE ("${ " heap Bytes [ address Ġ+ Ġn ] ". c int } Ġ!= Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" n ++ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" getByte z ", ĠB A , Ġint (" address "), Ġint (" max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ( Ġ" getBytes ( address , Ġstrlen ( address )) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" getString z ", ĠSTR , Ġint (" address "), ĠCHARSET (" charset ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ( STR . new (" getByte z ( address )", Ġ" charset ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" getString z ", ĠSTR , Ġint (" address ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" getString z ( address , ĠUTF _ 8 )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠString . string GetBytes ( charset : ĠString ): ĠString Ġ= Ġ"$ this . getBytes ($ charset )" ĊĊĠĠĠ Ġfun Ġdump ( func : ĠW asm Func ): ĠInd enter Ġ= ĠInd enter Ġ{ ĊĠĠĠĠĠĠĠ Ġline ("// Ġfunc Ġ(${ func . index }) Ġ: Ġ${ func . name }") ĊĠĠĠĠĠĠĠ Ġval Ġbody Ast Ġ= Ġfunc . get Ast ( module ) ĊĠĠĠĠĠĠĠ Ġif Ġ( body Ast Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠDump Context ( module Ctx , Ġfunc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġfunc . type . args ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER ( module Ctx . getName ( func ), Ġfunc . type . ret Type , Ġ* func . type . args . map Ġ{ Ġit . type ( ctx . getName ( it )) Ġ}. to Typed Array (), Ġpub Ġ= Ġfunc . export Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( func . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $_ memmove ", Ġ"\ $_ memcpy " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġctx . getName ( arg [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġctx . getName ( arg [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġctx . getName ( arg [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" System . arraycopy ( heap Bytes , Ġ$ src , Ġheap Bytes , Ġ$ dst , Ġ$ count )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ( dst ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $_ memset " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġptr Ġ= Ġctx . getName ( arg [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġctx . getName ( arg [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġctx . getName ( arg [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" java . util . Arrays . fill ( heap Bytes , Ġ$ ptr , Ġ$ ptr Ġ+ Ġ$ num , Ġ${ value . c byte }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ( ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Set Ġ= Ġfunc . type . args . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Local s Ġ= Ġbody Ast . getLocal s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( local Ġin Ġall Local s . filter Ġ{ Ġit Ġ! in Ġargs Set Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( local . type ( ctx . getName ( local )), Ġlocal . type . default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdump Extra Local s ( ctx , Ġfunc , Ġall Local s , Ġargs Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġbody Ast . dump ( ctx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( phi Ġin Ġctx . phi Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( phi (" phi _$ phi "), Ġphi . default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ( res . ind enter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . dump Extra Local s ( ctx : ĠDump Context , Ġfunc : ĠW asm Func , Ġlo cs : ĠList < Ast Local >, Ġargs : ĠSet < Ast Local >) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval ĠInteger Type Ġ= Ġ" Integer " ĊĊĠĠĠ Ġfun ĠInd enter . sysc alls () Ġ{ ĊĠĠĠĠĠĠĠ ĠFIELD ( int (" last FD "), Ġ" 1 0 ") ĊĠĠĠĠĠĠĠ ĠFIELD ( type (" java . util . HashMap <$ Integer Type , Ġjava . io . Random Access File >") (" files "), Ġtype (" java . util . HashMap <$ Integer Type , Ġjava . io . Random Access File > "). new ()) ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( STR (" path Name "), Ġ" getString z ( lw ( address Ġ+ Ġ 0 )) ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" flags "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" mode "), Ġ" lw ( address Ġ+ Ġ 8 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" last FD ++ ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( STR (" sm ode "), Ġt ernary ("( flags Ġ$ AND Ġ($ O _ WR ONLY Ġ$ OR Ġ$ O _ RD WR )) Ġ!= Ġ 0 ", Ġ"\" rw \"", Ġ"\" r \"" )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( FILE (" file "), ĠFILE . new (" path Name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( RA FILE (" raf "), ĠRA FILE . new (" file ", Ġ" sm ode ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" files . put ( fd , Ġr af )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" fd ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ close ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" close Ġfd =\" Ġ+ Ġfd ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( RA FILE . nullable (" raf "), Ġ" files . remove ( fd )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" files . remove ( fd ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" raf Ġ!= Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" raf . close () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ ioctl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" param "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" ioctl Ġfd =\" Ġ+ Ġfd Ġ+ Ġ\ ", Ġparam =\" Ġ+ Ġparam ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ fcntl 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" param H "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" param L "), Ġ" lw ( address Ġ+ Ġ 8 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" ioctl Ġfd =\" Ġ+ Ġfd Ġ+ Ġ\ ", Ġparam =\" Ġ+ Ġparam ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS __ ll seek ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" offset H "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" offset L "), Ġ" lw ( address Ġ+ Ġ 8 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" result "), Ġ" lw ( address Ġ+ Ġ 1 2 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" wh ence "), Ġ" lw ( address Ġ+ Ġ 1 6 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( long (" offset "), Ġ" offset L ". cl ong ) Ġ// Ġoffset H Ġunused Ġin Ġem scripten ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . printf (\" ll seek Ġfd =% d , Ġoffset H =% d , Ġoffset L =% d , Ġresult =% d , Ġwh ence =% d \", Ġfd , Ġoffset H , Ġoffset L , Ġresult , Ġwh ence ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( RA FILE . nullable (" raf "), Ġ" files . get ( fd )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" raf Ġ== Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ("- 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSW ITCH (" wh ence ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE _ STM _ BREAK ( 0 ) Ġ{ Ġ// ĠSEEK _ SET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" raf . seek ( offset )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE _ STM _ BREAK ( 1 ) Ġ{ Ġ// ĠSEEK _ CUR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" raf . seek ( raf . getFile Pointer () Ġ+ Ġoffset )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE _ STM _ BREAK ( 2 ) Ġ{ Ġ// ĠSEEK _ END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" raf . seek ( raf . length () Ġ+ Ġoffset )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" result Ġ!= Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" sd w ( result , Ġr af . getFile Pointer ()) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ read v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" iov "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" io vc nt "), Ġ" lw ( address Ġ+ Ġ 8 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" read v Ġfd =\" Ġ+ Ġfd Ġ+ Ġ\ ", Ġi ov =\" Ġ+ Ġi ov Ġ+ Ġ\ ", Ġi ov cnt =\" Ġ+ Ġi ov cnt ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( RA FILE . nullable (" raf "), Ġ" files . get ( fd )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" ret "), Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLABEL (" end ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR (" cc ", Ġfrom Ġ= Ġ" 0 ", Ġuntil Ġ= Ġ" io vc nt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" ptr "), Ġ" lw (( iov Ġ+ Ġ( cc Ġ* Ġ 8 )) Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" len "), Ġ" lw (( iov Ġ+ Ġ( cc Ġ* Ġ 8 )) Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" chunk : Ġptr =\" Ġ+ Ġptr Ġ+ Ġ\ ", len =\" Ġ+ Ġlen ); ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" res "), Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" raf Ġ!= Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" res Ġ= Ġr af . read ( heap Bytes , Ġptr , Ġlen )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠELSE _ IF (" fd Ġ== Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" res Ġ= Ġ${ System _ in ()}. read ( heap Bytes , Ġptr , Ġlen )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" res Ġ<= Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBRE AK (" end ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" ret Ġ+= Ġres ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" ret ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyscall ( W asm Sy scall . SYS _ write v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" fd "), Ġ" lw ( address Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" iov "), Ġ" lw ( address Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" io vc nt "), Ġ" lw ( address Ġ+ Ġ 8 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" write v Ġfd =\" Ġ+ Ġfd Ġ+ Ġ\ ", Ġi ov =\" Ġ+ Ġi ov Ġ+ Ġ\ ", Ġi ov cnt =\" Ġ+ Ġi ov cnt ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( RA FILE . nullable (" raf "), Ġ" files . get ( fd )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" ret "), Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR (" cc ", Ġfrom Ġ= Ġ" 0 ", Ġuntil Ġ= Ġ" io vc nt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" ptr "), Ġ" lw (( iov Ġ+ Ġ( cc Ġ* Ġ 8 )) Ġ+ Ġ 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" len "), Ġ" lw (( iov Ġ+ Ġ( cc Ġ* Ġ 8 )) Ġ+ Ġ 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" System . out . println (\" chunk : Ġptr =\" Ġ+ Ġptr Ġ+ Ġ\ ", len =\" Ġ+ Ġlen ); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" len Ġ== Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONTINUE () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" raf Ġ!= Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" raf . write ( heap Bytes , Ġptr , Ġlen )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠELSE _ IF (" fd Ġ== Ġ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" System . out . write ( heap Bytes , Ġptr , Ġlen )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠELSE _ IF (" fd Ġ== Ġ 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" System . err . write ( heap Bytes , Ġptr , Ġlen )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" ret Ġ+= Ġlen ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" ret ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠSystem _ in () Ġ= Ġ" System . in " ĊĊĠĠĠ Ġ// Ġhttps :// web assembly . github . io / spec / core / exec / num erics . html ĊĠĠĠ Ġfun ĠInd enter . write Ops (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" b 2 i ", Ġint , Ġbool (" v ")) Ġ{ Ġt ernary (" v ", Ġ" 1 ", Ġ" 0 ") Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO ", Ġvoid ) Ġ{ ĠTHROW ( RT EXCEPTION . new ()) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ i 3 2 ", Ġint ) Ġ{ ĠTHROW ( RT EXCEPTION . new ()) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ i 6 4 ", Ġlong ) Ġ{ ĠTHROW ( RT EXCEPTION . new ()) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ f 3 2 ", Ġfloat ) Ġ{ ĠTHROW ( RT EXCEPTION . new ()) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ f 6 4 ", Ġdouble ) Ġ{ ĠTHROW ( RT EXCEPTION . new ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO ", Ġvoid , ĠSTR (" reason ")) Ġ{ ĠTHROW ( RT EXCEPTION . new (" reason ")) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ i 3 2 ", Ġint , ĠSTR (" reason ")) Ġ{ ĠTHROW ( RT EXCEPTION . new (" reason ")) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ i 6 4 ", Ġlong , ĠSTR (" reason ")) Ġ{ ĠTHROW ( RT EXCEPTION . new (" reason ")) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ f 3 2 ", Ġfloat , ĠSTR (" reason ")) Ġ{ ĠTHROW ( RT EXCEPTION . new (" reason ")) Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" TODO _ f 6 4 ", Ġdouble , ĠSTR (" reason ")) Ġ{ ĠTHROW ( RT EXCEPTION . new (" reason ")) Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" sb ", Ġvoid , Ġint (" address "), Ġint (" value "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ store 8 ( address , Ġ 0 , Ġ 0 , Ġvalue )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" sh ", Ġvoid , Ġint (" address "), Ġint (" value "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ store 1 6 ( address , Ġ 0 , Ġ 1 , Ġvalue )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" sw ", Ġvoid , Ġint (" address "), Ġint (" value "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ store ( address , Ġ 0 , Ġ 2 , Ġvalue )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" sd w ", Ġvoid , Ġint (" address "), Ġlong (" value "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 6 4 _ store ( address , Ġ 0 , Ġ 3 , Ġvalue )" Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" lb ", Ġint , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ load 8 _ s ( address , Ġ 0 , Ġ 0 )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" l bu ", Ġint , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ load 8 _ u ( address , Ġ 0 , Ġ 0 )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" lh ", Ġint , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ load 1 6 _ s ( address , Ġ 0 , Ġ 1 )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" l hu ", Ġint , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ load 1 6 _ u ( address , Ġ 0 , Ġ 1 )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" lw ", Ġint , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 3 2 _ load ( address , Ġ 0 , Ġ 2 )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" ld w ", Ġlong , Ġint (" address "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" Op _ i 6 4 _ load ( address , Ġ 0 , Ġ 3 )" Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" getByte ", Ġint , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . get ( a ) ". c int Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" get Short ", Ġint , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . get Short ( a ) ". c int Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" getInt ", Ġint , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . getInt ( a )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" getLong ", Ġlong , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . getLong ( a )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" get Float ", Ġfloat , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . get Float ( a )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" getDouble ", Ġdouble , Ġint (" a "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . getDouble ( a )" Ġ} ĊĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Byte ", Ġvoid , Ġint (" a "), Ġint (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put ( a , Ġ${ " v ". c byte })" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Short ", Ġvoid , Ġint (" a "), Ġint (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put Short ( a , Ġ${ " v ". c short })" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Int ", Ġvoid , Ġint (" a "), Ġint (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put Int ( a , Ġv )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Long ", Ġvoid , Ġint (" a "), Ġlong (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put Long ( a , Ġv )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Float ", Ġvoid , Ġint (" a "), Ġfloat (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put Float ( a , Ġv )" Ġ} ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE (" put Double ", Ġvoid , Ġint (" a "), Ġdouble (" v "), Ġpub Ġ= Ġfalse ) Ġ{ Ġ" heap . put Double ( a , Ġv )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Op _ memory _ size ĊĠĠĠĠĠĠĠ Ġ// Op _ memory _ grow ĊĠĠĠĠĠĠĠ Ġ// Op _ i 3 2 _ const ĊĠĠĠĠĠĠĠ Ġ// Op _ i 6 4 _ const ĊĠĠĠĠĠĠĠ Ġ// Op _ f 3 2 _ const ĊĠĠĠĠĠĠĠ Ġ// Op _ f 6 4 _ const ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" check Address ", Ġint , Ġint (" address "), Ġint (" offset "), Ġint (" align "), Ġint (" size "), Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOCAL ( int (" r address "), Ġ" address Ġ+ Ġoffset ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF (" r address Ġ< Ġ 0 Ġ|| Ġr address Ġ>= Ġheap . limit () Ġ- Ġ 4 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM _ EXPR (" System . out . printf (\" ADDRESS : Ġ% d Ġ(% d Ġ+ Ġ% d ) Ġalign =% d , Ġsize =% d \\ n \", Ġr address , Ġaddress , Ġoffset , Ġalign , Ġsize )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// line (" if Ġ(( r address Ġ& Ġ(( 1 Ġ<< Ġalign ) Ġ- Ġ 1 )) Ġ!= Ġ 0 )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġline (" System . out . printf (\" UN ALIGN ED ĠACCESS Ġ% d Ġ(% d Ġ+ Ġ% d ) Ġalign =% d , Ġsize =% d ! \\ n \", Ġr address , Ġaddress , Ġoffset , Ġalign , Ġsize ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" r address ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline ("") ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" check A Read ", Ġint , Ġint (" address "), Ġint (" offset "), Ġint (" align "), Ġint (" size "), Ġpub Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" check Address ( address , Ġoffset , Ġalign , Ġsize )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline ("") ĊĊĠĠĠĠĠĠĠ ĠFUNC _ IND ENTER (" check A Write ", Ġint , Ġint (" address "), Ġint (" offset "), Ġint (" align "), Ġint (" size ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN (" check Address ( address , Ġoffset , Ġalign , Ġsize )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠW asm Type . new ( var arg Ġargs : ĠString ) Ġ= ĠNEW ( this , Ġ* args ) ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . THROW ( expr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" throw Ġ$ expr ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . TRY ( callback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" try ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CATCH ( arg : ĠMy Arg , Ġcallback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" catch Ġ(${ arg . type . type ()} Ġ${ arg . name }) ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠNEW ( type : ĠW asm Type , Ġvar arg Ġargs : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" new Ġ${ type . type ( instantiate Ġ= Ġtrue )} (${ args . join ToString (", Ġ") })" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . IF ( cond : ĠString , Ġbody : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" if Ġ($ cond )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . ELSE _ IF ( cond : ĠString , Ġbody : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" else Ġif Ġ($ cond )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . ELSE ( body : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" else ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . LABEL ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ("$ name :") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠAst Label . goto ( ctx : ĠDump Context ) Ġ= Ġ"${ this . kind . keyword } Ġ${ ctx . getName ( this )}" ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . BREAK ( name : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ( if Ġ( name . isNull OrEmpty ()) Ġ" break ;" Ġelse Ġ" break Ġ$ name ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CONTINUE ( name : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ( if Ġ( name . isNull OrEmpty ()) Ġ" continue ;" Ġelse Ġ" continue Ġ$ name ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . LOCAL ( arg : ĠMy Arg , Ġexpr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ("${ arg . type . type ()} Ġ${ arg . name } Ġ= Ġ$ expr ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . FOR ( v : ĠString , Ġfrom : ĠString , Ġuntil : ĠString , Ġbody : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" for Ġ( int Ġ$ v Ġ= Ġ$ from ; Ġ$ v Ġ< Ġ$ until ; Ġ$ v ++) ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . WH ILE ( cond : ĠString , Ġbody : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" while Ġ($ cond )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . BLOCK ( body : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ("") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠRETURN _ INLINE ( expr : ĠString ) Ġ= Ġ" return Ġ$ expr ;" ĊĠĠĠ Ġopen Ġfun ĠSTM _ EXPR _ INLINE ( expr : ĠString ) Ġ= Ġ"$ expr ;" ĊĊĠĠĠ Ġfun ĠInd enter . RETURN ( expr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ( RETURN _ INLINE ( expr )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . STM _ EXPR ( expr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline ( STM _ EXPR _ INLINE ( expr )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . RETURN _ VOID () Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" return ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . FUNC _ INLINE _ RAW ( name : ĠString , Ġret : ĠW asm Type , Ġvar arg Ġargs : ĠMy Arg , Ġpub : ĠBoolean Ġ= Ġtrue , Ġbody : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġif Ġ( pub ) Ġ" public " Ġelse Ġ" private " ĊĠĠĠĠĠĠĠ Ġline ("$ s Ġ${ ret . type ()} Ġ$ name (${ args . arg str () }) Ġ{ Ġ${ body ()} Ġ} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . FUNC _ INLINE ( name : ĠString , Ġret : ĠW asm Type , Ġvar arg Ġargs : ĠMy Arg , Ġpub : ĠBoolean Ġ= Ġtrue , Ġbody : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr body Ġ= Ġif Ġ( ret Ġ== Ġvoid ) ĠSTM _ EXPR _ INLINE ( body ()) Ġelse ĠRETURN _ INLINE ( body ()) ĊĠĠĠĠĠĠĠ ĠFUNC _ INLINE _ RAW ( name , Ġret , Ġ* args , Ġpub Ġ= Ġpub ) Ġ{ Ġr body Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . FUNC _ IND ENTER ( name : ĠString , Ġret : ĠW asm Type , Ġvar arg Ġargs : ĠMy Arg , Ġpub : ĠBoolean Ġ= Ġtrue , Ġbody : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġif Ġ( pub ) Ġ" public " Ġelse Ġ" private " ĊĠĠĠĠĠĠĠ Ġline ("$ s Ġ${ ret . type ()} Ġ$ name (${ args . arg str () }) ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . SWITCH ( expr : ĠString , Ġcallback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" switch Ġ($ expr )") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CASE _ RETURN ( ret type : ĠW asm Type , Ġindex : ĠInt , Ġexpr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ret type Ġ== ĠW asm Type . void ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline (" case Ġ$ index : Ġ$ expr ; Ġreturn ; ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline (" case Ġ$ index : Ġreturn Ġ$ expr ; ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CASE _ STM _ BREAK ( index : ĠInt , Ġcallback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" case Ġ$ index :") ĊĠĠĠĠĠĠĠ Ġindent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline (" break ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CASE _ F STM ( index : ĠInt , Ġcallback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" case Ġ$ index :") ĊĠĠĠĠĠĠĠ Ġindent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠInd enter . CASE _ DEFAULT _ F STM ( callback : ĠInd enter . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġline (" default :") ĊĠĠĠĠĠĠĠ Ġindent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠW asm Type . default (): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠW asm Type . i 6 4 Ġ-> Ġ" 0 L " ĊĠĠĠĠĠĠĠ ĠW asm Type . f 3 2 Ġ-> Ġ" 0 f " ĊĠĠĠĠĠĠĠ ĠW asm Type . f 6 4 Ġ-> Ġ" 0 . 0 " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" 0 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠW asm Type . type ( instantiate : ĠBoolean Ġ= Ġfalse ): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠW asm Type . void Ġ-> Ġ" void " ĊĠĠĠĠĠĠĠ ĠW asm Type ._ i 8 Ġ-> Ġ" byte " ĊĠĠĠĠĠĠĠ ĠW asm Type ._ i 1 6 Ġ-> Ġ" short " ĊĠĠĠĠĠĠĠ ĠW asm Type . i 3 2 Ġ-> Ġ" int " ĊĠĠĠĠĠĠĠ ĠW asm Type . i 6 4 Ġ-> Ġ" long " ĊĠĠĠĠĠĠĠ ĠW asm Type . f 3 2 Ġ-> Ġ" float " ĊĠĠĠĠĠĠĠ ĠW asm Type . f 6 4 Ġ-> Ġ" double " ĊĠĠĠĠĠĠĠ Ġis ĠW asm Type ._ NULL ABLE Ġ-> Ġthis . element . type ( instantiate ) ĊĠĠĠĠĠĠĠ Ġis ĠW asm Type ._ ARRAY Ġ-> Ġ"${ this . element . type ( instantiate )} []" ĊĠĠĠĠĠĠĠ Ġis ĠW asm Type ._ VAR ARG Ġ-> Ġ"${ this . element . type ( instantiate )} ..." ĊĠĠĠĠĠĠĠ Ġis ĠW asm Type . Function Ġ-> Ġ" (${ this . args . join ToString (", Ġ") Ġ{ Ġit . type . type () Ġ}}) Ġ-> Ġ${ this . ret Type . type ( instantiate )}" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ this " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval ĠString . c inv Ġget () Ġ= Ġ"( ~ ($ this )) " Ċ } Ċ Ċ val ĠW asm Type . nullable Ġget () Ġ= ĠW asm Type ._ NULL ABLE ( this ) Ċ