C ++ Object & Javascript Object несинхронизация жизненного цикла объекта - PullRequest
0 голосов
/ 02 сентября 2010

У меня вопрос по поводу несинхронизации жизненного цикла объектов C ++ Object и Javascript Object, и надеюсь, что здесь ваши гуру могут мне помочь.

В частности, я встраиваю SpiderMonkey в свою программу на C ++.Я не уверен, что мой подход правильный или нет.То, что я делаю, похоже на

(1) Программа C ++ загружает файл Javascript и вызывает функцию ввода.

(2) В функции ввода некоторые функции C ++ вызываются для инициализации программы,Во время этих вызовов будут созданы некоторые объекты C ++.

(3) В зависимости от взаимодействия с пользователем соответствующая функция сценария будет вызываться как обработчик события.

Этот подход работает, но с одной проблемой (может быть неопознанным больше:)

То есть

В моей функции обработчика событий JS мне нужно получить C ++возьмите объект в контекст Javascript и назовите его функцией-членом.Для этого в моей функции извлечения C ++ я проверяю, был ли создан соответствующий объект JS-партнера или нет.Если нет, я использую JS_NewObject, чтобы создать и вернуть его.Тогда функция JS может вызывать нативную функцию для него.

Проблема в том, что в некоторых случаях результат такого вызова нативной функции приведет к смерти объекта C ++.Тем не менее, я не могу найти способ уведомить JS-контекст, чтобы удалить его объект JS peer тоже.Мне не удалось найти функцию JSAPI для этого.

В моей текущей программе все объекты JS, созданные с использованием JS_NewObject, уничтожаются, когда, наконец, среда выполнения JS уничтожается.

Полагаю, это как-то связано с "сборкой мусора" SipderMonkey.Но я еще не нашел хорошего гида.Большое спасибо за любое предложение

1 Ответ

0 голосов
/ 02 сентября 2010

JS - это среда GC, поэтому вы не можете просто "удалить" выделенный объект GC.Есть в основном 2 варианта, которые вы можете выбрать:

  1. Сделать ваш объект C ++ зависимым от объекта-оболочки JS, например, если вы использовали перемонтирование, вы увеличиваете ref объекта C ++ при созданииобертку и уменьшите ссылку в финализаторе объектов обертки.

  2. Когда вы уничтожаете объект C ++, извлеките объект обертки (если он существует), как очистите ссылку на объект C ++.Все ваши обратные вызовы теперь должны будут обнулять проверку перед использованием объекта C ++, но вы не будете аварийно завершать работу (возможно, вы могли бы вызвать исключение JS в ответ?)

В большинстве случаев опция1 - это то, чего ожидают пользователи.

Я бы указал на требуемый API, но я не знаю API SM (вместо этого я знаю API JSC, но применяются те же концепции)

...