2010-09-02 16 views
0

J'ai une question concernant l'objet C++ & Javascript Mauvaise synchronisation du cycle de vie de l'objet et j'espère que vos gourous pourront m'aider. En particulier, j'incorpore SpiderMonkey dans mon programme C++. Je ne suis pas sûr que mon approche soit bonne ou non. Ce que je fais est commeC++ Objet et Javascript Mauvaise synchronisation du cycle de vie de l'objet

(1) Le programme C++ charge un fichier Javascript et appelle une fonction d'entrée.

(2) Dans la fonction d'entrée, certaines fonctions C++ sont appelées pour initialiser le programme. Au cours de ces appels, certains objets C++ seront créés. (3) En fonction de l'interaction de l'utilisateur, la fonction de script correspondante sera appelée en tant que gestionnaire d'événements.

Cette approche fonctionne, mais avec un problème (il pourrait y avoir non identifié plus :)

C'est

Dans ma fonction de gestionnaire d'événements JS, je dois chercher un objet C++ au contexte Javascript et appelle la fonction membre. Pour cela, dans ma fonction de récupération C++, je vérifie si l'objet homologue JS correspondant a été créé ou non. Sinon, j'utilise JS_NewObject pour en créer un et le retourner. Alors la fonction JS pourrait appeler la fonction native dessus.

Le problème est que dans certains cas, le résultat de cet appel de fonction native entraînera la mort de l'objet C++. Cependant, je ne peux pas trouver un moyen de notifier le contexte JS pour supprimer son objet homologue JS aussi. J'ai échoué à trouver une fonction JSAPI pour le faire.

Dans mon programme actuel, tous les objets JS créés à l'aide de JS_NewObject sont détruits lorsque le runtime JS est finalement détruit.

Je suppose que ceci a quelque chose à voir avec la "garbage collection" de SipderMonkey. Mais je n'ai pas encore trouvé un bon guide. Merci beaucoup pour toute suggestion à

Répondre

0

JS est un environnement GC'd donc vous ne pouvez pas simplement "supprimer" un objet alloué GC. Il y a essentiellement 2 options que vous pouvez prendre:

  1. Faites votre objet C++ être dépendant de l'objet wrapper JS, si vous utilisiez refcounting par exemple, vous incrémenter l'arbitre l'objet du C lorsque vous avez créé une enveloppe, et décrément le ref dans le finaliseur d'objets wrapper.

  2. Lorsque vous détruisez l'objet C++, récupérez l'objet wrapper (s'il existe) comme étant la référence à l'objet C++. Tous vos callbacks devront maintenant null vérifier avant d'utiliser l'objet C de, mais vous ne plantera pas (vous pouvez lancer une exception JS peut-être en réponse?)

Dans la plupart des cas l'option 1 est ce que les utilisateurs attendent .

Je pointerais vers l'API requise mais je ne connais pas l'API SM (je connais l'API JSC à la place, mais les mêmes concepts s'appliquent)