如何使Lua“写入器”(C++版)

我正在尝试制作一个存储 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;
}

变量 bytecode 不完整。查看下面的截图。

Incomplete

Complete

注:我没有编写此 "Writer"。 抱歉我的英语不好...

点赞
用户3221428
用户3221428

不要在 char* newData; 后面加上 ;

正确的形式是:

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

尽管如此,我仍然不确定它能否正常运行。

2014-03-27 18:03:08
用户869951
用户869951

我要假设你在问题中的 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;
2014-03-27 21:58:40