如何通过 C FFI 将 Haskell 数据作为不透明数据类型传递?
How do I pass Haskell data through a C FFI as an opaque data type?
我正在尝试通过不读取或修改该数据的 C 库传递一些数据。
foreign import ccall "lua.h lua_pushlightuserdata"
c_lua_pushlightuserdata :: LuaState -> Ptr a -> IO ()
foreign import ccall "lua.h lua_touserdata"
c_lua_touserdata :: LuaState -> CInt -> IO (Ptr a)
data MyData =
MyData
{ dataIds = TVar [Int]
, dataSomethingElse = [String]
}
calledFromRunLuaState :: LuaState -> IO ()
calledFromRunLuaState luaState = do
dataPtr <- c_lua_touserdata luaState (-1)
myData <- dataFromPtr dataPtr
doSomethingWith myData
main = do
luaState <- Lua.newstate
ids <- atomically $ newTVar []
c_lua_pushlightuserdata luaState (dataToPtr (MyData ids []))
runLuaState luaState
我想知道如何定义 dataFromPtr
和 dataToPtr
。
这就是 StablePtr is for. So you have to use newStablePtr in place of your dataFromPtr
and deRefStablePtr 代替您的 dataToPtr
的地方。请注意 deRefStablePtr
在 IO
monad 中运行,因此您必须相应地调整代码。此外,您必须调整外国进口以使用稳定的指针,例如:
foreign import ccall "lua.h lua_pushlightuserdata"
c_lua_pushlightuserdata :: LuaState -> StablePtr MyData -> IO ()
lua_touserdata
.
同样如此
最后,当您使用 newStablePtr
创建稳定指针时,垃圾收集器不会自动释放该值。因此,您有责任通过调用 freeStablePtr.
来解除分配它
我正在尝试通过不读取或修改该数据的 C 库传递一些数据。
foreign import ccall "lua.h lua_pushlightuserdata"
c_lua_pushlightuserdata :: LuaState -> Ptr a -> IO ()
foreign import ccall "lua.h lua_touserdata"
c_lua_touserdata :: LuaState -> CInt -> IO (Ptr a)
data MyData =
MyData
{ dataIds = TVar [Int]
, dataSomethingElse = [String]
}
calledFromRunLuaState :: LuaState -> IO ()
calledFromRunLuaState luaState = do
dataPtr <- c_lua_touserdata luaState (-1)
myData <- dataFromPtr dataPtr
doSomethingWith myData
main = do
luaState <- Lua.newstate
ids <- atomically $ newTVar []
c_lua_pushlightuserdata luaState (dataToPtr (MyData ids []))
runLuaState luaState
我想知道如何定义 dataFromPtr
和 dataToPtr
。
这就是 StablePtr is for. So you have to use newStablePtr in place of your dataFromPtr
and deRefStablePtr 代替您的 dataToPtr
的地方。请注意 deRefStablePtr
在 IO
monad 中运行,因此您必须相应地调整代码。此外,您必须调整外国进口以使用稳定的指针,例如:
foreign import ccall "lua.h lua_pushlightuserdata"
c_lua_pushlightuserdata :: LuaState -> StablePtr MyData -> IO ()
lua_touserdata
.
最后,当您使用 newStablePtr
创建稳定指针时,垃圾收集器不会自动释放该值。因此,您有责任通过调用 freeStablePtr.