Ошибка LuaJIT в Embarcadero C ++ Builder XE5

Я собрал последнюю LuaJIT версия с использованием как MinGW32, так и MSVC32,
и затем создал импортную библиотеку, используя инструмент implib Embarcadero:

implib -a lua51.lib lua51.dll

Библиотека связана с примером программы на C ++ и скомпилирована компилятором bcc32.

Все, что работало с vanilla Lua 5.1, прекрасно работает с LuaJIT (гораздо быстрее, конечно), но проблема возникает с FFI.

Вот простая функция C внутри моего кода C ++:

// header
extern "C"  {
int test_ffi(int value);
}
// cpp file
int test_ffi(int value) {
int xx = value + 1;
return xx;
}

файл test.lua:

local ffi = require("ffi")
ffi.cdef[[int test_ffi(int value);]]
local a = 100
local C = ffi.C
local result = C.test_ffi(a)

Часть исполнения CPP:

//...
lua_State *L =  luaL_newstate();
luaL_openlibs(L);
lua_pushlightuserdata(L, (void*)test_ffi);
luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON);
lua_pop(L, 1);
int result;
result = luaL_loadfile(L, "test.lua");
if (result == 0)
result = lua_pcall(L, 0, 0, 0);
lua_close(L);
//...

когда lua_pcall() выполняется, это вызывает test_ffi() как и ожидалось, но значение, переданное функции, не 100, а некоторые неинициализированным случайное значение Результат от lua_pcall() это 2.

Я пробовал различные соглашения о вызовах (__cdecl, __stdcall) но без эффекта.

Кроме того, замена библиотек MSVC32 на библиотеки DLL MinGW32 приводит к тому же результату.

Когда некоторые void функция называется, lua_pcall() производит нарушение прав доступа в lua51.dll, Я знаю, что LuaJIT официально не поддерживает компиляторы bcc32, но, за исключением FFI, все остальные API работают правильно.

Кто-нибудь знает, что происходит?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …