diff options
Diffstat (limited to 'js/src/jit-test/tests/ion/super-prop.js')
-rw-r--r-- | js/src/jit-test/tests/ion/super-prop.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/ion/super-prop.js b/js/src/jit-test/tests/ion/super-prop.js new file mode 100644 index 0000000000..004284730f --- /dev/null +++ b/js/src/jit-test/tests/ion/super-prop.js @@ -0,0 +1,87 @@ +class Y { + a() { + assertEq(this.__proto__, X.prototype); + return 1; + } + b() { + assertEq(this.__proto__, X.prototype); + return 2; + } +} + +class X extends Y { + a() { throw "not invoked"; } + b() { + return super.a() + super.b(); + } + c(i) { + var a, b; + + if (i % 2) { + a = "a"; + b = "b" + } else { + a = "b"; + b = "a"; + } + + return super[a]() + super[b](); + } +} + +function simple() { + var x = new X(); + assertEq(x.b(), 3); + assertEq(x.c(), 3); +} + +class A { + b() { return 1;} +} +class B extends A { + a() { + assertEq(super.b(), 1); + } +} + +function nullHomeObjectSuperBase(i) { + var b = new B(); + if (i == 500) { + Object.setPrototypeOf(B.prototype, null); + // Don't crash + } + b.a(); +} + +class SArray extends Array { + constructor() { + super("a", "b"); + } + + a() { + assertEq(super.length, 0); + assertEq(this.length, 2); + + assertEq(this[0], "a"); + assertEq(this[1], "b"); + + assertEq(super[0], undefined); + assertEq(super[1], undefined); + } +} + +function array() { + var s = new SArray(); + s.a(); +} + +for (var i = 0; i < 1e4; i++) { + simple(); + array(); + + try { + nullHomeObjectSuperBase(i); + } catch (e) { + assertEq(i >= 500, true); + } +} |