michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: * michael@0: * Date: 15 Nov 2003 michael@0: * SUMMARY: Stressing the byte code generator michael@0: * michael@0: * See http://bugzilla.mozilla.org/show_bug.cgi?id=225831 michael@0: * michael@0: */ michael@0: //----------------------------------------------------------------------------- michael@0: var UBound = 0; michael@0: var BUGNUMBER = 225831; michael@0: var summary = 'Stressing the byte code generator'; michael@0: var status = ''; michael@0: var statusitems = []; michael@0: var actual = ''; michael@0: var actualvalues = []; michael@0: var expect= ''; michael@0: var expectedvalues = []; michael@0: michael@0: michael@0: function f() { return {x: 0}; } michael@0: michael@0: var N = 300; michael@0: var a = new Array(N + 1); michael@0: a[N] = 10; michael@0: a[0] = 100; michael@0: michael@0: michael@0: status = inSection(1); michael@0: michael@0: // build string of the form ++(a[++f().x + ++f().x + ... + ++f().x]) which michael@0: // gives ++a[N] michael@0: var str = "".concat("++(a[", repeat_str("++f().x + ", (N - 1)), "++f().x])"); michael@0: michael@0: // Use Script constructor instead of simple eval to test Rhino optimizer mode michael@0: // because in Rhino, eval always uses interpreted mode. michael@0: if (typeof Script == 'undefined') michael@0: { michael@0: print('Test skipped. Script not defined.'); michael@0: } michael@0: else michael@0: { michael@0: var script = new Script(str); michael@0: script(); michael@0: michael@0: actual = a[N]; michael@0: expect = 11; michael@0: } michael@0: addThis(); michael@0: michael@0: status = inSection(2); michael@0: michael@0: michael@0: // build string of the form (a[f().x-- + f().x-- + ... + f().x--])-- michael@0: // which should give (a[0])-- michael@0: if (typeof Script == 'undefined') michael@0: { michael@0: print('Test skipped. Script not defined.'); michael@0: } michael@0: else michael@0: { michael@0: str = "".concat("(a[", repeat_str("f().x-- + ", (N - 1)), "f().x--])--"); michael@0: script = new Script(str); michael@0: script(); michael@0: michael@0: actual = a[0]; michael@0: expect = 99; michael@0: } michael@0: addThis(); michael@0: michael@0: michael@0: status = inSection(3); michael@0: michael@0: // build string of the form [[1], [1], ..., [1]] michael@0: if (typeof Script == 'undefined') michael@0: { michael@0: print('Test skipped. Script not defined.'); michael@0: } michael@0: else michael@0: { michael@0: str = "".concat("[", repeat_str("[1], ", (N - 1)), "[1]]"); michael@0: script = new Script(str); michael@0: script(); michael@0: michael@0: actual = uneval(script()); michael@0: expect = str; michael@0: } michael@0: addThis(); michael@0: michael@0: michael@0: status = inSection(4); michael@0: michael@0: // build string of the form ({1:{a:1}, 2:{a:1}, ... N:{a:1}}) michael@0: if (typeof Script == 'undefined') michael@0: { michael@0: print('Test skipped. Script not defined.'); michael@0: } michael@0: else michael@0: { michael@0: str = function() { michael@0: var arr = new Array(N+1); michael@0: arr[0] = "({"; michael@0: for (var i = 1; i < N; ++i) { michael@0: arr[i] = i+":{a:1}, "; michael@0: } michael@0: arr[N] = N+":{a:1}})"; michael@0: return "".concat.apply("", arr); michael@0: }(); michael@0: michael@0: script = new Script(str); michael@0: script(); michael@0: michael@0: actual = uneval(script()); michael@0: expect = str; michael@0: } michael@0: addThis(); michael@0: michael@0: michael@0: michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: test(); michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: michael@0: michael@0: function repeat_str(str, repeat_count) michael@0: { michael@0: var arr = new Array(--repeat_count); michael@0: while (repeat_count != 0) michael@0: arr[--repeat_count] = str; michael@0: return str.concat.apply(str, arr); michael@0: } michael@0: michael@0: michael@0: function addThis() michael@0: { michael@0: statusitems[UBound] = status; michael@0: actualvalues[UBound] = actual; michael@0: expectedvalues[UBound] = expect; michael@0: UBound++; michael@0: } michael@0: michael@0: michael@0: function test() michael@0: { michael@0: enterFunc('test'); michael@0: printBugNumber(BUGNUMBER); michael@0: printStatus(summary); michael@0: michael@0: for (var i=0; i