c++ - C++ 中的 Lua 转储

标签 c++ qt compiler-construction lua dump

我想用 lua_dump 或 luaU_dump 导出二进制 Chunk..

错误:返回的只是<-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

最佳答案

不需要使用 Lua 的内部结构。在任何情况下,您都应该调用 luaL_loadstringluaL_loadbuffer,而不是 luaL_dostring,它执行字符串中的代码:

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

但是,您应该测试 luaL_loadstringlua_dump 的返回值。

关于c++ - C++ 中的 Lua 转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597816/

相关文章:

在 GCC 或 Cygwin 中创建 DLL?

java - 有没有命令可以获取Java代码编译的中间文件?

c++ - OpenGL ES 2 glGetActiveAtrib 和非 float

c++ - 当我尝试在函数内部声明一个函数时它不起作用?有什么建议么? *下面的源代码*

C++ 字符串流段错误

c++ - 从 QGridLayout 中删除小部件

parsing - 编译器设计中的内联汇编

c# - Unity3d DllNotFoundException 显示我的计算机上不存在的目录

c++ - Qt for iOS : How to open iOS component from Qt Application (i. e.from QMainWindow 或 QWidget 或其他)?

Qt Quick Controls 2 和 TableView