8009982: Lazy execution bugfix. Added lazy sunspider unit test. Added mandreel to compile-octane test. Fixed warnings
Reviewed-by: sundar, jlaskey
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @subtest
*/
var tests = [
"box2d.js",
"code-load.js",
"crypto.js",
"deltablue.js",
"earley-boyer.js",
"gbemu.js",
"mandreel.js",
"navier-stokes.js",
"pdfjs.js",
"raytrace.js",
"regexp.js",
"richards.js",
"splay.js"
];
// hack, teardown breaks things defined in the global space, making it impossible
// to do multiple consecutive benchmark runs with the same harness. I think it's a bug
// that the setup and teardown aren't each others constructor and destructor but rather
// that the benchmarks rely on partial global state. For shame, Octane!
var ignoreTeardown = [
{ name: "box2d.js" },
{ name: "gbemu.js" },
];
//TODO mandreel can be compiled as a test, but not run multiple times unless modified to not have global state
var compileOnly = {
"mandreel.js" : true
};
var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__;
// TODO: why is this path hard coded when it's defined in project properties?
var path = dir + "../external/octane/";
var runtime = "";
var verbose = false;
var numberOfIterations = 5;
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
function should_compile_only(name) {
return (typeof compile_only !== 'undefined') || compileOnly[name] === true;
}
function run_one_benchmark(arg, iters) {
var file_name;
var file = arg.split('/');
if (file.length == 1) {
file = arg.split('\\');
}
//trim off trailing path separators
while (file[file.length - 1].indexOf(".js") == -1) {
file.pop();
}
file_name = file[file.length - 1];
var compile_and_return = should_compile_only(file_name);
if (compile_and_return) {
if (typeof compile_only === 'undefined') { //for a run, skip compile onlies, don't even compile them
return;
}
print("Compiling... " + file_name);
}
load(path + 'base.js');
load(arg);
if (compile_and_return) {
print("Compiled OK: " + file_name);
print("");
return;
}
var success = true;
var hiscore = 0;
var loscore = 10e8;
var current_name;
function PrintResult(name, result) {
current_name = name;
}
function PrintError(name, error) {
current_name = name;
PrintResult(name, error);
success = false;
}
function PrintScore(score) {
if (success) {
if (+score >= hiscore) {
hiscore = +score;
}
if (+score <= loscore) {
loscore = +score;
}
}
if (verbose) {
print("Score: " + score);
}
}
if (iters == undefined) {
iters = numberOfIterations;
} else {
numberOfIterations = iters;
}
print(runtime + ": running " + file_name + "...");
for (var i = 0; i < numberOfIterations; i++) {
var callbacks =
{ NotifyResult: PrintResult,
NotifyError: PrintError,
NotifyScore: PrintScore };
for (j in ignoreTeardown) {
var ignore = ignoreTeardown[j];
if (endsWith(arg, ignore.name)) {
var teardownOverride = ignore.teardown;
if (!teardownOverride) {
teardownOverride = function() {};
}
for (k in BenchmarkSuite.suites) {
var benchmarks = BenchmarkSuite.suites[k].benchmarks;
for (l in benchmarks) {
benchmarks[l].TearDown = teardownOverride;
}
}
break;
}
}
BenchmarkSuite.RunSuites(callbacks);
}
var start = "Score: ";
if (runtime != "") {
start = runtime + ": ";
}
print(start + current_name + ' (version ' + BenchmarkSuite.version + '): ' + loscore + '-' + hiscore);
}
function run_suite(tests, iters) {
for (var idx = 0; idx < tests.length; idx++) {
run_one_benchmark(tests[idx], iters);
}
}
runtime = "command line";
var args = [];
if (typeof $ARGS !== 'undefined') {
args = $ARGS;
} else if (typeof arguments !== 'undefined' && arguments.length != 0) {
args = arguments;
}
var new_args = [];
for (i in args) {
if (args[i].toString().indexOf(' ') != -1) {
args[i] = args[i].replace(/\/$/, '');
var s = args[i].split(' ');
for (j in s) {
new_args.push(s[j]);
}
} else {
new_args.push(args[i]);
}
}
if (new_args.length != 0) {
args = new_args;
}
var tests_found = [];
var iters = undefined;
for (var i = 0; i < args.length; i++) {
arg = args[i];
if (arg == "--iterations") {
iters = +args[++i];
} else if (arg == "--runtime") {
runtime = args[++i];
} else if (arg == "--verbose") {
verbose = true;
} else if (arg == "") {
continue; //skip
} else {
tests_found.push(arg);
}
}
if (tests_found.length == 0) {
for (i in tests) {
tests_found.push(path + tests[i]);
}
}
tests_found.sort();
run_suite(tests_found, iters);