Lua Dump in C ++

I want to export binary Chunk with lua_dump or luaU_dump ..

Error: only <-LuaR is returned

You have no compilation error or static code problems, only return <-LuaR

What can I do? to solve the problem?

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,in-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
source share
3 answers

I fix it with code

Source file (contains)

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

Header file (contains)

 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 should replace your file name: D

0
source

No need to use internal Lua elements. In any case, you should call luaL_loadstring or luaL_loadbuffer , not luaL_dostring , which executes the code on the line:

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

However, you should check the return values โ€‹โ€‹of both luaL_loadstring and lua_dump .

0
source

The compiler error was caused by an invalid function prototype, where frmDevelop::writer .

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

You only need the static qualifier at the declaration point in class frmDevelop . Also, extern "C" is not here because you are telling the compiler not to distort the function name. But the compiler cannot execute this request because you are using the C ++ function (the author is part of frmDevelop , so you need the scope operator :: frmDevelop - extern "C" simply ignored for frmDevelop::writer .

Change recording execution with:

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

to

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

and this will fix the compilation error you get.

0
source

Source: https://habr.com/ru/post/1490944/


All Articles