родное расширение c ++ для Node.js: «клонирование» локального <Value>в конструкторе - PullRequest
0 голосов
/ 03 сентября 2011

Я прочитал учебник «Написание собственных расширений Node.js»: https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions

Код работал нормально (https://github.com/pquerna/node-extension-examples/blob/master/helloworld/helloworld.cc)

Теперь я хочу изменить:

class HelloWorld: ObjectWrap
{
private:
  int m_count;
public:
(...)
 HelloWorld() :
    m_count(0)
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    hw->m_count++;
    Local<String> result = String::New("Hello World");
    return scope.Close(result);
  }
(...)
}

на что-то подобное (скопируйте параметр в конструкторе и верните его в «Hello ()»):

class HelloWorld: ObjectWrap
{
private:
  Local< Value > myval;/* <===================== */
public:
(...)
 HelloWorld(const Local< Value >& v) :
   myval(v) /* <===================== */
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);/* <===================== */
  }
(...)
}

мой код не работает,Похоже, что hello () возвращает целое число

var h=require("helloworld");
var H=new h.HelloWorld("test");
console.log(H.hello());

Как правильно копировать myval в конструктор и возвращать myval в функцию 'Hello ()'?И нужно ли мне что-то управлять в деструкторе?

Спасибо.

Пьер

1 Ответ

1 голос
/ 03 сентября 2011

'Локальные' переменные будут автоматически очищены, поэтому вы не можете просто сохранить их копию таким образом. Вам нужно использовать «постоянный» дескриптор.

class HelloWorld: ObjectWrap
{
private:
  Persistent< Value > myval;
public:
(...)
  HelloWorld(const Local< Value >& v) : 
    myval(Persistent< Value >::New(v)) {

  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);
  }
(...)
}
...