package Ġas mb le . run . jvm Ċ Ċ import Ġas mb le . annotation . W asm Export Ċ import Ġas mb le . annotation . W asm External Kind Ċ import Ġas mb le . ast . Node Ċ import Ġas mb le . compile . jvm . Mem Ċ import Ġas mb le . compile . jvm . ref Ċ import Ġjava . lang . invoke . Method Handle Ċ import Ġjava . lang . invoke . Method Handles Ċ import Ġjava . lang . invoke . MethodType Ċ import Ġjava . lang . reflect . Constructor Ċ import Ġjava . lang . reflect . Modifier Ċ Ċ interface ĠModule Ġ{ ĊĠĠĠ Ġfun Ġbind Method ( ĊĠĠĠĠĠĠĠ Ġctx : ĠScript Context , ĊĠĠĠĠĠĠĠ Ġwasm Name : ĠString , ĊĠĠĠĠĠĠĠ Ġwasm Kind : ĠW asm External Kind , ĊĠĠĠĠĠĠĠ Ġjava Name : ĠString , ĊĠĠĠĠĠĠĠ Ġtype : ĠMethod Type ĊĠĠĠ Ġ): ĠMethod Handle ? ĊĊĠĠĠ Ġdata Ġclass ĠComposite ( val Ġmodules : ĠList < Module >) Ġ: ĠModule Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind Method ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠScript Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwasm Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwasm Kind : ĠW asm External Kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠMethod Type ĊĠĠĠĠĠĠĠ Ġ) Ġ= Ġmodules . as Sequence (). map NotNull Ġ{ Ġit . bind Method ( ctx , Ġwasm Name , Ġwasm Kind , Ġjava Name , Ġtype ) Ġ}. single OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠInstance Ġ: ĠModule Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcls : ĠClass < *> ĊĠĠĠĠĠĠĠ Ġ// ĠGu arante ed Ġto Ġbe Ġthe Ġsame Ġinstance Ġwhen Ġthere Ġis Ġno Ġerror ĊĠĠĠĠĠĠĠ Ġfun Ġinstance ( ctx : ĠScript Context ): ĠAny ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind Method ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠScript Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwasm Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwasm Kind : ĠW asm External Kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠMethod Type ĊĠĠĠĠĠĠĠ Ġ) Ġ= Ġcls . methods . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ W asm Export Ġmatch Ġor Ġjust Ġjava Name Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . is Public ( it . modifiers ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! Modifier . is Static ( it . modifiers ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getDeclared Annotation ( W asm Export :: class . java ). let Ġ{ Ġann Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ann Ġ== Ġnull ) Ġit . name Ġ== Ġjava Name Ġelse Ġann . value Ġ== Ġwasm Name Ġ&& Ġann . kind Ġ== Ġwasm Kind ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Handles . lookup (). un reflect ( it ). bind To ( instance ( ctx )). take If Ġ{ Ġit . type () Ġ== Ġtype Ġ} ĊĠĠĠĠĠĠĠ Ġ}. single OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠNative ( override Ġval Ġcls : ĠClass <* >, Ġval Ġinst : ĠAny ) Ġ: ĠInstance Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( inst : ĠAny ) Ġ: Ġthis ( inst :: class . java , Ġinst ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstance ( ctx : ĠScript Context ) Ġ= Ġinst ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠComp iled ( ĊĠĠĠĠĠĠĠ Ġval Ġmod : ĠNode . Module , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcls : ĠClass <* >, ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġmem : ĠMem ĊĠĠĠ Ġ) Ġ: ĠInstance Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinst : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstance ( ctx : ĠScript Context ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ Ġinst Ġ?: Ġcreate Instance ( ctx ). also Ġ{ Ġinst Ġ= Ġit Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Instance ( ctx : ĠScript Context ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconstructor Params Ġ= Ġempty List < Any >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconstructor : ĠConstructor < *> ? ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġa Ġmemory Ġimport , Ġwe Ġhave Ġto Ġget Ġthe Ġone Ġwith Ġthe Ġmem Ġclass Ġas Ġthe Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Import Ġ= Ġmod . imports . find Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Memory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġctx . memory Builder ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Limit Ġ= Ġif Ġ( mem Import Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Ġ= Ġcls . declared Construct ors . find Ġ{ Ġit . parameter Types . first OrNull ()?. ref Ġ== Ġmem . mem Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Import Kind Ġ= Ġmem Import . kind Ġas ĠNode . Import . Kind . Memory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Inst Ġ= Ġctx . resolve Import Memory ( mem Import , Ġmem Import Kind . type , Ġmem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ+= Ġmem Inst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( mem Limit , Ġmem Cap ) Ġ= Ġmem . limit And Capacity ( mem Inst ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mem Limit Ġ< Ġmem Import Kind . type . limits . initial Ġ* ĠMem . PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Import Memory Limit Too Small ( mem Import Kind . type . limits . initial Ġ* ĠMem . PAGE _ SIZE , Ġmem Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Import Kind . type . limits . maximum ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mem Cap Ġ> Ġit Ġ* ĠMem . PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Import Memory Capacity Too Large ( it Ġ* ĠMem . PAGE _ SIZE , Ġmem Cap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( builder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Ġ= Ġcls . declared Construct ors . find Ġ{ Ġit . parameter Types . first OrNull ()?. ref Ġ== Ġmem . mem Type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Limit Ġ= Ġctx . default Max Mem Pages Ġ* ĠMem . PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Inst Ġ= Ġbuilder . build ( mem Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ+= Ġmem Inst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġconstructor Ġwith Ġno Ġmax Ġmem Ġamount Ġ( i . e . Ġnot Ġint Ġand Ġnot Ġmemory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Ġ= Ġcls . declared Construct ors . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Class Ġ= ĠClass . forName ( mem . mem Type . asm . className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . parameter Types . first OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java , Ġmem Class Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis Ġnot Ġthere , Ġfind Ġthe Ġone Ġw / Ġthe Ġmax Ġmem Ġamount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaybe Mem Ġ= Ġmod . mem ories . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Mem Ġ= ĠMath . max ( maybe Mem ?. limits ?. initial Ġ?: Ġ 0 , Ġctx . default Max Mem Pages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Ġ= Ġcls . declared Construct ors . find Ġ{ Ġit . parameter Types . first OrNull () Ġ== ĠInt :: class . java Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ+= Ġmax Mem Ġ* ĠMem . PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Mem ?. limits ?. initial ?. let Ġ{ Ġit Ġ* ĠMem . PAGE _ SIZE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor Ġ== Ġnull ) Ġerror (" Unable Ġto Ġfind Ġsuitable Ġmodule Ġconstructor ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFunction Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ+= Ġmod . imports . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . kind Ġis ĠNode . Import . Kind . Func ) Ġctx . resolve Import Func ( it , Ġmod . types [ it . kind . type Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGlobal Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglobal Imports Ġ= Ġmod . imports . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . kind Ġis ĠNode . Import . Kind . Global ) Ġctx . resolve Import Globals ( it , Ġit . kind . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ+= Ġglobal Imports ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTable Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Import Ġ= Ġmod . imports . find Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Table Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Size Ġ= Ġif Ġ( table Import Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Import Kind Ġ= Ġtable Import . kind Ġas ĠNode . Import . Kind . Table ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġctx . resolve Import Table ( table Import , Ġtable Import Kind . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( table . size Ġ< Ġtable Import Kind . type . limits . initial ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Import Table Too Small ( table Import Kind . type . limits . initial , Ġtable . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Import Kind . type . limits . maximum ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( table . size Ġ> Ġit ) Ġthrow ĠRun Err . Import Table Too Large ( it , Ġtable . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Params Ġ= Ġconstructor Params . plus Element ( table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġmod . tables . first OrNull ()?. limits ?. initial ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġvalidate Ġthat Ġelems Ġcan Ġfit Ġin Ġtable Ġand Ġdata Ġcan Ġfit Ġin Ġmem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġconst Int Expr ( ins ns : ĠList < Node . Instr >): ĠInt ? Ġ= Ġins ns . single OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Const Ġ-> Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode . Instr . Get Global Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . index Ġ< Ġglobal Imports . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImports Ġwe Ġalready Ġhave ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( global Imports [ it . index ]. type (). returnType () Ġ== ĠInt :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Imports [ it . index ]. invoke With Arguments () Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġconst Int Expr ( mod . globals [ it . index Ġ- Ġglobal Imports . size ]. init ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( table Size Ġ!= Ġnull ) Ġmod . elems . forEach Ġ{ Ġelem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Int Expr ( elem . offset )?. let Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ+ Ġelem . func Indices . size Ġ> Ġtable Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Invalid Elem Index ( offset , Ġelem . func Indices . size , Ġtable Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mem Limit Ġ!= Ġnull ) Ġmod . data . forEach Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Int Expr ( data . offset )?. let Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ< Ġ 0 Ġ|| Ġoffset Ġ+ Ġdata . data . size Ġ> Ġmem Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Err . Invalid Data Index ( offset , Ġdata . data . size , Ġmem Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . debug Ġ{ Ġ" Instanti ating Ġ$ cls Ġusing Ġ$ constructor Ġwith Ġparams Ġ$ constructor Params " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconstructor . newInstance (* constructor Params . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }