Les problèmes de collecte d'ordures sur spidermonkey … JS_AnchorPtr ()?

J'ai roulé mon propre langage côté javascript appelé bondi. Juste récemment mis à niveau vers le nouveau singe araignée.

Maintenant que JS entre dans les racines locales et laisse les racines locales fonction est disparu / inutile à partir de 1.8.5 api, est-il suffisant d'utiliser le pointeur d'ancrage ( JS_AnchorPtr(varname) ) à la fin de vos appels de fonction pour s'assurer que le compilateur n'est pas ' T supprimer les références pour garder le collecteur d'ordures heureux?

Je l'ai testé en supprimant toutes mes références à JS_EnterLocalRootScope ( voir ici ) / Laissez la portée racine locale et en ajoutant JS_AnchorPtr() au bas du script.

J'ai regardé la fonction AnchorPoint dans le code source du singe araignée. Devinez quoi … il ne fait rien. Il n'y a pas de doco non plus. Je l'utilise juste pour que je puisse faire une mention de ces variables, de sorte que le récupérateur ne les tue pas.

Bien, le reproche semble dire que le bogue 519949 vous recommande d'utiliser js :: Anchor pour que le scanner de pile conservateur le reprenne.

Notez que le scanner conservateur peut trouver n'importe quelle chose GC qui se trouve sur la pile ou dans les registres, de sorte que le seul cas vraiment difficile est l'endroit où vous utilisez des valeurs dérivées lorsque la chose "possédant" GC peut être morte, ainsi:

 { JSString *str = GetMeSomeStringYo(); const jschar *chars = str->chars(); // Note, |str| is not "live" here, but the derived |chars| is! // The conservative stack scanner won't see |chars| and know // to keep |str| alive, so we should be anchoring |str|. DoSomethingThatCanCauseGC(); return chars[0]; } 

Si vous utilisez C, le JS_AnchorPtr à la fin des fonctions devrait suffire. Vous avez raison que la fonction a une mise en œuvre nop! L'idée est que, tant qu'il effectue un appel vers un symbole d'objet partagé avec la variable pour rester en vie en tant que paramètre, la fonction d'appel devra conserver cette valeur dans l'état de la machine afin d'effectuer l'appel de rien. Ceci est plus sucky pour perf que js :: Anchor.

Il y a un piège potentiel dans le cas improbable où vous liez statiquement contre SpiderMonkey et que l'optimisation du temps de liaison est activée: l'appel à objet croisé peut être intégré avec une implémentation nulle, éliminant la vitalité de la variable, auquel cas les mêmes risques GC peuvent Pop-up.