C ++ Как сделать lua & quot; писатель & quot;

Я пытаюсь создать систему для хранения скомпилированных скриптов 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;
}

Байт-код содержимого переменной является неполным. Посмотрите

незавершенный

полный

Примечание: я не делал этого «Писателя».
Извините за английский …

2

Решение

Я собираюсь предположить, что 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;
0

Другие решения

Строка 9: char* newData; = (char*)realloc(*(bd->data), (*(bd->len)) + sz);

Не ставить ; после char* newData,

Это правильно:

char* newData = (char*)realloc(*(bd->data), (*(bd->len)) + sz);

Хотя я все еще не уверен, сработает ли это.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector