luka 2012.7.7 → 2012.7.7.1
raw patch · 5 files changed
+38/−172 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.ObjectiveC.Luka.API: msg_cchar :: String -> [Arg] -> ID -> IO CChar
- Language.ObjectiveC.Luka.API: msg_cdouble :: String -> [Arg] -> ID -> IO CDouble
- Language.ObjectiveC.Luka.API: msg_cfloat :: String -> [Arg] -> ID -> IO CFloat
- Language.ObjectiveC.Luka.API: msg_cint :: String -> [Arg] -> ID -> IO CInt
- Language.ObjectiveC.Luka.API: msg_clong :: String -> [Arg] -> ID -> IO CLong
- Language.ObjectiveC.Luka.API: msg_cstring :: String -> [Arg] -> ID -> IO CString
- Language.ObjectiveC.Luka.API: msg_cuint :: String -> [Arg] -> ID -> IO CUInt
- Language.ObjectiveC.Luka.API: msg_culong :: String -> [Arg] -> ID -> IO CULong
- Language.ObjectiveC.Luka.API: msg_obj :: String -> [Arg] -> ID -> IO ID
- Language.ObjectiveC.Luka.API: msg_ptr :: String -> [Arg] -> ID -> IO (Ptr ())
- Language.ObjectiveC.Luka.API: msg_uchar :: String -> [Arg] -> ID -> IO CUChar
- Language.ObjectiveC.Luka.RunTime: data IVarData
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cchar :: ID -> SEL -> [Arg] -> IO CChar
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cdouble :: ID -> SEL -> [Arg] -> IO CDouble
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cfloat :: ID -> SEL -> [Arg] -> IO CFloat
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cint :: ID -> SEL -> [Arg] -> IO CInt
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_clong :: ID -> SEL -> [Arg] -> IO CLong
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cstring :: ID -> SEL -> [Arg] -> IO CString
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cuchar :: ID -> SEL -> [Arg] -> IO CUChar
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_cuint :: ID -> SEL -> [Arg] -> IO CUInt
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_culong :: ID -> SEL -> [Arg] -> IO CULong
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_obj :: ID -> SEL -> [Arg] -> IO ID
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_ptr :: ID -> SEL -> [Arg] -> IO (Ptr ())
- Language.ObjectiveC.Luka.RunTime: objc_msgSend_void :: ID -> SEL -> [Arg] -> IO ()
- Language.ObjectiveC.Luka.RunTime: retIVarPtr :: RetType IVar
- Language.ObjectiveC.Luka.RunTime: retIdPtr :: RetType ID
- Language.ObjectiveC.Luka.RunTime: retSelPtr :: RetType SEL
- Language.ObjectiveC.Luka.RunTime: type IVar = Ptr IVarData
+ Language.ObjectiveC.Luka.RunTime: data IvarData
+ Language.ObjectiveC.Luka.RunTime: objc_msgSend :: ID -> SEL -> [Arg] -> RetType a -> IO a
+ Language.ObjectiveC.Luka.RunTime: retId :: RetType ID
+ Language.ObjectiveC.Luka.RunTime: retIvar :: RetType Ivar
+ Language.ObjectiveC.Luka.RunTime: retSel :: RetType SEL
+ Language.ObjectiveC.Luka.RunTime: type Ivar = Ptr IvarData
- Language.ObjectiveC.Luka.API: msg :: String -> [Arg] -> ID -> IO ()
+ Language.ObjectiveC.Luka.API: msg :: String -> [Arg] -> RetType a -> ID -> IO a
- Language.ObjectiveC.Luka.RunTime: object_getInstanceVariable :: ID -> String -> IO IVar
+ Language.ObjectiveC.Luka.RunTime: object_getInstanceVariable :: ID -> String -> IO Ivar
- Language.ObjectiveC.Luka.RunTime: object_getIvar :: ID -> IVar -> IO ID
+ Language.ObjectiveC.Luka.RunTime: object_getIvar :: ID -> Ivar -> IO ID
Files
- luka.cabal +1/−1
- readme.md +8/−0
- src/Init.hs +2/−11
- src/Language/ObjectiveC/Luka/API.hs +6/−44
- src/Language/ObjectiveC/Luka/RunTime.hs +21/−116
luka.cabal view
@@ -1,5 +1,5 @@ Name: luka-Version: 2012.7.7+Version: 2012.7.7.1 Build-type: Simple Synopsis: Simple ObjectiveC runtime binding Description: Simple ObjectiveC runtime binding
readme.md view
@@ -1,3 +1,6 @@+Luka+====+ Simple ObjectiveC runtime binding Tutorial@@ -16,6 +19,11 @@ nemesis run ++Notes+====++* when used with `ghci`, `-frameworkCocoa` flag is required License: ========
src/Init.hs view
@@ -2,21 +2,12 @@ module Init where -import Foreign hiding (void)-import Foreign.C.Types-import Foreign.C.String--import Prelude ()-import Air.Env-import Control.Monad ((>=>))- import Language.ObjectiveC.Luka.RunTime import Language.ObjectiveC.Luka-import Foreign.LibFFI + main = do- with_pool - do+ with_pool $ do ns_puts "Hello World!" []- -- c_NSApplicationMain 0 nullPtr
src/Language/ObjectiveC/Luka/API.hs view
@@ -22,56 +22,19 @@ from_ns_string :: ID -> IO String-from_ns_string = msg_cstring "UTF8String" [] >=> peekCString--+from_ns_string = msg "UTF8String" [] retCString >=> peekCString with_pool :: IO a -> IO () with_pool _io = do- pool <- class_named "NSAutoreleasePool" >>= msg_obj "alloc" [] >>= msg_obj "init" []+ pool <- class_named "NSAutoreleasePool" >>= msg "alloc" [] retId >>= msg "init" [] retId _io - pool .msg "release" []+ pool .msg "release" [] retVoid -msg :: String -> [Arg] -> ID -> IO ()-msg methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_void obj sel args--msg_ptr :: String -> [Arg] -> ID -> IO (Ptr ()) -msg_ptr methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_ptr obj sel args- -msg_obj :: String -> [Arg] -> ID -> IO ID -msg_obj methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_obj obj sel args- -msg_cint :: String -> [Arg] -> ID -> IO CInt -msg_cint methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cint obj sel args- -msg_cuint :: String -> [Arg] -> ID -> IO CUInt -msg_cuint methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cuint obj sel args- -msg_clong :: String -> [Arg] -> ID -> IO CLong -msg_clong methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_clong obj sel args- -msg_culong :: String -> [Arg] -> ID -> IO CULong -msg_culong methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_culong obj sel args- -msg_cfloat :: String -> [Arg] -> ID -> IO CFloat -msg_cfloat methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cfloat obj sel args- -msg_cdouble :: String -> [Arg] -> ID -> IO CDouble -msg_cdouble methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cdouble obj sel args- -msg_cchar :: String -> [Arg] -> ID -> IO CChar -msg_cchar methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cchar obj sel args- -msg_uchar :: String -> [Arg] -> ID -> IO CUChar -msg_uchar methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cuchar obj sel args--msg_cstring :: String -> [Arg] -> ID -> IO CString -msg_cstring methodName args obj = sel_named methodName >>= \sel -> objc_msgSend_cstring obj sel args- -+msg :: String -> [Arg] -> RetType a -> ID -> IO a+msg methodName args ret_type obj = sel_named methodName >>= \sel -> objc_msgSend obj sel args ret_type sel_named :: String -> IO SEL sel_named = sel_getUid@@ -79,7 +42,7 @@ ns_string :: String -> IO ID ns_string x = do- class_named "NSString" >>= msg_obj "stringWithUTF8String:" [argString x]+ class_named "NSString" >>= msg "stringWithUTF8String:" [argString x] retId class_named :: String -> IO ID@@ -98,4 +61,3 @@ method <- class_getInstanceMethod class_pointer cmd method_setImplementation method method_implementation-
src/Language/ObjectiveC/Luka/RunTime.hs view
@@ -41,8 +41,8 @@ data SELData type SEL = Ptr SELData -data IVarData-type IVar = Ptr IVarData+data IvarData+type Ivar = Ptr IvarData objc_False :: CChar objc_False = 0x0@@ -55,49 +55,49 @@ -retIdPtr :: RetType ID-retIdPtr = fmap castPtr $ retPtr retVoid+retId :: RetType ID+retId = fmap castPtr $ retPtr retVoid -retSelPtr :: RetType SEL-retSelPtr = fmap castPtr $ retPtr retVoid+retSel :: RetType SEL+retSel = fmap castPtr $ retPtr retVoid -retIVarPtr :: RetType IVar-retIVarPtr = fmap castPtr $ retPtr retVoid+retIvar :: RetType Ivar+retIvar = fmap castPtr $ retPtr retVoid retVoidPtr :: RetType (Ptr ()) retVoidPtr = fmap castPtr $ retPtr retVoid -object_getInstanceVariable :: ID -> String -> IO IVar-object_getInstanceVariable objectPtr instanceName = callFFI funPtr_object_getInstanceVariable retIVarPtr [argPtr objectPtr, argString instanceName]+object_getInstanceVariable :: ID -> String -> IO Ivar+object_getInstanceVariable objectPtr instanceName = callFFI funPtr_object_getInstanceVariable retIvar [argPtr objectPtr, argString instanceName] -object_getIvar :: ID -> IVar -> IO ID-object_getIvar objectPtr ivarPtr = callFFI funPtr_object_getIvar retIdPtr [argPtr objectPtr, argPtr ivarPtr]+object_getIvar :: ID -> Ivar -> IO ID+object_getIvar objectPtr ivarPtr = callFFI funPtr_object_getIvar retId [argPtr objectPtr, argPtr ivarPtr] objc_getClass :: String -> IO ID-objc_getClass className = callFFI funPtr_objc_getClass retIdPtr [argString className]+objc_getClass className = callFFI funPtr_objc_getClass retId [argString className] method_setImplementation :: Ptr a -> FunPtr b -> IO (FunPtr ()) method_setImplementation methodPtr funPtr = callFFI funPtr_method_setImplementation (retFunPtr retVoid) [argPtr methodPtr, argFunPtr funPtr] sel_registerName :: String -> IO SEL-sel_registerName methodName = callFFI funPtr_sel_registerName retSelPtr [argString methodName]+sel_registerName methodName = callFFI funPtr_sel_registerName retSel [argString methodName] sel_getUid :: String -> IO SEL-sel_getUid methodName = callFFI funPtr_sel_getUid retSelPtr [argString methodName]+sel_getUid methodName = callFFI funPtr_sel_getUid retSel [argString methodName] class_createInstance :: ID -> IO ID-class_createInstance classPtr = callFFI funPtr_class_createInstance retIdPtr [argPtr classPtr, argCSize 0]+class_createInstance classPtr = callFFI funPtr_class_createInstance retId [argPtr classPtr, argCSize 0] object_dispose :: ID -> IO ID-object_dispose objectPtr = callFFI funPtr_object_dispose retIdPtr [argPtr objectPtr]+object_dispose objectPtr = callFFI funPtr_object_dispose retId [argPtr objectPtr] objc_allocateClassPair :: ID -> String -> IO ID-objc_allocateClassPair super name = callFFI funPtr_objc_allocateClassPair retIdPtr [argPtr super, argString name, argCSize 0]+objc_allocateClassPair super name = callFFI funPtr_objc_allocateClassPair retId [argPtr super, argString name, argCSize 0] objc_registerClassPair :: ID -> IO () objc_registerClassPair classPtr = callFFI funPtr_objc_registerClassPair retVoid [argPtr classPtr]@@ -110,102 +110,7 @@ class_getInstanceMethod :: Ptr a -> Ptr b -> IO ID-class_getInstanceMethod classPtr selectorPtr = callFFI funPtr_class_getInstanceMethod retIdPtr [argPtr classPtr, argPtr selectorPtr]---objc_msgSend_void :: ID -> SEL -> [Arg] -> IO ()-objc_msgSend_void objectPtr selPtr args = callFFI funPtr_objc_msgSend retVoid (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_ptr :: ID -> SEL -> [Arg] -> IO (Ptr ())-objc_msgSend_ptr objectPtr selPtr args = callFFI funPtr_objc_msgSend retVoidPtr (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_obj :: ID -> SEL -> [Arg] -> IO ID-objc_msgSend_obj objectPtr selPtr args = callFFI funPtr_objc_msgSend retIdPtr (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cint :: ID -> SEL -> [Arg] -> IO CInt-objc_msgSend_cint objectPtr selPtr args = callFFI funPtr_objc_msgSend retCInt (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cuint :: ID -> SEL -> [Arg] -> IO CUInt-objc_msgSend_cuint objectPtr selPtr args = callFFI funPtr_objc_msgSend retCUInt (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_clong :: ID -> SEL -> [Arg] -> IO CLong-objc_msgSend_clong objectPtr selPtr args = callFFI funPtr_objc_msgSend retCLong (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_culong :: ID -> SEL -> [Arg] -> IO CULong-objc_msgSend_culong objectPtr selPtr args = callFFI funPtr_objc_msgSend retCULong (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cfloat :: ID -> SEL -> [Arg] -> IO CFloat-objc_msgSend_cfloat objectPtr selPtr args = callFFI funPtr_objc_msgSend retCFloat (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cdouble :: ID -> SEL -> [Arg] -> IO CDouble-objc_msgSend_cdouble objectPtr selPtr args = callFFI funPtr_objc_msgSend retCDouble (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cchar :: ID -> SEL -> [Arg] -> IO CChar-objc_msgSend_cchar objectPtr selPtr args = callFFI funPtr_objc_msgSend retCChar (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cuchar :: ID -> SEL -> [Arg] -> IO CUChar-objc_msgSend_cuchar objectPtr selPtr args = callFFI funPtr_objc_msgSend retCUChar (argPtr objectPtr : argPtr selPtr : args)--objc_msgSend_cstring :: ID -> SEL -> [Arg] -> IO CString-objc_msgSend_cstring objectPtr selPtr args = callFFI funPtr_objc_msgSend retCString (argPtr objectPtr : argPtr selPtr : args)---{--retCInt :: RetType CInt-retCInt = mkStorableRetType ffi_type_sint-retCUInt :: RetType CUInt-retCUInt = mkStorableRetType ffi_type_uint-retCLong :: RetType CLong-retCLong = mkStorableRetType ffi_type_slong-retCULong :: RetType CULong-retCULong = mkStorableRetType ffi_type_ulong--retInt :: RetType Int-retInt = mkStorableRetType ffi_type_hs_int-retInt8 :: RetType Int8-retInt8 = mkStorableRetType ffi_type_sint8-retInt16 :: RetType Int16-retInt16 = mkStorableRetType ffi_type_sint16-retInt32 :: RetType Int32-retInt32 = mkStorableRetType ffi_type_sint32-retInt64 :: RetType Int64-retInt64 = mkStorableRetType ffi_type_sint64--retWord :: RetType Word-retWord = mkStorableRetType ffi_type_hs_word-retWord8 :: RetType Word8-retWord8 = mkStorableRetType ffi_type_uint8-retWord16 :: RetType Word16-retWord16 = mkStorableRetType ffi_type_uint16-retWord32 :: RetType Word32-retWord32 = mkStorableRetType ffi_type_uint32-retWord64 :: RetType Word64-retWord64 = mkStorableRetType ffi_type_uint64--retCFloat :: RetType CFloat-retCFloat = mkStorableRetType ffi_type_float-retCDouble :: RetType CDouble-retCDouble = mkStorableRetType ffi_type_double--retCSize :: RetType CSize-retCSize = mkStorableRetType ffi_type_size-retCTime :: RetType CTime-retCTime = mkStorableRetType ffi_type_time--retCChar :: RetType CChar-retCChar = mkStorableRetType ffi_type_schar-retCUChar :: RetType CUChar-retCUChar = mkStorableRetType ffi_type_uchar--retCWchar :: RetType CWchar-retCWchar = mkStorableRetType ffi_type_schar--retFunPtr :: RetType a -> RetType (FunPtr a)-retFunPtr _ = mkStorableRetType ffi_type_pointer--retPtr :: RetType a -> RetType (Ptr a)-retPtr _ = mkStorableRetType ffi_type_pointer+class_getInstanceMethod classPtr selectorPtr = callFFI funPtr_class_getInstanceMethod retId [argPtr classPtr, argPtr selectorPtr] -retCString :: RetType CString-retCString = retPtr retCChar--}+objc_msgSend :: ID -> SEL -> [Arg] -> RetType a -> IO a+objc_msgSend objectPtr selPtr args retType = callFFI funPtr_objc_msgSend retType (argPtr objectPtr : argPtr selPtr : args)