Как использовать lua_pop (), функционируют правильно?

Мерзавец действительно имеет предварительную фиксацию и постфиксирует рычаги, они расположены в каждом .git/hooks каталоге. Просто измените файлы и chmod их для создания их исполняемым файлом.

9
задан Morpheus 1 August 2009 в 20:43
поделиться

1 ответ

Вы вызываете lua_pop () для удаления элементов из стека Lua. Для простых функций это может быть совершенно ненужным, так как ядро ​​будет очищать стек как часть обработки возвращаемых значений.

Для более сложных функций, и особенно для кода C, который вызывает Lua, вам часто нужно вытолкнуть вещи из стека, чтобы предотвратить неограниченный рост стека.

Функция lua_getglobal () добавляет один элемент в стек при вызове, который либо nil , если глобальный не делает » t существует или значение названной глобальной переменной. Наличие копии этого значения в стеке защищает его от сборщика мусора, пока оно существует. Это значение должно оставаться в стеке до тех пор, пока оно используется кодом C, который его получил, потому что, если глобальное значение было изменено, копия в стеке может быть единственной оставшейся ссылкой.

Итак, общие шаблоны для использования глобального примерно такие:

void doMyEvent(lua_State *L) {
    lua_getglobal(L, "MyEvent");
    lua_call(L, 0, 0);  /* pops the function and 0 parameters, pushes 0 results */
}

double getGlobalDouble(lua_State *L, const char *name) {
    double d;
    lua_getglobal(L,name);
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
    lua_pop(L,1);          /* pop the value to leave stack balanced */
    return d;
}

char *copyGlobalString(lua_State *L, const char *name) {
    char *s = NULL;
    lua_getglobal(L,name);
    if (!lua_isnil(L,-1))
        s = strdup(lua_tostring(L,-1));
    lua_pop(L,1);
    return s;
}

В последнем примере я осторожно копирую содержимое строки, потому что указатель вернул by lua_tostring () гарантированно действует только до тех пор, пока значение остается в стеке. Требуется, чтобы вызывающий copyGlobalString () отвечал за вызов free () позже.

Обратите также внимание на то, что последние версии руководства Lua включают обозначение вместе с каждой функцией, которая идентифицирует количество использованных записей стека, и число нажатий. Это помогает избежать неожиданного роста стека.

void doMyEvent(lua_State *L) {
    lua_getglobal(L, "MyEvent");
    lua_call(L, 0, 0);  /* pops the function and 0 parameters, pushes 0 results */
}

double getGlobalDouble(lua_State *L, const char *name) {
    double d;
    lua_getglobal(L,name);
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
    lua_pop(L,1);          /* pop the value to leave stack balanced */
    return d;
}

char *copyGlobalString(lua_State *L, const char *name) {
    char *s = NULL;
    lua_getglobal(L,name);
    if (!lua_isnil(L,-1))
        s = strdup(lua_tostring(L,-1));
    lua_pop(L,1);
    return s;
}

В последнем примере я стараюсь скопировать содержимое строки, потому что указатель, возвращаемый lua_tostring () , гарантированно действителен только до тех пор, пока значение остается в стеке. Требуется, чтобы вызывающий copyGlobalString () отвечал за вызов free () позже.

Также обратите внимание, что последние выпуски руководства Lua включают обозначение вместе с каждой функцией, которая идентифицирует количество использованных записей стека, и число нажатий. Это помогает избежать неожиданного роста стека.

void doMyEvent(lua_State *L) {
    lua_getglobal(L, "MyEvent");
    lua_call(L, 0, 0);  /* pops the function and 0 parameters, pushes 0 results */
}

double getGlobalDouble(lua_State *L, const char *name) {
    double d;
    lua_getglobal(L,name);
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
    lua_pop(L,1);          /* pop the value to leave stack balanced */
    return d;
}

char *copyGlobalString(lua_State *L, const char *name) {
    char *s = NULL;
    lua_getglobal(L,name);
    if (!lua_isnil(L,-1))
        s = strdup(lua_tostring(L,-1));
    lua_pop(L,1);
    return s;
}

В последнем примере я стараюсь скопировать содержимое строки, потому что указатель, возвращаемый lua_tostring () , гарантированно действителен только до тех пор, пока значение остается в стеке. Требуется, чтобы вызывающий copyGlobalString () отвечал за вызов free () позже.

Также обратите внимание, что последние выпуски руководства Lua включают обозначение вместе с каждой функцией, которая идентифицирует количество использованных записей стека, и число нажатий. Это помогает избежать неожиданного роста стека.

Требуется, чтобы вызывающий copyGlobalString () отвечал за вызов free () позже.

Обратите также внимание на то, что последние версии руководства Lua включают обозначение вместе с каждой функцией, которая идентифицирует количество использованных записей стека, и число нажатий. Это помогает избежать неожиданного роста стека.

Требуется, чтобы вызывающий copyGlobalString () отвечал за вызов free () позже.

Также обратите внимание, что последние выпуски руководства Lua включают обозначение вместе с каждой функцией, которая идентифицирует количество использованных записей стека, и число нажатий. Это помогает избежать неожиданного роста стека.

20
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: