2012-01-10 2 views
0

В библиотеке Lua 'Pluto description говорится, что функции и потоки lib сохраняются.Что такое потоковая библиотека Lua's Pluto?

Can persist any Lua function 
Can persist threads 
Works with any Lua chunkreader/chunkwriter 
Support for "invariant" permanent objects, of all datatypes 

Хмм, я не представляю, как функции и темы сохраняются. Могу ли я получить некоторое объяснение этой функции?

ответ

0

Может сохраняться любой функцией Lua

Это означает, что Плутон может сохраняться любой функция Lua на сохраняющемся это байткод и все необходимое upvalues. См. here и here для источника. Когда вы ее отмените, вы можете вызвать функцию как обычно. Обратите внимание, что он не может сохранять функции C, зарегистрированные в Lua.

Может сохраняться темы

Он упорствует стека и активации записи Нить, поэтому, когда вы unpersist, вы можете возобновить, где стек выполнял. Код: here.

2

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

Смежные вопросы