/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 Ċ Ċ import Ġkw asm . KW asm RuntimeException Ċ import Ġkw asm . ast . Identifier Ċ import Ġkw asm . ast . type . FunctionType Ċ Ċ /** Ċ Ġ* ĠFrom Ġ[ the Ġdocs ]( https :// web assembly . github . io / spec / core / text / con ventions . html # contexts ): Ċ Ġ* Ċ Ġ* ĠWhere Ġ` I ` Ġis Ġa Ġ[ Identifier Context ]: Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* ĠĠ ĠI Ġ Ġ::= ĠĠ Ġ{ Ġtypes ĠĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuncs ĠĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables ĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġme ms ĠĠĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobals ĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocals ĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabels ĠĠĠĠĠ Ġ( id ? )* , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypedef s ĠĠĠ Ġfun ctype * ĠĠ Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ data Ġclass ĠIdentifier Context ( ĊĠĠĠ Ġval Ġtypes : ĠMutable Map < Int ?, ĠIdentifier . Type > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġfunctions : ĠMutable Map < Int ?, ĠIdentifier . Function > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġtables : ĠMutable Map < Int ?, ĠIdentifier . Table > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġme ms : ĠMutable Map < Int ?, ĠIdentifier . Memory > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġglobals : ĠMutable Map < Int ?, ĠIdentifier . Global > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġlocals : ĠMutable Map < Int ?, ĠIdentifier . Local > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġlabels : ĠMutable Map < Int ?, ĠIdentifier . Local > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġtypedef s : ĠMutable Map < FunctionType , ĠIdentifier . TypeDef > Ġ= Ġmutable Map Of () Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠGets Ġan Ġ[ Identifier ] Ġby Ġits Ġregistered Ġ[ id ], Ġor Ġ` null ` Ġif Ġnone Ġis Ġregistered Ġyet . Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠIdentifier > Ġget ( id : ĠInt ?): ĠT ? Ġ= Ġwhen Ġ( T :: class ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIdentifier . Type :: class Ġ-> Ġtypes [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Function :: class Ġ-> Ġfunctions [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Table :: class Ġ-> Ġtables [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Memory :: class Ġ-> Ġme ms [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Global :: class Ġ-> Ġglobals [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Local :: class Ġ-> Ġlocals [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ ĠIdentifier . Label :: class Ġ-> Ġlabels [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠK W asm RuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Record Ġlookup Ġfor Ġ${ T :: class . java } Ġby Ġunique Id Ġis Ġnot Ġsupported " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGets Ġan Ġ[ Identifier . TypeDef ] Ġby Ġits Ġ[ func Type ], Ġor Ġ` null ` Ġif Ġnone Ġis Ġregistered Ġyet . Ġ*/ ĊĠĠĠ Ġfun Ġget ( func Type : ĠFunction Type ): ĠIdentifier . TypeDef ? Ġ= Ġtypedef s [ func Type ] ĊĊĠĠĠ Ġ/** ĠRegisters Ġan Ġ[ Identifier ] Ġwith Ġthe Ġ[ Identifier Context ]. Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠIdentifier > Ġregister ( identifier : ĠIdentifier ): ĠT Ġ= Ġcompute ( identifier ) ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠIdentifier > Ġcompute ( identifier : ĠIdentifier ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Ġ= Ġwhen Ġ( identifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Type Ġ-> Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Function Ġ-> Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Table Ġ-> Ġtables ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Memory Ġ-> Ġme ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Global Ġ-> Ġglobals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Local Ġ-> Ġlocals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . Label Ġ-> Ġlabels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIdentifier . TypeDef Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypedef s . compute If Absent ( identifier . func Type ) Ġ{ Ġidentifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtypedef s [ identifier . func Type ] Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( identifier . unique Ġ! in Ġlookup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( lookup Ġas ĠMutable Map < Int ?, ĠIdentifier >) [ identifier . unique ] Ġ= Ġidentifier ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlookup [ identifier . unique ] Ġas ĠT ĊĠĠĠ Ġ} Ċ } Ċ