我试图建立一个系统,用于在内存中存储lua编译的脚本。 问题是我无法生成" lua_Writer",并且变量字节码为空。我用Luajit。 在我的代码下面。
typedef struct {
size_t *len;
char **data;
} BS_DESCRIP;
int scriptMemoryWriter(lua_State* ls, const void* p, size_t sz, void* ud)
{
BS_DESCRIP* bd = (BS_DESCRIP*)ud;
char* newData; = (char*)realloc(*(bd->data), (*(bd->len)) + sz);
if(newData)
{
memcpy(newData + (*(bd->len)), p, sz);
*(bd->data) = newData;
*(bd->len) += sz;
} else {
free(newData);
return 1;
}
return 0;
}
void HScriptManager::compileToMemory(HScript* script)
{
char* bytecode = 0L;
size_t bytecode_len = 0;
BS_DESCRIP bd = {&bytecode_len, &bytecode};
int buff_ret = luaL_loadbuffer(m_pLuaState, script->getData().c_str(), script->getBuffSize(), script->getName().c_str());
int comp_ret = lua_dump(m_pLuaState, scriptMemoryWriter, &bd);
lua_pop(m_pLuaState, 1);
std::cout << "bytecode_len: " << bytecode_len << std::endl;
std::cout << "bytecode: " << bytecode << std::endl;
std::cout << "buff_ret: " << buff_ret << std::endl;
std::cout << "comp_ret: " << comp_ret << std::endl;
}
变量内容字节码不完整。看
注意:我没有这样做&#34;作家&#34;。 抱歉英语...
答案 0 :(得分:1)
第9行:char* newData; = (char*)realloc(*(bd->data), (*(bd->len)) + sz);
请勿在{{1}}之后加;
。
这是正确的:
char* newData
虽然,我仍然不确定它是否会起作用。
答案 1 :(得分:0)
我将假设char* newData; = (char
是你问题中的拼写错误,因为这样的代码无法编译。
我认为问题在于您尝试将字节码打印为字符串。如果你给std流(比如std :: cout)指向一个字符的指针,那么流将打印所有字符,从该内存位置开始,直到但不包括它在该内存地址之后找到的第一个空字符。现在我从来没有看过Lua字节码,但我怀疑Lua字节码可以有空字节,这会导致打印输出不完整。您在“完整”示例中幸运的是,没有空字节。
由于很多字节码都是不可打印的字符,因此您也可以打印它们的十进制值。将std::cout << "bytecode: " << bytecode << std::endl;
替换为:
std::cout << "bytecode: ";
for (int i=0; i<bytecode_len; i++)
std::cout << int(bytecode[i]) << " ";
std::cout << std::endl;