Правильный метод для хранения экземпляров JavaScript в классе Nan :: ObjectWrap C ++ - PullRequest
0 голосов
/ 10 декабря 2018

Допустим, у меня есть два класса, которые разработаны на C ++, но предоставляются с использованием собственных модулей Nan NodeJS.Например, классы «Sprite» и «Texture».

В JavaScript я хочу, чтобы Sprite сохранял текстуру, как если бы это было просто другое свойство:

// Local instance of texture
var t = new Texture();

// Global instances of Sprites that won't be GC'd
global.spr = new Sprite();
global.spr2 = new Sprite();

// Same texture can be assigned to multiple sprites
spr.texture = t;
spr2.texture = t;

console.log(spr.texture);

Со стороны C ++, свойство "texture" Sprite будет Getter / Setter, который хранит или извлекает текстуру.Однако вопрос в том, как правильно хранить экземпляр Texture внутри (из предоставленной версии v8 :: Local)?Например, что мне нужно сделать, чтобы зарегистрировать его как «принадлежащий» Sprite и заставить его не получать GC'd, как это, вероятно, было бы в приведенном выше примере?

1 Ответ

0 голосов
/ 29 декабря 2018

Вы можете иметь дескриптор Persistent в качестве члена вашего класса Sprite, в котором хранится экземпляр текстуры.Деструктору Sprite необходимо сбросить дескриптор, чтобы избежать утечки.

class Sprite : public Nan::ObjectWrap {
public:
  Nan::Persistent<v8::Object> textureHandle;

  static NAN_SETTER(SetTexture) {
    Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
    if (Nan::New(Texture::constructor)->HasInstance(value)) {
      sprite->textureHandle.Reset(value);
    } else {
      // value wasn't a Texture instance; do something
    }
  }

  static NAN_GETTER(GetTexture) {
    Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
    Isolate* iso = Isolate::GetCurrent();
    if (sprite->textureHandle.IsEmpty()) {
      // Texture hasn't been set yet; do something
    } else {
      info.GetReturnValue().Set(sprite->TextureHandle.Get(iso));
    }
  }

  ~Sprite() {
    textureHandle.Reset();
  }
}

(Не показано: код инициализации для регистрации получателя / установщика.)

...