qt — Lua Dump в переполнении стека

Я хочу экспортировать двоичный чанк с помощью lua_dump или luaU_dump ..

Ошибка: возврат только <-LuaR

Нет ошибки компиляции или статических проблем с кодом, только <-LuaR возвращение

Что я могу сделать? привести проблему?

private:
const char* buildLua(QString luaScript)
{
const Proto* f;
char *byteCode = 0L;
size_t byteCodeLen = 0;
wdata wd = { &byteCodeLen, &byteCode };
string ts = luaScript.toStdString();
const char* cs;
lua_State *L = luaL_newstate();
f=combine(L,0);
luaL_loadstring(L,ts.c_str());
luaL_openlibs(L);
lua_lock(L);
luaU_dump(L,f,kpt_lua_Writer,&wd,1);
lua_unlock(L);
lua_close(L);
cs = byteCode;
return cs;
}

static const char* kpt_lua_Reader(lua_State *L, void *ud, size_t *size)
{
UNUSED(L);
if ((*(int*)ud)--)
{
*size=sizeof(FUNCTION)-1;
return FUNCTION;
}
else
{
*size=0;
return NULL;
}
}

static int kpt_lua_Writer(lua_State * /*l*/, const void *p, size_t sz, void *ud)
{
wdata *wd = (wdata *)ud;

char *newData;

if((newData = (char *)realloc(*(wd->data), (*(wd->len)) + sz))) {
memcpy(newData + (*(wd->len)), p, sz);
*(wd->data) = newData;
*(wd->len) += sz;
} else {
free(newData);
return 1;
}

return 0;
}

static const Proto* combine(lua_State* L, int n)
{
if (n==1)
return toproto(L,-1);
else
{
Proto* f;
int i=n;
if (lua_load(L,kpt_lua_Reader,&i,"=(keppedev)",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));
f=toproto(L,-1);
for (i=0; i<n; i++)
{
f->p[i]=toproto(L,i-n-1);
if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
}
f->sizelineinfo=0;
return f;
}
}

static void fatal(const char* message)
{
QWidget *widget = new QWidget();
QMessageBox::warning(widget,"Keppe Develop",message);
}

http://www.keppe.org/img/LuaR.png

4

Решение

Нет необходимости использовать внутренности Lua. В любом случае вам следует позвонить luaL_loadstring или же luaL_loadbufferне luaL_dostring, который исполняет код в строке:

lua_State *L = luaL_newstate();
luaL_loadstring(L,s.c_str());
lua_dump(L,writer,NULL);
lua_close(L);

Тем не менее, вы должны проверить возвращаемые значения обоих luaL_loadstring а также lua_dump,

0

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

Ошибка компилятора вызвана неверным прототипом функции, где frmDevelop::writer реализовано.

extern "C"{
static int frmDevelop::writer(lua_State *L, const void *p, size_t size, void *u)
{
// ...
}
}

Только ты необходимость static спецификатор в пункте декларации в class frmDevelop, Также, extern "C" здесь не правильно, так как вы говорите компилятору не искажать имя функции. Но компилятор не может удовлетворить этот запрос, потому что вы используете функцию C ++ (писатель является частью frmDevelop и поэтому вам нужно :: оператор области видимости) — extern "C" просто игнорируется frmDevelop::writer,

Изменить реализацию автора с:

extern "C"static int frmDevelop::writer(lua_State *L, const void *p, size_t size, void *u)
{ /* ... */ }

в

int frmDevelop::writer(lua_State *L, const void *p, size_t size, void *u)
{ /* ... */ }

и это исправит полученную ошибку компиляции.

0

Я исправляю это с помощью Кодекса

Исходный файл (содержит)

void frmDevelop::on_actionBuild_Project_triggered()
{
if (!isInLuaMode) return;
const char* output = buildLua(cedit->document()->toPlainText());
int length = strlen(output);
}

Заголовочный файл (содержит)

private:
const char* buildLua(QString luaScript)
{
string ts = luaScript.toStdString();
lua_State *L = luaL_newstate();
FILE* D = fopen("test.luac","wb");
luaL_openlibs(L);
luaL_loadstring(L,ts.c_str());
lua_lock(L);
int re = lua_dump(L,kpt_lua_Writer,D);
lua_unlock(L);
lua_close(L);
fclose(D);
return QString::number(re).toStdString().c_str();
}

static int kpt_lua_Writer(lua_State * /*l*/, const void *p, size_t sz, void *u)
{
return (fwrite(p,sz,1,(FILE*)u)!=1) && (sz!=0);
}

test.luac должен заменить ваше имя файла: D

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector