summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Exceptions
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/tests/non262/Exceptions/browser.js0
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-002-n.js31
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-003-n.js35
-rw-r--r--js/src/tests/non262/Exceptions/error-expando-reconfigure.js28
-rw-r--r--js/src/tests/non262/Exceptions/error-property-enumerability.js30
-rw-r--r--js/src/tests/non262/Exceptions/errstack-001.js242
-rw-r--r--js/src/tests/non262/Exceptions/regress-121658.js121
-rw-r--r--js/src/tests/non262/Exceptions/regress-123002.js90
-rw-r--r--js/src/tests/non262/Exceptions/regress-181654.js118
-rw-r--r--js/src/tests/non262/Exceptions/regress-181914.js157
-rw-r--r--js/src/tests/non262/Exceptions/regress-257751.js92
-rw-r--r--js/src/tests/non262/Exceptions/regress-273931.js74
-rw-r--r--js/src/tests/non262/Exceptions/regress-332472.js25
-rw-r--r--js/src/tests/non262/Exceptions/regress-333728.js83
-rw-r--r--js/src/tests/non262/Exceptions/regress-342359.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-347674.js63
-rw-r--r--js/src/tests/non262/Exceptions/regress-350650-n.js28
-rw-r--r--js/src/tests/non262/Exceptions/regress-350837.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-58946.js33
-rw-r--r--js/src/tests/non262/Exceptions/regress-95101.js81
-rw-r--r--js/src/tests/non262/Exceptions/shell.js0
21 files changed, 1417 insertions, 0 deletions
diff --git a/js/src/tests/non262/Exceptions/browser.js b/js/src/tests/non262/Exceptions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/browser.js
diff --git a/js/src/tests/non262/Exceptions/catchguard-002-n.js b/js/src/tests/non262/Exceptions/catchguard-002-n.js
new file mode 100644
index 0000000000..fa574389db
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-002-n.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+DESCRIPTION = "var in catch clause should have caused an error.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard var declaration negative test.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (var e)
+ {
+ actual = e + '';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/catchguard-003-n.js b/js/src/tests/non262/Exceptions/catchguard-003-n.js
new file mode 100644
index 0000000000..a45b56adca
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-003-n.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+DESCRIPTION = "Illegally constructed catchguard should have thrown an exception.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard syntax negative test #2.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (e)
+ {
+ actual = e + ': 1';
+ }
+ catch (e) /* two non-guarded catch statements should generate an error */
+ {
+ actual = e + ': 2';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/error-expando-reconfigure.js b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
new file mode 100644
index 0000000000..c70ff5f853
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "error-expando-reconfigure.js"
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 961494;
+var summary =
+ "Reconfiguring the first expando property added to an Error object " +
+ "shouldn't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var err = new Error(); // no message argument => no err.message property
+err.expando = 17;
+Object.defineProperty(err, "expando", { configurable: false });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Exceptions/error-property-enumerability.js b/js/src/tests/non262/Exceptions/error-property-enumerability.js
new file mode 100644
index 0000000000..c6674cfc57
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-property-enumerability.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var errors = ["Error", "EvalError", "RangeError", "ReferenceError",
+ "SyntaxError", "TypeError", "URIError"];
+
+for (var i = 0; i < errors.length; i++) {
+ var error = this[errors[i]];
+
+ var desc = Object.getOwnPropertyDescriptor(error.prototype, "name");
+ assertEq(!!desc, true, errors[i] + ".prototype.name should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.name should not be enumerable");
+
+ desc = Object.getOwnPropertyDescriptor(error.prototype, "message");
+ assertEq(!!desc, true, errors[i] + ".prototype.message should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.message should not be enumerable");
+
+ var instance = new error;
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, false, "new " + errors[i] + ".message should not exist");
+
+ instance = new error("a message");
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, true, "new " + errors[i] + "(...).message should exist");
+ assertEq((desc || {}).enumerable, false, "new " + errors[i] + "(...).message should not be enumerable");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Exceptions/errstack-001.js b/js/src/tests/non262/Exceptions/errstack-001.js
new file mode 100644
index 0000000000..042e357fa6
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/errstack-001.js
@@ -0,0 +1,242 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 28 Feb 2002
+ * SUMMARY: Testing that Error.stack distinguishes between:
+ *
+ * A) top-level calls: myFunc();
+ * B) no-name function calls: function() { myFunc();} ()
+ *
+ * The stack frame for A) should begin with '@'
+ * The stack frame for B) should begin with '()'
+ *
+ * This behavior was coded by Brendan during his fix for bug 127136.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=127136#c13
+ *
+ * Note: our function getStackFrames(err) orders the array of stack frames
+ * so that the 0th element will correspond to the highest frame, i.e. will
+ * correspond to a line in top-level code. The 1st element will correspond
+ * to the function that is called first, and so on...
+ *
+ * NOTE: At present Rhino does not have an Error.stack property. It is an
+ * ECMA extension, see http://bugzilla.mozilla.org/show_bug.cgi?id=123177
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing Error.stack';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var myErr = '';
+var stackFrames = '';
+
+
+function A(x,y)
+{
+ return B(x+1,y+1);
+}
+
+function B(x,z)
+{
+ return C(x+1,z+1);
+}
+
+function C(x,y)
+{
+ return D(x+1,y+1);
+}
+
+function D(x,z)
+{
+ try
+ {
+ throw new Error('meep!');
+ }
+ catch (e)
+ {
+ return e;
+ }
+}
+
+
+myErr = A(44,13);
+stackFrames = getStackFrames(myErr);
+status = inSection(1);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(2);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(3);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(4);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(5);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';
+addThis();
+
+
+
+myErr = A('44:foo','13:bar');
+stackFrames = getStackFrames(myErr);
+status = inSection(6);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(7);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(8);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(9);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(10);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';;
+addThis();
+
+
+
+/*
+ * Make the first frame occur in a function with an empty name -
+ */
+myErr = function() { return A(44,13); } ();
+stackFrames = getStackFrames(myErr);
+status = inSection(11);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(12);
+actual = stackFrames[1].substring(0,7);
+expect = 'myErr<@';
+addThis();
+
+status = inSection(13);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make the first frame occur in a function with name 'anonymous' -
+ */
+var f = Function('return A(44,13);');
+myErr = f();
+stackFrames = getStackFrames(myErr);
+status = inSection(14);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(15);
+actual = stackFrames[1].substring(0,10);
+expect = 'anonymous@';
+addThis();
+
+status = inSection(16);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make a user-defined error via the Error() function -
+ */
+var message = 'Hi there!'; var fileName = 'file name'; var lineNumber = 0;
+myErr = Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(17);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+/*
+ * Now use the |new| keyword. Re-use the same params -
+ */
+myErr = new Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(18);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Split the string |err.stack| along its '\n' delimiter.
+ * As of 2002-02-28 |err.stack| ends with the delimiter, so
+ * the resulting array has an empty string as its last element.
+ *
+ * Pop that useless element off before doing anything.
+ * Then reverse the array, for convenience of indexing -
+ */
+function getStackFrames(err)
+{
+ var arr = err.stack.split('\n');
+ arr.pop();
+ return arr.reverse();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-121658.js b/js/src/tests/non262/Exceptions/regress-121658.js
new file mode 100644
index 0000000000..f2ab6e860f
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-121658.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 24 Jan 2002
+ * SUMMARY: "Too much recursion" errors should be safely caught by try...catch
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=121658
+ *
+ * In the cases below, we expect i>0. The bug was filed because we
+ * were getting i===0; i.e. |i| did not retain the value it had at the
+ * location of the error.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 121658;
+var msg = '"Too much recursion" errors should be safely caught by try...catch';
+var TEST_PASSED = 'i retained the value it had at location of error';
+var TEST_FAILED = 'i did NOT retain this value';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var i;
+
+
+function f()
+{
+ ++i;
+
+ // try...catch should catch the "too much recursion" error to ensue
+ try
+ {
+ f();
+ }
+ catch(e)
+ {
+ }
+}
+
+i=0;
+f();
+status = inSection(1);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in function scope -
+function g()
+{
+ f();
+}
+
+i=0;
+g();
+status = inSection(2);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in eval scope -
+var sEval = 'function h(){++i; try{h();} catch(e){}}; i=0; h();';
+eval(sEval);
+status = inSection(3);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Try in eval scope and mix functions up -
+sEval = 'function a(){++i; try{h();} catch(e){}}; i=0; a();';
+eval(sEval);
+status = inSection(4);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = formatThis(actual);
+ expectedvalues[UBound] = formatThis(expect);
+ UBound++;
+}
+
+
+function formatThis(bool)
+{
+ return bool? TEST_PASSED : TEST_FAILED;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(msg);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-123002.js b/js/src/tests/non262/Exceptions/regress-123002.js
new file mode 100644
index 0000000000..1639e6c65c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-123002.js
@@ -0,0 +1,90 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 01 Feb 2002
+ * SUMMARY: Testing Error.length
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123002
+ *
+ * NOTE: Error.length should equal the length of FormalParameterList of the
+ * Error constructor. This is currently 1 in Rhino, 3 in SpiderMonkey.
+ *
+ * The difference is due to http://bugzilla.mozilla.org/show_bug.cgi?id=50447.
+ * As a result of that bug, SpiderMonkey has extended ECMA to allow two new
+ * parameters to Error constructors:
+ *
+ * Rhino: new Error (message)
+ * SpiderMonkey: new Error (message, fileName, lineNumber)
+ *
+ * NOTE: since we have hard-coded the length expectations, this testcase will
+ * have to be changed if the Error FormalParameterList is ever changed again.
+ *
+ * To do this, just change the two LENGTH constants below -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 123002;
+var summary = 'Testing Error.length';
+var QUOTE = '"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var LENGTH_EXPECTED = 1;
+
+/*
+ * The various NativeError objects; see ECMA-262 Edition 3, Section 15.11.6
+ */
+var errObjects = [new Error(), new EvalError(), new RangeError(),
+ new ReferenceError(), new SyntaxError(), new TypeError(), new URIError()];
+
+
+for (var i in errObjects)
+{
+ var err = errObjects[i];
+ status = inSection(quoteThis(err.name));
+ actual = Error.length;
+ expect = LENGTH_EXPECTED;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function quoteThis(text)
+{
+ return QUOTE + text + QUOTE;
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181654.js b/js/src/tests/non262/Exceptions/regress-181654.js
new file mode 100644
index 0000000000..7ddc9b0217
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181654.js
@@ -0,0 +1,118 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 23 Nov 2002
+ * SUMMARY: Calling toString for an object derived from the Error class
+ * results in an TypeError (Rhino only)
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181654
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181654';
+var summary = 'Calling toString for an object derived from the Error class should be possible.';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// derive MyError from Error
+function MyError( msg )
+{
+ this.message = msg;
+}
+MyError.prototype = new Error();
+MyError.prototype.name = "MyError";
+
+
+status = inSection(1);
+var err1 = new MyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyError(String(err1));
+actual = examineThis(err2, err1);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = new MyError();
+actual = examineThis(err3, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = new MyError(EMPTY_STRING);
+actual = examineThis(err4, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+// now generate an error -
+status = inSection(5);
+try
+{
+ throw new MyError("thrown");
+}
+catch(err5)
+{
+ actual = examineThis(err5, "thrown");
+}
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Searches err.toString() for err.name + ':' + err.message,
+ * with possible whitespace on each side of the colon sign.
+ *
+ * We allow for no colon in case err.message was not provided by the user.
+ * In such a case, SpiderMonkey and Rhino currently set err.message = '',
+ * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case.
+ *
+ * If this is ever changed to a non-empty string, e.g. 'undefined',
+ * you may have to modify |pattern| to take that into account -
+ *
+ */
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181914.js b/js/src/tests/non262/Exceptions/regress-181914.js
new file mode 100644
index 0000000000..5f153a3912
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181914.js
@@ -0,0 +1,157 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 25 Nov 2002
+ * SUMMARY: Calling a user-defined superconstructor
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181914, esp. Comment 10.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181914';
+var summary = 'Calling a user-defined superconstructor';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// make a user-defined version of the Error constructor
+function _Error(msg)
+{
+ this.message = msg;
+}
+_Error.prototype = new Error();
+_Error.prototype.name = '_Error';
+
+
+// derive MyApplyError from _Error
+function MyApplyError(msg)
+{
+ if(this instanceof MyApplyError)
+ _Error.apply(this, arguments);
+ else
+ return new MyApplyError(msg);
+}
+MyApplyError.prototype = new _Error();
+MyApplyError.prototype.name = "MyApplyError";
+
+
+// derive MyCallError from _Error
+function MyCallError(msg)
+{
+ if(this instanceof MyCallError)
+ _Error.call(this, msg);
+ else
+ return new MyCallError(msg);
+}
+MyCallError.prototype = new _Error();
+MyCallError.prototype.name = "MyCallError";
+
+
+function otherScope(msg)
+{
+ return MyApplyError(msg);
+}
+
+
+status = inSection(1);
+var err1 = new MyApplyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyCallError('msg2');
+actual = examineThis(err2, 'msg2');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = MyApplyError('msg3');
+actual = examineThis(err3, 'msg3');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = MyCallError('msg4');
+actual = examineThis(err4, 'msg4');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(5);
+var err5 = otherScope('msg5');
+actual = examineThis(err5, 'msg5');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(6);
+var err6 = otherScope();
+actual = examineThis(err6, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(7);
+var err7 = eval("MyApplyError('msg7')");
+actual = examineThis(err7, 'msg7');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(8);
+var err8;
+try
+{
+ throw MyApplyError('msg8');
+}
+catch(e)
+{
+ if(e instanceof Error)
+ err8 = e;
+}
+actual = examineThis(err8, 'msg8');
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+// Searches |err.toString()| for |err.name + ':' + err.message|
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-257751.js b/js/src/tests/non262/Exceptions/regress-257751.js
new file mode 100644
index 0000000000..f95dedff49
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-257751.js
@@ -0,0 +1,92 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 257751;
+var summary = 'RegExp Syntax Errors should have lineNumber and fileName';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+var re;
+
+status = summary + ' ' + inSection(1) + ' RegExp("\\\\") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp('\\');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' RegExp(")") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp(')');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' /\\\\/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/\\/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(4) + ' /)/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/)/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-273931.js b/js/src/tests/non262/Exceptions/regress-273931.js
new file mode 100644
index 0000000000..000b5f3108
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-273931.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 273931;
+var summary = 'Pop scope chain in exception handling';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' ';
+try
+{
+ with ({foo:"bar"})
+ throw 42;
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' ';
+try
+{
+ with ({foo:"bar"})
+ eval("throw 42");
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' ';
+try
+{
+ var s = "throw 42";
+ with ({foo:"bar"})
+ eval(s);
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-332472.js b/js/src/tests/non262/Exceptions/regress-332472.js
new file mode 100644
index 0000000000..df17f2ebe9
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-332472.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 332472;
+var summary = 'new RegExp() ignores string boundaries when throwing exceptions';
+var actual = '';
+var expect = true;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str1 = "?asdf\nAnd you really shouldn't see this!";
+var str2 = str1.substr(0, 5);
+try {
+ new RegExp(str2);
+}
+catch(ex) {
+ printStatus(ex);
+ actual = ex instanceof SyntaxError;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-333728.js b/js/src/tests/non262/Exceptions/regress-333728.js
new file mode 100644
index 0000000000..bf6f4ea34d
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-333728.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333728;
+var summary = 'Throw ReferenceErrors for typeof(...undef)';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ actual = typeof (0, undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0, undef)');
+
+try
+{
+ actual = typeof (0 || undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0 || undef)');
+
+try
+{
+ actual = typeof (1 && undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (1 && undef)');
+
+/*
+ try
+ {
+ actual = typeof (0 ? 0 : undef);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (0 ? 0 : undef)');
+*/
+
+/*
+ try
+ {
+ actual = typeof (1 ? undef : 0);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (1 ? undef : 0)');
+*/
+
+try
+{
+ actual = typeof (!this ? 0 : undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (!this ? 0 : undef)');
diff --git a/js/src/tests/non262/Exceptions/regress-342359.js b/js/src/tests/non262/Exceptions/regress-342359.js
new file mode 100644
index 0000000000..af5e2647f5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-342359.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342359;
+var summary = 'Overriding ReferenceError should stick';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// work around bug 376957
+var SavedReferenceError = ReferenceError;
+
+try
+{
+ ReferenceError = 5;
+}
+catch(ex)
+{
+}
+
+try
+{
+ foo.blitz;
+}
+catch(ex)
+{
+}
+
+if (SavedReferenceError == ReferenceError)
+{
+ actual = expect = 'Test ignored due to bug 376957';
+}
+else
+{
+ expect = 5;
+ actual = ReferenceError;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-347674.js b/js/src/tests/non262/Exceptions/regress-347674.js
new file mode 100644
index 0000000000..63bc36616c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-347674.js
@@ -0,0 +1,63 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "347674";
+var summary = "ReferenceError thrown when accessing exception bound in a " +
+ "catch block in a try block within that catch block";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function foo()
+{
+ try
+ {
+ throw "32.9";
+ }
+ catch (e)
+ {
+ try
+ {
+ var errorCode = /^(\d+)\s+.*$/.exec(e)[1];
+ }
+ catch (e2)
+ {
+ void("*** internal error: e == " + e + ", e2 == " + e2);
+ throw e2;
+ }
+ }
+}
+
+try
+{
+ try
+ {
+ foo();
+ }
+ catch (ex)
+ {
+ if (!(ex instanceof TypeError))
+ throw "Wrong value thrown!\n" +
+ " expected: a TypeError ('32.9' doesn't match the regexp)\n" +
+ " actual: " + ex;
+ }
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-350650-n.js b/js/src/tests/non262/Exceptions/regress-350650-n.js
new file mode 100644
index 0000000000..fb457a6e07
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350650-n.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350650;
+var summary = 'js reports "uncaught exception';
+var actual = 'Error';
+var expect = 'Error';
+
+expectExitCode(3);
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exc() { this.toString = function() { return "EXC"; } }
+ throw new exc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-350837.js b/js/src/tests/non262/Exceptions/regress-350837.js
new file mode 100644
index 0000000000..66e721c3c5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350837.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350837;
+var summary = 'clear cx->throwing in finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'F';
+
+ function f()
+ {
+ actual = "F";
+ }
+
+ try
+ {
+ try {
+ throw 1;
+ } finally {
+ f.call(this);
+ }
+ }
+ catch(ex)
+ {
+ reportCompare(1, ex, summary);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-58946.js b/js/src/tests/non262/Exceptions/regress-58946.js
new file mode 100644
index 0000000000..d869c4a126
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-58946.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-------------------------------------------------------------------------------------------------
+var BUGNUMBER = '58946';
+var stat = 'Testing a return statement inside a catch statement inside a function';
+
+test();
+
+function test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (stat);
+
+ expect = 'PASS';
+
+ function f()
+ {
+ try
+ {
+ throw 'PASS';
+ }
+ catch(e)
+ {
+ return e;
+ }
+ }
+
+ actual = f();
+
+ reportCompare(expect, actual, stat);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-95101.js b/js/src/tests/non262/Exceptions/regress-95101.js
new file mode 100644
index 0000000000..372fb09428
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-95101.js
@@ -0,0 +1,81 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 13 August 2001
+ *
+ * SUMMARY: Invoking an undefined function should produce a ReferenceError
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=95101
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 95101;
+var summary = 'Invoking an undefined function should produce a ReferenceError';
+var msgERR_REF_YES = 'ReferenceError';
+var msgERR_REF_NO = 'did NOT generate a ReferenceError';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+try
+{
+ xxxyyyzzz();
+}
+catch (e)
+{
+ status = 'Section 1 of test';
+ actual = e instanceof ReferenceError;
+ expect = true;
+ addThis();
+
+
+ /*
+ * This test is more literal, and may one day be invalid.
+ * Searching for literal string "ReferenceError" in e.toString()
+ */
+ status = 'Section 2 of test';
+ var match = e.toString().search(/ReferenceError/);
+ actual = (match > -1);
+ expect = true;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isReferenceError(actual);
+ expectedvalues[UBound] = isReferenceError(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+// converts a Boolean result into a textual result -
+function isReferenceError(bResult)
+{
+ return bResult? msgERR_REF_YES : msgERR_REF_NO;
+}
diff --git a/js/src/tests/non262/Exceptions/shell.js b/js/src/tests/non262/Exceptions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/shell.js