diff options
Diffstat (limited to 'js/src/tests/js1_8/regress/regress-384412.js')
-rw-r--r-- | js/src/tests/js1_8/regress/regress-384412.js | 98 |
1 files changed, 98 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 000000000..55cbdf9c0 --- /dev/null +++ b/js/src/tests/js1_8/regress/regress-384412.js @@ -0,0 +1,98 @@ +// |reftest| skip-if(!xulRuntime.shell) +/* -*- 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 = 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); + + +/* + * 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); + + print("End of Tests"); + +/* + * Utility functions + */ + function expect(a, b) { + print('expect: ' + a + ', actual: ' + b); + reportCompare(a, b, summary); + } + + + exitFunc ('test'); +} |