<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[204882] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/204882">204882</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-08-23 20:39:33 -0700 (Tue, 23 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>It should be easy to run ES6SampleBench from the jsc shell
https://bugs.webkit.org/show_bug.cgi?id=161085
Reviewed by Yusuke Suzuki.
PerformanceTests:
This patch makes ES6 sample bench runnable through the `jsc` shell.
To do that, you need to be in the PerformanceTests/ES6SampleBench
directory and run `jsc cli.js`. To make this work, the benchmark
is now aware of being run in two modes: via the browser, and via
the shell. Each entry point will set a variable `isInBrowser`,
and the benchmark will do different things based on if that
variable is true or false.
* ES6SampleBench/Air/benchmark.js:
* ES6SampleBench/Air/stress-test.js:
* ES6SampleBench/Basic/benchmark.js:
(runBenchmark):
* ES6SampleBench/Basic/stress-test.js:
* ES6SampleBench/air_benchmark.js:
* ES6SampleBench/basic_benchmark.js:
* ES6SampleBench/cli.js: Added.
(return.doRun):
(makeBenchmarkRunner):
* ES6SampleBench/driver.js:
(Driver):
(Driver.prototype._recomputeSummary):
(Driver.prototype._iterate.window.setTimeout):
(Driver.prototype._iterate):
(Driver.prototype._updateIterations):
* ES6SampleBench/glue.js:
(reportResult):
* ES6SampleBench/index.html:
* ES6SampleBench/results.js:
(Results):
(Results.prototype.reportRunning):
(Results.prototype.reportDone):
(Results.prototype.reportError):
* ES6SampleBench/stats.js:
(Stats):
(Stats.prototype.toString):
(Stats.prototype._update):
Source/JavaScriptCore:
This patch adds a new function called `runString` to the shell.
It takes in a string, and executes it in a new global object.
Then, it returns the global object it executed the code in.
This allows the code to stash some kind of a result on the global,
and then have the caller of `runString` extract the result.
* jsc.cpp:
(GlobalObject::finishCreation):
(functionRunString):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsChangeLog">trunk/PerformanceTests/ChangeLog</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchAirbenchmarkjs">trunk/PerformanceTests/ES6SampleBench/Air/benchmark.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchAirstresstestjs">trunk/PerformanceTests/ES6SampleBench/Air/stress-test.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchBasicbenchmarkjs">trunk/PerformanceTests/ES6SampleBench/Basic/benchmark.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchBasicstresstestjs">trunk/PerformanceTests/ES6SampleBench/Basic/stress-test.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchair_benchmarkjs">trunk/PerformanceTests/ES6SampleBench/air_benchmark.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchbasic_benchmarkjs">trunk/PerformanceTests/ES6SampleBench/basic_benchmark.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchdriverjs">trunk/PerformanceTests/ES6SampleBench/driver.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchgluejs">trunk/PerformanceTests/ES6SampleBench/glue.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchindexhtml">trunk/PerformanceTests/ES6SampleBench/index.html</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchresultsjs">trunk/PerformanceTests/ES6SampleBench/results.js</a></li>
<li><a href="#trunkPerformanceTestsES6SampleBenchstatsjs">trunk/PerformanceTests/ES6SampleBench/stats.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsES6SampleBenchclijs">trunk/PerformanceTests/ES6SampleBench/cli.js</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkPerformanceTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ChangeLog (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ChangeLog        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ChangeLog        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2016-08-23 Saam Barati <sbarati@apple.com>
+
+ It should be easy to run ES6SampleBench from the jsc shell
+ https://bugs.webkit.org/show_bug.cgi?id=161085
+
+ Reviewed by Yusuke Suzuki.
+
+ This patch makes ES6 sample bench runnable through the `jsc` shell.
+ To do that, you need to be in the PerformanceTests/ES6SampleBench
+ directory and run `jsc cli.js`. To make this work, the benchmark
+ is now aware of being run in two modes: via the browser, and via
+ the shell. Each entry point will set a variable `isInBrowser`,
+ and the benchmark will do different things based on if that
+ variable is true or false.
+
+ * ES6SampleBench/Air/benchmark.js:
+ * ES6SampleBench/Air/stress-test.js:
+ * ES6SampleBench/Basic/benchmark.js:
+ (runBenchmark):
+ * ES6SampleBench/Basic/stress-test.js:
+ * ES6SampleBench/air_benchmark.js:
+ * ES6SampleBench/basic_benchmark.js:
+ * ES6SampleBench/cli.js: Added.
+ (return.doRun):
+ (makeBenchmarkRunner):
+ * ES6SampleBench/driver.js:
+ (Driver):
+ (Driver.prototype._recomputeSummary):
+ (Driver.prototype._iterate.window.setTimeout):
+ (Driver.prototype._iterate):
+ (Driver.prototype._updateIterations):
+ * ES6SampleBench/glue.js:
+ (reportResult):
+ * ES6SampleBench/index.html:
+ * ES6SampleBench/results.js:
+ (Results):
+ (Results.prototype.reportRunning):
+ (Results.prototype.reportDone):
+ (Results.prototype.reportError):
+ * ES6SampleBench/stats.js:
+ (Stats):
+ (Stats.prototype.toString):
+ (Stats.prototype._update):
+
</ins><span class="cx"> 2016-08-01 Said Abou-Hallawa <sabouhallawa@apple.com>
</span><span class="cx">
</span><span class="cx"> Add an option to run the MotionMark tests with classic tile size (512x512)
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchAirbenchmarkjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/Air/benchmark.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/Air/benchmark.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/Air/benchmark.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> */
</span><span class="cx"> "use strict";
</span><span class="cx">
</span><del>-class Benchmark {
</del><ins>+class AirBenchmark {
</ins><span class="cx"> constructor(verbose = 0)
</span><span class="cx"> {
</span><span class="cx"> this._verbose = verbose;
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchAirstresstestjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/Air/stress-test.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/Air/stress-test.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/Air/stress-test.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> load("payload-typescript-scanIdentifier.js");
</span><span class="cx"> load("benchmark.js");
</span><span class="cx">
</span><del>-let benchmark = new Benchmark();
</del><ins>+let benchmark = new AirBenchmark();
</ins><span class="cx"> let before = preciseTime();
</span><span class="cx">
</span><span class="cx"> // Run for at least 10 iterations.
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchBasicbenchmarkjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/Basic/benchmark.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/Basic/benchmark.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/Basic/benchmark.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> */
</span><span class="cx"> "use strict";
</span><span class="cx">
</span><del>-class Benchmark {
</del><ins>+class BasicBenchmark {
</ins><span class="cx"> constructor(verbose = 0)
</span><span class="cx"> {
</span><span class="cx"> this._verbose = verbose;
</span><span class="lines">@@ -63,4 +63,3 @@
</span><span class="cx"> let after = currentTime();
</span><span class="cx"> return after - before;
</span><span class="cx"> }
</span><del>-
</del></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchBasicstresstestjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/Basic/stress-test.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/Basic/stress-test.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/Basic/stress-test.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> load("util.js");
</span><span class="cx"> load("benchmark.js");
</span><span class="cx">
</span><del>-let benchmark = new Benchmark();
</del><ins>+let benchmark = new BasicBenchmark();
</ins><span class="cx"> let before = preciseTime();
</span><span class="cx">
</span><span class="cx"> // Run for at least 10 iterations.
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchair_benchmarkjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/air_benchmark.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/air_benchmark.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/air_benchmark.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> <script src="Air/benchmark.js"></script>
</span><span class="cx"> <script>
</span><span class="cx"> var results = [];
</span><del>-var benchmark = new Benchmark();
</del><ins>+var benchmark = new AirBenchmark();
</ins><span class="cx"> var numIterations = 200;
</span><span class="cx"> for (var i = 0; i < numIterations; ++i) {
</span><span class="cx"> var before = currentTime();
</span><span class="lines">@@ -59,13 +59,47 @@
</span><span class="cx"> reportResult(results);
</span><span class="cx"> </script>`;
</span><span class="cx">
</span><del>-const AirBenchmark = {
</del><ins>+let runAirBenchmark = null;
+if (!isInBrowser) {
+ let sources = [
+ "Air/symbols.js"
+ , "Air/tmp_base.js"
+ , "Air/arg.js"
+ , "Air/basic_block.js"
+ , "Air/code.js"
+ , "Air/frequented_block.js"
+ , "Air/inst.js"
+ , "Air/opcode.js"
+ , "Air/reg.js"
+ , "Air/stack_slot.js"
+ , "Air/tmp.js"
+ , "Air/util.js"
+ , "Air/custom.js"
+ , "Air/liveness.js"
+ , "Air/insertion_set.js"
+ , "Air/allocate_stack.js"
+ , "Air/payload-gbemu-executeIteration.js"
+ , "Air/payload-imaging-gaussian-blur-gaussianBlur.js"
+ , "Air/payload-airjs-ACLj8C.js"
+ , "Air/payload-typescript-scanIdentifier.js"
+ , "Air/benchmark.js"
+ ];
+
+ runAirBenchmark = makeBenchmarkRunner(sources, "AirBenchmark");
+}
+
+const AirBenchmarkRunner = {
</ins><span class="cx"> code: AirBenchmarkCode,
</span><del>- cells: {
</del><ins>+ run: runAirBenchmark,
+ cells: { },
+ name: "Air"
+};
+
+if (isInBrowser) {
+ AirBenchmarkRunner.cells = {
</ins><span class="cx"> firstIteration: document.getElementById("AirFirstIteration"),
</span><span class="cx"> averageWorstCase: document.getElementById("AirAverageWorstCase"),
</span><span class="cx"> steadyState: document.getElementById("AirSteadyState"),
</span><span class="cx"> message: document.getElementById("AirMessage")
</span><span class="cx"> }
</span><del>-};
-
</del><ins>+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchbasic_benchmarkjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/basic_benchmark.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/basic_benchmark.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/basic_benchmark.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> <script src="Basic/benchmark.js"></script>
</span><span class="cx"> <script>
</span><span class="cx"> var results = [];
</span><del>-var benchmark = new Benchmark();
</del><ins>+var benchmark = new BasicBenchmark();
</ins><span class="cx"> var numIterations = 200;
</span><span class="cx"> for (var i = 0; i < numIterations; ++i) {
</span><span class="cx"> var before = currentTime();
</span><span class="lines">@@ -48,12 +48,37 @@
</span><span class="cx"> reportResult(results);
</span><span class="cx"> </script>`;
</span><span class="cx">
</span><del>-const BasicBenchmark = {
</del><ins>+
+let runBasicBenchmark = null;
+if (!isInBrowser) {
+ let sources = [
+ "Basic/ast.js"
+ , "Basic/basic.js"
+ , "Basic/caseless_map.js"
+ , "Basic/lexer.js"
+ , "Basic/number.js"
+ , "Basic/parser.js"
+ , "Basic/random.js"
+ , "Basic/state.js"
+ , "Basic/util.js"
+ , "Basic/benchmark.js"
+ ];
+
+ runBasicBenchmark = makeBenchmarkRunner(sources, "BasicBenchmark");
+}
+
+const BasicBenchmarkRunner = {
+ name: "Basic",
</ins><span class="cx"> code: BasicBenchmarkCode,
</span><del>- cells: {
</del><ins>+ run: runBasicBenchmark,
+ cells: {}
+};
+
+if (isInBrowser) {
+ BasicBenchmarkRunner.cells = {
</ins><span class="cx"> firstIteration: document.getElementById("BasicFirstIteration"),
</span><span class="cx"> averageWorstCase: document.getElementById("BasicAverageWorstCase"),
</span><span class="cx"> steadyState: document.getElementById("BasicSteadyState"),
</span><span class="cx"> message: document.getElementById("BasicMessage")
</span><del>- }
-};
</del><ins>+ };
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchclijs"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/ES6SampleBench/cli.js (0 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/cli.js         (rev 0)
+++ trunk/PerformanceTests/ES6SampleBench/cli.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+const isInBrowser = false;
+
+function makeBenchmarkRunner(sources, benchmarkConstructor) {
+ let source = "'use strict';"
+ for (let file of sources) {
+ source += readFile(file);
+ }
+ source += `
+ this.results = [];
+ var benchmark = new ${benchmarkConstructor}();
+ var numIterations = 200;
+ for (var i = 0; i < numIterations; ++i) {
+ var before = currentTime();
+ benchmark.runIteration();
+ var after = currentTime();
+ results.push(after - before);
+ }
+ `;
+ return function doRun() {
+ let globalObjectOfScript = runString(source);
+ let results = globalObjectOfScript.results;
+ reportResult(results);
+ }
+}
+
+load("driver.js");
+load("results.js");
+load("stats.js");
+load("air_benchmark.js");
+load("basic_benchmark.js");
+load("glue.js");
+
+driver.start(10);
</ins></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchdriverjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/driver.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/driver.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/driver.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -31,10 +31,11 @@
</span><span class="cx"> this._triggerCell = triggerCell;
</span><span class="cx"> this._triggerLink = triggerLink;
</span><span class="cx"> this._magicCell = magicCell;
</span><del>- this._summary = new Stats(summaryCell);
</del><ins>+ this._summary = new Stats(summaryCell, "summary");
</ins><span class="cx"> this._key = key;
</span><span class="cx"> this._hadErrors = false;
</span><del>- window[key] = this;
</del><ins>+ if (isInBrowser)
+ window[key] = this;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> addBenchmark(benchmark)
</span><span class="lines">@@ -96,7 +97,7 @@
</span><span class="cx"> for (let subResult of Results.subResults)
</span><span class="cx"> statses.push(results[subResult]);
</span><span class="cx"> }
</span><del>-
</del><ins>+
</ins><span class="cx"> let numIterations = Math.min(...statses.map(stats => stats.numIterations));
</span><span class="cx"> let data = new Array(numIterations);
</span><span class="cx"> for (let i = 0; i < data.length; ++i)
</span><span class="lines">@@ -117,9 +118,12 @@
</span><span class="cx"> this._benchmark = this._iterator ? this._iterator.next().value : null;
</span><span class="cx"> if (!this._benchmark) {
</span><span class="cx"> if (!this._numIterations) {
</span><del>- this._triggerCell.innerHTML =
- (this._hadErrors ? "Failures encountered!" : "Success!") +
- ` <a href="${this._triggerLink}">Restart Benchmark</a>`;
</del><ins>+ if (isInBrowser) {
+ this._triggerCell.innerHTML =
+ (this._hadErrors ? "Failures encountered!" : "Success!") +
+ ` <a href="${this._triggerLink}">Restart Benchmark</a>`;
+ } else
+ print(this._hadErrors ? "Failures encountered!" : "Success! Benchmark is now finished.");
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> this._numIterations--;
</span><span class="lines">@@ -130,31 +134,48 @@
</span><span class="cx">
</span><span class="cx"> this._benchmarks.get(this._benchmark).reportRunning();
</span><span class="cx">
</span><del>- window.setTimeout(() => {
- if (!this._isRunning)
- return;
-
- this._magicCell.contentDocument.body.textContent = "";
- this._magicCell.contentDocument.body.innerHTML = "<iframe id=\"magicFrame\" frameborder=\"0\">";
-
- let magicFrame = this._magicCell.contentDocument.getElementById("magicFrame");
- magicFrame.contentDocument.open();
- magicFrame.contentDocument.write(
- `<!DOCTYPE html><head><title>benchmark payload</title></head><body><script>` +
- `window.onerror = top.${this._key}.reportError;\n` +
- `function reportResult()\n` +
- `{\n` +
- ` var driver = top.${this._key};\n` +
- ` driver.reportResult.apply(driver, arguments);\n` +
- `}\n` +
- `</script>\n` +
- `${this._benchmark.code}</body></html>`);
- }, 100);
</del><ins>+ let benchmark = this._benchmark;
+ if (isInBrowser) {
+ window.setTimeout(() => {
+ if (!this._isRunning)
+ return;
+
+ this._magicCell.contentDocument.body.textContent = "";
+ this._magicCell.contentDocument.body.innerHTML = "<iframe id=\"magicFrame\" frameborder=\"0\">";
+
+ let magicFrame = this._magicCell.contentDocument.getElementById("magicFrame");
+ magicFrame.contentDocument.open();
+ magicFrame.contentDocument.write(
+ `<!DOCTYPE html><head><title>benchmark payload</title></head><body><script>` +
+ `window.onerror = top.${this._key}.reportError;\n` +
+ `function reportResult()\n` +
+ `{\n` +
+ ` var driver = top.${this._key};\n` +
+ ` driver.reportResult.apply(driver, arguments);\n` +
+ `}\n` +
+ `</script>\n` +
+ `${this._benchmark.code}</body></html>`);
+ }, 100);
+ } else {
+ Promise.resolve(20).then(() => {
+ if (!this._isRunning)
+ return;
+
+ try {
+ print(`Running... ${this._benchmark.name} ( ${this._numIterations + 1} to go)`);
+ benchmark.run();
+ print("\n");
+ } catch(e) {
+ print(e);
+ print(e.stack);
+ }
+ });
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> _updateIterations()
</span><span class="cx"> {
</span><del>- this._triggerCell.innerHTML = "Running... (" + (this._numIterations + 1) + " to go)";
</del><ins>+ if (isInBrowser)
+ this._triggerCell.innerHTML = "Running... (" + (this._numIterations + 1) + " to go)";
</ins><span class="cx"> }
</span><span class="cx"> }
</span><del>-
</del></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchgluejs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/glue.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/glue.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/glue.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -25,11 +25,15 @@
</span><span class="cx"> "use strict";
</span><span class="cx">
</span><span class="cx"> const driver = new Driver(
</span><del>- document.getElementById("trigger"),
</del><ins>+ isInBrowser ? document.getElementById("trigger") : null,
</ins><span class="cx"> "driver.start(10)",
</span><del>- document.getElementById("magic"),
- document.getElementById("Geomean"),
</del><ins>+ isInBrowser ? document.getElementById("magic") : null,
+ isInBrowser ? document.getElementById("Geomean") : null,
</ins><span class="cx"> "sampleBench");
</span><span class="cx">
</span><del>-driver.addBenchmark(AirBenchmark);
-driver.addBenchmark(BasicBenchmark);
</del><ins>+function reportResult(...args) {
+ driver.reportResult(...args);
+}
+
+driver.addBenchmark(AirBenchmarkRunner);
+driver.addBenchmark(BasicBenchmarkRunner);
</ins></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchindexhtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/index.html (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/index.html        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/index.html        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -8,6 +8,8 @@
</span><span class="cx"> {
</span><span class="cx"> document.getElementById("trigger").innerHTML = "ERROR: " + url + ":" + lineNumber + ": " + message;
</span><span class="cx"> }
</span><ins>+
+const isInBrowser = true;
</ins><span class="cx"> </script>
</span><span class="cx"> <script src="driver.js"></script>
</span><span class="cx"> <script src="results.js"></script>
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchresultsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/results.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/results.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/results.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> {
</span><span class="cx"> this._benchmark = benchmark;
</span><span class="cx"> for (let subResult of Results.subResults)
</span><del>- this[subResult] = new Stats(benchmark.cells[subResult]);
</del><ins>+ this[subResult] = new Stats(benchmark.cells[subResult], subResult);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> get benchmark() { return this._benchmark; }
</span><span class="lines">@@ -42,12 +42,14 @@
</span><span class="cx">
</span><span class="cx"> reportRunning()
</span><span class="cx"> {
</span><del>- this._benchmark.cells.message.innerHTML = "Running...";
</del><ins>+ if (isInBrowser)
+ this._benchmark.cells.message.innerHTML = "Running...";
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> reportDone()
</span><span class="cx"> {
</span><del>- this._benchmark.cells.message.innerHTML = "";
</del><ins>+ if (isInBrowser)
+ this._benchmark.cells.message.innerHTML = "";
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> reportResult(times)
</span><span class="lines">@@ -99,7 +101,8 @@
</span><span class="cx"> {
</span><span class="cx"> for (let subResult of Results.subResults)
</span><span class="cx"> this[subResult].reportResult(Stats.error);
</span><del>- this._benchmark.cells.message.innerHTML = url + ":" + lineNumber + ": " + message;
</del><ins>+ if (isInBrowser)
+ this._benchmark.cells.message.innerHTML = url + ":" + lineNumber + ": " + message;
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkPerformanceTestsES6SampleBenchstatsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ES6SampleBench/stats.js (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ES6SampleBench/stats.js        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/PerformanceTests/ES6SampleBench/stats.js        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -25,10 +25,16 @@
</span><span class="cx"> "use strict";
</span><span class="cx">
</span><span class="cx"> class Stats {
</span><del>- constructor(cell)
</del><ins>+ constructor(cell, prefix)
</ins><span class="cx"> {
</span><span class="cx"> this._cell = cell;
</span><span class="cx"> this._data = [];
</span><ins>+ this._prefix = "";
+ if (!isInBrowser && prefix) {
+ this._prefix = prefix + ": ";
+ if (this._prefix.length < 20)
+ this._prefix += " ".repeat(20 - this._prefix.length);
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> reset(...data)
</span><span class="lines">@@ -91,15 +97,18 @@
</span><span class="cx"> return "ERROR";
</span><span class="cx">
</span><span class="cx"> if ("interval" in result)
</span><del>- return `${result.mean.toFixed(2)} ms &plusmn; ${result.interval.toFixed(2)} ms`;
</del><ins>+ return `${this._prefix}${result.mean.toFixed(2)} ms +- ${result.interval.toFixed(2)} ms`;
</ins><span class="cx">
</span><del>- return `${result.mean.toFixed(2)} ms`;
</del><ins>+ return `${this._prefix}${result.mean.toFixed(2)} ms`;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> _update()
</span><span class="cx"> {
</span><del>- if (this._cell)
- this._cell.innerHTML = this.toString();
</del><ins>+ if (isInBrowser) {
+ if (this._cell)
+ this._cell.innerHTML = this.toString();
+ } else
+ print(this.toString());
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-08-23 Saam Barati <sbarati@apple.com>
+
+ It should be easy to run ES6SampleBench from the jsc shell
+ https://bugs.webkit.org/show_bug.cgi?id=161085
+
+ Reviewed by Yusuke Suzuki.
+
+ This patch adds a new function called `runString` to the shell.
+ It takes in a string, and executes it in a new global object.
+ Then, it returns the global object it executed the code in.
+ This allows the code to stash some kind of a result on the global,
+ and then have the caller of `runString` extract the result.
+
+ * jsc.cpp:
+ (GlobalObject::finishCreation):
+ (functionRunString):
+
</ins><span class="cx"> 2016-08-23 Benjamin Poulain <benjamin@webkit.org>
</span><span class="cx">
</span><span class="cx"> [JSC] Make ArithLog works with any type
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (204881 => 204882)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2016-08-24 02:36:40 UTC (rev 204881)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2016-08-24 03:39:33 UTC (rev 204882)
</span><span class="lines">@@ -589,6 +589,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionVersion(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionRun(ExecState*);
</span><ins>+static EncodedJSValue JSC_HOST_CALL functionRunString(ExecState*);
</ins><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionLoad(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionLoadString(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionReadFile(ExecState*);
</span><span class="lines">@@ -785,6 +786,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> addFunction(vm, "version", functionVersion, 1);
</span><span class="cx"> addFunction(vm, "run", functionRun, 1);
</span><ins>+ addFunction(vm, "runString", functionRunString, 1);
</ins><span class="cx"> addFunction(vm, "load", functionLoad, 1);
</span><span class="cx"> addFunction(vm, "loadString", functionLoadString, 1);
</span><span class="cx"> addFunction(vm, "readFile", functionReadFile, 1);
</span><span class="lines">@@ -1443,6 +1445,31 @@
</span><span class="cx"> return JSValue::encode(jsNumber(stopWatch.getElapsedMS()));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+EncodedJSValue JSC_HOST_CALL functionRunString(ExecState* exec)
+{
+ String source = exec->argument(0).toWTFString(exec);
+ if (exec->hadException())
+ return JSValue::encode(jsUndefined());
+
+ GlobalObject* globalObject = GlobalObject::create(exec->vm(), GlobalObject::createStructure(exec->vm(), jsNull()), Vector<String>());
+
+ JSArray* array = constructEmptyArray(globalObject->globalExec(), 0);
+ for (unsigned i = 1; i < exec->argumentCount(); ++i)
+ array->putDirectIndex(globalObject->globalExec(), i - 1, exec->uncheckedArgument(i));
+ globalObject->putDirect(
+ exec->vm(), Identifier::fromString(globalObject->globalExec(), "arguments"), array);
+
+ NakedPtr<Exception> exception;
+ evaluate(globalObject->globalExec(), makeSource(source), JSValue(), exception);
+
+ if (exception) {
+ exec->vm().throwException(globalObject->globalExec(), exception);
+ return JSValue::encode(jsUndefined());
+ }
+
+ return JSValue::encode(globalObject);
+}
+
</ins><span class="cx"> EncodedJSValue JSC_HOST_CALL functionLoad(ExecState* exec)
</span><span class="cx"> {
</span><span class="cx"> String fileName = exec->argument(0).toWTFString(exec);
</span></span></pre>
</div>
</div>
</body>
</html>