summaryrefslogtreecommitdiff
path: root/js/src/tests/js1_8/regress/regress-384412.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/js1_8/regress/regress-384412.js')
-rw-r--r--js/src/tests/js1_8/regress/regress-384412.js230
1 files changed, 230 insertions, 0 deletions
diff --git a/js/src/tests/js1_8/regress/regress-384412.js b/js/src/tests/js1_8/regress/regress-384412.js
new file mode 100644
index 0000000..a7c90a0
--- /dev/null
+++ b/js/src/tests/js1_8/regress/regress-384412.js
@@ -0,0 +1,230 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is JavaScript Engine testing utilities.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Joachim Kuebart
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 384412;
+var summary = 'Exercise frame handling code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+/*
+ * Generators
+ */
+
+/* Generator yields properly */
+ f = (function(n) { for (var i = 0; i != n; i++) yield i });
+ g = f(3);
+ expect(0, g.next());
+ expect(1, g.next());
+ expect(2, g.next());
+ s = "no exception";
+ try { g.next(); } catch (e) { s = e + ""; }
+ expect("[object StopIteration]", s);
+
+/* Generator yields properly in finally */
+ f = (function(n) {
+ try {
+ for (var i = 0; i != n; i++)
+ yield i;
+ } finally {
+ yield "finally";
+ }
+ });
+
+ g = f(3);
+ expect(0, g.next());
+ expect(1, g.next());
+ expect(2, g.next());
+ expect("finally", g.next());
+
+/* Generator throws when closed with yield in finally */
+ g = f(3);
+ expect(0, g.next());
+ s = "no exception";
+ try { g.close(); } catch (e) { s = e + ""; };
+ expect("TypeError: yield from closing generator " + f.toSource(), s);
+
+
+/*
+ * XML predicates
+ */
+ t = <xml><eins><name>ich</name></eins><eins><name>joki</name></eins></xml>;
+
+/* Predicates, nested predicates and empty lists */
+ expect(<eins><name>joki</name></eins>, t.eins.(name == "joki"));
+ expect(t.eins, t.eins.(t.eins.(true)));
+ expect(t.(false), t.eins.(false).(true));
+
+/* Predicate with yield throws */
+ f = (function() { t.eins.(yield true); });
+ g = f();
+ s = "no exception";
+ try { g.next(); } catch (e) { s = e + ""; }
+ expect("no exception", s);
+
+/* Function with predicate without return returns void */
+ f = (function() { t.eins.(true); });
+ expect(undefined, f());
+
+/* XML filter predicate in finally preserves return value */
+ f = (function() {
+ try {
+ return "hallo";
+ } finally {
+ t.eins.(true);
+ }
+ });
+ expect("hallo", f());
+
+
+/*
+ * Calls that have been replaced with js_PushFrame() &c...
+ */
+ f = (function() { return arguments[(arguments.length - 1) / 2]; });
+ expect(2, f(1, 2, 3));
+ expect(2, f.call(null, 1, 2, 3));
+ expect(2, f.apply(null, [1, 2, 3]));
+ expect("a1c", "abc".replace("b", f));
+ s = "no exception";
+ try {
+ "abc".replace("b", (function() { throw "hello" }));
+ } catch (e) {
+ s = e + "";
+ }
+ expect("hello", s);
+ expect(6, [1, 2, 3].reduce(function(a, b) { return a + b; }));
+ s = "no exception";
+ try {
+ [1, 2, 3].reduce(function(a, b) { if (b == 2) throw "hello"; });
+ } catch (e) {
+ s = e + "";
+ }
+ expect("hello", s);
+
+/*
+ * __noSuchMethod__
+ */
+ o = {};
+ s = "no exception";
+ try {
+ o.hello();
+ } catch (e) {
+ s = e + "";
+ }
+ expect("TypeError: o.hello is not a function", s);
+ o.__noSuchMethod__ = (function() { return "world"; });
+ expect("world", o.hello());
+ o.__noSuchMethod__ = 1;
+ s = "no exception";
+ try {
+ o.hello();
+ } catch (e) {
+ s = e + "";
+ }
+ expect("TypeError: o.hello is not a function", s);
+ o.__noSuchMethod__ = {};
+ s = "no exception";
+ try {
+ o.hello();
+ } catch (e) {
+ s = e + "";
+ }
+ expect("TypeError: o.hello() is not a function", s);
+ s = "no exception";
+ try {
+ eval("o.hello()");
+ } catch (e) {
+ s = e + "";
+ }
+ expect("TypeError: o.hello() is not a function", s);
+ s = "no exception";
+ try { [2, 3, 0].sort({}); } catch (e) { s = e + ""; }
+ expect("TypeError: [2, 3, 0].sort({}) is not a function", s);
+
+/*
+ * Generator expressions.
+ */
+ String.prototype.__iterator__ = (function () {
+ /*
+ * NOTE:
+ * Without the "0 + ", the loop over <x/> does not terminate because
+ * the iterator gets run on a string with an empty length property.
+ */
+ for (let i = 0; i != 0 + this.length; i++)
+ yield this[i];
+ });
+ expect(["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"] + "",
+ ([a + b for (a in 'abc') for (b in '123')]) + "");
+ expect("", ([x for (x in <x/>)]) + "");
+
+/*
+ * Version switching
+ */
+ if (typeof version == 'function')
+ {
+ var v = version(150);
+ f = new Function("return version(arguments[0])");
+ revertVersion();
+ expect(150, f());
+ expect(150, eval("f()"));
+ expect(0, eval("f(0); f()"));
+ revertVersion();
+ }
+ print("End of Tests");
+
+/*
+ * Utility functions
+ */
+ function expect(a, b) {
+ print('expect: ' + a + ', actual: ' + b);
+ reportCompare(a, b, summary);
+ }
+
+
+ exitFunc ('test');
+}