superPropMegamorphic.js (1062B)
1 // Test GETPROP_SUPER with megamorphic variation 2 const NCLASS = 20; 3 4 var g_prop = "prop"; 5 var g_THIS = "THIS"; 6 7 // Define array of base classes with a data property and a getter property. 8 let C = []; 9 for (let i = 0; i < NCLASS; ++i) { 10 let klass = class { 11 get THIS() { return this; } 12 }; 13 klass.prototype.prop = i; 14 15 C.push(klass); 16 } 17 18 // Derive class using super property access 19 class D extends C[0] { 20 get prop() { return super.prop; } 21 get elem() { return super[g_prop]; } 22 23 get prop_this() { return super.THIS; } 24 get elem_this() { return super[g_THIS]; } 25 } 26 27 let d = new D(); 28 29 for (var j = 0; j < 4; ++j) { 30 for (var i = 0; i < 15; ++i) { 31 // Change base class by overriding [[HomeObject]].[[Prototype]] 32 Object.setPrototypeOf(D.prototype, C[j].prototype); 33 34 // Check we get property of correct class 35 assertEq(d.prop, j); 36 assertEq(d.elem, j); 37 38 // Check super getter gets |this| of object not base class 39 assertEq(d.prop_this, d); 40 assertEq(d.elem_this, d); 41 } 42 }