/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ċ Ġ* Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ċ Ġ* Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ċ Ġ* Ġeither Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġkw asm . runtime Ċ Ċ /** Ċ Ġ* ĠFrom Ġ[ the Ġdocs ]( https :// web assembly . github . io / spec / core / exec / runtime . html # store ): Ċ Ġ* Ċ Ġ* ĠThe Ġstore Ġrepresents Ġall Ġglobal Ġstate Ġthat Ġcan Ġbe Ġmanip ulated Ġby ĠWeb Assembly Ġprograms . ĠIt Ċ Ġ* Ġconsists Ġof Ġthe Ġruntime Ġrepresentation Ġof Ġall Ġinstances Ġof Ġfunctions , Ġtables , Ġmem ories , Ġand Ċ Ġ* Ġglobals Ġthat Ġhave Ġbeen Ġallocated Ġduring Ġthe Ġlife Ġtime Ġof Ġthe Ġabstract Ġmachine . Ċ Ġ* Ċ Ġ* ĠSynt act ically , Ġthe Ġstore Ġis Ġdefined Ġas Ġa Ġrecord Ġlisting Ġthe Ġexisting Ġinstances Ġof Ġeach Ġcategory : Ċ Ġ* Ġ``` Ċ Ġ* ĠĠ Ġstore Ġ Ġ::= Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuncs Ġfunc inst *, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables Ġtable inst *, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġme ms Ġme min st *, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobals Ġglobal inst * Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ data Ġclass ĠStore Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġfunctions : ĠList < Function Instance > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġtables : ĠList < Table > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġmem ories : ĠList < Memory > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġglobals : ĠList < Global <* >> Ġ= Ġempty List () Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠAlloc ates Ġthe Ġprovided Ġ[ Function Instance ]. Ġ*/ ĊĠĠĠ Ġfun Ġallocate Function ( function : ĠFunction Instance ): ĠAl location < Address . Function > Ġ= ĊĠĠĠĠĠĠĠ ĠAl location ( copy ( functions Ġ= Ġfunctions Ġ+ Ġfunction ), ĠAddress . Function ( functions . size )) ĊĊĠĠĠ Ġ/** ĠAlloc ates Ġthe Ġprovided Ġ[ Table ]. Ġ*/ ĊĠĠĠ Ġfun Ġallocate Table ( table : ĠTable ): ĠAl location < Address . Table > Ġ= ĊĠĠĠĠĠĠĠ ĠAl location ( copy ( tables Ġ= Ġtables Ġ+ Ġtable ), ĠAddress . Table ( tables . size )) ĊĊĠĠĠ Ġ/** ĠAlloc ates Ġthe Ġprovided Ġ[ Memory ]. Ġ*/ ĊĠĠĠ Ġfun Ġallocate Memory ( memory : ĠMemory ): ĠAl location < Address . Memory > Ġ= ĊĠĠĠĠĠĠĠ ĠAl location ( copy ( mem ories Ġ= Ġmem ories Ġ+ Ġmemory ), ĠAddress . Memory ( mem ories . size )) ĊĊĠĠĠ Ġ/** ĠAlloc ates Ġthe Ġprovided Ġ[ Global ]. Ġ*/ ĊĠĠĠ Ġfun Ġallocate Global ( global : ĠGlobal < *> ): ĠAl location < Address . Global > Ġ= ĊĠĠĠĠĠĠĠ ĠAl location ( copy ( globals Ġ= Ġglobals Ġ+ Ġglobal ), ĠAddress . Global ( globals . size )) ĊĊĠĠĠ Ġdata Ġclass ĠAl location < T Ġ: ĠAddress >( val Ġupdated Store : ĠStore , Ġval Ġallocated Address : ĠT ) Ċ } Ċ