diff options
Diffstat (limited to 'js/src/tests/js1_8_1')
116 files changed, 5372 insertions, 0 deletions
diff --git a/js/src/tests/js1_8_1/JSON/browser.js b/js/src/tests/js1_8_1/JSON/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/JSON/browser.js diff --git a/js/src/tests/js1_8_1/JSON/regress-458959.js b/js/src/tests/js1_8_1/JSON/regress-458959.js new file mode 100644 index 000000000..04c606c5b --- /dev/null +++ b/js/src/tests/js1_8_1/JSON/regress-458959.js @@ -0,0 +1,32 @@ +/* -*- 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 = 458959; +var summary = 'this.JSON should not be enumerable'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (var i in this) + { + if (i.toString() == 'JSON') + actual = i; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/JSON/regress-459293.js b/js/src/tests/js1_8_1/JSON/regress-459293.js new file mode 100644 index 000000000..fbd46589c --- /dev/null +++ b/js/src/tests/js1_8_1/JSON/regress-459293.js @@ -0,0 +1,25 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Robert Sayre + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 459293; +var summary = 'Allow redeclaration of JSON'; +var actual = ''; +var expect = ''; + + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + eval('var JSON = "foo";'); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); diff --git a/js/src/tests/js1_8_1/JSON/shell.js b/js/src/tests/js1_8_1/JSON/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/JSON/shell.js diff --git a/js/src/tests/js1_8_1/README b/js/src/tests/js1_8_1/README new file mode 100644 index 000000000..d0b5fc6ee --- /dev/null +++ b/js/src/tests/js1_8_1/README @@ -0,0 +1 @@ +JavaScript 1.8.1 diff --git a/js/src/tests/js1_8_1/String/browser.js b/js/src/tests/js1_8_1/String/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/String/browser.js diff --git a/js/src/tests/js1_8_1/String/regress-305064.js b/js/src/tests/js1_8_1/String/regress-305064.js new file mode 100644 index 000000000..c3e45e43c --- /dev/null +++ b/js/src/tests/js1_8_1/String/regress-305064.js @@ -0,0 +1,144 @@ +// |reftest| fails +/* -*- 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 = 305064; +var summary = 'Tests the trim, trimRight and trimLeft methods'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var trimMethods = ['trim', 'trimLeft', 'trimRight']; + +/** List from ES 3.1 Recommendation for String.trim (bug 305064) **/ +var whitespace = [ + {s : '\u0009', t : 'HORIZONTAL TAB'}, + {s : '\u000B', t : 'VERTICAL TAB'}, + {s : '\u000C', t : 'FORMFEED'}, + {s : '\u0020', t : 'SPACE'}, + {s : '\u00A0', t : 'NO-BREAK SPACE'}, + {s : '\u1680', t : 'OGHAM SPACE MARK'}, + {s : '\u180E', t : 'MONGOLIAN VOWEL SEPARATOR'}, + {s : '\u2000', t : 'EN QUAD'}, + {s : '\u2001', t : 'EM QUAD'}, + {s : '\u2002', t : 'EN SPACE'}, + {s : '\u2003', t : 'EM SPACE'}, + {s : '\u2004', t : 'THREE-PER-EM SPACE'}, + {s : '\u2005', t : 'FOUR-PER-EM SPACE'}, + {s : '\u2006', t : 'SIX-PER-EM SPACE'}, + {s : '\u2007', t : 'FIGURE SPACE'}, + {s : '\u2008', t : 'PUNCTUATION SPACE'}, + {s : '\u2009', t : 'THIN SPACE'}, + {s : '\u200A', t : 'HAIR SPACE'}, + {s : '\u202F', t : 'NARROW NO-BREAK SPACE'}, + {s : '\u205F', t : 'MEDIUM MATHEMATICAL SPACE'}, + {s : '\u3000', t : 'IDEOGRAPHIC SPACE'}, + {s : '\u000A', t : 'LINE FEED OR NEW LINE'}, + {s : '\u000D', t : 'CARRIAGE RETURN'}, + {s : '\u2028', t : 'LINE SEPARATOR'}, + {s : '\u2029', t : 'PARAGRAPH SEPARATOR'}, + {s : '\u200B', t : 'ZERO WIDTH SPACE (category Cf)'} + ]; + +for (var j = 0; j < trimMethods.length; ++j) +{ + var str; + + var method = trimMethods[j]; + + if (typeof String.prototype[method] == 'undefined') + { + reportCompare(true, true, 'Test skipped. String.prototype.' + method + ' is not supported'); + continue; + } + + print('Test empty string.'); + str = ''; + expected = ''; + actual = str[method](); + reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()'); + + print('Test string with no whitespace.'); + str = 'a'; + expected = 'a'; + actual = str[method](); + reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()'); + + for (var i = 0; i < whitespace.length; ++i) + { + var v = whitespace[i].s; + var t = whitespace[i].t; + v = v + v + v; + + print('======================================='); + print('Test ' + method + ' with with only whitespace. : ' + t); + str = v; + expected = ''; + actual = str[method](); + reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()'); + + print('Test ' + method + ' with with no leading or trailing whitespace. : ' + t); + str = 'a' + v + 'b'; + expected = str; + actual = str[method](); + reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()'); + + print('Test ' + method + ' with with leading whitespace. : ' + t); + str = v + 'a'; + switch(method) + { + case 'trim': + expected = 'a'; + break; + case 'trimLeft': + expected = 'a'; + break; + case 'trimRight': + expected = str; + break; + } + actual = str[method](); + reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()'); + + print('Test ' + method + ' with with trailing whitespace. : ' + t); + str = 'a' + v; + switch(method) + { + case 'trim': + expected = 'a'; + break; + case 'trimLeft': + expected = str; + break; + case 'trimRight': + expected = 'a'; + break; + } + actual = str[method](); + reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()'); + + print('Test ' + method + ' with with leading and trailing whitepace.'); + str = v + 'a' + v; + switch(method) + { + case 'trim': + expected = 'a'; + break; + case 'trimLeft': + expected = 'a' + v; + break; + case 'trimRight': + expected = v + 'a'; + break; + } + actual = str[method](); + reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()'); + + } +} + diff --git a/js/src/tests/js1_8_1/String/shell.js b/js/src/tests/js1_8_1/String/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/String/shell.js diff --git a/js/src/tests/js1_8_1/browser.js b/js/src/tests/js1_8_1/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/browser.js diff --git a/js/src/tests/js1_8_1/extensions/browser.js b/js/src/tests/js1_8_1/extensions/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/browser.js diff --git a/js/src/tests/js1_8_1/extensions/new-parenthesization.js b/js/src/tests/js1_8_1/extensions/new-parenthesization.js new file mode 100644 index 000000000..a3aebf383 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/new-parenthesization.js @@ -0,0 +1,21 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jesse Ruderman + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 521456; +var summary = + 'Incorrect decompilation of new (eval(v)).s and new (f.apply(2)).s'; +printBugNumber(BUGNUMBER); +printStatus(summary); + +function foo(c) { return new (eval(c)).s; } +function bar(f) { var a = new (f.apply(2).s); return a; } + +assertEq(bar.toString().search(/new\s+f/), -1); +assertEq(foo.toString().search(/new\s+eval/), -1); + +reportCompare(true, true); diff --git a/js/src/tests/js1_8_1/extensions/regress-353214-02.js b/js/src/tests/js1_8_1/extensions/regress-353214-02.js new file mode 100644 index 000000000..13a8f246d --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-353214-02.js @@ -0,0 +1,30 @@ +/* -*- 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 = 353214; +var summary = 'bug 353214'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var f = function ([x]) { let y; } + expect = 'function ([x]) { let y; }'; + actual = f + ''; + + compareSource(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-437288-01.js b/js/src/tests/js1_8_1/extensions/regress-437288-01.js new file mode 100644 index 000000000..d9813c34f --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-437288-01.js @@ -0,0 +1,35 @@ +/* -*- 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 = 437288; +var summary = 'for loop turning into a while loop'; +var actual = 'No Hang'; +var expect = 'No Hang'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + eval('(function() { const x = 1; for (x in null); })();'); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-452498-162.js b/js/src/tests/js1_8_1/extensions/regress-452498-162.js new file mode 100644 index 000000000..543c9a1b0 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-452498-162.js @@ -0,0 +1,24 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #162 From Gary Kwong + +printBugNumber(BUGNUMBER); +printStatus (summary); + +// Assertion failure: !OBJ_GET_CLASS(cx, proto)->getObjectOps, at ../jsobj.cpp:2030 + +this.__defineGetter__("x3", Function); +parseInt = x3; +parseInt.prototype = []; +for (var z = 0; z < 4; ++z) { new parseInt() } + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/js1_8_1/extensions/regress-452498-193.js b/js/src/tests/js1_8_1/extensions/regress-452498-193.js new file mode 100644 index 000000000..1397bf4bb --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-452498-193.js @@ -0,0 +1,34 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #193 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// Assertion failure: afunbox->parent, at ../jsparse.cpp:1912 + + this.x = undefined; + this.watch("x", Function); + NaN = uneval({ get \u3056 (){ return undefined } }); + x+=NaN; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-452498-196.js b/js/src/tests/js1_8_1/extensions/regress-452498-196.js new file mode 100644 index 000000000..69d5a3586 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-452498-196.js @@ -0,0 +1,44 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #196 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// Assertion failure: localKind == JSLOCAL_VAR || localKind == JSLOCAL_CONST, at ../jsfun.cpp:916 + + this.x = undefined; + this.watch("x", Function); + NaN = uneval({ get \u3056 (){ return undefined } }); + x+=NaN; + + reportCompare(expect, actual, summary + ': 1'); + +// Assertion failure: lexdep->isLet(), at ../jsparse.cpp:1900 + + (function (){ + var x; + eval("var x; (function ()x)"); + } + )(); + + reportCompare(expect, actual, summary + ': 2'); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-466905-04.js b/js/src/tests/js1_8_1/extensions/regress-466905-04.js new file mode 100644 index 000000000..95f9e2aef --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-466905-04.js @@ -0,0 +1,49 @@ +/* -*- 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 = 466905; +var summary = 'Prototypes of sandboxed arrays'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof evalcx != 'function') + { + expect = actual = 'Test skipped: requires evalcx support'; + } + else + { + expect = true; + + function createArray() + { + var a; + for (var i = 0; i < 10; i++) + a = [1, 2, 3, 4, 5]; + return a; + } + + var sandbox = evalcx("lazy"); + sandbox.createArray = createArray; + var p1 = Object.getPrototypeOf(createArray()); + var p2 = Object.getPrototypeOf(evalcx("createArray()", sandbox)); + print(actual = (p1 === p2)); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-466905-05.js b/js/src/tests/js1_8_1/extensions/regress-466905-05.js new file mode 100644 index 000000000..c1da83dba --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-466905-05.js @@ -0,0 +1,45 @@ +// |reftest| skip -- no-op in browser, fails in shell - see bug 554793 +/* -*- 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 = 466905; +var summary = 'Sandbox shapes'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof evalcx != 'function') + { + expect = actual = 'Test skipped: requires evalcx support'; + } + else if (typeof shapeOf != 'function') + { + expect = actual = 'Test skipped: requires shapeOf support'; + } + else + { + + var s1 = evalcx('lazy'); + var s2 = evalcx('lazy'); + + expect = shapeOf(s1); + actual = shapeOf(s2); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-477158.js b/js/src/tests/js1_8_1/extensions/regress-477158.js new file mode 100644 index 000000000..9ff3591e6 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-477158.js @@ -0,0 +1,31 @@ +/* -*- 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 = 477158; +var summary = 'Do not assert: v == JSVAL_TRUE || v == JSVAL_FALSE'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + + x = 0; + x = x.prop; + for each (let [] in ['', '']) { switch(x) { default: (function(){}); } }; + + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-477187.js b/js/src/tests/js1_8_1/extensions/regress-477187.js new file mode 100644 index 000000000..76b2d1954 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-477187.js @@ -0,0 +1,41 @@ +// |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 = 477187; +var summary = 'timeout script'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof window != 'undefined' || typeof timeout != 'function') + { + print(expect = actual = 'Test skipped due to lack of timeout function'); + reportCompare(expect, actual, summary); + } + else + { + expectExitCode(6); + timeout(0.01); + // Call reportCompare early here to get a result. The test will fail if + // the timeout doesn't work and the test framework is forced to terminate + // the test. + reportCompare(expect, actual, summary); + + while(1); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/regress-520572.js b/js/src/tests/js1_8_1/extensions/regress-520572.js new file mode 100644 index 000000000..97f00029a --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/regress-520572.js @@ -0,0 +1,41 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Blake Kaplan + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 520572; +var summary = 'watch should innerize the object being watched'; +var actual = 0; +var expect = 2; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if ("evalcx" in this) { + // shell + let s = evalcx("lazy"); + s.n = 0; + evalcx('this.watch("x", function(){ n++; }); this.x = 4; x = 6', s); + actual = s.n; + reportCompare(expect, actual, summary); + } else { + // browser + this.watch('x', function(){ actual++; }); + this.x = 4; + x = 6; + reportCompare(expect, actual, summary); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/extensions/shell.js b/js/src/tests/js1_8_1/extensions/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/shell.js diff --git a/js/src/tests/js1_8_1/extensions/strict-warning.js b/js/src/tests/js1_8_1/extensions/strict-warning.js new file mode 100644 index 000000000..b5a37ea70 --- /dev/null +++ b/js/src/tests/js1_8_1/extensions/strict-warning.js @@ -0,0 +1,32 @@ +// Turn on strict mode and warnings-as-errors mode. +if (options().split().indexOf('strict') == -1) + options('strict'); +if (options().split().indexOf('werror') == -1) + options('werror'); + +function expectSyntaxError(stmt) { + print(stmt); + var result = 'no error'; + try { + Function(stmt); + } catch (exc) { + result = exc.constructor.name; + } + assertEq(result, 'SyntaxError'); +} + +function test(expr) { + // Without extra parentheses, expect an error. + expectSyntaxError('if (' + expr + ') {};'); + + // Extra parentheses silence the warning/error. + Function('if ((' + expr + ')) {};'); +} + +// Overparenthesized assignment in a condition should not be a strict error. +test('a = 0'); +test('a = (f(), g)'); +test('a = b || c > d'); +expectSyntaxError('if (a == 0);'); +reportCompare('passed', 'passed', 'Overparenthesized assignment in a condition should not be a strict error.'); + diff --git a/js/src/tests/js1_8_1/jit/browser.js b/js/src/tests/js1_8_1/jit/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/jit/browser.js diff --git a/js/src/tests/js1_8_1/jit/math-jit-tests.js b/js/src/tests/js1_8_1/jit/math-jit-tests.js new file mode 100644 index 000000000..ac8e4b510 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/math-jit-tests.js @@ -0,0 +1,687 @@ +/* -*- 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 = 'none'; +var summary = 'trace-capability math mini-testsuite'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +/** + * A number of the tests in this file depend on the setting of + * HOTLOOP. Define some constants up front, so they're easy to grep + * for. + */ +// The HOTLOOP constant we depend on; only readable from our stats +// object in debug builds. +const haveTracemonkey = !!(this.tracemonkey) +const HOTLOOP = haveTracemonkey ? tracemonkey.HOTLOOP : 2; + +var testName = null; +if ("arguments" in this && arguments.length > 0) + testName = arguments[0]; +var fails = [], passes=[]; + +function jitstatHandler(f) +{ + if (!haveTracemonkey) + return; + + // XXXbz this is a nasty hack, but I can't figure out a way to + // just use jitstats.tbl here + f("recorderStarted"); + f("recorderAborted"); + f("traceCompleted"); + f("sideExitIntoInterpreter"); + f("typeMapMismatchAtEntry"); + f("returnToDifferentLoopHeader"); + f("traceTriggered"); + f("globalShapeMismatchAtEntry"); + f("treesTrashed"); + f("slotPromoted"); + f("unstableLoopVariable"); + f("noCompatInnerTrees"); + f("breakLoopExits"); + f("returnLoopExits"); +} + +function test(f) +{ + if (!testName || testName == f.name) { + // Collect our jit stats + var localJITstats = {}; + jitstatHandler(function(prop, local, global) { + localJITstats[prop] = tracemonkey[prop]; + }); + check(f.name, f(), f.expected, localJITstats, f.jitstats); + } +} + +function map_test(t, cases) +{ + for (var i = 0; i < cases.length; i++) { + function c() { return t(cases[i].input); } + c.expected = cases[i].expected; + c.name = t.name + "(" + uneval(cases[i].input) + ")"; + test(c); + } +} + +// Use this function to compare expected and actual test results. +// Types must match. +// For numbers, treat NaN as matching NaN, distinguish 0 and -0, and +// tolerate a certain degree of error for other values. +// +// These are the same criteria used by the tests in js/tests, except that +// we distinguish 0 and -0. +function close_enough(expected, actual) +{ + if (typeof expected != typeof actual) + return false; + if (typeof expected != 'number') + return actual == expected; + + // Distinguish NaN from other values. Using x != x comparisons here + // works even if tests redefine isNaN. + if (actual != actual) + return expected != expected + if (expected != expected) + return false; + + // Tolerate a certain degree of error. + if (actual != expected) + return Math.abs(actual - expected) <= 1E-10; + + // Distinguish 0 and -0. + if (actual == 0) + return (1 / actual > 0) == (1 / expected > 0); + + return true; +} + +function check(desc, actual, expected, oldJITstats, expectedJITstats) +{ + var pass = false; + if (close_enough(expected, actual)) { + pass = true; + jitstatHandler(function(prop) { + if (expectedJITstats && prop in expectedJITstats && + expectedJITstats[prop] != + tracemonkey[prop] - oldJITstats[prop]) { + pass = false; + } + }); + if (pass) { + reportCompare(expected, actual, desc); + passes.push(desc); + return print(desc, ": passed"); + } + } + + if (expected instanceof RegExp) { + pass = reportMatch(expected, actual + '', desc); + if (pass) { + jitstatHandler(function(prop) { + if (expectedJITstats && prop in expectedJITstats && + expectedJITstats[prop] != + tracemonkey[prop] - oldJITstats[prop]) { + pass = false; + } + }); + } + if (pass) { + passes.push(desc); + return print(desc, ": passed"); + } + } + + reportCompare(expected, actual, desc); + + fails.push(desc); + var expectedStats = ""; + if (expectedJITstats) { + jitstatHandler(function(prop) { + if (prop in expectedJITstats) { + if (expectedStats) + expectedStats += " "; + expectedStats += + prop + ": " + expectedJITstats[prop]; + } + }); + } + var actualStats = ""; + if (expectedJITstats) { + jitstatHandler(function(prop) { + if (prop in expectedJITstats) { + if (actualStats) + actualStats += " "; + actualStats += prop + ": " + (tracemonkey[prop]-oldJITstats[prop]); + } + }); + } + print(desc, ": FAILED: expected", typeof(expected), + "(", uneval(expected), ")", + (expectedStats ? " [" + expectedStats + "] " : ""), + "!= actual", + typeof(actual), "(", uneval(actual), ")", + (actualStats ? " [" + actualStats + "] " : "")); +} + +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +// Apply FUNCNAME to ARGS, and check against EXPECTED. +// Expect a loop containing such a call to be traced. +// FUNCNAME and ARGS are both strings. +// ARGS has the form of an argument list: a comma-separated list of expressions. +// Certain Tracemonkey limitations require us to pass FUNCNAME as a string. +// Passing ARGS as a string allows us to assign better test names: +// expressions like Math.PI/4 haven't been evaluated to big hairy numbers. +function testmath(funcname, args, expected) { + var i, j; + + var arg_value_list = eval("[" + args + "]"); + var arity = arg_value_list.length; + + // Build the string "a[i][0],...,a[i][ARITY-1]". + var actuals = [] + for (i = 0; i < arity; i++) + actuals.push("a[i][" + i + "]"); + actuals = actuals.join(","); + + // Create a function that maps FUNCNAME across an array of input values. + // Unless we eval here, the call to funcname won't get traced. + // FUNCNAME="Infinity/Math.abs" and cases like that happen to + // parse, too, in a twisted way. + var mapfunc = eval("(function(a) {\n" + + " for (var i = 0; i < a.length; i++)\n" + + " a[i] = " + funcname + "(" + actuals +");\n" + + " })\n"); + + // To prevent the compiler from doing constant folding, produce an + // array to pass to mapfunc that contains enough dummy + // values at the front to get the loop body jitted, and then our + // actual test value. + var dummies_and_input = []; + for (i = 0; i < RUNLOOP; i++) { + var dummy_list = []; + for (j = 0; j < arity; j++) + dummy_list[j] = .0078125 * ((i + j) % 128); + dummies_and_input[i] = dummy_list; + } + dummies_and_input[RUNLOOP] = arg_value_list; + + function testfunc() { + // Map the function across the dummy values and the test input. + mapfunc(dummies_and_input); + return dummies_and_input[RUNLOOP]; + } + testfunc.name = funcname + "(" + args + ")"; + testfunc.expected = expected; + + // Disable jitstats check. This never worked right. The actual part of the + // loop we cared about was never traced. We traced the filler parts early + // and then took a mismatch side exit on every subequent array read with + // a different type (gal, discovered when fixing bug 479110). + // testfunc.jitstats = { + // recorderStarted: 1, + // recorderAborted: 0, + // traceTriggered: 1 + // }; + + test(testfunc); +} + +testmath("Math.abs", "void 0", Number.NaN) +testmath("Math.abs", "null", 0) +testmath("Math.abs", "true", 1) +testmath("Math.abs", "false", 0) +testmath("Math.abs", "\"a string primitive\"", Number.NaN) +testmath("Math.abs", "new String( 'a String object' )", Number.NaN) +testmath("Math.abs", "Number.NaN", Number.NaN) +testmath("Math.abs", "0", 0) +testmath("Math.abs", "-0", 0) +testmath("Infinity/Math.abs", "-0", Infinity) +testmath("Math.abs", "Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.abs", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.abs", "- Number.MAX_VALUE", Number.MAX_VALUE) +testmath("Math.abs", "-Number.MIN_VALUE", Number.MIN_VALUE) +testmath("Math.abs", "Number.MAX_VALUE", Number.MAX_VALUE) +testmath("Math.abs", "Number.MIN_VALUE", Number.MIN_VALUE) +testmath("Math.abs", "-1", 1) +testmath("Math.abs", "new Number(-1)", 1) +testmath("Math.abs", "1", 1) +testmath("Math.abs", "Math.PI", Math.PI) +testmath("Math.abs", "-Math.PI", Math.PI) +testmath("Math.abs", "-1/100000000", 1/100000000) +testmath("Math.abs", "-Math.pow(2,32)", Math.pow(2,32)) +testmath("Math.abs", "Math.pow(2,32)", Math.pow(2,32)) +testmath("Math.abs", "-0xfff", 4095) +testmath("Math.abs", "-0777", 511) +testmath("Math.abs", "'-1e-1'", 0.1) +testmath("Math.abs", "'0xff'", 255) +testmath("Math.abs", "'077'", 77) +testmath("Math.abs", "'Infinity'", Infinity) +testmath("Math.abs", "'-Infinity'", Infinity) + +testmath("Math.acos", "void 0", Number.NaN) +testmath("Math.acos", "null", Math.PI/2) +testmath("Math.acos", "Number.NaN", Number.NaN) +testmath("Math.acos", "\"a string\"", Number.NaN) +testmath("Math.acos", "'0'", Math.PI/2) +testmath("Math.acos", "'1'", 0) +testmath("Math.acos", "'-1'", Math.PI) +testmath("Math.acos", "1.00000001", Number.NaN) +testmath("Math.acos", "-1.00000001", Number.NaN) +testmath("Math.acos", "1", 0) +testmath("Math.acos", "-1", Math.PI) +testmath("Math.acos", "0", Math.PI/2) +testmath("Math.acos", "-0", Math.PI/2) +testmath("Math.acos", "Math.SQRT1_2", Math.PI/4) +testmath("Math.acos", "-Math.SQRT1_2", Math.PI/4*3) +testmath("Math.acos", "0.9999619230642", Math.PI/360) +testmath("Math.acos", "-3.0", Number.NaN) + +testmath("Math.asin", "void 0", Number.NaN) +testmath("Math.asin", "null", 0) +testmath("Math.asin", "Number.NaN", Number.NaN) +testmath("Math.asin", "\"string\"", Number.NaN) +testmath("Math.asin", "\"0\"", 0) +testmath("Math.asin", "\"1\"", Math.PI/2) +testmath("Math.asin", "\"-1\"", -Math.PI/2) +testmath("Math.asin", "Math.SQRT1_2+''", Math.PI/4) +testmath("Math.asin", "-Math.SQRT1_2+''", -Math.PI/4) +testmath("Math.asin", "1.000001", Number.NaN) +testmath("Math.asin", "-1.000001", Number.NaN) +testmath("Math.asin", "0", 0) +testmath("Math.asin", "-0", -0) +testmath("Infinity/Math.asin", "-0", -Infinity) +testmath("Math.asin", "1", Math.PI/2) +testmath("Math.asin", "-1", -Math.PI/2) +testmath("Math.asin", "Math.SQRT1_2", Math.PI/4) +testmath("Math.asin", "-Math.SQRT1_2", -Math.PI/4) + +testmath("Math.atan", "void 0", Number.NaN) +testmath("Math.atan", "null", 0) +testmath("Math.atan", "Number.NaN", Number.NaN) +testmath("Math.atan", "\"a string\"", Number.NaN) +testmath("Math.atan", "'0'", 0) +testmath("Math.atan", "'1'", Math.PI/4) +testmath("Math.atan", "'-1'", -Math.PI/4) +testmath("Math.atan", "'Infinity'", Math.PI/2) +testmath("Math.atan", "'-Infinity'", -Math.PI/2) +testmath("Math.atan", "0", 0) +testmath("Math.atan", "-0", -0) +testmath("Infinity/Math.atan", "-0", -Infinity) +testmath("Math.atan", "Number.POSITIVE_INFINITY", Math.PI/2) +testmath("Math.atan", "Number.NEGATIVE_INFINITY", -Math.PI/2) +testmath("Math.atan", "1", Math.PI/4) +testmath("Math.atan", "-1", -Math.PI/4) + +testmath("Math.atan2", "Number.NaN,0", Number.NaN) +testmath("Math.atan2", "null, null", 0) +testmath("Math.atan2", "void 0, void 0", Number.NaN) +testmath("Math.atan2", "0,Number.NaN", Number.NaN) +testmath("Math.atan2", "1,0", Math.PI/2) +testmath("Math.atan2", "1,-0", Math.PI/2) +testmath("Math.atan2", "0,0.001", 0) +testmath("Math.atan2", "0,0", 0) +testmath("Math.atan2", "0,-0", Math.PI) +testmath("Math.atan2", "0, -1", Math.PI) +testmath("Math.atan2", "-0, 1", -0) +testmath("Infinity/Math.atan2", "-0,1", -Infinity) +testmath("Math.atan2", "-0,0", -0) +testmath("Math.atan2", "-0, -0", -Math.PI) +testmath("Math.atan2", "-0, -1", -Math.PI) +testmath("Math.atan2", "-1, 0", -Math.PI/2) +testmath("Math.atan2", "-1, -0", -Math.PI/2) +testmath("Math.atan2", "1, Number.POSITIVE_INFINITY", 0) +testmath("Math.atan2", "1, Number.NEGATIVE_INFINITY", Math.PI) +testmath("Math.atan2", "-1,Number.POSITIVE_INFINITY", -0) +testmath("Infinity/Math.atan2", "-1,Infinity", -Infinity) +testmath("Math.atan2", "-1,Number.NEGATIVE_INFINITY", -Math.PI) +testmath("Math.atan2", "Number.POSITIVE_INFINITY, 0", Math.PI/2) +testmath("Math.atan2", "Number.POSITIVE_INFINITY, 1", Math.PI/2) +testmath("Math.atan2", "Number.POSITIVE_INFINITY,-1", Math.PI/2) +testmath("Math.atan2", "Number.POSITIVE_INFINITY,-0", Math.PI/2) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 0", -Math.PI/2) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-0", -Math.PI/2) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 1", -Math.PI/2) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-1", -Math.PI/2) +testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY", Math.PI/4) +testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY", 3*Math.PI/4) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", -Math.PI/4) +testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", -3*Math.PI/4) +testmath("Math.atan2", "-1, 1", -Math.PI/4) + +testmath("Math.ceil", "Number.NaN", Number.NaN) +testmath("Math.ceil", "null", 0) +testmath("Math.ceil", "void 0", Number.NaN) +testmath("Math.ceil", "'0'", 0) +testmath("Math.ceil", "'-0'", -0) +testmath("Infinity/Math.ceil", "'0'", Infinity) +testmath("Infinity/Math.ceil", "'-0'", -Infinity) +testmath("Math.ceil", "0", 0) +testmath("Math.ceil", "-0", -0) +testmath("Infinity/Math.ceil", "0", Infinity) +testmath("Infinity/Math.ceil", "-0", -Infinity) +testmath("Math.ceil", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.ceil", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY) +testmath("Math.ceil", "-Number.MIN_VALUE", -0) +testmath("Infinity/Math.ceil", "-Number.MIN_VALUE", -Infinity) +testmath("Math.ceil", "1", 1) +testmath("Math.ceil", "-1", -1) +testmath("Math.ceil", "-0.9", -0) +testmath("Infinity/Math.ceil", "-0.9", -Infinity) +testmath("Math.ceil", "0.9", 1) +testmath("Math.ceil", "-1.1", -1) +testmath("Math.ceil", "1.1", 2) +testmath("Math.ceil", "Number.POSITIVE_INFINITY", -Math.floor(-Infinity)) +testmath("Math.ceil", "Number.NEGATIVE_INFINITY", -Math.floor(Infinity)) +testmath("Math.ceil", "-Number.MIN_VALUE", -Math.floor(Number.MIN_VALUE)) +testmath("Math.ceil", "1", -Math.floor(-1)) +testmath("Math.ceil", "-1", -Math.floor(1)) +testmath("Math.ceil", "-0.9", -Math.floor(0.9)) +testmath("Math.ceil", "0.9", -Math.floor(-0.9)) +testmath("Math.ceil", "-1.1", -Math.floor(1.1)) +testmath("Math.ceil", "1.1", -Math.floor(-1.1)) + +testmath("Math.cos", "void 0", Number.NaN) +testmath("Math.cos", "false", 1) +testmath("Math.cos", "null", 1) +testmath("Math.cos", "'0'", 1) +testmath("Math.cos", "\"Infinity\"", Number.NaN) +testmath("Math.cos", "'3.14159265359'", -1) +testmath("Math.cos", "Number.NaN", Number.NaN) +testmath("Math.cos", "0", 1) +testmath("Math.cos", "-0", 1) +testmath("Math.cos", "Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.cos", "Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.cos", "0.7853981633974", 0.7071067811865) +testmath("Math.cos", "1.570796326795", 0) +testmath("Math.cos", "2.356194490192", -0.7071067811865) +testmath("Math.cos", "3.14159265359", -1) +testmath("Math.cos", "3.926990816987", -0.7071067811865) +testmath("Math.cos", "4.712388980385", 0) +testmath("Math.cos", "5.497787143782", 0.7071067811865) +testmath("Math.cos", "Math.PI*2", 1) +testmath("Math.cos", "Math.PI/4", Math.SQRT2/2) +testmath("Math.cos", "Math.PI/2", 0) +testmath("Math.cos", "3*Math.PI/4", -Math.SQRT2/2) +testmath("Math.cos", "Math.PI", -1) +testmath("Math.cos", "5*Math.PI/4", -Math.SQRT2/2) +testmath("Math.cos", "3*Math.PI/2", 0) +testmath("Math.cos", "7*Math.PI/4", Math.SQRT2/2) +testmath("Math.cos", "2*Math.PI", 1) +testmath("Math.cos", "-0.7853981633974", 0.7071067811865) +testmath("Math.cos", "-1.570796326795", 0) +testmath("Math.cos", "2.3561944901920", -.7071067811865) +testmath("Math.cos", "3.14159265359", -1) +testmath("Math.cos", "3.926990816987", -0.7071067811865) +testmath("Math.cos", "4.712388980385", 0) +testmath("Math.cos", "5.497787143782", 0.7071067811865) +testmath("Math.cos", "6.28318530718", 1) +testmath("Math.cos", "-Math.PI/4", Math.SQRT2/2) +testmath("Math.cos", "-Math.PI/2", 0) +testmath("Math.cos", "-3*Math.PI/4", -Math.SQRT2/2) +testmath("Math.cos", "-Math.PI", -1) +testmath("Math.cos", "-5*Math.PI/4", -Math.SQRT2/2) +testmath("Math.cos", "-3*Math.PI/2", 0) +testmath("Math.cos", "-7*Math.PI/4", Math.SQRT2/2) +testmath("Math.cos", "-Math.PI*2", 1) + +testmath("Math.exp", "null", 1) +testmath("Math.exp", "void 0", Number.NaN) +testmath("Math.exp", "1", Math.E) +testmath("Math.exp", "true", Math.E) +testmath("Math.exp", "false", 1) +testmath("Math.exp", "'1'", Math.E) +testmath("Math.exp", "'0'", 1) +testmath("Math.exp", "Number.NaN", Number.NaN) +testmath("Math.exp", "0", 1) +testmath("Math.exp", "-0", 1) +testmath("Math.exp", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.exp", "Number.NEGATIVE_INFINITY", 0) + +testmath("Math.floor", "void 0", Number.NaN) +testmath("Math.floor", "null", 0) +testmath("Math.floor", "true", 1) +testmath("Math.floor", "false", 0) +testmath("Math.floor", "\"1.1\"", 1) +testmath("Math.floor", "\"-1.1\"", -2) +testmath("Math.floor", "\"0.1\"", 0) +testmath("Math.floor", "\"-0.1\"", -1) +testmath("Math.floor", "Number.NaN", Number.NaN) +testmath("Math.floor(Number.NaN) == -Math.ceil", "-Number.NaN", false) +testmath("Math.floor", "0", 0) +testmath("Math.floor(0) == -Math.ceil", "-0", true) +testmath("Math.floor", "-0", -0) +testmath("Infinity/Math.floor", "-0", -Infinity) +testmath("Math.floor(-0)== -Math.ceil", "0", true) +testmath("Math.floor", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.floor(Number.POSITIVE_INFINITY) == -Math.ceil", "Number.NEGATIVE_INFINITY", true) +testmath("Math.floor", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY) +testmath("Math.floor(Number.NEGATIVE_INFINITY) == -Math.ceil", "Number.POSITIVE_INFINITY", true) +testmath("Math.floor", "0.0000001", 0) +testmath("Math.floor(0.0000001)==-Math.ceil", "-0.0000001", true) +testmath("Math.floor", "-0.0000001", -1) +testmath("Math.floor(-0.0000001)==-Math.ceil", "0.0000001", true) + +testmath("Math.log", "void 0", Number.NaN) +testmath("Math.log", "null", Number.NEGATIVE_INFINITY) +testmath("Math.log", "true", 0) +testmath("Math.log", "false", -Infinity) +testmath("Math.log", "'0'", -Infinity) +testmath("Math.log", "'1'", 0) +testmath("Math.log", "\"Infinity\"", Infinity) +testmath("Math.log", "Number.NaN", Number.NaN) +testmath("Math.log", "-0.000001", Number.NaN) +testmath("Math.log", "-1", Number.NaN) +testmath("Math.log", "0", Number.NEGATIVE_INFINITY) +testmath("Math.log", "-0", Number.NEGATIVE_INFINITY) +testmath("Math.log", "1", 0) +testmath("Math.log", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.log", "Number.NEGATIVE_INFINITY", Number.NaN) + +testmath("Math.max", "void 0, 1", Number.NaN) +testmath("Math.max", "void 0, void 0", Number.NaN) +testmath("Math.max", "null, 1", 1) +testmath("Math.max", "-1, null", 0) +testmath("Math.max", "true,false", 1) +testmath("Math.max", "\"-99\",\"99\"", 99) +testmath("Math.max", "Number.NaN,Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.max", "Number.NaN, 0", Number.NaN) +testmath("Math.max", "\"a string\", 0", Number.NaN) +testmath("Math.max", "Number.NaN,1", Number.NaN) +testmath("Math.max", "\"a string\", Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.max", "Number.POSITIVE_INFINITY, Number.NaN", Number.NaN) +testmath("Math.max", "Number.NaN, Number.NaN", Number.NaN) +testmath("Math.max", "0,Number.NaN", Number.NaN) +testmath("Math.max", "1, Number.NaN", Number.NaN) +testmath("Math.max", "0,0", 0) +testmath("Math.max", "0,-0", 0) +testmath("Math.max", "-0,0", 0) +testmath("Math.max", "-0,-0", -0) +testmath("Infinity/Math.max", "-0,-0", -Infinity) +testmath("Math.max", "Number.POSITIVE_INFINITY, Number.MAX_VALUE", Number.POSITIVE_INFINITY) +testmath("Math.max", "Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.max", "Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY) +testmath("Math.max", "1,.99999999999999", 1) +testmath("Math.max", "-1,-.99999999999999", -.99999999999999) + +testmath("Math.min", "void 0, 1", Number.NaN) +testmath("Math.min", "void 0, void 0", Number.NaN) +testmath("Math.min", "null, 1", 0) +testmath("Math.min", "-1, null", -1) +testmath("Math.min", "true,false", 0) +testmath("Math.min", "\"-99\",\"99\"", -99) +testmath("Math.min", "Number.NaN,0", Number.NaN) +testmath("Math.min", "Number.NaN,1", Number.NaN) +testmath("Math.min", "Number.NaN,-1", Number.NaN) +testmath("Math.min", "0,Number.NaN", Number.NaN) +testmath("Math.min", "1,Number.NaN", Number.NaN) +testmath("Math.min", "-1,Number.NaN", Number.NaN) +testmath("Math.min", "Number.NaN,Number.NaN", Number.NaN) +testmath("Math.min", "1,1.0000000001", 1) +testmath("Math.min", "1.0000000001,1", 1) +testmath("Math.min", "0,0", 0) +testmath("Math.min", "0,-0", -0) +testmath("Math.min", "-0,-0", -0) +testmath("Infinity/Math.min", "0,-0", -Infinity) +testmath("Infinity/Math.min", "-0,-0", -Infinity) + +testmath("Math.pow", "null,null", 1) +testmath("Math.pow", "void 0, void 0", Number.NaN) +testmath("Math.pow", "true, false", 1) +testmath("Math.pow", "false,true", 0) +testmath("Math.pow", "'2','32'", 4294967296) +testmath("Math.pow", "1,Number.NaN", Number.NaN) +testmath("Math.pow", "0,Number.NaN", Number.NaN) +testmath("Math.pow", "Number.NaN,0", 1) +testmath("Math.pow", "Number.NaN,-0", 1) +testmath("Math.pow", "Number.NaN, 1", Number.NaN) +testmath("Math.pow", "Number.NaN, .5", Number.NaN) +testmath("Math.pow", "1.00000001, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.pow", "1.00000001, Number.NEGATIVE_INFINITY", 0) +testmath("Math.pow", "-1.00000001,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.pow", "-1.00000001,Number.NEGATIVE_INFINITY", 0) +testmath("Math.pow", "1, Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.pow", "1, Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.pow", "-1, Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.pow", "-1, Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.pow", ".0000000009, Number.POSITIVE_INFINITY", 0) +testmath("Math.pow", "-.0000000009, Number.POSITIVE_INFINITY", 0) +testmath("Math.pow", "-.0000000009, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.POSITIVE_INFINITY,.00000000001", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.POSITIVE_INFINITY, 1", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.POSITIVE_INFINITY, -.00000000001", 0) +testmath("Math.pow", "Number.POSITIVE_INFINITY, -1", 0) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, 1", Number.NEGATIVE_INFINITY) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, 333", Number.NEGATIVE_INFINITY) +testmath("Math.pow", "Number.POSITIVE_INFINITY, 2", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, 666", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, 0.5", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, -1", -0) +testmath("Infinity/Math.pow", "Number.NEGATIVE_INFINITY, -1", -Infinity) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, -3", -0) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, -2", 0) +testmath("Math.pow", "Number.NEGATIVE_INFINITY,-0.5", 0) +testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", 0) +testmath("Math.pow", "0,1", 0) +testmath("Math.pow", "0,0", 1) +testmath("Math.pow", "1,0", 1) +testmath("Math.pow", "-1,0", 1) +testmath("Math.pow", "0,0.5", 0) +testmath("Math.pow", "0,1000", 0) +testmath("Math.pow", "0, Number.POSITIVE_INFINITY", 0) +testmath("Math.pow", "0, -1", Number.POSITIVE_INFINITY) +testmath("Math.pow", "0, -0.5", Number.POSITIVE_INFINITY) +testmath("Math.pow", "0, -1000", Number.POSITIVE_INFINITY) +testmath("Math.pow", "0, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.pow", "-0, 1", -0) +testmath("Math.pow", "-0,3", -0) +testmath("Infinity/Math.pow", "-0, 1", -Infinity) +testmath("Infinity/Math.pow", "-0,3", -Infinity) +testmath("Math.pow", "-0,2", 0) +testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0) +testmath("Math.pow", "-0, -1", Number.NEGATIVE_INFINITY) +testmath("Math.pow", "-0, -10001", Number.NEGATIVE_INFINITY) +testmath("Math.pow", "-0, -2", Number.POSITIVE_INFINITY) +testmath("Math.pow", "-0, 0.5", 0) +testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0) +testmath("Math.pow", "-1, 0.5", Number.NaN) +testmath("Math.pow", "-1, Number.NaN", Number.NaN) +testmath("Math.pow", "-1, -0.5", Number.NaN) + +testmath("Math.round", "0", 0) +testmath("Math.round", "void 0", Number.NaN) +testmath("Math.round", "true", 1) +testmath("Math.round", "false", 0) +testmath("Math.round", "'.99999'", 1) +testmath("Math.round", "'12345e-2'", 123) +testmath("Math.round", "Number.NaN", Number.NaN) +testmath("Math.round", "0", 0) +testmath("Math.round", "-0", -0) +testmath("Infinity/Math.round", "-0", -Infinity) +testmath("Math.round", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.round", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY) +testmath("Math.round", "0.49", 0) +testmath("Math.round", "0.5", 1) +testmath("Math.round", "0.51", 1) +testmath("Math.round", "-0.49", -0) +testmath("Math.round", "-0.5", -0) +testmath("Infinity/Math.round", "-0.49", -Infinity) +testmath("Infinity/Math.round", "-0.5", -Infinity) +testmath("Math.round", "-0.51", -1) +testmath("Math.round", "3.5", 4) +testmath("Math.round", "-3", -3) + +testmath("Math.sin", "null", 0) +testmath("Math.sin", "void 0", Number.NaN) +testmath("Math.sin", "false", 0) +testmath("Math.sin", "'2.356194490192'", 0.7071067811865) +testmath("Math.sin", "Number.NaN", Number.NaN) +testmath("Math.sin", "0", 0) +testmath("Math.sin", "-0", -0) +testmath("Math.sin", "Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.sin", "Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.sin", "0.7853981633974", 0.7071067811865) +testmath("Math.sin", "1.570796326795", 1) +testmath("Math.sin", "2.356194490192", 0.7071067811865) +testmath("Math.sin", "3.14159265359", 0) + +testmath("Math.sqrt", "void 0", Number.NaN) +testmath("Math.sqrt", "null", 0) +testmath("Math.sqrt", "1", 1) +testmath("Math.sqrt", "false", 0) +testmath("Math.sqrt", "'225'", 15) +testmath("Math.sqrt", "Number.NaN", Number.NaN) +testmath("Math.sqrt", "Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.sqrt", "-1", Number.NaN) +testmath("Math.sqrt", "-0.5", Number.NaN) +testmath("Math.sqrt", "0", 0) +testmath("Math.sqrt", "-0", -0) +testmath("Infinity/Math.sqrt", "-0", -Infinity) +testmath("Math.sqrt", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY) +testmath("Math.sqrt", "1", 1) +testmath("Math.sqrt", "2", Math.SQRT2) +testmath("Math.sqrt", "0.5", Math.SQRT1_2) +testmath("Math.sqrt", "4", 2) +testmath("Math.sqrt", "9", 3) +testmath("Math.sqrt", "16", 4) +testmath("Math.sqrt", "25", 5) +testmath("Math.sqrt", "36", 6) +testmath("Math.sqrt", "49", 7) +testmath("Math.sqrt", "64", 8) +testmath("Math.sqrt", "256", 16) +testmath("Math.sqrt", "10000", 100) +testmath("Math.sqrt", "65536", 256) +testmath("Math.sqrt", "0.09", 0.3) +testmath("Math.sqrt", "0.01", 0.1) +testmath("Math.sqrt", "0.00000001", 0.0001) + +testmath("Math.tan", "void 0", Number.NaN) +testmath("Math.tan", "null", 0) +testmath("Math.tan", "false", 0) +testmath("Math.tan", "Number.NaN", Number.NaN) +testmath("Math.tan", "0", 0) +testmath("Math.tan", "-0", -0) +testmath("Math.tan", "Number.POSITIVE_INFINITY", Number.NaN) +testmath("Math.tan", "Number.NEGATIVE_INFINITY", Number.NaN) +testmath("Math.tan", "Math.PI/4", 1) +testmath("Math.tan", "3*Math.PI/4", -1) +testmath("Math.tan", "Math.PI", -0) +testmath("Math.tan", "5*Math.PI/4", 1) +testmath("Math.tan", "7*Math.PI/4", -1) +testmath("Infinity/Math.tan", "-0", -Infinity) + + +/* Keep these at the end so that we can see the summary after the trace-debug spew. */ +if (0) { + print("\npassed:", passes.length && passes.join(",")); + print("\nFAILED:", fails.length && fails.join(",")); +} diff --git a/js/src/tests/js1_8_1/jit/regress-451673.js b/js/src/tests/js1_8_1/jit/regress-451673.js new file mode 100644 index 000000000..415acdbc1 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-451673.js @@ -0,0 +1,81 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 451673; +var summary = 'TM: Tracing prime number generation'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function doTest(enablejit) + { + if (enablejit) + else + + var n = 1000000; + var start = new Date(); + var i=0; + var j=0; + var numprimes=0; + var limit=0; + numprimes = 1; // 2 is prime + var mceil = Math.floor; + var msqrt = Math.sqrt; + var isPrime = 1; + + for (i = 3; i<= n; i+=2) + { + isPrime=1; + limit = mceil(msqrt(i)+1) + 1; + + for (j = 3; j < limit; j+=2) + { + if (i % j == 0) + { + isPrime = 0; + break; + } + } + + if (isPrime) + { + numprimes ++; + } + } + + var end = new Date(); + + var timetaken = end - start; + timetaken = timetaken / 1000; + + if (enablejit) + + print((enablejit ? ' JIT' : 'Non-JIT') + ": Number of primes up to: " + n + " is " + numprimes + ", counted in " + timetaken + " secs."); + + return timetaken; + } + + var timenonjit = doTest(false); + var timejit = doTest(true); + + expect = true; + actual = timejit < timenonjit; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-451974-01.js b/js/src/tests/js1_8_1/jit/regress-451974-01.js new file mode 100644 index 000000000..548695daf --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-451974-01.js @@ -0,0 +1,52 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 451974; +var summary = 'TM: loops with anon functions should not be slower with jit enabled'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var chars = '0123456789abcdef'; +var size = 10000; +var mult = 1000; +var densearray = []; +var lsize = size; + +while (lsize--) +{ + densearray.push(chars); +} + +function loop() +{ + var start = new Date(); + + for (var a = 0; a < mult; a++) + { + var f = (function(x){}); + for (var i = 0, len = densearray.length; i < len; i++) + { + f(densearray[i]); + } + } + + var stop = new Date(); + return stop - start; +} + +var timenonjit = loop(); +var timejit = loop(); + +print('time: nonjit = ' + timenonjit + ', jit = ' + timejit); + +expect = true; +actual = timejit < timenonjit/2; + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/js1_8_1/jit/regress-451974-02.js b/js/src/tests/js1_8_1/jit/regress-451974-02.js new file mode 100644 index 000000000..ddb11713f --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-451974-02.js @@ -0,0 +1,63 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 451974; +var summary = 'TM: loops with anon functions should not be slower with jit enabled'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var chars = '0123456789abcdef'; + var size = 10000; + var mult = 1000; + var densearray = []; + var lsize = size; + + while (lsize--) + { + densearray.push(chars); + } + + function loop() + { + var start = new Date(); + + for (var a = 0; a < mult; a++) + { + var f = (function(x){}); + for (var i = 0, len = densearray.length; i < len; i++) + { + f(densearray[i]); + } + } + + var stop = new Date(); + return stop - start; + } + + var timenonjit = loop(); + var timejit = loop(); + + print('time: nonjit = ' + timenonjit + ', jit = ' + timejit); + + expect = true; + actual = timejit < timenonjit/2; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-452498-01.js b/js/src/tests/js1_8_1/jit/regress-452498-01.js new file mode 100644 index 000000000..4ccd4476f --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-452498-01.js @@ -0,0 +1,72 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 452498; +var summary = 'TM: upvar2: jit heavyweight functions'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +function complex(aReal, aImag) { + this.r = aReal; + this.i = aImag; + this.square = function() { + return new complex(this.r * this.r - this.i * this.i, + 2 * this.r * this.i); + } + this.dist = function() { + return Math.sqrt(this.r * this.r + this.i * this.i); + } + this.add = function(aComplex) { + return new complex(this.r + aComplex.r, this.i + aComplex.i); + } +} + +function mandelbrotValueOO (aC, aIterMax) { + let Z = new complex(0.0, 0.0); + for (var iter = 0; iter < aIterMax; iter++) { + Z = Z.square().add(aC); + if (Z.r * Z.r + Z.i * Z.i > 256) { break; } + } + return iter; +} + +function f(trace) { + var start = Date.now(); + const width = 60; + const height = 60; + const max_iters = 50; + var output = []; + for (let img_x = 0; img_x < width; img_x++) { + for (let img_y = 0; img_y < height; img_y++) { + let C = new complex(-2 + (img_x / width) * 3, + -1.5 + (img_y / height) * 3); + var res = mandelbrotValueOO(C, max_iters); + if (output.length > 0 && output[output.length -1][0] == res) { + output[output.length-1][1]++; + } else { + output.push([res, 1]); + } + } + } + const reference = "[[2, 6], [3, 17], [4, 6], [5, 1], [50, 1], [5, 1], [4, 6], [3, 17], [2, 10], [3, 17], [4, 6], [5, 1], [6, 1], [50, 1], [6, 1], [5, 1], [4, 6], [3, 17], [2, 8], [3, 17], [4, 6], [5, 2], [6, 1], [50, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 6], [3, 17], [4, 6], [5, 2], [6, 1], [7, 1], [50, 1], [7, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 4], [3, 17], [4, 7], [5, 2], [6, 1], [8, 1], [50, 1], [8, 1], [6, 1], [5, 2], [4, 7], [3, 17], [2, 2], [3, 17], [4, 7], [5, 3], [6, 1], [9, 1], [50, 1], [9, 1], [6, 1], [5, 3], [4, 7], [3, 17], [2, 1], [3, 16], [4, 7], [5, 3], [6, 2], [8, 1], [50, 1], [8, 1], [6, 2], [5, 3], [4, 7], [3, 32], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 31], [4, 7], [5, 3], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 30], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 28], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [10, 1], [50, 1], [10, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 26], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [11, 1], [50, 1], [11, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 25], [4, 6], [5, 3], [6, 3], [7, 1], [8, 1], [18, 1], [13, 1], [15, 1], [50, 1], [15, 1], [13, 1], [18, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 6], [3, 24], [4, 7], [5, 2], [6, 2], [7, 3], [8, 1], [10, 1], [14, 1], [50, 3], [14, 1], [10, 1], [8, 1], [7, 3], [6, 2], [5, 2], [4, 7], [3, 23], [4, 6], [5, 3], [7, 1], [8, 1], [9, 1], [8, 2], [10, 1], [11, 1], [15, 1], [50, 3], [15, 1], [11, 1], [10, 1], [8, 2], [9, 1], [8, 1], [7, 1], [5, 3], [4, 6], [3, 22], [4, 7], [5, 2], [6, 1], [7, 1], [14, 1], [16, 1], [11, 1], [10, 1], [12, 1], [20, 1], [23, 1], [46, 1], [50, 1], [46, 1], [23, 1], [20, 1], [12, 1], [10, 1], [11, 1], [16, 1], [14, 1], [7, 1], [6, 1], [5, 2], [4, 7], [3, 20], [4, 7], [5, 3], [6, 1], [7, 1], [8, 1], [10, 1], [17, 1], [16, 1], [20, 1], [50, 7], [20, 1], [16, 1], [17, 1], [10, 1], [8, 1], [7, 1], [6, 1], [5, 3], [4, 7], [3, 19], [4, 7], [5, 3], [6, 2], [7, 1], [10, 1], [21, 1], [50, 11], [21, 1], [10, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 18], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [9, 1], [13, 1], [25, 1], [50, 9], [25, 1], [13, 1], [9, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 17], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [14, 2], [50, 11], [14, 2], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 16], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [11, 1], [36, 1], [50, 11], [36, 1], [11, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 15], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [14, 1], [50, 11], [14, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 14], [4, 7], [5, 4], [6, 3], [7, 1], [8, 1], [9, 1], [12, 1], [26, 1], [50, 9], [26, 1], [12, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 4], [4, 7], [3, 13], [4, 7], [5, 4], [6, 2], [7, 2], [8, 1], [9, 1], [10, 1], [15, 1], [50, 9], [15, 1], [10, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 4], [4, 7], [3, 12], [4, 7], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [10, 1], [12, 1], [16, 1], [50, 7], [16, 1], [12, 1], [10, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 7], [3, 11], [4, 6], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [11, 1], [12, 1], [14, 1], [17, 1], [23, 1], [34, 1], [50, 3], [34, 1], [23, 1], [17, 1], [14, 1], [12, 1], [11, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 6], [3, 10], [4, 7], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [22, 1], [12, 1], [50, 1], [25, 1], [50, 11], [25, 1], [50, 1], [12, 1], [22, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 7], [3, 9], [4, 6], [5, 4], [6, 1], [7, 1], [8, 2], [9, 1], [14, 1], [50, 1], [21, 1], [50, 15], [21, 1], [50, 1], [14, 1], [9, 1], [8, 2], [7, 1], [6, 1], [5, 4], [4, 6], [3, 8], [4, 7], [5, 3], [6, 2], [9, 1], [14, 1], [13, 1], [11, 1], [13, 1], [26, 1], [50, 17], [26, 1], [13, 1], [11, 1], [13, 1], [14, 1], [9, 1], [6, 2], [5, 3], [4, 7], [3, 7], [4, 6], [5, 4], [6, 1], [7, 1], [9, 1], [49, 1], [43, 1], [50, 23], [43, 1], [49, 1], [9, 1], [7, 1], [6, 1], [5, 4], [4, 6], [3, 7], [4, 5], [5, 4], [6, 2], [7, 1], [9, 1], [13, 1], [50, 25], [13, 1], [9, 1], [7, 1], [6, 2], [5, 4], [4, 5], [3, 6], [4, 6], [5, 3], [6, 2], [7, 2], [9, 1], [11, 1], [17, 1], [50, 23], [17, 1], [11, 1], [9, 1], [7, 2], [6, 2], [5, 3], [4, 6], [3, 5], [4, 5], [5, 3], [6, 3], [7, 1], [8, 1], [9, 1], [50, 1], [26, 1], [50, 23], [26, 1], [50, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 5], [4, 4], [5, 3], [6, 3], [7, 1], [8, 2], [10, 1], [21, 1], [50, 25], [21, 1], [10, 1], [8, 2], [7, 1], [6, 3], [5, 3], [4, 4], [3, 5], [4, 4], [5, 2], [6, 3], [7, 1], [12, 1], [9, 1], [10, 1], [11, 1], [50, 27], [11, 1], [10, 1], [9, 1], [12, 1], [7, 1], [6, 3], [5, 2], [4, 4], [3, 5], [4, 3], [5, 2], [6, 2], [7, 2], [9, 1], [42, 1], [15, 1], [23, 1], [14, 1], [50, 27], [14, 1], [23, 1], [15, 1], [42, 1], [9, 1], [7, 2], [6, 2], [5, 2], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [20, 1], [9, 1], [8, 1], [9, 1], [10, 1], [16, 1], [50, 33], [16, 1], [10, 1], [9, 1], [8, 1], [9, 1], [20, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [9, 1], [13, 1], [12, 1], [11, 1], [38, 1], [25, 1], [50, 33], [25, 1], [38, 1], [11, 1], [12, 1], [13, 1], [9, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 2], [6, 1], [7, 1], [10, 1], [24, 1], [25, 1], [50, 35], [25, 1], [24, 1], [10, 1], [7, 1], [6, 1], [5, 2], [4, 3], [3, 5], [4, 4], [5, 1], [6, 1], [7, 1], [11, 2], [13, 1], [19, 1], [50, 33], [19, 1], [13, 1], [11, 2], [7, 1], [6, 1], [5, 1], [4, 4], [3, 5], [4, 4], [5, 2], [6, 1], [50, 1], [8, 2], [17, 1], [19, 1], [35, 1], [14, 1], [24, 1], [50, 25], [24, 1], [14, 1], [35, 1], [19, 1], [17, 1], [8, 2], [50, 1], [6, 1], [5, 2], [4, 4], [3, 5], [4, 5], [5, 2], [6, 2], [7, 1], [8, 1], [9, 2], [11, 1], [38, 1], [50, 25], [38, 1], [11, 1], [9, 2], [8, 1], [7, 1], [6, 2], [5, 2], [4, 5], [3, 6], [4, 4], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [15, 1], [50, 25], [15, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 4], [3, 7], [4, 5], [5, 3], [6, 3], [7, 1], [9, 1], [42, 1], [21, 1], [50, 23], [21, 1], [42, 1], [9, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 8], [4, 5], [5, 3], [6, 2], [7, 1], [8, 1], [9, 1], [13, 1], [50, 23], [13, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 5], [3, 9], [4, 6], [5, 3], [6, 2], [7, 1], [9, 1], [14, 1], [50, 23], [14, 1], [9, 1], [7, 1], [6, 2], [5, 3], [4, 6], [3, 10], [4, 6], [5, 3], [6, 1], [7, 1], [9, 1], [16, 1], [50, 2], [35, 1], [50, 8], [13, 1], [50, 8], [35, 1], [50, 2], [16, 1], [9, 1], [7, 1], [6, 1], [5, 3], [4, 6], [3, 12], [4, 6], [5, 2], [6, 1], [19, 1], [16, 1], [17, 1], [25, 1], [21, 1], [13, 1], [18, 1], [50, 6], [11, 1], [9, 1], [11, 1], [50, 6], [18, 1], [13, 1], [21, 1], [25, 1], [17, 1], [16, 1], [19, 1], [6, 1], [5, 2], [4, 6], [3, 14], [4, 5], [5, 3], [6, 1], [8, 1], [16, 1], [10, 1], [8, 2], [11, 1], [50, 1], [16, 1], [15, 1], [32, 1], [29, 1], [9, 1], [8, 1], [7, 1], [8, 1], [9, 1], [29, 1], [32, 1], [15, 1], [16, 1], [50, 1], [11, 1], [8, 2], [10, 1], [16, 1], [8, 1], [6, 1], [5, 3], [4, 5], [3, 15], [4, 6], [5, 3], [6, 4], [7, 1], [20, 1], [19, 1], [9, 3], [7, 3], [6, 1], [7, 3], [9, 3], [19, 1], [20, 1], [7, 1], [6, 4], [5, 3], [4, 6], [3, 16], [4, 7], [5, 4], [6, 3], [7, 1], [6, 13], [7, 1], [6, 3], [5, 4], [4, 7], [3, 18], [4, 7], [5, 27], [4, 7], [3, 20], [4, 9], [5, 21], [4, 9], [3, 23], [4, 12], [5, 11], [4, 12], [3, 26], [4, 33], [3, 29], [4, 29], [3, 33], [4, 25], [3, 38], [4, 19], [3, 20], [2, 1], [3, 26], [4, 7], [3, 26], [2, 2], [3, 57], [2, 1]]"; + reportCompare(reference, output.toSource(), summary + ': correctness jit=' + trace); + return (Date.now() - start); +} + + +var timenonjit = f(false); +var timejit = f(true); + +expect = true; +actual = timejit < timenonjit; + +print('time nonjit: ' + timenonjit + ', time jit: ' + timejit); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/js1_8_1/jit/regress-458838.js b/js/src/tests/js1_8_1/jit/regress-458838.js new file mode 100644 index 000000000..b8b19f2d4 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-458838.js @@ -0,0 +1,63 @@ +/* -*- 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 = 458838; +var summary = 'TM: do not fall off trace when nested function accesses var of outer function'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + + function f() { + var a = 1; + function g() { + var b = 0 + for (var i = 0; i < 10; ++i) { + b += a; + } + return b; + } + + return g(); + } + + expect = 10; + actual = f(); + + var recorderStarted; + var recorderAborted; + var traceCompleted; + var skip = true; + + if (this.tracemonkey && !this.tracemonkey.adaptive) + { + recorderStarted = this.tracemonkey.recorderStarted; + recorderAborted = this.tracemonkey.recorderAborted; + traceCompleted = this.tracemonkey.traceCompleted; + skip = false; + } + + + reportCompare(expect, actual, summary + ': return value 10'); + + if (!skip) + { + expect = 'recorderStarted=1, recorderAborted=0, traceCompleted=1'; + actual = 'recorderStarted=' + recorderStarted + ', recorderAborted=' + recorderAborted + ', traceCompleted=' + traceCompleted; + reportCompare(expect, actual, summary + ': trace'); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-462459-01.js b/js/src/tests/js1_8_1/jit/regress-462459-01.js new file mode 100644 index 000000000..97c8a055d --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-01.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace Array()'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + Array(); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-02.js b/js/src/tests/js1_8_1/jit/regress-462459-02.js new file mode 100644 index 000000000..a1836af61 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-02.js @@ -0,0 +1,70 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace Array(1)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + for (var i = 0; i < RUNLOOP; i++) + { + Array(1); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-03.js b/js/src/tests/js1_8_1/jit/regress-462459-03.js new file mode 100644 index 000000000..a6b55e301 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-03.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace Array(1, 2)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + Array(1, 2); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-04.js b/js/src/tests/js1_8_1/jit/regress-462459-04.js new file mode 100644 index 000000000..28e0a02e7 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-04.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace Array(1, 2, 3)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + Array(1, 2, 3); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-05.js b/js/src/tests/js1_8_1/jit/regress-462459-05.js new file mode 100644 index 000000000..7f8e5539c --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-05.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace new Array()'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + new Array(); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-06.js b/js/src/tests/js1_8_1/jit/regress-462459-06.js new file mode 100644 index 000000000..a43dc0de0 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-06.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace new Array(1)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + new Array(1); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-07.js b/js/src/tests/js1_8_1/jit/regress-462459-07.js new file mode 100644 index 000000000..c1349c696 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-07.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace new Array(1, 2)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + new Array(1, 2); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-08.js b/js/src/tests/js1_8_1/jit/regress-462459-08.js new file mode 100644 index 000000000..4d3431495 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-08.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace new Array(1, 2, 3)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + new Array(1, 2, 3); + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-09.js b/js/src/tests/js1_8_1/jit/regress-462459-09.js new file mode 100644 index 000000000..40c3c7961 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-09.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace []'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + []; + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-10.js b/js/src/tests/js1_8_1/jit/regress-462459-10.js new file mode 100644 index 000000000..6d6c3e3f4 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-10.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace [1]'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + [1]; + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-11.js b/js/src/tests/js1_8_1/jit/regress-462459-11.js new file mode 100644 index 000000000..9d4ca8461 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-11.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace [1, 2]'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + [1, 2]; + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-462459-12.js b/js/src/tests/js1_8_1/jit/regress-462459-12.js new file mode 100644 index 000000000..c0f2d5e0b --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-462459-12.js @@ -0,0 +1,71 @@ +/* -*- 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 = 462459; +var summary = 'TM: trace [1, 2, 3]'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +if (!this.tracemonkey || this.tracemonkey.adaptive) +{ + expect = actual = 'Test skipped due to lack of tracemonkey jitstats'; + reportCompare(expect, actual, summary); +} +else +{ + + expect = 'recorder started, recorder not aborted, trace completed'; + actual = ''; + + var recorderStartedStart = this.tracemonkey.recorderStarted; + var recorderAbortedStart = this.tracemonkey.recorderAborted; + var traceCompletedStart = this.tracemonkey.traceCompleted; + + + for (var i = 0; i < RUNLOOP; i++) + { + [1, 2, 3]; + } + + + var recorderStartedEnd = this.tracemonkey.recorderStarted; + var recorderAbortedEnd = this.tracemonkey.recorderAborted; + var traceCompletedEnd = this.tracemonkey.traceCompleted; + + if (recorderStartedEnd > recorderStartedStart) + { + actual = 'recorder started, '; + } + else + { + actual = 'recorder not started, '; + } + + if (recorderAbortedEnd > recorderAbortedStart) + { + actual += 'recorder aborted, '; + } + else + { + actual += 'recorder not aborted, '; + } + + if (traceCompletedEnd > traceCompletedStart) + { + actual += 'trace completed'; + } + else + { + actual += 'trace not completed'; + } + + reportCompare(expect, actual, summary); +} + diff --git a/js/src/tests/js1_8_1/jit/regress-469927.js b/js/src/tests/js1_8_1/jit/regress-469927.js new file mode 100644 index 000000000..01d208abb --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-469927.js @@ -0,0 +1,44 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 469927; +var summary = 'TM: jit should not slow down short loop with let'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function letitbe() { + var start = new Date(); + for (let i = 0; i < 500000; ++i) { + for (let j = 0; j < 4; ++j) { } + } + var stop = new Date(); + return stop - start; + } + + var timenonjit = letitbe(); + var timejit = letitbe(); + + print('time: nonjit = ' + timenonjit + ', jit = ' + timejit); + + expect = true; + actual = timejit < timenonjit; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-470739.js b/js/src/tests/js1_8_1/jit/regress-470739.js new file mode 100644 index 000000000..8e8d2c5d0 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-470739.js @@ -0,0 +1,46 @@ +// |reftest| skip -- bogus perf test (bug 540512) +/* -*- 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 = 470739; +var summary = 'TM: never abort on =='; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function loop() + { + var i; + var start = new Date(); + + for(i=0;i<500000;++i) { var r = (void 0) == null; } + + var stop = new Date(); + return stop - start; + } + + var timenonjit = loop(); + var timejit = loop(); + + print('time: nonjit = ' + timenonjit + ', jit = ' + timejit); + + expect = true; + actual = timejit < timenonjit; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-471635.js b/js/src/tests/js1_8_1/jit/regress-471635.js new file mode 100644 index 000000000..c37a9e9fb --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-471635.js @@ -0,0 +1,56 @@ +/* -*- 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 = 471635; +var summary = 'TM: trace js shell print()'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + + (function(){ + for (var i = 1; i < 20; ++i) { + print("#"); + } + })(); + + var recorderStarted; + var recorderAborted; + var traceCompleted; + var skip = true; + + if (this.tracemonkey && !this.tracemonkey.adaptive) + { + recorderStarted = this.tracemonkey.recorderStarted; + recorderAborted = this.tracemonkey.recorderAborted; + traceCompleted = this.tracemonkey.traceCompleted; + skip = false; + } + + + if (!skip) + { + expect = 'recorderStarted=1, recorderAborted=0, traceCompleted=1'; + actual = 'recorderStarted=' + recorderStarted + ', recorderAborted=' + recorderAborted + ', traceCompleted=' + traceCompleted; + } + else + { + expect = actual = 'Test skipped due to lack of tracemonkey jitstats object.'; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/jit/regress-489682.js b/js/src/tests/js1_8_1/jit/regress-489682.js new file mode 100644 index 000000000..fd5dee8a9 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/regress-489682.js @@ -0,0 +1,31 @@ +/* -*- 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 = 489682; +var summary = 'TM: wrong number with nested type-unstable loops'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +var v = 0; + +for each (var a in [0, {}, {}, {}]) { + print(v); + v = v >>> 0; + for each (var b in [{}, {}, new String(''), 42, new String(''), {}, 42]) + { + } + } +print(v); + + +expect = '0'; +actual = v + ''; + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/js1_8_1/jit/shell.js b/js/src/tests/js1_8_1/jit/shell.js new file mode 100644 index 000000000..63f283b96 --- /dev/null +++ b/js/src/tests/js1_8_1/jit/shell.js @@ -0,0 +1,4 @@ +// The loop count at which we trace +const RECORDLOOP = this.tracemonkey ? tracemonkey.HOTLOOP : 8; +// The loop count at which we run the trace +const RUNLOOP = RECORDLOOP + 1; diff --git a/js/src/tests/js1_8_1/regress/browser.js b/js/src/tests/js1_8_1/regress/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/regress/browser.js diff --git a/js/src/tests/js1_8_1/regress/regress-452498-006.js b/js/src/tests/js1_8_1/regress/regress-452498-006.js new file mode 100644 index 000000000..63fffd211 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-006.js @@ -0,0 +1,45 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #6 From Andreas Gal :gal + + function foo() { + var x = 4; + var f = (function() { return x++; }); + var g = (function() { return x++; }); + return [f,g]; + } + + var bar = foo(); + + expect = '9'; + actual = 0; + + bar[0](); + bar[1](); + + actual = String(expect); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-027.js b/js/src/tests/js1_8_1/regress/regress-452498-027.js new file mode 100644 index 000000000..3583fa03b --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-027.js @@ -0,0 +1,38 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '5'; + +// ------- Comment #27 From Brendan Eich + + function f(x){function g(y)x+y;return g} + g = f(2); + + actual = String(g(3)); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} + + + diff --git a/js/src/tests/js1_8_1/regress/regress-452498-030.js b/js/src/tests/js1_8_1/regress/regress-452498-030.js new file mode 100644 index 000000000..1d8b41908 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-030.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #30 From Mike Shaver + + function f() { var i = 0; var i = 5; } + f(); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-040.js b/js/src/tests/js1_8_1/regress/regress-452498-040.js new file mode 100644 index 000000000..8bd97207a --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-040.js @@ -0,0 +1,37 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #40 From Jesse Ruderman + + function m() + { + function a() { } + function b() { a(); } + this.c = function () { b(); } + } + (new m).c(); + + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-050.js b/js/src/tests/js1_8_1/regress/regress-452498-050.js new file mode 100644 index 000000000..309242a62 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-050.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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #50 From Jason Orendorff + +// Do not crash + +// compiler bug when a block introduces no names + { let {}={}; } + + try + { +// compiler incorrectly emits GETLOCAL for first `x`, +// triggering decompiler assertion + while (x.y) { let x; } + } + catch(ex) + { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-051.js b/js/src/tests/js1_8_1/regress/regress-452498-051.js new file mode 100644 index 000000000..cd5554e74 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-051.js @@ -0,0 +1,48 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #51 From Jason Orendorff + +// Assertion failure: UPVAR_FRAME_SKIP(uva->vector[i]) == 0 +// at ../jsopcode.cpp:2791 +// +// when decompiling the eval code, which is: +// +// main: +// 00000: 10 getupvar 0 +// 00003: 10 getprop "y" +// 00006: 10 popv +// 00007: 10 stop + try + { + function f() { var x; eval("x.y"); } + f(); + } + catch(ex) + { + } + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-052-a.js b/js/src/tests/js1_8_1/regress/regress-452498-052-a.js new file mode 100644 index 000000000..0f55d9324 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-052-a.js @@ -0,0 +1,42 @@ +// |reftest| skip-if(Android) +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #52 From Jason Orendorff + + +// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:444 +// Here the function node has been morphed into a JSOP_TRUE node, but we're in +// FindFunArgs poking it anyway. + if (typeof timeout == 'function') + { + expectExitCode(6); + timeout(3); + while(function(){}); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-053.js b/js/src/tests/js1_8_1/regress/regress-452498-053.js new file mode 100644 index 000000000..9f70a0f74 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-053.js @@ -0,0 +1,80 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #53 From Jason Orendorff + +// Assertion failure: (slot) < (uint32_t)(obj)->dslots[-1] +// at ../jsobj.cpp:5559 +// On the last line of BindLet, we have +// JS_SetReservedSlot(cx, blockObj, index, PRIVATE_TO_JSVAL(pn)); +// but this uses reserved slots as though they were unlimited. +// blockObj only has 2. + { let a=0, b=1, c=2; } + +// In RecycleTree at ../jsparse.cpp:315, we hit +// MOZ_CRASH("RecycleUseDefKids"); +// pn->pn_type is TOK_UNARYOP +// pn->pn_op is JSOP_XMLNAME +// pn->pn_defn is 1 +// pn->pn_used is 1 + try + { + true; 0; + } + catch(ex) + { + } +// Calls LinkUseToDef with pn->pn_defn == 1. +// +// If you say "var x;" first, then run this case, it gets further, +// crashing in NoteLValue like the first case in comment 52. +// + try + { + for (var [x] in y) var x; + } + catch(ex) + { + } +// Assertion failure: !pn2->pn_defn, at ../jsparse.h:461 +// Another case where some optimization is going on. + try + { + if (true && foo) ; + } + catch(ex) + { + } +// Assertion failure: scope->object == ctor +// in js_FastNewObject at ../jsbuiltins.cpp:237 +// +// With the patch, we're new-ing a different function each time, and the +// .prototype property is missing. +// + for (var z = 0; z < 3; z++) { (new function(){}); } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-058.js b/js/src/tests/js1_8_1/regress/regress-452498-058.js new file mode 100644 index 000000000..ac2ba0f7a --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-058.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #58 From Gary Kwong [:nth10sd] + + function foo(x) { var x = x } + +// Assertion failure: dn->kind() == ((data->op == JSOP_DEFCONST) ? JSDefinition::CONST : JSDefinition::VAR), at ../jsparse.cpp:2595 + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-062.js b/js/src/tests/js1_8_1/regress/regress-452498-062.js new file mode 100644 index 000000000..f28c29bbf --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-062.js @@ -0,0 +1,44 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #62 From Gary Kwong [:nth10sd] + + try + { + eval( + '(function(){' + + ' var x;' + + ' this.init_by_array = function()' + + ' x = 0;' + + '})();' + ); + } + catch(ex) + { + } + +// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5686 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-063.js b/js/src/tests/js1_8_1/regress/regress-452498-063.js new file mode 100644 index 000000000..970dfeca6 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-063.js @@ -0,0 +1,35 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #63 From Brendan Eich + + function f(that) { + for (ix in this) + print(ix); + for (let ix in that) + ; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-071.js b/js/src/tests/js1_8_1/regress/regress-452498-071.js new file mode 100644 index 000000000..647677877 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-071.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #71 From Jesse Ruderman + + x; var x +// Assertion failure: pn->pn_op == JSOP_NOP, at ../jsparse.cpp:1118 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-072.js b/js/src/tests/js1_8_1/regress/regress-452498-072.js new file mode 100644 index 000000000..99e540c77 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-072.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #72 From Jesse Ruderman + + v = function p() { delete p; }; +// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1711 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-073.js b/js/src/tests/js1_8_1/regress/regress-452498-073.js new file mode 100644 index 000000000..9de10e87b --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-073.js @@ -0,0 +1,38 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #73 From Jesse Ruderman + + try + { + eval('function() { var arguments }'); + } + catch(ex) + { + } + +// Assertion failure: (uintN)i < ss->top, at ../jsopcode.cpp:2801 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-074.js b/js/src/tests/js1_8_1/regress/regress-452498-074.js new file mode 100644 index 000000000..d7f920d4a --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-074.js @@ -0,0 +1,34 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '1'; + +// ------- Comment #74 From Jesse Ruderman + + const [d] = [1]; print(actual = d); + + actual = String(actual); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-075.js b/js/src/tests/js1_8_1/regress/regress-452498-075.js new file mode 100644 index 000000000..7b5945719 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-075.js @@ -0,0 +1,32 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #75 From Jesse Ruderman + + (function p(){ p = 3; }); + (function p(){ p = 3; return p; })() +// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2980 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-076.js b/js/src/tests/js1_8_1/regress/regress-452498-076.js new file mode 100644 index 000000000..925f3db03 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-076.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #76 From Jesse Ruderman + + for (let d = 0; d < 4; ++d) { d; } +// 1: ReferenceError: d is not defined + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-079.js b/js/src/tests/js1_8_1/regress/regress-452498-079.js new file mode 100644 index 000000000..d8b3a1f1d --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-079.js @@ -0,0 +1,34 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #79 From Jason Orendorff + + x; var x; function x() 0 + +// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:635 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-082.js b/js/src/tests/js1_8_1/regress/regress-452498-082.js new file mode 100644 index 000000000..5568cf8f5 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-082.js @@ -0,0 +1,84 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #82 From Gary Kwong [:nth10sd] + +// ===== + + (function(){function x(){} {let x = [] }}); + +// ===== + + var f = new Function("new function x(){ return x |= function(){} } ([], function(){})"); + "" + f; + +// ===== + + uneval(function(){[y] = [x];}); + +// ===== + + function g(code) + { + var f = new Function(code); + f(); + } + g("for (var x = 0; x < 3; ++x)(new (function(){})());"); + +// ===== + try + { + eval( + 'for(let [\n' + + 'function x () { M:if([1,,]) }\n' + ); + } + catch(ex) + { + } + +// ===== + + try + { + function foo(code) + { + var c; + eval("const c, x5 = c;"); + } + foo(); + } + catch(ex) + { + } + +// ===== + + var f = new Function("[] = [( '' )()];"); + "" + f; + +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-092.js b/js/src/tests/js1_8_1/regress/regress-452498-092.js new file mode 100644 index 000000000..54d42c8af --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-092.js @@ -0,0 +1,40 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #92 From Jesse Ruderman + + expect = 'SyntaxError: redeclaration of formal parameter e'; + try + { + eval('(function (e) { var e; const e = undefined; });'); + } + catch(ex) + { + actual = ex + ''; + } +// Without patch: "SyntaxError: redeclaration of var e" +// expected new behavior // With patch: "SyntaxError: redeclaration of formal parameter e:" + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-101.js b/js/src/tests/js1_8_1/regress/regress-452498-101.js new file mode 100644 index 000000000..5bd15b2b7 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-101.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #101 From Gary Kwong [:nth10sd] + + uneval(function(){with({functional: []}){x5, y = this;const y = undefined }}); +// Assertion failure: strcmp(rval, with_cookie) == 0, at ../jsopcode.cpp:2567 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-102.js b/js/src/tests/js1_8_1/regress/regress-452498-102.js new file mode 100644 index 000000000..0aa60e4ec --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-102.js @@ -0,0 +1,69 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #102 From Gary Kwong [:nth10sd] + +// ===== + + (function(){function x(){} function x()y})(); + +// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710 + +// ===== + function f() { + "" + (function(){ + for( ; [function(){}] ; x = 0) + with({x: ""}) { + const x = [] + }}); + } + f(); + +// Assertion failure: ss->top - saveTop <= 1U, at ../jsopcode.cpp:2156 + +// ===== + + try + { + function f() { + var x; + eval("const x = [];"); + } + f(); + } + catch(ex) + { + } +// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2984 + +// Assertion failure: cg->staticLevel >= level, at ../jsemit.cpp:2014 +// Crash [@ BindNameToSlot] in opt without -j + +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} + + + diff --git a/js/src/tests/js1_8_1/regress/regress-452498-104.js b/js/src/tests/js1_8_1/regress/regress-452498-104.js new file mode 100644 index 000000000..19ade2695 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-104.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #104 From Jesse Ruderman + + (function(a) { function b() { a; } function a() { } })(); +// Assertion failure: pn_defn, at ../jsparse.h:655 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-111.js b/js/src/tests/js1_8_1/regress/regress-452498-111.js new file mode 100644 index 000000000..0a6cb99a6 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-111.js @@ -0,0 +1,34 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #111 From Gary Kwong [:nth10sd] + +new Function("{function x(){}}"); + +// Assertion failure: pn->pn_defn || (fun->flags & JSFUN_LAMBDA), at ../jsemit.cpp:4149 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} + + diff --git a/js/src/tests/js1_8_1/regress/regress-452498-112.js b/js/src/tests/js1_8_1/regress/regress-452498-112.js new file mode 100644 index 000000000..19aa63b10 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-112.js @@ -0,0 +1,39 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #112 From Jesse Ruderman + + expect = 'ReferenceError: can\'t access lexical declaration `q\' before initialization'; + + try + { + q = new Function("(function() { q(3); })(); const q = undefined;"); q(); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-114-a.js b/js/src/tests/js1_8_1/regress/regress-452498-114-a.js new file mode 100644 index 000000000..5d753f9eb --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-114-a.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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #114 From Gary Kwong [:nth10sd] + + if (typeof timeout == 'function') + { + timeout(3); + try + { + eval('while(x|={}) with({}) const x;'); + } + catch(ex) + { + } + reportCompare(expect, actual, ''); + } + +// Assertion failure: cg->stackDepth >= 0, at ../jsemit.cpp:185 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-114.js b/js/src/tests/js1_8_1/regress/regress-452498-114.js new file mode 100644 index 000000000..8962ca956 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-114.js @@ -0,0 +1,50 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #114 From Gary Kwong [:nth10sd] + + for (var x = 0; x < 3; ++x){ y = function (){} } + +// glorp! +// Assertion failed: "Constantly false guard detected": 0 (../nanojit/LIR.cpp:999) +// (note, this is with -j; I don't know what the glorp! message is about.) + +// ===== + function y([{x: x, y}]){} + +// Assertion failure: UPVAR_FRAME_SKIP(pn->pn_cookie) == (pn->pn_defn ? cg->staticLevel : 0), at ../jsemit.cpp:3547 + +// ===== + + try + { + eval("(1.3.__defineGetter__(\"\"));let (y, x) { var z = true, x = 0; }"); + } + catch(ex) + { + } +// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5691 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-116.js b/js/src/tests/js1_8_1/regress/regress-452498-116.js new file mode 100644 index 000000000..c81b2b892 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-116.js @@ -0,0 +1,33 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #116 From Gary Kwong [:nth10sd] + +// -j + (new Function("for (var x = 0; x < 3; ++x) { (function(){})() } "))(); + +//Crash [@ js_IsActiveWithOrBlock] + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-117.js b/js/src/tests/js1_8_1/regress/regress-452498-117.js new file mode 100644 index 000000000..ce37ea418 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-117.js @@ -0,0 +1,95 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #117 From Gary Kwong [:nth10sd] + +// The following all do not require -j. + +// ===== + + try + { + eval('x; function x(){}; const x = undefined;'); + } + catch(ex) + { + } + +// Assertion failure: !pn->isPlaceholder(), at ../jsparse.cpp:4876 +// ===== + (function(){ var x; eval("var x; x = null"); })(); + +// Assertion failure: !(pnu->pn_dflags & PND_BOUND), at ../jsemit.cpp:1818 +// ===== + (function(){const x = 0, y = delete x;})() + +// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710 +// ===== + try + { + (function(){(yield []) (function(){with({}){x} }); const x = undefined;})(); + } + catch(ex) + { + } + +// Assertion failure: pnu->pn_lexdef == dn, at ../jsemit.cpp:1817 +// ===== + uneval(function(){arguments = ({ get y(){} }); for(var [arguments] in y ) (x);}); + +// Assertion failure: n != 0, at ../jsfun.cpp:2689 +// ===== + try + { + eval('(function(){{for(c in (function (){ for(x in (x1))window} )()) {const x = undefined;} }})();'); + } + catch(ex) + { + } + +// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1537 +// Opt crash [@ js_NewFlatClosure] near null +// ===== + "" + function(){for(var [x] in x1) ([]); function x(){}} + +// Assertion failure: cg->stackDepth == stackDepth, at ../jsemit.cpp:3664 +// Opt crash [@ JS_ArenaRealloc] near null +// ===== + try + { + eval( + "for (a in (function(){" + + " for each (let x in ['']) { return new function x1 (\u3056) { yield x } ();" + + " }})())" + + " function(){}" + ); + } + catch(ex) + { + } +// Crash [@ js_Interpret] near null +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-118.js b/js/src/tests/js1_8_1/regress/regress-452498-118.js new file mode 100644 index 000000000..4c4ee1750 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-118.js @@ -0,0 +1,33 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #118 From Jesse Ruderman + + (function() { (function() { e *= 4; })(); var e; })(); + +//Without patch: no output +//With patch: ReferenceError: reference to undefined property "e" + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-121.js b/js/src/tests/js1_8_1/regress/regress-452498-121.js new file mode 100644 index 000000000..99cecd79b --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-121.js @@ -0,0 +1,33 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #121 From Gary Kwong [:nth10sd] + +// without -j + x = function()x; + +// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-123.js b/js/src/tests/js1_8_1/regress/regress-452498-123.js new file mode 100644 index 000000000..ec9973fdd --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-123.js @@ -0,0 +1,59 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + +// ------- Comment #123 From Gary Kwong [:nth10sd] + +// Does not require -j: +// ===== + try + { + eval('y = (function (){y} for (x in []);'); + } + catch(ex) + { + } + +// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651 +// ===== + (function(){for(var x in [arguments]){} function x(){}})(); + +// Assertion failure: dn->pn_defn, at ../jsemit.cpp:1873 +// ===== + + +// Requires -j: +// ===== + (function(){ eval("for (x in ['', {}, '', {}]) { this; }" )})(); + +// Assertion failure: fp->thisp == fp->argv[-1].toObjectOrNull(), at ../jstracer.cpp:4172 +// ===== + for each (let x in ['', '', '']) { (new function(){} )} + +// Assertion failure: scope->object == ctor, at ../jsbuiltins.cpp:236 +// Opt crash [@ js_FastNewObject] near null +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-129.js b/js/src/tests/js1_8_1/regress/regress-452498-129.js new file mode 100644 index 000000000..b7f3c1474 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-129.js @@ -0,0 +1,50 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #129 From Gary Kwong [:nth10sd] + +// Does not require -j: +// ===== +try { + eval("({ set x x () { for(x in function(){}){}} })"); +} catch (e) +{ +} + +// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710 +// ===== + +try +{ + (function (){ eval("(function(){delete !function(){}});"); })(); +} +catch(ex) +{ +} +// Debug crash [@ JSParseNode::isFunArg] at null +// Opt crash [@ FindFunArgs] near null +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-131.js b/js/src/tests/js1_8_1/regress/regress-452498-131.js new file mode 100644 index 000000000..d4cb82384 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-131.js @@ -0,0 +1,49 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #131 From Gary Kwong [:nth10sd] + +// Does not require -j: +// ===== + try + { + eval('((__defineGetter__, function (x) { function x(){} }) for'); + } + catch(ex) + { + } +// Assertion failure: pn->pn_cookie == FREE_UPVAR_COOKIE, at ../jsparse.cpp:5698 +// ===== + try + { + eval('( "" ? 1.3 : x); *::*; x::x;'); + } + catch(ex) + { + } +// Assertion failure: pn != dn->dn_uses, at ../jsparse.cpp:1171 +// ===== + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-135.js b/js/src/tests/js1_8_1/regress/regress-452498-135.js new file mode 100644 index 000000000..b2bf72fab --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-135.js @@ -0,0 +1,46 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #135 From Gary Kwong [:nth10sd] + +// -j is not required: +// === + + for (let i = 0; i < 9; ++i) { + let m = i; + if (i % 3 == 1) { + print('' + (function() { return m; })()); + } + } + +// Debug & opt crash [@ BindNameToSlot] + +// -j is required: +// === + for (let a=0;a<3;++a) for (let b=0;b<3;++b) if ((g=a|(a%b))) with({}){} + +// Assertion failure: OBJ_IS_CLONED_BLOCK(obj), at ../jsobj.cpp:2392 + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-155.js b/js/src/tests/js1_8_1/regress/regress-452498-155.js new file mode 100644 index 000000000..5798569fa --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-155.js @@ -0,0 +1,34 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + delete (1 ? window : function(){}); + } + catch(ex) + { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-160.js b/js/src/tests/js1_8_1/regress/regress-452498-160.js new file mode 100644 index 000000000..6498a0b5a --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-160.js @@ -0,0 +1,34 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #160 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// crash [@ js_Interpret] + (eval("(function(){ this.watch(\"x\", function () { new function ()y } ); const y = undefined });"))(); + x = NaN; + reportCompare(expect, actual, summary + ': 2'); + +// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:5916 + ({ set z(v){}, set y(v)--x, set w(v)--w }); + reportCompare(expect, actual, summary + ': 3'); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-168-1.js b/js/src/tests/js1_8_1/regress/regress-452498-168-1.js new file mode 100644 index 000000000..c94653e49 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-168-1.js @@ -0,0 +1,33 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #168 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1543 + + ( + new Function("const x = (function () { if (1e+81){} else{x} } )" + ))(); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-168-2.js b/js/src/tests/js1_8_1/regress/regress-452498-168-2.js new file mode 100644 index 000000000..b41a5211c --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-168-2.js @@ -0,0 +1,32 @@ +// |reftest| skip -- slow +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #168 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// Assertion failure: cg->upvars.lookup(atom), at ../jsemit.cpp:2047 + + for (let x; __defineSetter__; (<{x}></{x}> for (x in x))) {} + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-176.js b/js/src/tests/js1_8_1/regress/regress-452498-176.js new file mode 100644 index 000000000..77460e789 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-176.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #176 From Gary Kwong + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:449 + + if(delete( 5 ? [] : (function(){})() )) []; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-181.js b/js/src/tests/js1_8_1/regress/regress-452498-181.js new file mode 100644 index 000000000..df5f3a160 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-181.js @@ -0,0 +1,31 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #181 From Jesse Ruderman + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 3; + + (function(print) { delete print; })(); print(actual = 3); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-185.js b/js/src/tests/js1_8_1/regress/regress-452498-185.js new file mode 100644 index 000000000..1c88dc348 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-185.js @@ -0,0 +1,37 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #185 From Jesse Ruderman + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'SyntaxError: redeclaration of var e'; + try + { + eval('{ var e = 3; let e = ""; } print(typeof e);'); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-187.js b/js/src/tests/js1_8_1/regress/regress-452498-187.js new file mode 100644 index 000000000..e4138ba28 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-187.js @@ -0,0 +1,36 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #187 From Jesse Ruderman + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + eval('const x = undefined; for (x in []);'); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-191.js b/js/src/tests/js1_8_1/regress/regress-452498-191.js new file mode 100644 index 000000000..1628d7f87 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-191.js @@ -0,0 +1,47 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #191 From Brendan Eich + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = actual = 'No Error'; + try + { + eval('{ var x; {let x;} }'); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + expect = 'SyntaxError: redeclaration of let x'; + try + { + eval('{ let x; {var x;} }'); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-452498-192.js b/js/src/tests/js1_8_1/regress/regress-452498-192.js new file mode 100644 index 000000000..6f176788b --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-452498-192.js @@ -0,0 +1,30 @@ +/* -*- 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 = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + +//------- Comment #192 From Brendan Eich + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + let x; + with({x: (x -= 0)}){([]); const x = undefined; } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-466905-01.js b/js/src/tests/js1_8_1/regress/regress-466905-01.js new file mode 100644 index 000000000..882f8d7e3 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-466905-01.js @@ -0,0 +1,30 @@ +/* -*- 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 = 466905; +var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function f(a) { for each (let c in a) [(c > 5) ? 'A' : 'B']; } + f([true, 8]); + f([2]); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-466905-02.js b/js/src/tests/js1_8_1/regress/regress-466905-02.js new file mode 100644 index 000000000..89872af19 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-466905-02.js @@ -0,0 +1,29 @@ +/* -*- 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 = 466905; +var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (var i = 0; i < 5; i++) + [(i > 3) ? 'a' : 'b']; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-479430-01.js b/js/src/tests/js1_8_1/regress/regress-479430-01.js new file mode 100644 index 000000000..c61cea7d4 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-479430-01.js @@ -0,0 +1,44 @@ +// |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 = 479430; +var summary = 'Missing operation callback checks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof timeout == 'function') + { + expectExitCode(6); + + timeout(0.01); + + function f(n) + { + if (n != 0) { + f(n - 1); + f(n - 1); + } + } + + f(100); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-479430-02.js b/js/src/tests/js1_8_1/regress/regress-479430-02.js new file mode 100644 index 000000000..04e6fca89 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-479430-02.js @@ -0,0 +1,46 @@ +// |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 = 479430; +var summary = 'Missing operation callback checks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof timeout == 'function') + { + expectExitCode(6); + + timeout(0.01); + + function f(n) + { + if (n != 0) { + try { f(n - 1); } catch (e) {} + try { f(n - 1); } catch (e) {} + } + throw 0; + } + + f(100); + + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-479430-03.js b/js/src/tests/js1_8_1/regress/regress-479430-03.js new file mode 100644 index 000000000..dcac2bfb5 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-479430-03.js @@ -0,0 +1,49 @@ +// |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 = 479430; +var summary = 'Missing operation callback checks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof timeout == 'function') + { + expectExitCode(6); + + timeout(0.01); + + function f(n) + { + if (n != 0) { + f(n - 1); + f(n - 1); + } + try { + return 0; + } finally { + n++; + } + } + + f(100); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-479430-04.js b/js/src/tests/js1_8_1/regress/regress-479430-04.js new file mode 100644 index 000000000..7ddcea3b0 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-479430-04.js @@ -0,0 +1,45 @@ +// |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 = 479430; +var summary = 'Missing operation callback checks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof timeout== 'function') + { + expectExitCode(6); + + timeout(0.01); + + function f(n) + { + if (n != 0) { + try { f(n - 1); } catch (e) {} + try { f(n - 1); } catch (e) {} + } + name_that_does_not_exists; + } + + f(100); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-479430-05.js b/js/src/tests/js1_8_1/regress/regress-479430-05.js new file mode 100644 index 000000000..b811202f8 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-479430-05.js @@ -0,0 +1,44 @@ +// |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 = 479430; +var summary = 'Missing operation callback checks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + if (typeof timeout == 'function') + { + expectExitCode(6); + + timeout(0.01); + + function f(n) + { + if (n != 0) { + try { f(n - 1); } finally { f(n - 1); } + } + name_that_does_not_exists; + } + + f(100); + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-495773.js b/js/src/tests/js1_8_1/regress/regress-495773.js new file mode 100644 index 000000000..53c0387a7 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-495773.js @@ -0,0 +1,42 @@ +/* -*- 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 = 495773; +var summary = 'Read upvar from trace-entry frame from JSStackFrame instead of tracing native stack'; +var actual = '' +var expect = '010101'; +//----------------------------------------------------------------------------- +function f() { + var q = []; + for (var a = 0; a < 3; ++a) { + (function () { + for (var b = 0; b < 2; ++b) { + (function () { + for (var c = 0; c < 1; ++c) { + q.push(b); + } + })(); + } + })(); + } + return q.join(""); +} + +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + actual = f(); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-495907.js b/js/src/tests/js1_8_1/regress/regress-495907.js new file mode 100644 index 000000000..12ac1ef83 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-495907.js @@ -0,0 +1,34 @@ +/* -*- 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 = 495907; +var summary = 'Read upvar from trace-entry frame when created with top-level let'; +var actual = '' +var expect = '00112233'; +//----------------------------------------------------------------------------- + +// The test code needs to run at top level in order to expose the bug. +start_test(); + +var o = []; +for (let a = 0; a < 4; ++a) { + (function () {for (var b = 0; b < 2; ++b) {o.push(a);}}()); +} +actual = o.join(""); + +finish_test(); +//----------------------------------------------------------------------------- + +function start_test() { + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); +} + +function finish_test() { + reportCompare(expect, actual, summary); + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-496922.js b/js/src/tests/js1_8_1/regress/regress-496922.js new file mode 100644 index 000000000..7b32c26c1 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-496922.js @@ -0,0 +1,38 @@ +/* -*- 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 = 496922; +var summary = 'Incorrect handling of extra arguments'; +var actual = '' +var expect = '0,0,1,1,2,2,3,3'; + + +//----------------------------------------------------------------------------- + +// The code must run as part of the top-level script in order to get the bug. +enterFunc ('test'); +printBugNumber(BUGNUMBER); +printStatus (summary); + +var a = []; +{ +let f = function() { + for (let x = 0; x < 4; ++x) { + (function() { + for (let y = 0; y < 2; ++y) { + a.push(x); + } + })() + } +}; (function() {})() + f(99) +} +actual = '' + a; + +reportCompare(expect, actual, summary); +exitFunc ('test'); +//----------------------------------------------------------------------------- + diff --git a/js/src/tests/js1_8_1/regress/regress-507053.js b/js/src/tests/js1_8_1/regress/regress-507053.js new file mode 100644 index 000000000..ace72f326 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-507053.js @@ -0,0 +1,46 @@ +/* -*- 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 = 507053; +var summary = 'TM: invalid results with setting a closure variable in a loop' +var actual = ''; +var expect = '2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,'; + + +//----------------------------------------------------------------------------- +start_test(); + +var f = function() { + var p = 1; + + function g() { + for (var i = 0; i < 5; ++i) { + p = p * 2; + actual += p + ','; + } + } + g(); +} + +for (var i = 0; i < 5; ++i) { + f(); +} + +finish_test(); +//----------------------------------------------------------------------------- + +function start_test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); +} + +function finish_test() +{ + reportCompare(expect, actual, summary); + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-507295.js b/js/src/tests/js1_8_1/regress/regress-507295.js new file mode 100644 index 000000000..7a1de77e0 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-507295.js @@ -0,0 +1,41 @@ +/* -*- 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 = 507295; +var summary = 'TM: assert with using result of assignment to closure var' +var actual = ''; +var expect = 'do not crash'; + + +//----------------------------------------------------------------------------- +start_test(); + +(function () { + var y; + (eval("(function () {\ + for (var x = 0; x < 3; ++x) {\ + ''.replace(/a/, (y = 3))\ + }\ + });\ + "))() +})() + +actual = 'do not crash' +finish_test(); +//----------------------------------------------------------------------------- + +function start_test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); +} + +function finish_test() +{ + reportCompare(expect, actual, summary); + exitFunc ('test'); +} diff --git a/js/src/tests/js1_8_1/regress/regress-509354.js b/js/src/tests/js1_8_1/regress/regress-509354.js new file mode 100644 index 000000000..cbf4cfc59 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-509354.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff <jorendorff@mozilla.com> + */ + +// Decompile destructuring argument named `arguments` correctly. +var actual = "" + function ([arguments]) {return arguments;}; +compareSource('function ([arguments]) {return arguments;}', actual, "part 1"); + +// Make sure the 'arguments' argument actually works. +var f = function ([arguments]) {return arguments + 1;}; +reportCompare(3.25, f([2.25]), "part 2"); + +// Throw SyntaxError when `arguments` appears twice in a destructuring parameter. +actual = "no exception"; +try { + eval('(function ([arguments, arguments]) {return arguments();})'); +} catch (exc) { + actual = exc.name; +} +reportCompare("SyntaxError", actual, "part 3"); + +// And again... +actual = "no exception"; +try { + eval('(function ([a, b, arguments, d], [e, f, arguments]) {return arguments();})'); +} catch (exc) { + actual = exc.name; +} +reportCompare("SyntaxError", actual, "part 4"); + +// The original test case from bug 509354. Don't crash. +try { + eval('print(function([arguments,arguments,arguments,arguments,arguments,' + + 'arguments,arguments,arguments,arguments,arguments,arguments,' + + 'arguments,arguments,arguments,arguments,arguments]){})'); +} catch (exc) { +} +reportCompare("no crash", "no crash", "part 5"); + diff --git a/js/src/tests/js1_8_1/regress/regress-522123.js b/js/src/tests/js1_8_1/regress/regress-522123.js new file mode 100644 index 000000000..7a491e094 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-522123.js @@ -0,0 +1,38 @@ +/* -*- 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 = 522123; +var summary = 'Indirect eval confuses scope chain'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +var x=1; + +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 1; + + evil=eval; + { + let x=2; + actual = evil("x"); + }; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} + +reportCompare(true, true); diff --git a/js/src/tests/js1_8_1/regress/regress-524264.js b/js/src/tests/js1_8_1/regress/regress-524264.js new file mode 100644 index 000000000..78006bd6c --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-524264.js @@ -0,0 +1,7 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ +uneval(function () { do yield; while (0); }); +reportCompare("no assertion failure", "no assertion failure", "bug 524264"); diff --git a/js/src/tests/js1_8_1/regress/regress-524743.js b/js/src/tests/js1_8_1/regress/regress-524743.js new file mode 100644 index 000000000..8bd3cd6ee --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-524743.js @@ -0,0 +1,20 @@ +// |reftest| skip-if((isDebugBuild&&!xulRuntime.shell)||Android) -- hang +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/licenses/publicdomain/ + +if (typeof gczeal != 'undefined' && typeof gc != 'undefined') { + try + { + gczeal(2); + var obj = {}; + for (var i = 0; i < 50; i++) { + obj["_" + i] = 0; + gc(); + } + } + catch(ex) + { + } + gczeal(0); +} +reportCompare("no assertion failure", "no assertion failure", "bug 524743"); diff --git a/js/src/tests/js1_8_1/regress/regress-530879.js b/js/src/tests/js1_8_1/regress/regress-530879.js new file mode 100644 index 000000000..39931d1c3 --- /dev/null +++ b/js/src/tests/js1_8_1/regress/regress-530879.js @@ -0,0 +1,9 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ +function f(a, b, c, d) { + yield arguments.length; +} +reportCompare(0, f().next(), "bug 530879"); diff --git a/js/src/tests/js1_8_1/regress/shell.js b/js/src/tests/js1_8_1/regress/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/js1_8_1/regress/shell.js diff --git a/js/src/tests/js1_8_1/shell.js b/js/src/tests/js1_8_1/shell.js new file mode 100644 index 000000000..ef2f97fe1 --- /dev/null +++ b/js/src/tests/js1_8_1/shell.js @@ -0,0 +1,13 @@ +/* -*- 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/. */ + +// NOTE: This only turns on 1.8.1 in shell builds. The browser requires the +// futzing in js/src/tests/browser.js (which only turns on 1.8, the most +// the browser supports). +if (typeof version != 'undefined') +{ + version(181); +} + diff --git a/js/src/tests/js1_8_1/strict/12.2.1.js b/js/src/tests/js1_8_1/strict/12.2.1.js new file mode 100644 index 000000000..674c7a7c6 --- /dev/null +++ b/js/src/tests/js1_8_1/strict/12.2.1.js @@ -0,0 +1,75 @@ +// |reftest| skip-if(Android) +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/* + * In strict mode code, 'let' and 'const' declarations may not bind + * 'eval' or 'arguments'. + */ +assertEq(testLenientAndStrict('let eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('let x,eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('let arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('let x,arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('const eval = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('const x = undefined,eval = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('const arguments = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('const x = undefined,arguments = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* + * In strict mode code, 'let' declarations appearing in 'for' + * or 'for in' statements may not bind 'eval' or 'arguments'. + */ +assertEq(testLenientAndStrict('for (let eval in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('for (let [eval] in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('for (let {x:eval} in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('for (let arguments in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('for (let [arguments] in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assertEq(testLenientAndStrict('for (let {x:arguments} in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +reportCompare(true, true); diff --git a/js/src/tests/js1_8_1/strict/8.7.2.js b/js/src/tests/js1_8_1/strict/8.7.2.js new file mode 100644 index 000000000..8e1d76106 --- /dev/null +++ b/js/src/tests/js1_8_1/strict/8.7.2.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(Android) +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/* Check that assignment to a let-bound variable is permitted in both lenient and strict modes. */ + +/* Assigning to a let-declared variable is okay in strict and loose modes. */ +assertEq(testLenientAndStrict('let let_declared; let_declared=1', + completesNormally, + completesNormally), + true); + +reportCompare(true, true); diff --git a/js/src/tests/js1_8_1/strict/shell.js b/js/src/tests/js1_8_1/strict/shell.js new file mode 100644 index 000000000..7469bbf94 --- /dev/null +++ b/js/src/tests/js1_8_1/strict/shell.js @@ -0,0 +1,88 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ + +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + + +/* + * Return true if both of these return true: + * - LENIENT_PRED applied to CODE + * - STRICT_PRED applied to CODE with a use strict directive added to the front + * + * Run STRICT_PRED first, for testing code that affects the global environment + * in loose mode, but fails in strict mode. + */ +function testLenientAndStrict(code, lenient_pred, strict_pred) { + return (strict_pred("'use strict'; " + code) && + lenient_pred(code)); +} + +/* + * completesNormally(CODE) returns true if evaluating CODE (as eval + * code) completes normally (rather than throwing an exception). + */ +function completesNormally(code) { + try { + eval(code); + return true; + } catch (exception) { + return false; + } +} + +/* + * raisesException(EXCEPTION)(CODE) returns true if evaluating CODE (as eval + * code) throws an exception object whose prototype is + * EXCEPTION.prototype, and returns false if it throws any other error + * or evaluates successfully. For example: raises(TypeError)("0()") == + * true. + */ +function raisesException(exception) { + return function (code) { + try { + eval(code); + return false; + } catch (actual) { + return exception.prototype.isPrototypeOf(actual); + } + }; +}; + +/* + * parsesSuccessfully(CODE) returns true if CODE parses as function + * code without an error. + */ +function parsesSuccessfully(code) { + try { + Function(code); + return true; + } catch (exception) { + return false; + } +}; + +/* + * parseRaisesException(EXCEPTION)(CODE) returns true if parsing CODE + * as function code raises EXCEPTION. + */ +function parseRaisesException(exception) { + return function (code) { + try { + Function(code); + return false; + } catch (actual) { + return exception.prototype.isPrototypeOf(actual); + } + }; +}; + +/* + * Return the result of applying uneval to VAL, and replacing all runs + * of whitespace with a single horizontal space (poor man's + * tokenization). + */ +function clean_uneval(val) { + return uneval(val).replace(/\s+/g, ' '); +} diff --git a/js/src/tests/js1_8_1/template.js b/js/src/tests/js1_8_1/template.js new file mode 100644 index 000000000..089aae2d6 --- /dev/null +++ b/js/src/tests/js1_8_1/template.js @@ -0,0 +1,28 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 99999; +var summary = ''; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} |