2

我对来自 Ubuntu 存储库的Lua 5.1有以下问题。但问题与从Hardy(旧)到Precise(相当新)的 Lua 相同。

我想预编译以下小 Lua 代码:

i = 0;

以下我在 C++ 程序中使用的代码:

typedef struct {
    size_t *len;
    char **data;
} BS_DESCRIP;

static int hgl_lua_Writer(lua_State * /*l*/, const void *p, size_t sz, void *ud) {

    BS_DESCRIP *bd = (BS_DESCRIP *)ud;

    char *newData;

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

    return 0;
}

char *CompilerBase::luaCompile(char *script, size_t *scriptLen) const throw(Exception::LuaException) {

 char *byteCode = 0L;

 lua_State *l = Type::Lua::LuaTypeBase::m_luaInit.m_luaState;

 if(l) {
    size_t byteCodeLen = 0;
    int ret;

    if(!(ret = luaL_loadstring(l, script))) {
        BS_DESCRIP bd = { &byteCodeLen, &byteCode };

        lua_dump(l, hgl_lua_Writer, &bd);
        lua_pop(l, 1);

        logDebug("Rechecking pre-compiled Lua string...");
        ret = luaL_loadstring(l, byteCode);
    }

    if(ret) {
        if(ret == LUA_ERRSYNTAX) {
            throw Exception::LuaException(lua_tostring(l, -1));
        } else if(ret == LUA_ERRMEM) {
            throw Exception::LuaException("Lua memory allocation error");
        } else {
            throw Exception::LuaException("Lua unknown error");
        }
    } else {
        *scriptLen = byteCodeLen;
    }

 } else {
    throw Exception::LuaException("Lua hasn't been initialized");
 }

 return byteCode;
}

包括上述最低代码在内的任何 Lua 代码在“重新检查”时已经失败并出现错误

二进制字符串:预编译块中的意外结束,但我找不到错误。

我的错误在哪里?我没有想法:-(

4

1 回答 1

3

正如所承诺的,我用来转储字节码的 lua writer 函数版本:

int lua_MemoryWriter(lua_State *lua, const void *p, size_t sz, void *ud)
{
    MemStreamBuf *buf = (MemStreamBuf*)ud;
    if (buf->sputn((const char*)p, sz) == sz)
        return 0;
    else
        return 1;
}

MemStreamBuf我的实现在哪里std::streambuf只是流到内存缓冲区。

但你也可以这样做std::string

int lua_MemoryWriter(lua_State *lua, const void *p, size_t sz, void *ud)
{
      std::string *buf = (std::string*)ud;
      buf->append((const char*)p, sz);
      return 0;
}

当然,此时这不处理异常,如果有的话。

大胖编辑:

面盘

字节码0里面包含 s。luaL_loadbuffer由于字符串中的空字符,您需要调用并给出实际的缓冲区大小。

已经是周末了,慢慢想,对不起;)!

于 2013-05-10T12:24:34.573 回答