v8 расширение для node.js - не может установить FunctionTemplate для цели - PullRequest
1 голос
/ 11 августа 2011

Я только начинаю с написания привязки к библиотеке C (точнее, грамматики ссылок) через расширение v8 (следуя инструкциям по Node.JS docs и v8 APIдокументы ).

Моя проблема в том, что я получаю следующую ошибку сборки:

/usr/include/v8.h: In constructor âv8::Handle<T>::Handle(v8::Handle<S>) [with S = v8::FunctionTemplate, T = v8::Value]â:
node.cc:85:68:   instantiated from here
/usr/include/v8.h:195:5: error: cannot convert âv8::FunctionTemplate*â to âv8::Value* volatileâ in assignment

... при попытке создать следующий код:

#include <v8.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include "link-includes.h"

using namespace v8;

Dictionary dict;
Parse_Options opts;

static Handle<Value> v8parse(const Arguments& args)
{
    /* snip */
}

extern "C" void init (Handle<Object> target)
{
    HandleScope scope;
    target->Set(String::New("parse"), FunctionTemplate::New(v8parse));

    setlocale(LC_ALL, "");
    opts = parse_options_create();
    dict = dictionary_create_lang("en");
}

Мне кажется, что я следовал инструкциям, приведенным в приведенных выше ссылках, и следовал примеру примеров, на которые они ссылаются, однако я получаю вышеупомянутую ошибку.Не самый крутой C ++ кодер, так что вполне возможно, что ошибка смотрит мне в лицо.Увы, я в растерянности.

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Метод Set ожидает Handle<Value>, но вы передаете FunctionTemplate, который не может автоматически преобразоваться. Вам нужно использовать GetFunction для шаблона, чтобы получить для него дескриптор значения.

target->Set(String::New("parse"), FunctionTemplate::New(v8parse)->GetFunction());

Однако для этого есть макрос, поэтому я бы порекомендовал сделать это:

NODE_SET_METHOD(target, "parse", v8parse);

Я нашел этот пост / пример кода полезным, когда играл с этим материалом. https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

Я не уверен на 100%, так как он не упоминается в опубликованных вами документах nodejs, но я думаю, что вам также понадобится extern "C" { NODE_MODULE(yourmodulefilename, init); } внизу вашего файла, чтобы сообщить узлу, что это модуль для загрузки.

2 голосов
/ 11 августа 2011

Возможно, вам нужно вызвать GetFunction () в шаблоне вашей функции.Я только баловался с расширениями c ++ для узлов, но кажется, что большинство примеров кода, которые я видел, выглядят примерно так:

static Persistent<FunctionTemplate> s_ct;

static void Init(Handle<Object> target)
{
  HandleScope scope;

  Local<FunctionTemplate> t = FunctionTemplate::New(New);

  s_ct = Persistent<FunctionTemplate>::New(t);
  s_ct->InstanceTemplate()->SetInternalFieldCount(1);
  s_ct->SetClassName(String::NewSymbol("MyClass"));

  NODE_SET_PROTOTYPE_METHOD(s_ct, "someMethod", MyClass::SomeMethod);

  target->Set(String::NewSymbol("MyClass"),
              s_ct->GetFunction());
}

Расширение узла для грамматики ссылок будет круто :)1004 *

...