2009-11-25 9 views
0

Je voudrais compter le nombre d'appels faits à eval dans notre application javascript.Compter les appels à eval

J'ai trouvé ce qui suit, mais cela génère des erreurs. Ces erreurs sont difficiles à suivre, et ma connaissance de l'application est limitée.

Pouvez-vous dire quel est le problème avec mon code?

increment = function(){ 
    var me = arguments.callee; 
    if (!me.count) me.count = 0; 
    return ++me.count; 
} 

var oldEval = eval; 

eval = function eval(string){  
    console.log('eval number ', increment()); 
    return oldEval(string); 
} 

Ou vous connaissez une autre façon de compter l'utilisation d'eval?

grâce

Olivier

Répondre

1

Je suis venu avec une solution rudimentaire. Cela semble fonctionner, au moins je peux rassembler des données, mais je ne suis pas sûr à 100% que c'est correct.

donc je fais juste:

eval = eval; 

Avec cela, le profileur de Firebug est en mesure de compter les appels à eval, mais ne groupe que le comptage, donc je dois copier-coller pour exceller, et construire une pivoter Table afin d'obtenir les données.

+0

Say What Now? S'il vous plaît élaborer! –

+0

Il n'y a pas grand chose à élaborer. eval = eval; après que les appels à eval() sont signalés par le profileur firebug. Cependant, ils sont comptés sur plusieurs lignes, donc j'utilise Excel pour les résumer tous. regard de sortie du profileur au firebug comme cela: eval() 0,01% \t 0.024ms \t 0.979ms \t 0.979ms \t 0.979ms \t 0.979ms \t 326 (ligne 1) eval() 0,01 % \t 0.024ms \t 0.991ms \t 0.991ms \t 0.991ms \t 0.991ms \t 318 (ligne 1) eval() 0,01% \t 0.024ms \t 0.759ms \t 0.759ms \t 0.759ms \t 0.759ms \t 313 (ligne 1) Cette technique peut probablement par utilisée pour compter les appels à toute autre fonction javascript natif. – Olivvv

+0

@Olivvv comment pourrais-je inclure ceci dans javascript, je veux dire que je suis incapable de montrer les paramètres d'eval avec cette fonction – user1275375

0

La seule chose qui saute est le nom de votre argument "chaîne"

Essayez de changer à "str" ​​ou quelque chose. Certains navigateurs peuvent ne pas aimer "String" car il s'agit en fait d'un nom de classe (IE qui ignore souvent la casse parfois)

Remarque J'ai testé votre code, et il fonctionne dans Firefox 3.5 (avec l'addon Firebug installé)

Si vous ne disposez pas d'un objet console défini ou d'une méthode log sur cet objet console, vous obtiendrez des erreurs. (par exemple si Firebug ou similaire n'est pas installé)

5

Malheureusement, il n'y a pas de méthode d'émulation/d'emballage étanche, car ce n'est pas une fonction normale. Il peut accéder (lire et écrire) aux variables locales de l'appelant direct.

function testeval() { 
    var a= 2; 
    eval('a*= 2'); 
    alert(a); // 4 
}; 

Ceci est une magie que vous ne pouvez pas émuler à partir d'une fonction JavaScript native. Vous n'avez aucun moyen de myWrappedEval pour obtenir la valeur a dans l'appelant ou réécrire la valeur modifiée. Alors que vous pouvez obtenir la fonction d'appelant en utilisant arguments.caller, il n'y a aucun moyen de lire les locals de l'invocation de fonction.

Vous devrez insérer manuellement un appel à increment juste avant chaque utilisation de eval que vous pouvez trouver dans la source. Ou, mieux, supprimez tous les appels à eval et remplacez-le par un meilleur code, ce qui rend l'appel total zéro. ;-)

+0

Oublié cela. En fonction de ce que 'eval' est utilisé pour cette décoration va probablement le casser complètement. Putain, JS a tellement besoin de 'caller.locals()'. –

+0

Merci. Le problème n'est pas lié à la chose increment, si je l'enlève, c'est la même chose. Je ne suis pas sûr que la question arguments.caller est l'origine du problème, car il casse sur les méthodes qui n'utilisent pas cela. – Olivvv

+0

'arguments.caller' n'est pas lié au problème, simplement mentionné comme une stratégie pour une solution de contournement (qui ne fonctionnera pas!). Le problème se produira pour * tout * 'eval' appel qui utilise les variables locales d'une fonction. – bobince

-1

Essayez cette version modifiée

var increment = function() { 
    var me = arguments.callee; 
    if (!me.count) me.count = 0; 
    return ++me.count; 
} 

var oldEval = eval; 

eval = function (str) { 
    alert('eval number ' + increment()); 
    return oldEval(str); 
} 
  • Renommé string-str
  • utilisé alerte au lieu de console.log (qui n'est pas disponible dans tous les navigateurs)
  • appel Changé pour alerter utiliser la concaténation de chaîne
  • a changé la nouvelle fonction eval d'être anonyme (retiré eval nom)
+0

Merci, mais cela n'aide pas. les points 1 et 4 ne changent rien et j'ai des centaines d'occurrences, donc je n'utiliserai pas alert(); – Olivvv

+0

Ok, remplacez à nouveau "alert" par console.log. Alors maintenant, je suppose que console.log fonctionne pour vous. Avez-vous envisagé de consigner l'argument (str) lui-même et de vérifier lequel il casse. Ensuite, postez des échantillons dans votre question – jitter