Белка sq_getclosurename не работает

Пытаюсь создать свою собственную утилиту связывания функций, но зацикливаюсь на попытке использовать нативный метод c для правильного обратного вызова.

Если я связываю функцию, используя стандартный метод:

sq_pushroottable(vm);
sq_pushstring(vm, name.c_str(), -1);

sq_newclosure(vm, [](HSQUIRRELVM v)->SQInteger
{
    if (!sq_getclosurename(v, -1)) //Should be a clojure.
    {
        std::cout << "not clojure";
    }
    const SQChar* strname;
    if (sq_getstring(v, 0, &strname)) //Should give me the name i set right?
    {
        std::cout << strname;
    }
    else
    {
        std::cout << "name";
    }
    return 0;
}, 0);

//sq_setnativeclosurename(vm, -1, name.c_str()); //Debug test. Failed.
sq_newslot(vm, -3, false);
sq_pop(vm, 1);

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

Функция defun не будет работать, так как они немедленно проверяют размер аргумента, и моя лямбда не имеет аргументов обратного вызова, поэтому она не работает.

Я копался в easy_squrrelbind, squall и sqrat, чтобы попытаться понять, что они делают. Шквал, кажется, использует функторы. но моя утилита на данный момент использует функтиноиды, и попытаться заставить их хорошо играть друг с другом сложно.

вот что думает

a string is pushed to the stack: STACK["name"]
a closure is pushed to the stack: Stack["name",*func]
set name = *func.
then the stack is popped.

Теперь, когда вызывается функция:

arguments are pushed to the stack: Stack["arg1",arg2]
clojure information is pushed to the stack: Stack["arg1",arg2,clojure]
function *func is called.
inside *func I call sq_getclosurename which pushes its name to the stack: Stack["arg1",arg2,clojure,"name"]

Итак, если это правильно, я должен быть в состоянии понять имя правильно?

из того, что я могу сказать о sqrat, они хранят информацию о функциях в SQObject. затем каким-то образом вытолкнуть эту информацию. Не уверен, где это даже хранится в тамошнем стеке, или как оно там заполняется.

Есть ли способ выгрузить содержимое стека на стороне C++ белка для проверки стека и его переменных?

0 ответов

Другие вопросы по тегам