Подтвердить что ты не робот

Как вы выставляете класс С++ в V8 Javascript Engine, чтобы его можно было создать с помощью нового?

Официальные примеры раскрытия класса Point, похоже, предполагают, что в вашей программе будет фиксированное количество экземпляров. Непонятно, как выделяются новые экземпляры кода С++, когда в Javascript вызывается new.

Как вы можете открыть класс, который может иметь несколько экземпляров? Например, класс Image:

var img1 = new Image( 640, 480 );
var img2 = new Image( 1024, 768 );

img1.clear( "red" );
img2.clear( "black" );
4b9b3361

Ответ 1

Это лучшее сообщение в блоге, которое я мог бы найти при экспонировании объектов С++ для V8 Javascript. Он идет более подробно и разбивает его на более мелкие шаги с помощью фрагментов кода. Будьте осторожны: фрагменты кода имеют небольшие несоответствия, и мне потребовалось несколько раз прочитать. Прочитав мое краткое резюме заранее, вы можете помочь:

  • Объекты должны быть обернуты в шаблоны V8. Примечание. В образце Google используются ObjectTemplates, но автор объясняет, почему он предпочитает FunctionTemplates.
    • Создайте FunctionTemplate. Экземпляры этого шаблона имеют внутреннее поле для хранения адреса памяти объекта С++. Они также получают методы доступа класса.
    • Сделать функцию wrapObject(), которая будет обертывать объект С++ в один из этих FunctionTemplates.
  • Конструктор также должен быть обернут в (другой) шаблон V8. Для предотвращения нежелательной рекурсии используется другой шаблон. (Метод объединения обоих шаблонов в один описан в конце сообщения в блоге.)
    • Создайте еще один FunctionTemplate. Этот шаблон просто соединяет глобальную область JavaScript (откуда new будет вызываться от) к конструктору С++.
    • Сделайте метод, который будет вызывать шаблон. Этот метод фактически использует оператор С++ new и вызывает конструктор класса С++. Затем он обертывает объект, вызывая метод wrapObject(), созданный на шаге 1.2.

Теперь память, выделенная на этапе 2.2, должна быть delete 'd некоторое время. Обновление: Следующая запись в блоге, Persistent Handles," подробно описывает это.

Мои заметки о действительном коде указанном в этих сообщениях в блоге:

  • Метод wrapPoint() в блоге фактически аналогичен методу unwrap() в фактическом коде; не wrap()
  • Чтобы найти другие общие точки между кодом, выполните поиск: SetInternalFieldCount(0, constructorCall
  • Фактический код, похоже, выполняет управление памятью, используя метод MakeWeak() для установки метода обратного вызова, который выполняет очистку.

Ответ 3

Я не знаю, как добиться этого в движке V8 Js точно, но, как и в мире Python, вы можете просто сделать следующее. ваш класс изображения:

class Image
{
public:
    Image(int w, int h);
    int Width(void) const;
};

напишите некоторые функции-обертки и выложите эти функции в мир Js:

Image* Image_New(int w, int h) { return new Image(w, h); }
void Image_Delete(Image* pImage) { delete pImage; }
int Image_Width(const Image* pImage) { return pImage->Width(); }

добавьте следующие коды в файл js:

var Image = function (w, h) {
    this.image = new Image(w, h);
    this.Width = function() {
        return Image_Width(this.image);
    };
};

и теперь вы можете получить работу с кодом. Кроме того, в приведенных выше кодексах не учитывается механизм сбора мусора, поэтому обратите особое внимание на это. Прошу прощения за мой английский английский!