summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/extensions/destructuring-order.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/tests/non262/extensions/destructuring-order.js150
1 files changed, 150 insertions, 0 deletions
diff --git a/js/src/tests/non262/extensions/destructuring-order.js b/js/src/tests/non262/extensions/destructuring-order.js
new file mode 100644
index 0000000000..b1567e6a07
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-order.js
@@ -0,0 +1,150 @@
+/* -*- 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 summary = "Order of destructuring, destructuring in the presence of " +
+ "exceptions";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+
+var a = "FAILED", b = "PASSED";
+
+function exceptObj()
+{
+ return { get b() { throw "PASSED"; }, a: "PASSED" };
+}
+
+function partialEvalObj()
+{
+ try
+ {
+ ({a:a, b:b} = exceptObj());
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var c = "FAILED", d = "FAILED", e = "PASSED", f = "PASSED";
+
+function exceptArr()
+{
+ return ["PASSED", {e: "PASSED", get f() { throw "PASSED"; }}, "FAILED"];
+}
+
+function partialEvalArr()
+{
+ try
+ {
+ [c, {e: d, f: e}, f] = exceptArr();
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var g = "FAILED", h = "FAILED", i = "FAILED", j = "FAILED", k = "FAILED";
+var _g = "PASSED", _h = "FAILED", _i = "FAILED", _j = "FAILED", _k = "FAILED";
+var order = [];
+
+function objWithGetters()
+{
+ return {
+ get j()
+ {
+ var rv = _j;
+ _g = _h = _i = _j = "FAILED";
+ _k = "PASSED";
+ order.push("j");
+ return rv;
+ },
+ get g()
+ {
+ var rv = _g;
+ _g = _i = _j = _k = "FAILED";
+ _h = "PASSED";
+ order.push("g");
+ return rv;
+ },
+ get i()
+ {
+ var rv = _i;
+ _g = _h = _i = _k = "FAILED";
+ _j = "PASSED";
+ order.push("i");
+ return rv;
+ },
+ get k()
+ {
+ var rv = _k;
+ _g = _h = _i = _j = _k = "FAILED";
+ order.push("k");
+ return rv;
+ },
+ get h()
+ {
+ var rv = _h;
+ _g = _h = _j = _k = "FAILED";
+ _i = "PASSED";
+ order.push("h");
+ return rv;
+ }
+ };
+}
+
+function partialEvalObj2()
+{
+ ({g: g, h: h, i: i, j: j, k: k} = objWithGetters());
+}
+
+try
+{
+ partialEvalObj();
+ if (a !== "PASSED" || b !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "a == " + a + ", b == " + b;
+
+ partialEvalObj2();
+ if (g !== "PASSED" ||
+ h !== "PASSED" ||
+ i !== "PASSED" ||
+ j !== "PASSED" ||
+ k !== "PASSED")
+ throw "FAILED: order of property accesses wrong!\n" +
+ "order == " + order;
+
+ partialEvalArr();
+ if (c !== "PASSED" || d !== "PASSED" || e !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "c == " + c +
+ ", d == " + d +
+ ", e == " + e +
+ ", f == " + f ;
+}
+catch (ex)
+{
+ failed = ex;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);