Есть ли способ преобразовать функцию v8 в обычную функцию, используемую сигналами windows? - PullRequest
1 голос
/ 29 января 2020

Есть ли способ конвертировать из 'v8 :: Local' в 'void (int)'. У меня есть функция v8, и я пытаюсь передать ее в сигнал на windows.

  v8::Local<v8::Function> function;
  function = v8::Local<v8::Function>::Cast(args[1]);
  (void)signal(SIGINT, function);

Я не уверен, как лучше работать над этим. Определение для сигнала:

    _ACRTIMP _crt_signal_t __cdecl signal(_In_ int _Signal, _In_opt_ _crt_signal_t _Function);

Но, похоже, _In_opt_ _crt_signal_t ​​эквивалентно void (int)

Редактировать: я пытался сделать то, что предложил jmrk. Я понимаю, как сделать его v8 постоянным, но я не уверен, как его обернуть. Я пытался использовать приведенную ниже оболочку, но она не работает.

struct c_api_interface { void (*func_js)(v8::Persistent<v8::Function>);};

  template<typename Fn, Fn fn, typename... Args>
  typename std::result_of<Fn(Args...)>::type
    wrapper(Args... args) {
    return fn(std::forward<Args>(args)...);
  }
#define WRAPIT(FUNC) wrapper<decltype(&FUNC), &FUNC>



  v8::Local<v8::Function> function;
  function = v8::Local<v8::Function>::Cast(args[1]);
  v8::Persistent<v8::Function> value(isolate, function );
  c_api_interface my_interface;
  my_interface.func_js = WRAPIT(value);

  (void)signal(SIGINT, my_interface.func_js);


1 Ответ

1 голос
/ 29 января 2020

Это не будет работать напрямую. signal нужна функция C ++, тогда как v8::Local<...> - это объект данных C ++, ссылающийся внутренне на объект кучи V8; последний в данном случае является функциональным объектом JavaScript, который, помимо свойств, прототипа и т. д., также может вызываться, если вы знаете, как его вызывать, что, конечно, не так, как в C ++ будет вызвана функция.

Так что лучший (только?) способ go об этом, вероятно, состоит в определении функции-оболочки в C ++. Храните v8::Function в v8::Persistent, тогда вы можете добраться до него. (Все это предполагает, что вашей общей целью является выполнение функции JavaScript, когда процесс получает определенный сигнал?)

...