二进制字符串:预编译块中的意外结束

时间:2013-05-10 11:52:15

标签: c++ lua

我在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代码在“重新检查”时已经失败并显示错误

  

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

哪里可能是我的错误?我没有想法: - (

1 个答案:

答案 0 :(得分:3)

正如我所承诺的那样,我用来转储字节码的lua编写器函数的版本:

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;
}

MemStreamBufstd::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个内部。您需要调用luaL_loadbuffer并根据字符串中的空字符给出实际的缓冲区大小。

已经是周末了,思维缓慢,抱歉;)!