Bonjour. J'ai fait des améliorations à mon "type profiler". Maintenant le profileur simule la création des maps, et utilise les map pour identifier le type des objets. Chaque site d'accès de propriété de la forme obj.prop est profilé de sorte à savoir, sur toute l'exécution du programme, le type d'objet observés pour "obj". Le profileur simule aussi une cache pour chaque site d'accès pour savoir combien de "hit" et "miss" il y a (un miss à chaque fois que la map de obj est différente de la map de obj lors de l'accès précédent). Je crois que ce profileur pourrait être très utile pour en savoir plus sur le comportement des programmes réalistes JS. On peut aussi tester des hypothèses (comme la "stabilité" des types) sur des programmes réalistes.
Voici un exemple d'utilisation.
Marc
bash-3.2$ ./js2js -debug -js test.js bash-3.2$ d8 test.js.js 111 222 333 --------------------------- TYPE PROFILE fetch_counter = 3 store_counter = 8 obj_counter = 3 new_counter = 3 map_counter = 7 hit_counter = 3 miss_counter = 8
map[0] = {} map[1] = {a} map[2] = {a,x} map[3] = {b} map[4] = {b,x} map[5] = {0..1,a,x} map[6] = {0..2,a,x}
FUNCTION PROFILE:
1 Foo(i) ("test.js"@1.1-4.2:) arg[0] = 111 result = undefined
2 Bar(j) ("test.js"@6.1-9.2:) arg[0] = 222..333 result = undefined
3 f(obj) ("test.js"@11.1-13.2:) arg[0] = map[4] U map[6] result = undefined
PROPERTY ACCESS RECEIVER PROFILE:
1 ("test.js"@2.3-2.14:) map[0]
1 ("test.js"@3.3-3.13:) map[1]
1 ("test.js"@18.1-18.10:) map[2]
1 ("test.js"@19.1-19.10:) map[5]
2 ("test.js"@7.3-7.14:) map[0]
2 ("test.js"@8.3-8.13:) map[3]
3 ("test.js"@12.9-12.14:) map[4] U map[6]
bash-3.2$ cat test.js function Foo(i) { this.a = 11; this.x = i; }
function Bar(j) { this.b = 22; this.x = j; }
function f(obj) { print(obj.x); }
var p = new Foo(111); var q = new Bar(222);
p[1] = 11; p[2] = 22;
f(p); f(q); f(new Bar(333));
Afficher les réponses par date