scripted-getter-setter.js (1555B)
1 if (getJitCompilerOptions()["ion.warmup.trigger"] > 50) 2 setJitCompilerOption("ion.warmup.trigger", 50); 3 4 function getObjects() { 5 var objs = []; 6 7 // Own scripted getter/setter. 8 objs.push({x: 0, get prop() { 9 assertJitStackInvariants(); 10 return ++this.x; 11 }, set prop(v) { 12 assertJitStackInvariants(); 13 this.x += v; 14 }}); 15 16 // Scripted getter/setter on prototype. Also verify extra formal args are 17 // handled correctly. 18 function getter(a, b, c) { 19 assertEq(arguments.length, 0); 20 assertEq(a, undefined); 21 assertEq(b, undefined); 22 assertEq(c, undefined); 23 assertJitStackInvariants(); 24 bailout(); 25 return ++this.y; 26 } 27 function setter1(a, b) { 28 assertEq(arguments.length, 1); 29 assertEq(b, undefined); 30 assertJitStackInvariants(); 31 this.y = a; 32 bailout(); 33 return "unused"; 34 } 35 var proto = {}; 36 Object.defineProperty(proto, "prop", {get: getter, set: setter1}); 37 objs.push(Object.create(proto)); 38 39 function setter2() { 40 assertEq(arguments.length, 1); 41 assertJitStackInvariants(); 42 this.y = arguments[0]; 43 } 44 proto = {}; 45 Object.defineProperty(proto, "prop", {get: getter, set: setter2}); 46 objs.push(Object.create(proto)); 47 return objs; 48 } 49 function f() { 50 var objs = getObjects(); 51 var res = 0; 52 for (var i=0; i<200; i++) { 53 var o = objs[i % objs.length]; 54 o.prop = 2; 55 res += o.prop; 56 } 57 assertEq(res, 7233); 58 } 59 f();