Ответ 1
Это лучшее сообщение в блоге, которое я мог бы найти при экспонировании объектов С++ для V8 Javascript. Он идет более подробно и разбивает его на более мелкие шаги с помощью фрагментов кода. Будьте осторожны: фрагменты кода имеют небольшие несоответствия, и мне потребовалось несколько раз прочитать. Прочитав мое краткое резюме заранее, вы можете помочь:
- Объекты должны быть обернуты в шаблоны V8. Примечание. В образце Google используются ObjectTemplates, но автор объясняет, почему он предпочитает FunctionTemplates.
- Создайте FunctionTemplate. Экземпляры этого шаблона имеют внутреннее поле для хранения адреса памяти объекта С++. Они также получают методы доступа класса.
- Сделать функцию wrapObject(), которая будет обертывать объект С++ в один из этих FunctionTemplates.
- Конструктор также должен быть обернут в (другой) шаблон V8. Для предотвращения нежелательной рекурсии используется другой шаблон. (Метод объединения обоих шаблонов в один описан в конце сообщения в блоге.)
- Создайте еще один FunctionTemplate. Этот шаблон просто соединяет глобальную область JavaScript (откуда
new
будет вызываться от) к конструктору С++. - Сделайте метод, который будет вызывать шаблон. Этот метод фактически использует оператор С++
new
и вызывает конструктор класса С++. Затем он обертывает объект, вызывая метод wrapObject(), созданный на шаге 1.2.
- Создайте еще один FunctionTemplate. Этот шаблон просто соединяет глобальную область JavaScript (откуда
Теперь память, выделенная на этапе 2.2, должна быть delete
'd некоторое время. Обновление: Следующая запись в блоге, Persistent Handles," подробно описывает это.
Мои заметки о действительном коде указанном в этих сообщениях в блоге:
- Метод
wrapPoint()
в блоге фактически аналогичен методуunwrap()
в фактическом коде; неwrap()
- Чтобы найти другие общие точки между кодом, выполните поиск:
SetInternalFieldCount(0
,constructorCall
- Фактический код, похоже, выполняет управление памятью, используя метод MakeWeak() для установки метода обратного вызова, который выполняет очистку.