package Ġcompiler Ċ Ċ import ĠFile Ċ import ĠMessage Ċ import ĠType Ċ import Ġalgorithm . align Ċ import Ġbackend . Backend Ċ Ċ class ĠCompiler ( ĊĠĠĠ Ġprivate Ġval Ġfile : ĠFile , ĊĠĠĠ Ġprivate Ġval Ġbackend : ĠBackend ) Ġ{ ĊĊĠĠĠ Ġfun Ġcompile All () Ġ{ ĊĠĠĠĠĠĠĠ Ġbackend . prepare () ĊĠĠĠĠĠĠĠ Ġfor Ġ( msg Ġin Ġfile . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( serialize , Ġdeserialize ) Ġ= Ġcompile Message ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend . compile Message ( msg , Ġserialize , Ġdeserialize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompile Message ( message : ĠMessage ): ĠPair < List < Instr >, ĠList < Instr >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserialize Ġ= Ġmutable ListOf < Instr >() ĊĠĠĠĠĠĠĠ Ġval Ġdeserialize Ġ= Ġmutable ListOf < Instr >() ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġpadding Ġof Ġthe Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġpadding Ġ= Ġalign ( message ) ĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġits Ġsize ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġhave Ġany Ġvariable - sized Ġfields Ġyet , Ġso Ġwe Ġcan Ġjust Ġsum Ġthe Ġsizes Ġof Ġall Ġfields Ġplus Ġthe Ġpadding ĊĠĠĠĠĠĠĠ Ġval Ġmsg Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . fields . map Ġ{ Ġget Size ( it . type ) Ġ}. sum () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding . map Ġ{ Ġit . value . Padding Size Ġ}. sum () ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġemit Ġthe Ġinstructions : ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġcheck Ġthe Ġbuffer Ġsize ĊĠĠĠĠĠĠĠ Ġserialize Ġ+= ĠIn str . Check Buf Size ( msg Size ) ĊĠĠĠĠĠĠĠ Ġdeserialize Ġ+= ĠIn str . Check Buf Size ( msg Size ) ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġonto Ġthe Ġfields : ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġmessage . fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġwhether Ġthere Ġis Ġpadding Ġbefore Ġthe Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . name Ġin Ġpadding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Ġ+= ĠIn str . Skip Padding ( padding [ field . name ] !!. Padding Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeserialize Ġ+= ĠIn str . Skip Padding ( padding [ field . name ] !!. Padding Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġserialize / deserialize ĠPrimitive Ġ( because Ġwe Ġdon 't Ġhave Ġnon - primitive Ġtypes Ġyet ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Ġ+= ĠIn str . Serialize Prim ( field . name , Ġfield . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeserialize Ġ+= ĠIn str . Deserialize Prim ( field . name , Ġfield . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( serialize , Ġdeserialize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Size ( t : ĠType ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType . Int 8 , Ġis ĠType . UInt 8 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType . Int 1 6 , Ġis ĠType . UInt 1 6 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType . Int 3 2 , Ġis ĠType . UInt 3 2 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType . Int 6 4 , Ġis ĠType . UInt 6 4 Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} Ċ }