summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/scripted-getter-setter.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/ion/scripted-getter-setter.js')
-rw-r--r--js/src/jit-test/tests/ion/scripted-getter-setter.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/ion/scripted-getter-setter.js b/js/src/jit-test/tests/ion/scripted-getter-setter.js
new file mode 100644
index 0000000000..4e8842cba5
--- /dev/null
+++ b/js/src/jit-test/tests/ion/scripted-getter-setter.js
@@ -0,0 +1,59 @@
+if (getJitCompilerOptions()["ion.warmup.trigger"] > 50)
+ setJitCompilerOption("ion.warmup.trigger", 50);
+
+function getObjects() {
+ var objs = [];
+
+ // Own scripted getter/setter.
+ objs.push({x: 0, get prop() {
+ assertJitStackInvariants();
+ return ++this.x;
+ }, set prop(v) {
+ assertJitStackInvariants();
+ this.x += v;
+ }});
+
+ // Scripted getter/setter on prototype. Also verify extra formal args are
+ // handled correctly.
+ function getter(a, b, c) {
+ assertEq(arguments.length, 0);
+ assertEq(a, undefined);
+ assertEq(b, undefined);
+ assertEq(c, undefined);
+ assertJitStackInvariants();
+ bailout();
+ return ++this.y;
+ }
+ function setter1(a, b) {
+ assertEq(arguments.length, 1);
+ assertEq(b, undefined);
+ assertJitStackInvariants();
+ this.y = a;
+ bailout();
+ return "unused";
+ }
+ var proto = {};
+ Object.defineProperty(proto, "prop", {get: getter, set: setter1});
+ objs.push(Object.create(proto));
+
+ function setter2() {
+ assertEq(arguments.length, 1);
+ assertJitStackInvariants();
+ this.y = arguments[0];
+ }
+ proto = {};
+ Object.defineProperty(proto, "prop", {get: getter, set: setter2});
+ objs.push(Object.create(proto));
+ return objs;
+}
+function f() {
+ var objs = getObjects();
+ var res = 0;
+ for (var i=0; i<200; i++) {
+ var o = objs[i % objs.length];
+ o.prop = 2;
+ res += o.prop;
+ }
+ assertEq(res, 7233);
+}
+f();