summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/class/super-in-nested-eval.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/class/super-in-nested-eval.js')
-rw-r--r--js/src/jit-test/tests/class/super-in-nested-eval.js34
1 files changed, 34 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/class/super-in-nested-eval.js b/js/src/jit-test/tests/class/super-in-nested-eval.js
new file mode 100644
index 0000000000..c0f9e4fd66
--- /dev/null
+++ b/js/src/jit-test/tests/class/super-in-nested-eval.js
@@ -0,0 +1,34 @@
+// |jit-test| allow-overrecursed
+
+// Test super() and super.foo() calls in deeply nested eval.
+
+class C {
+ constructor(x) { this.x = x; }
+ foo() { this.x++; }
+}
+class D extends C {
+ constructor(depth) {
+ var d = depth;
+ var callsuper = 'super(depth); super.foo();';
+ var s = "if (d-- > 0) { eval(s) } else { eval(callsuper); }";
+ eval(s);
+ }
+}
+
+const MAX_DEPTH = 252;
+
+// These values should work.
+var depths = [0, 1, 10, 200, MAX_DEPTH];
+for (var d of depths) {
+ var o = new D(d);
+ assertEq(o.x, d + 1);
+}
+
+// This should fail.
+var ex;
+try {
+ new D(MAX_DEPTH + 1);
+} catch(e) {
+ ex = e;
+}
+assertEq(ex instanceof InternalError, true);