我沒有見過的一個話題是如何將新語言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