Есть ли способ автоматически управлять памятью, выделенной собственным кодом с помощью js-ctypes? - PullRequest
1 голос
/ 21 августа 2011

Я унаследовал дополнение Firefox, которое крайне нуждается в обновлении новой линии Firefox 4+.У меня наконец-то есть время поработать над этим, но оказывается, что это дополнение включает в себя нативную часть, скомпилированную как компонент XPCOM, и компонентам XPCOM теперь настоятельно не рекомендуется.Поскольку я действительно не хочу перекомпилировать свои двоичные файлы каждый раз, когда выходит новая основная версия, я перехожу к переходу на js-ctypes.

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

В идеале, я хотел бы иметь эквивалентную функциональность с js-ctypes.Поскольку js-ctypes более низкоуровневый, чем XPCOM, он не поддерживает объекты напрямую, но мне интересно, есть ли способ, которым я мог бы создать объект-обертку самостоятельно и каким-то образом получить уведомление, когда он собирает мусор.Я знаю, что в чистом JavaScript нет понятия деструкторов, но, возможно, есть еще способ, которым я могу сделать это в Firefox.

1 Ответ

1 голос
/ 22 августа 2011

К сожалению для вас, в JavaScript есть важная концепция, что вы не можете наблюдать за сборкой мусора (по крайней мере, из самого JavaScript). Единственное место, где у вас есть функциональность, подобная деструктору, это XBL . Другими словами, вы можете определить элемент XUL, который будет служить вашим объектом оболочки (аналогично тому, как <stringbundle> служит оболочкой для API локализации). Ваша XBL-привязка для этого элемента должна обеспечивать необходимые методы и вызывать js-ctypes внутри. А когда элемент отбрасывается (запускается деструктор XBL), вы можете очистить и освободить память.

Это предполагает, конечно, что вы можете работать с элементами XUL в первую очередь. Если ваш код не запускается в окне, то ИМХО вам не повезло - он возвращается к ручному отслеживанию объекта, чтобы обнаружить момент, когда объект больше не используется.

...