HJVM-0.1: src/Language/Java/JVM/Types.hs
{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls, TypeSynonymInstances, RankNTypes, ImpredicativeTypes, MultiParamTypeClasses #-}
module Language.Java.JVM.Types where
import qualified Data.Map as Map
import Foreign.C
import Foreign.Ptr
import Foreign.Storable
import Data.Map (Map)
import Control.Concurrent.MVar
import Control.Monad.State
data JObject
type JObjectPtr=Ptr JObject
data JClass
type JClassPtr=Ptr JClass
data JMethod
type JMethodPtr=Ptr JMethod
data JField
type JFieldPtr=Ptr JField
--data JRuntime
--type JRuntimePtr=Ptr JRuntime
newtype TypedJObjectPtr a=TypedJObjectPtr JObjectPtr
deriving (Eq,Show)
data JEnv
type JEnvPtr=Ptr JEnv
type CallbackInternal=(JEnvPtr -> JObjectPtr -> CLong -> JObjectPtr -> IO())
type Callback = (JObjectPtr -> JavaT ())
type CallbackMap = Map.Map CLong Callback
type CallbackMapRef =MVar CallbackMap
data JValue=JObj JObjectPtr
| JInt CLong
| JBool CUChar
| JByte CChar
| JChar CUShort
| JShort CShort
| JLong CLong
| JFloat CFloat
| JDouble CDouble
type JValuePtr=Ptr JValue
instance Storable JValue where
sizeOf _= 8
alignment _=alignment (undefined :: CDouble)
poke p (JObj l)= poke (castPtr p) l
poke p (JInt i)= poke (castPtr p) i
poke p (JBool z)= poke (castPtr p) z
poke p (JByte b)= poke (castPtr p) b
poke p (JChar c)= poke (castPtr p) c
poke p (JShort s)= poke (castPtr p) s
poke p (JLong j)= poke (castPtr p) j
poke p (JFloat f)= poke (castPtr p) f
poke p (JDouble d)= poke (castPtr p) d
peek=error "undefined peek"
--class MethodProvider a where
-- getMethodID :: a -> IO (JMethodPtr)
--instance MethodProvider JMethodPtr where
-- getMethodID=return
type ClassName = String
data Method = Method {
m_class::ClassName
,m_name:: String
,m_signature:: String
}
deriving (Read,Show,Eq,Ord)
data Field= Field {
f_class::ClassName
,f_name:: String
,f_signature:: String
}
deriving (Read,Show,Eq,Ord)
type ClassCache=Map ClassName JClassPtr
type MethodCache=Map Method JMethodPtr
type FieldCache=Map Field JFieldPtr
data JavaCache=JavaCache {
jc_classes::ClassCache
,jc_methods::MethodCache
,jc_fields::FieldCache
}
type JavaT =StateT JavaCache IO
class (Monad m, MonadIO m) => WithJava m where
getJavaCache :: m JavaCache
putJavaCache :: JavaCache -> m()
instance WithJava JavaT where
getJavaCache = do
rt<-get
return rt
putJavaCache=put
javaToHaskell :: (HaskellJavaConversion h j,WithJava m)=> m j -> m h
javaToHaskell = liftM toHaskell
haskellToJava :: (HaskellJavaConversion h j,WithJava m)=> m h -> m j
haskellToJava = liftM fromHaskell
class HaskellJavaConversion h j where
toHaskell :: j -> h
fromHaskell :: h -> j
instance HaskellJavaConversion Float CFloat where
toHaskell = realToFrac
fromHaskell = realToFrac
instance HaskellJavaConversion Double CDouble where
toHaskell = realToFrac
fromHaskell = realToFrac
instance HaskellJavaConversion Integer CLong where
toHaskell = fromIntegral
fromHaskell = fromIntegral
instance HaskellJavaConversion Int CChar where
toHaskell = fromIntegral
fromHaskell = fromIntegral
instance HaskellJavaConversion Int CShort where
toHaskell = fromIntegral
fromHaskell = fromIntegral
instance HaskellJavaConversion Bool CUChar where
toHaskell = (0 /=)
fromHaskell True = 1
fromHaskell False = 0
instance HaskellJavaConversion Char CUShort where
toHaskell = toEnum . fromIntegral
fromHaskell = fromIntegral . fromEnum
instance HaskellJavaConversion JObjectPtr JObjectPtr where
toHaskell = id
fromHaskell = id