Я пытаюсь создать систему для хранения скомпилированных скриптов lua в памяти.
Проблема в том, что я не могу сделать «lua_Writer», а переменная bytecode пуста. Я использую 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;
}
Байт-код содержимого переменной является неполным. Посмотрите
Примечание: я не делал этого «Писателя».
Извините за английский …
Я собираюсь предположить, что 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;
Строка 9: char* newData; = (char*)realloc(*(bd->data), (*(bd->len)) + sz);
Не ставить ;
после char* newData
,
Это правильно:
char* newData = (char*)realloc(*(bd->data), (*(bd->len)) + sz);
Хотя я все еще не уверен, сработает ли это.