summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/super-prop.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/ion/super-prop.js')
-rw-r--r--js/src/jit-test/tests/ion/super-prop.js87
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);
+ }
+}