{-# LINE 1 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
{-# Language CPP #-}
-- | Calling a foreign function
module Cryptol.Eval.FFI.Abstract.Call where


{-# LINE 6 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}



import Foreign
import Foreign.C.Types(CSize(..))
import Cryptol.Eval.Type(TValue)
import Cryptol.Eval.FFI.ForeignSrc
import Cryptol.Eval.FFI.Abstract.Import
import Cryptol.Eval.FFI.Abstract.Export


foreign export ccall cry_bool :: Import Word8
foreign import ccall "&cry_bool" cry_bool_addr :: FunPtr (Import Word8)

foreign export ccall cry_small_uint :: Import Word64
foreign import ccall "&cry_small_uint" cry_small_uint_addr :: FunPtr (Import Word64)

foreign export ccall cry_small_sint :: Import Int64
foreign import ccall "&cry_small_sint" cry_small_sint_addr :: FunPtr (Import Int64)

foreign export ccall cry_double :: Import Double
foreign import ccall "&cry_double" cry_double_addr :: FunPtr (Import Double)

foreign export ccall cry_large_int :: LargeIntFun
foreign import ccall "&cry_large_int" cry_large_int_addr :: FunPtr LargeIntFun

foreign export ccall cry_sign :: Import Word8
foreign import ccall "&cry_sign" cry_sign_addr :: FunPtr (Import Word8)

foreign export ccall cry_tag :: Import CSize
foreign import ccall "&cry_tag" cry_tag_addr :: FunPtr (Import CSize)

foreign export ccall cry_recv_u8 :: Export Word8
foreign import ccall "&cry_recv_u8" cry_recv_u8_addr :: FunPtr (Export Word8)

foreign export ccall cry_recv_u64 :: Export Word64
foreign import ccall "&cry_recv_u64" cry_recv_u64_addr :: FunPtr (Export Word64)

foreign export ccall cry_recv_u64_digits :: Export Word64
foreign import ccall "&cry_recv_u64_digits" cry_recv_u64_digits_addr :: FunPtr (Export Word64)

foreign export ccall cry_recv_double :: Export Double
foreign import ccall "&cry_recv_double" cry_recv_double_addr :: FunPtr (Export Double)



runFFI ::
  [ExportVal] {-^ Reversed, see `exportValues` -} ->
  TValue      {-^ Type of result -} ->
  ForeignImpl {- ^ Foreign function -} ->
  IO (Either ImportErrorMessage Value) {- ^ Result of call, or an error -}
runFFI :: [ExportVal]
-> TValue -> ForeignImpl -> IO (Either ImportErrorMessage Value)
runFFI [ExportVal]
args TValue
ty ForeignImpl
k =
  Int
-> (Ptr Any -> IO (Either ImportErrorMessage Value))
-> IO (Either ImportErrorMessage Value)
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes (Int
64) ((Ptr Any -> IO (Either ImportErrorMessage Value))
 -> IO (Either ImportErrorMessage Value))
-> (Ptr Any -> IO (Either ImportErrorMessage Value))
-> IO (Either ImportErrorMessage Value)
forall a b. (a -> b) -> a -> b
$ \Ptr Any
robj ->
{-# LINE 59 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
  allocaBytes (40) $ \aobj ->
{-# LINE 60 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
  
  do expS <- cryStartExport args
     (\hsc_ptr -> pokeByteOff hsc_ptr 0)            aobj expS
{-# LINE 63 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 8)         aobj cry_recv_u8_addr
{-# LINE 64 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 24)        aobj cry_recv_u64_addr
{-# LINE 65 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 16)     aobj cry_recv_double_addr
{-# LINE 66 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 32) aobj cry_recv_u64_digits_addr
{-# LINE 67 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     impS <- cryStartImport ty 
     (\hsc_ptr -> pokeByteOff hsc_ptr 0)               robj impS
{-# LINE 69 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 8)          robj cry_bool_addr
{-# LINE 70 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 16)    robj cry_small_uint_addr
{-# LINE 71 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 24)    robj cry_small_sint_addr
{-# LINE 72 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 32)        robj cry_double_addr
{-# LINE 73 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 40)           robj cry_tag_addr
{-# LINE 74 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 48) robj cry_large_int_addr
{-# LINE 75 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     (\hsc_ptr -> pokeByteOff hsc_ptr 56)          robj cry_sign_addr
{-# LINE 76 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}
     callForeignImpl k [SomeFFIArg aobj, SomeFFIArg robj] :: IO ()
     
     -- callFFI k retVoid [argPtr aobj, argPtr robj]
     cryEndExport expS
     cryFinishImport impS


{-# LINE 97 "src/Cryptol/Eval/FFI/Abstract/Call.hsc" #-}