我在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代码在“重新检查”时已经失败并显示错误
二进制字符串:预编译块中的意外结束 但我找不到错误。
哪里可能是我的错误?我没有想法: - (
答案 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;
}
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
个内部。您需要调用luaL_loadbuffer
并根据字符串中的空字符给出实际的缓冲区大小。
已经是周末了,思维缓慢,抱歉;)!