我没有见过的一个话题是如何将新语言VM函数调用的参数传递给C++堆栈,以及如何将C++函数的返回值传递回虚拟机。
假设你想让你的新语言提供pow(3)函数。 作为提醒,战俘()签名是
double pow (double base, double power)
最简单的方法是这样的
void
language::pow(VM * pVM)
{
double arg2 = pVM->PopDouble();
double arg1 = pVM->PopDouble();
double result = pow(arg1, arg2);
pVM->PushDouble(result);
}
但是,这听起来并不像你所追求的。结合dlopen()的&的dlsym()得到你像
void
language::pow(VM * pVM)
{
double arg2 = pVM->PopDouble();
double arg1 = pVM->PopDouble();
void *handle = dlopen("libm", RTLD_LAZY);
if (!handle) { /*...return; ...*/ }
typedef double (* pfPow) (double, double);
pfPow pPow = (pfPow) dlsym(handle, "pow");
if (!pPow) { /*...return; ...*/ }
double result = (* pPow)(arg1, arg2);
pVM->PushDouble(result);
}
但是,这更是雪上加霜。您仍然需要每个C++函数的存根函数,您希望您的语言能够访问它。
这听起来像你希望你的语言有类似
double result = eval_double("libm", "pow", arg1, arg2);
我不知道如何实现,在C++。 Varags支持获取任何类型的C++参数。但是没有推送任意类型的C++参数的API。
请问你提供一些代码样本你想要什么? –
在Windows上,您使用LoadLibrary()和GetProcAddress()。 Linux具有不同名称的等同功能。这些无助于您了解参数和返回值的数量和类型。 –
@BhavikAmbani当然,只要几个小时回家。 – corazza