Белка 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++ белка для проверки стека и его переменных?