source code относительно прост в использовании и очень прокомментирован.
Что делает lib, определяет, какие части составляют функции и/или потоки, а затем хранит каждую деталь отдельно.
Если вы пропустите код и просто прочитать комментарии, вот как две соответствующие функции выглядят:
static void persistfunction(PersistInfo *pi)
{
...
if(cl->c.isC) {
/* It's a C function. For now, we aren't going to allow
* persistence of C closures, even if the "C proto" is
* already in the permanents table. */
lua_pushstring(pi->L, "Attempt to persist a C function");
lua_error(pi->L);
} else { /* It's a Lua closure. */
/* Persist prototype */
...
/* Persist upvalue values (not the upvalue objects themselves) */
...
/* Persist function environment */
...
}
}
static void persistthread(PersistInfo *pi)
{
...
/* Persist the stack */
...
/* Now, persist the CallInfo stack. */
...
/* Serialize the state's other parameters, with the exception of upval stuff */
...
/* Finally, record upvalues which need to be reopened */
...
}
Итак, как вы можете видеть, функция может рассматриваться как состав прототипа, группа upvalues и среда (таблица). Поток - это два «стека» (стек вызовов и стек памяти, я думаю), информация о состоянии (исключая upvalues), которая в основном относится к тем, какие переменные имели значения при определении потока, и значениям upvalues.
Вы можете узнать больше о значениях в PiL 27.3.3