2010-09-02 3 views
0

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

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

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

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

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

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

То есть,

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

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

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

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

ответ

0

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

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

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

В большинстве случаев вариант 1 является то, что пользователи ожидают ,

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

Смежные вопросы