summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_6/Class/uninitializedThisError.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/ecma_6/Class/uninitializedThisError.js')
-rw-r--r--js/src/tests/ecma_6/Class/uninitializedThisError.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/js/src/tests/ecma_6/Class/uninitializedThisError.js b/js/src/tests/ecma_6/Class/uninitializedThisError.js
new file mode 100644
index 000000000..cbc557285
--- /dev/null
+++ b/js/src/tests/ecma_6/Class/uninitializedThisError.js
@@ -0,0 +1,57 @@
+function checkErr(f, className) {
+ var expected;
+ if (className !== "")
+ expected = "|this| used uninitialized in " + className + " class constructor";
+ else
+ expected = "|this| used uninitialized in arrow function in class constructor";
+ try {
+ f();
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq(e.name, "ReferenceError");
+ assertEq(e.message, expected);
+ }
+}
+class TestNormal extends class {} {
+ constructor() { this; }
+}
+checkErr(() => new TestNormal(), "TestNormal");
+
+class TestEval extends class {} {
+ constructor() { eval("this") }
+}
+checkErr(() => new TestEval(), "TestEval");
+
+class TestNestedEval extends class {} {
+ constructor() { eval("eval('this')") }
+}
+checkErr(() => new TestNestedEval(), "TestNestedEval");
+
+checkErr(() => {
+ new class extends class {} {
+ constructor() { eval("this") }
+ }
+}, "anonymous");
+
+class TestArrow extends class {} {
+ constructor() { (() => this)(); }
+}
+checkErr(() => new TestArrow(), "");
+
+class TestArrowEval extends class {} {
+ constructor() { (() => eval("this"))(); }
+}
+checkErr(() => new TestArrowEval(), "");
+
+class TestEvalArrow extends class {} {
+ constructor() { eval("(() => this)()"); }
+}
+checkErr(() => new TestEvalArrow(), "");
+
+class TestTypeOf extends class {} {
+ constructor() { eval("typeof this"); }
+}
+checkErr(() => new TestTypeOf(), "TestTypeOf");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);