Problème de performance “call” nested dans JavaScriptCore

Si je définis une fonction

inc = function(x) { return x + 1 } 

et en faire une invocation nestede

 inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1))))))))))))))))))))) 

cela se traduira par la valeur 22 . Si je révise l’expression nestede pour utiliser plutôt l’ call , en transmettant null pour this , comme

 inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1))))))))))))))))))))) 

cela produira également la valeur 22 .

Mais, sur JavaScriptCore, cette seconde forme semble consumr de la mémoire O (2 ^ n ), où n est le nombre d’appels nesteds. Ce n’est pas le cas si j’essaie ce JavaScript dans Firefox ou Chrome, donc il semble être isolé à JavaScriptCore.

J’ai très peu d’expérience en JavaScript (presque aucun). Je n’ai aucune idée des compromis que pourraient apporter les différentes implémentations de JavaScript, ni du fait qu’il soit raisonnable que l’exemple de code soit coûteux dans certaines implémentations (fournissant un support générique pour les fermetures ou certains autres), tout en étant efficace dans d’autres.

Ma question est la suivante: ce code est-il insortingnsèquement problématique? Devrait-il être réécrit pour être structuré différemment? Ou est-ce que le code est correct – JavaScriptCore a-t-il simplement un bogue?

J’ai fait des expérimentations où le refactorisation de quelques appels internes à des provisoires “tronque” le comportement de doublage de mémoire

 var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1))))))); var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp1))))))); inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp2))))))); 

    D’après les commentaires sur cette question, le consensus est qu’il n’y a pas de problème fondamental avec le code tel qu’il est écrit, mais qu’il s’agit plutôt d’un bogue dans JavaScriptCore.

    Pour le ticket déposé , il a été confirmé qu’il était reproductible et importé dans le système radar d’Apple.