summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/regress/regress-104077.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/regress/regress-104077.js')
-rw-r--r--js/src/tests/non262/regress/regress-104077.js470
1 files changed, 470 insertions, 0 deletions
diff --git a/js/src/tests/non262/regress/regress-104077.js b/js/src/tests/non262/regress/regress-104077.js
new file mode 100644
index 0000000000..703f516407
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-104077.js
@@ -0,0 +1,470 @@
+/* -*- 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: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues(obj)
+{
+ var sum;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(1);
+var obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+actual = addValues(obj);
+expect = 3;
+captureThis();
+
+
+
+function tryThis()
+{
+ var sum = 4 ;
+ var i = 0;
+
+ while (sum < 10)
+ {
+ try
+ {
+ sum += 1;
+ i += 1;
+ }
+ finally
+ {
+ print("In finally case of tryThis() function");
+ }
+ }
+ return i;
+}
+
+status = inSection(2);
+actual = tryThis();
+expect = 6;
+captureThis();
+
+
+
+function myTest(x)
+{
+ var obj = new Object();
+ var msg;
+
+ with (obj)
+ {
+ msg = (x != null) ? "NO" : "YES";
+ print("Is the provided argument to myTest() null? : " + msg);
+
+ try
+ {
+ throw "ZZZ";
+ }
+ catch(e)
+ {
+ print("Caught thrown exception = " + e);
+ }
+ }
+
+ return 1;
+}
+
+status = inSection(3);
+actual = myTest(null);
+expect = 1;
+captureThis();
+
+
+
+function addValues_2(obj)
+{
+ var sum = 0;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch(e)
+ {
+ print('Caught an exception in addValues_2() function: ' + e);
+ }
+ }
+ }
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(4);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_2(obj);
+expect = 6;
+captureThis();
+
+
+
+status = inSection(5);
+try
+{
+ throw new A();
+}
+catch(e)
+{
+}
+finally
+{
+ try
+ {
+ throw new A();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ actual = 'a';
+ }
+ actual = 'b';
+}
+expect = 'b';
+captureThis();
+
+
+
+
+function testfunc(mode)
+{
+ var obj = new Object();
+ with (obj)
+ {
+ var num = 100;
+ var str = "abc" ;
+
+ if (str == null)
+ {
+ try
+ {
+ throw "authentication.0";
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ else
+ {
+ try
+ {
+ if (mode == 0)
+ throw "authentication.0";
+ else
+ mytest();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ }
+}
+
+status = inSection(6);
+actual = testfunc(0);
+expect = 100;
+captureThis();
+
+status = inSection(7);
+actual = testfunc();
+expect = 100;
+captureThis();
+
+
+
+
+function entry_menu()
+{
+ var document = new Object();
+ var dialog = new Object();
+ var num = 100;
+
+ with (document)
+ {
+ with (dialog)
+ {
+ try
+ {
+ while (true)
+ {
+ return num;
+ }
+ }
+ finally
+ {
+ }
+ }
+ }
+}
+
+status = inSection(8);
+actual = entry_menu();
+expect = 100;
+captureThis();
+
+
+
+
+function addValues_5(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_5() function: sum = " + sum);
+ }
+ catch (e)
+ {
+ sum += 1;
+ print("In finally catch block of addValues_5() function: sum = " + sum + ", e = " + e);
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_5() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(11);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_5(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function testObj(obj)
+{
+ var x = 42;
+
+ try
+ {
+ with (obj)
+ {
+ if (obj.p)
+ throw obj.p;
+ x = obj.q;
+ }
+ }
+ finally
+ {
+ print("in finally block of testObj() function");
+ return 999;
+ }
+}
+
+status = inSection(12);
+obj = {p:43};
+actual = testObj(obj);
+expect = 999;
+captureThis();
+
+
+
+/*
+ * Next two cases are from http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ */
+function a120571()
+{
+ while(0)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash! Test to see that it doesn't now.
+print(a120571);
+
+// Now test that we have a non-null value for a120571.toString()
+status = inSection(13);
+try
+{
+ actual = a120571.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+function b()
+{
+ for(;;)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash!!! Test to see that it doesn't now.
+print(b);
+
+// Now test that we have a non-null value for b.toString()
+status = inSection(14);
+try
+{
+ actual = b.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ 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]);
+ }
+}