以编程方式构造和调用函数

时间:2015-08-14 17:59:43

标签: generics macros rust ffi

我已经以编程方式在内存中构建了一个C函数,并且我可以在Rust中调用它。

type AddFn = extern "C" fn(isize, isize) -> isize;
let Add = build_function::<AddFn>(&region, code);

fn build_function<T>(region: &MappedRegion, contents: &[u8]) -> Box<T> {
    unsafe {
        ...
        mem::transmute(Box::new(region.addr))
    }
}  

这要求我知道我生成的函数的签名,在本例中为AddFn。我希望能够在运行时构建此签名,例如let x = 3u8; macro!(x, f64) == fn(f64, f64, f64) -> f64。我找不到以这种方式生成函数的方法。相关问题是无法调用在运行时生成的函数。如果没有部分应用或完成上述逻辑的方法,我无法弄清楚如何在没有已知签名的情况下调用生成的函数。是否可以在Rust中以这种方式以编程方式生成函数签名?

更新: Rust对可变参数C函数(extern "C" fn(x:int, ...)的支持允许任意sysv ABI兼容函数签名。现在唯一的问题是在运行时调用它们。有没有办法在命名函数上执行部分应用程序?

0 个答案:

没有答案