summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js38
1 files changed, 38 insertions, 0 deletions
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
new file mode 100644
index 0000000000..970beb0436
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
@@ -0,0 +1,38 @@
+let superArrow;
+let thisArrow;
+
+let thisStash;
+
+class base {
+ constructor() {
+ // We run this constructor twice as part of the double init check
+ if (!thisStash)
+ thisStash = {prop:45};
+ return thisStash;
+ }
+}
+
+class foo extends base {
+ constructor() {
+ superArrow = (()=>super());
+ thisArrow = ()=>this;
+ }
+}
+
+// Populate the arrow function saves. Since we never invoke super(), we throw
+assertThrowsInstanceOf(()=>new foo(), ReferenceError);
+
+// No |this| binding in the closure, yet
+assertThrowsInstanceOf(thisArrow, ReferenceError);
+
+// call super()
+superArrow();
+
+// Can't call it twice
+assertThrowsInstanceOf(superArrow, ReferenceError);
+
+// Oh look, |this| is populated, now.
+assertEq(thisArrow(), thisStash);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");