从Haskell FFI回调中返回结构

时间:2018-02-20 19:25:12

标签: haskell

我需要能够调用此函数,其中native_call_cb由Haskell函数实现

typedef godot_variant (*native_call_cb)(void *, godot_array *);
void GDAPI godot_register_native_call_type(const char *p_call_type, native_call_cb p_callback);

godot_variant是一个结构

typedef struct {
    uint8_t _dont_touch_that[GODOT_VARIANT_SIZE];
} godot_variant;

Haskell FFI不支持返回结构,所以我能做的最好是

godot_variant* (*native_call_cb)(void *, godot_array *)
使用

foreign import ccall "wrapper" (Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)) -> IO (FunPtr (Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)))

如何在不为每个函数定义C包装的情况下将Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)转换为native_call_cb类型的C函数指针?

E:如果我为每个函数定义一个包装器,那很简单:

foreign export ccall my_func :: Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)
foreign import ccall "&my_func_wrapper" :: FunPtr (Ptr () -> Ptr GodotArray -> IO Void) -- placeholder for struct

和一个C包装器

godot_variant my_func_wrapper(void* desc, godot_array* array) {
    return *my_func(desc, array);
}

这很麻烦,但

0 个答案:

没有答案