/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . wasm . ir 2 wasm Ċ Ċ import Ġorg . jetbrains . kotlin . wasm . ir . W asm Symbol Ċ Ċ // ĠRepresentation Ġof Ġconstant Ġdata Ġin ĠW asm Ġmemory Ċ Ċ internal Ġconst Ġval ĠCHAR _ SIZE _ BYTES Ġ= Ġ 2 Ċ internal Ġconst Ġval ĠINT _ SIZE _ BYTES Ġ= Ġ 4 Ċ Ċ sealed Ġclass ĠConstant Data Element Ġ{ ĊĠĠĠ Ġabstract Ġval Ġsize InBytes : ĠInt ĊĠĠĠ Ġabstract Ġfun Ġdump ( indent : ĠString Ġ= Ġ"", Ġstart Address : ĠInt Ġ= Ġ 0 ): ĠString ĊĠĠĠ Ġabstract Ġfun Ġto Bytes (): ĠByteArray Ċ } Ċ Ċ private Ġfun Ġaddress ToString ( address : ĠInt ): ĠString Ġ= ĊĠĠĠ Ġaddress . toString (). pad End ( 6 , Ġ' Ġ') Ċ Ċ class ĠConstant Data CharField ( val Ġname : ĠString , Ġval Ġvalue : ĠW asm Symbol < Char >) Ġ: ĠConstant Data Element () Ġ{ ĊĠĠĠ Ġconstructor ( name : ĠString , Ġvalue : ĠChar ) Ġ: Ġthis ( name , ĠW asm Symbol ( value )) ĊĊĠĠĠ Ġoverride Ġfun Ġto Bytes (): ĠByteArray Ġ= Ġvalue . owner . to LittleEndian Bytes () ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠString , Ġstart Address : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ address ToString ( start Address )} : Ġ$ indent Ġi 3 2 ĠĠ Ġ: Ġ${ value . owner } ĠĠĠ Ġ;; Ġ$ name \ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize InBytes : ĠInt Ġ= ĠCHAR _ SIZE _ BYTES Ċ } Ċ Ċ class ĠConstant Data Int Field ( val Ġname : ĠString , Ġval Ġvalue : ĠW asm Symbol < Int >) Ġ: ĠConstant Data Element () Ġ{ ĊĠĠĠ Ġconstructor ( name : ĠString , Ġvalue : ĠInt ) Ġ: Ġthis ( name , ĠW asm Symbol ( value )) ĊĊĠĠĠ Ġoverride Ġfun Ġto Bytes (): ĠByteArray Ġ= Ġvalue . owner . to LittleEndian Bytes () ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠString , Ġstart Address : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ address ToString ( start Address )} : Ġ$ indent Ġi 3 2 ĠĠ Ġ: Ġ${ value . owner } ĠĠĠ Ġ;; Ġ$ name \ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize InBytes : ĠInt Ġ= ĠINT _ SIZE _ BYTES Ċ } Ċ Ċ class ĠConstant Data IntArray ( val Ġname : ĠString , Ġval Ġvalue : ĠList < W asm Symbol < Int >>) Ġ: ĠConstant Data Element () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġto Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . fold ( byte ArrayOf ()) Ġ{ Ġacc , Ġel Ġ-> Ġacc Ġ+ Ġel . owner . to LittleEndian Bytes () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠString , Ġstart Address : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value . isEmpty ()) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ address ToString ( start Address )} : Ġ$ indent Ġi 3 2 [] Ġ: Ġ${ value . map Ġ{ Ġit . owner Ġ}. to IntArray (). content ToString ()} ĠĠ Ġ;; Ġ$ name \ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize InBytes : ĠInt Ġ= Ġvalue . size Ġ* ĠINT _ SIZE _ BYTES Ċ } Ċ Ċ class ĠConstant Data CharArray ( val Ġname : ĠString , Ġval Ġvalue : ĠList < W asm Symbol < Char >>) Ġ: ĠConstant Data Element () Ġ{ ĊĠĠĠ Ġconstructor ( name : ĠString , Ġvalue : ĠChar Array ) Ġ: Ġthis ( name , Ġvalue . map Ġ{ ĠW asm Symbol ( it ) Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġto Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . owner . to LittleEndian Bytes () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( byte ArrayOf (), ĠByteArray :: plus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠString , Ġstart Address : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value . isEmpty ()) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ address ToString ( start Address )} : Ġ$ indent Ġi 1 6 [] Ġ: Ġ${ value . map Ġ{ Ġit . owner Ġ}. toCharArray (). content ToString ()} ĠĠ Ġ;; Ġ$ name \ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize InBytes : ĠInt Ġ= Ġvalue . size Ġ* ĠCHAR _ SIZE _ BYTES Ċ } Ċ Ċ class ĠConstant Data Struct ( val Ġname : ĠString , Ġval Ġelements : ĠList < Constant Data Element >) Ġ: ĠConstant Data Element () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġto Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelements . fold ( byte ArrayOf ()) Ġ{ Ġacc , Ġel Ġ-> Ġacc Ġ+ Ġel . to Bytes () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠString , Ġstart Address : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġ"$ indent ;; Ġ$ name \ n " ĊĠĠĠĠĠĠĠ Ġvar Ġelem Start Addr Ġ= Ġstart Address ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġel . dump ("$ indent Ġ Ġ", Ġelem Start Addr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelem Start Addr Ġ+= Ġel . size InBytes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize InBytes : ĠInt Ġ= Ġelements . map Ġ{ Ġit . size InBytes Ġ}. sum () Ċ } Ċ Ċ fun ĠInt . to LittleEndian Bytes (): ĠByteArray Ġ{ ĊĠĠĠ Ġreturn ĠByteArray ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( this Ġ ush r Ġ( it Ġ* Ġ 8 )). to Byte () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠChar . to LittleEndian Bytes (): ĠByteArray Ġ{ ĊĠĠĠ Ġreturn Ġbyte ArrayOf (( this . code Ġand Ġ 0 xFF ). to Byte (), Ġ( this . code Ġand Ġ 0 xFF 0 0 ). to Byte ()) Ċ }