Как мне сохранить ссылку на функцию, чтобы я мог вызвать ее позже в модуле add.js C ++?

Вот дополнительный модуль node.js, который я написал на C ++ и построил с использованием node-gyp.
Когда StoreFunction я пытаюсь сохранить указатель на функцию, чтобы я мог использовать ее позже

Когда я пытаюсь вызвать его позже, хотя в InvokeFunction я получаю ошибку сегментации. Что сбило меня с толку, если я изучил указатель в обеих функциях (используя cout), они имеют одинаковое значение.

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

Все (хмммммм) указатели с благодарностью получили по моей проблеме здесь …………..

#include <node.h>
#include <v8.h>

using namespace v8;
v8::Persistent<v8::Function> callbackFunction;
Handle<Value> StoreFunction(const Arguments& args) {
HandleScope scope;
callbackFunction = *Local<Function>::Cast(args[0]);
return scope.Close(Undefined());
}

Handle<Value> InvokeFunction(const Arguments& args) {
HandleScope scope;
Local<Value> argv[1] = { String::New("Callback from InvokeFunction")};
callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv);
return scope.Close(Undefined());
}

void init(Handle<Object> target) {
NODE_SET_METHOD(target, "StoreFunction", StoreFunction);
NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction);
}

NODE_MODULE(someaddonmodule, init);

И, конечно, некоторые звонят JS ………..

var myaddon = require('../build/Release/someaddonmodule');
myaddon.StoreFunction(function(data){
console.log("Called back: "+data);
});

myaddon.InvokeFunction();   //causes a segmentation fault

4

Решение

Ответ в том, что мы больше не программируем на Java.
Созданный мной указатель указывает на локальный дескриптор, а не на функцию. Наличие «ссылки» на это недостаточно, чтобы остановить сборку мусора V8, уничтожая ее при закрытии области действия.

Чтобы справиться с этим, необходимо сделать явный запрос к V8 выделить немного памяти для хранения
функция, которая сделала так:

Persistent< Function > percy;
Local<Function> callbackFunction = Local<Function>::Cast(args[0]);
percy = Persistent<Function>::New(callbackFunction);

Если кто-то, кто лучше понимает внутренности V8, знает больше, чем это, я все равно очень хотел бы услышать ваше объяснение 🙂

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector