/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ package Ġorg . jetbrains . kotlin . native . interop . gen Ċ Ċ import Ġorg . jetbrains . kotlin . native . interop . indexer . Function Decl Ċ import Ġorg . jetbrains . kotlin . native . interop . indexer . Global Decl Ċ import Ġorg . jetbrains . kotlin . native . interop . indexer . Void Type Ċ import Ġorg . jetbrains . kotlin . native . interop . indexer . unwrap Type defs Ċ Ċ internal Ġdata Ġclass ĠC Cal lee Wrapper ( val Ġlines : ĠList < String >) Ċ Ċ /** Ċ Ġ* ĠSome Ġfunctions Ġdon 't Ġhave Ġan Ġaddress Ġ( e . g . Ġmacros - based Ġor Ġbuiltins ). Ċ Ġ* ĠTo Ġsolve Ġthis Ġproblem Ġwe Ġgenerate Ġa Ġwrapper Ġfunction . Ċ Ġ*/ Ċ internal Ġclass ĠC Wrappers Generator ( private Ġval Ġcontext : ĠStub Ir Context ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Function Wrapper Id Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠpackageName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . configuration . pkg Name . replace ( INVALID _ CL ANG _ IDENTIFIER _ REGEX , Ġ"_ ") ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Function Wrapper Name ( function Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ packageName }_${ function Name }_ wrapper ${ current Function Wrapper Id ++ }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Symbol To Function ( symbol : ĠString , Ġfunction : ĠString ): ĠList < String > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" const Ġvoid * Ġ$ symbol Ġ__ asm (${ symbol . quote As Kotlin Literal () }); ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" const Ġvoid * Ġ$ symbol Ġ= Ġ&$ function ;" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠParameter ( val Ġtype : ĠString , Ġval Ġname : ĠString ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters : ĠList < Parameter >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠString ĊĠĠĠ Ġ): ĠList < String > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"__ attribute __(( always _ inline )) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ returnType Ġ$ wrapper Name (${ parameters . join ToString Ġ{ Ġ"${ it . type } Ġ${ it . name }" Ġ}}) Ġ{ ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ* bind Symbol To Function ( symbol Name , Ġwrapper Name ). to Typed Array () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġgenerate CC alle e Wrapper ( function : ĠFunction Decl , Ġsymbol Name : ĠString ): ĠC Cal lee Wrapper Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC Cal lee Wrapper ( bind Symbol To Function ( symbol Name , Ġfunction . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Name Ġ= Ġgenerate Function Wrapper Name ( function . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġfunction . returnType . getString Representation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġfunction . parameters . map Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ( parameter . type . getString Representation (), Ġ" p $ index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Expression Ġ= Ġ"${ function . name } (${ parameters . join ToString Ġ{ Ġit . name Ġ} }); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Body Ġ= Ġif Ġ( function . returnType . unwrap Type defs () Ġis ĠVoid Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġ$ call Expression " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= Ġcreate Wrapper ( symbol Name , Ġwrapper Name , ĠreturnType , Ġparameters , Ġwrapper Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC Cal lee Wrapper ( wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate C Global Getter ( global Decl : ĠGlobal Decl , Ġsymbol Name : ĠString ): ĠC Cal lee Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Name Ġ= Ġgenerate Function Wrapper Name ("${ global Decl . name }_ getter ") ĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġglobal Decl . type . getString Representation () ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Body Ġ= Ġ" return Ġ${ global Decl . name }; " ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= Ġcreate Wrapper ( symbol Name , Ġwrapper Name , ĠreturnType , Ġempty List (), Ġwrapper Body ) ĊĠĠĠĠĠĠĠ Ġreturn ĠC Cal lee Wrapper ( wrapper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate C Global By Pointer Getter ( global Decl : ĠGlobal Decl , Ġsymbol Name : ĠString ): ĠC Cal lee Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Name Ġ= Ġgenerate Function Wrapper Name ("${ global Decl . name }_ getter ") ĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġ" void *" ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Body Ġ= Ġ" return Ġ& ${ global Decl . name }; " ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= Ġcreate Wrapper ( symbol Name , Ġwrapper Name , ĠreturnType , Ġempty List (), Ġwrapper Body ) ĊĠĠĠĠĠĠĠ Ġreturn ĠC Cal lee Wrapper ( wrapper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate C Global Setter ( global Decl : ĠGlobal Decl , Ġsymbol Name : ĠString ): ĠC Cal lee Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Name Ġ= Ġgenerate Function Wrapper Name ("${ global Decl . name }_ setter ") ĊĠĠĠĠĠĠĠ Ġval Ġglobal Type Ġ= Ġglobal Decl . type . getString Representation () ĊĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= ĠParameter ( global Type , Ġ" p 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Body Ġ= Ġ"${ global Decl . name } Ġ= Ġ${ parameter . name }; " ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= Ġcreate Wrapper ( symbol Name , Ġwrapper Name , Ġ" void ", ĠlistOf ( parameter ), Ġwrapper Body ) ĊĠĠĠĠĠĠĠ Ġreturn ĠC Cal lee Wrapper ( wrapper ) ĊĠĠĠ Ġ} Ċ } Ċ