<!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  &lt;sbarati@apple.com&gt;
+
+        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  &lt;sabouhallawa@apple.com&gt;
</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"> &quot;use strict&quot;;
</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(&quot;payload-typescript-scanIdentifier.js&quot;);
</span><span class="cx"> load(&quot;benchmark.js&quot;);
</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"> &quot;use strict&quot;;
</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(&quot;util.js&quot;);
</span><span class="cx"> load(&quot;benchmark.js&quot;);
</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"> &lt;script src=&quot;Air/benchmark.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</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 &lt; 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"> &lt;/script&gt;`;
</span><span class="cx"> 
</span><del>-const AirBenchmark = {
</del><ins>+let runAirBenchmark = null;
+if (!isInBrowser) {
+    let sources = [
+        &quot;Air/symbols.js&quot;
+        , &quot;Air/tmp_base.js&quot;
+        , &quot;Air/arg.js&quot;
+        , &quot;Air/basic_block.js&quot;
+        , &quot;Air/code.js&quot;
+        , &quot;Air/frequented_block.js&quot;
+        , &quot;Air/inst.js&quot;
+        , &quot;Air/opcode.js&quot;
+        , &quot;Air/reg.js&quot;
+        , &quot;Air/stack_slot.js&quot;
+        , &quot;Air/tmp.js&quot;
+        , &quot;Air/util.js&quot;
+        , &quot;Air/custom.js&quot;
+        , &quot;Air/liveness.js&quot;
+        , &quot;Air/insertion_set.js&quot;
+        , &quot;Air/allocate_stack.js&quot;
+        , &quot;Air/payload-gbemu-executeIteration.js&quot;
+        , &quot;Air/payload-imaging-gaussian-blur-gaussianBlur.js&quot;
+        , &quot;Air/payload-airjs-ACLj8C.js&quot;
+        , &quot;Air/payload-typescript-scanIdentifier.js&quot;
+        , &quot;Air/benchmark.js&quot;
+    ];
+
+    runAirBenchmark = makeBenchmarkRunner(sources, &quot;AirBenchmark&quot;);
+}
+
+const AirBenchmarkRunner = {
</ins><span class="cx">     code: AirBenchmarkCode,
</span><del>-    cells: {
</del><ins>+    run: runAirBenchmark,
+    cells: { },
+    name: &quot;Air&quot;
+};
+
+if (isInBrowser) {
+    AirBenchmarkRunner.cells = {
</ins><span class="cx">         firstIteration: document.getElementById(&quot;AirFirstIteration&quot;),
</span><span class="cx">         averageWorstCase: document.getElementById(&quot;AirAverageWorstCase&quot;),
</span><span class="cx">         steadyState: document.getElementById(&quot;AirSteadyState&quot;),
</span><span class="cx">         message: document.getElementById(&quot;AirMessage&quot;)
</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"> &lt;script src=&quot;Basic/benchmark.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</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 &lt; 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"> &lt;/script&gt;`;
</span><span class="cx"> 
</span><del>-const BasicBenchmark = {
</del><ins>+
+let runBasicBenchmark = null;
+if (!isInBrowser) {
+    let sources = [
+        &quot;Basic/ast.js&quot;
+        , &quot;Basic/basic.js&quot;
+        , &quot;Basic/caseless_map.js&quot;
+        , &quot;Basic/lexer.js&quot;
+        , &quot;Basic/number.js&quot;
+        , &quot;Basic/parser.js&quot;
+        , &quot;Basic/random.js&quot;
+        , &quot;Basic/state.js&quot;
+        , &quot;Basic/util.js&quot;
+        , &quot;Basic/benchmark.js&quot;
+    ];
+
+    runBasicBenchmark = makeBenchmarkRunner(sources, &quot;BasicBenchmark&quot;);
+}
+
+const BasicBenchmarkRunner = {
+    name: &quot;Basic&quot;,
</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(&quot;BasicFirstIteration&quot;),
</span><span class="cx">         averageWorstCase: document.getElementById(&quot;BasicAverageWorstCase&quot;),
</span><span class="cx">         steadyState: document.getElementById(&quot;BasicSteadyState&quot;),
</span><span class="cx">         message: document.getElementById(&quot;BasicMessage&quot;)
</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 = &quot;'use strict';&quot;
+    for (let file of sources) {
+        source += readFile(file);
+    }
+    source += `
+        this.results = [];
+        var benchmark = new ${benchmarkConstructor}();
+        var numIterations = 200;
+        for (var i = 0; i &lt; 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(&quot;driver.js&quot;);
+load(&quot;results.js&quot;);
+load(&quot;stats.js&quot;);
+load(&quot;air_benchmark.js&quot;);
+load(&quot;basic_benchmark.js&quot;);
+load(&quot;glue.js&quot;);
+
+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, &quot;summary&quot;);
</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 =&gt; stats.numIterations));
</span><span class="cx">         let data = new Array(numIterations);
</span><span class="cx">         for (let i = 0; i &lt; 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 ? &quot;Failures encountered!&quot; : &quot;Success!&quot;) +
-                    ` &lt;a href=&quot;${this._triggerLink}&quot;&gt;Restart Benchmark&lt;/a&gt;`;
</del><ins>+                if (isInBrowser) {
+                    this._triggerCell.innerHTML =
+                        (this._hadErrors ? &quot;Failures encountered!&quot; : &quot;Success!&quot;) +
+                        ` &lt;a href=&quot;${this._triggerLink}&quot;&gt;Restart Benchmark&lt;/a&gt;`;
+                } else
+                    print(this._hadErrors ? &quot;Failures encountered!&quot; : &quot;Success! Benchmark is now finished.&quot;);
</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(() =&gt; {
-            if (!this._isRunning)
-                return;
-            
-            this._magicCell.contentDocument.body.textContent = &quot;&quot;;
-            this._magicCell.contentDocument.body.innerHTML = &quot;&lt;iframe id=\&quot;magicFrame\&quot; frameborder=\&quot;0\&quot;&gt;&quot;;
-            
-            let magicFrame = this._magicCell.contentDocument.getElementById(&quot;magicFrame&quot;);
-            magicFrame.contentDocument.open();
-            magicFrame.contentDocument.write(
-                `&lt;!DOCTYPE html&gt;&lt;head&gt;&lt;title&gt;benchmark payload&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;script&gt;` +
-                `window.onerror = top.${this._key}.reportError;\n` +
-                `function reportResult()\n` +
-                `{\n` +
-                `    var driver = top.${this._key};\n` +
-                `    driver.reportResult.apply(driver, arguments);\n` +
-                `}\n` +
-                `&lt;/script&gt;\n` +
-                `${this._benchmark.code}&lt;/body&gt;&lt;/html&gt;`);
-        }, 100);
</del><ins>+        let benchmark = this._benchmark;
+        if (isInBrowser) {
+            window.setTimeout(() =&gt; {
+                if (!this._isRunning)
+                    return;
+                
+                this._magicCell.contentDocument.body.textContent = &quot;&quot;;
+                this._magicCell.contentDocument.body.innerHTML = &quot;&lt;iframe id=\&quot;magicFrame\&quot; frameborder=\&quot;0\&quot;&gt;&quot;;
+                
+                let magicFrame = this._magicCell.contentDocument.getElementById(&quot;magicFrame&quot;);
+                magicFrame.contentDocument.open();
+                magicFrame.contentDocument.write(
+                    `&lt;!DOCTYPE html&gt;&lt;head&gt;&lt;title&gt;benchmark payload&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;script&gt;` +
+                    `window.onerror = top.${this._key}.reportError;\n` +
+                    `function reportResult()\n` +
+                    `{\n` +
+                    `    var driver = top.${this._key};\n` +
+                    `    driver.reportResult.apply(driver, arguments);\n` +
+                    `}\n` +
+                    `&lt;/script&gt;\n` +
+                    `${this._benchmark.code}&lt;/body&gt;&lt;/html&gt;`);
+            }, 100);
+        } else {
+            Promise.resolve(20).then(() =&gt; {
+                if (!this._isRunning)
+                    return;
+                
+                try {
+                    print(`Running... ${this._benchmark.name} ( ${this._numIterations + 1}  to go)`);
+                    benchmark.run();
+                    print(&quot;\n&quot;);
+                } 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 = &quot;Running... (&quot; + (this._numIterations + 1) + &quot; to go)&quot;;
</del><ins>+        if (isInBrowser)
+            this._triggerCell.innerHTML = &quot;Running... (&quot; + (this._numIterations + 1) + &quot; to go)&quot;;
</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"> &quot;use strict&quot;;
</span><span class="cx"> 
</span><span class="cx"> const driver = new Driver(
</span><del>-    document.getElementById(&quot;trigger&quot;),
</del><ins>+    isInBrowser ? document.getElementById(&quot;trigger&quot;) : null,
</ins><span class="cx">     &quot;driver.start(10)&quot;,
</span><del>-    document.getElementById(&quot;magic&quot;),
-    document.getElementById(&quot;Geomean&quot;),
</del><ins>+    isInBrowser ? document.getElementById(&quot;magic&quot;) : null,
+    isInBrowser ? document.getElementById(&quot;Geomean&quot;) : null,
</ins><span class="cx">     &quot;sampleBench&quot;);
</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(&quot;trigger&quot;).innerHTML = &quot;ERROR: &quot; + url + &quot;:&quot; + lineNumber + &quot;: &quot; + message;
</span><span class="cx"> }
</span><ins>+
+const isInBrowser = true;
</ins><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;driver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;results.js&quot;&gt;&lt;/script&gt;
</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 = &quot;Running...&quot;;
</del><ins>+        if (isInBrowser)
+            this._benchmark.cells.message.innerHTML = &quot;Running...&quot;;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     reportDone()
</span><span class="cx">     {
</span><del>-        this._benchmark.cells.message.innerHTML = &quot;&quot;;
</del><ins>+        if (isInBrowser)
+            this._benchmark.cells.message.innerHTML = &quot;&quot;;
</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 + &quot;:&quot; + lineNumber + &quot;: &quot; + message;
</del><ins>+        if (isInBrowser)
+            this._benchmark.cells.message.innerHTML = url + &quot;:&quot; + lineNumber + &quot;: &quot; + 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"> &quot;use strict&quot;;
</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 = &quot;&quot;;
+        if (!isInBrowser &amp;&amp; prefix) {
+            this._prefix = prefix + &quot;: &quot;;
+            if (this._prefix.length &lt; 20)
+                this._prefix += &quot; &quot;.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 &quot;ERROR&quot;;
</span><span class="cx">         
</span><span class="cx">         if (&quot;interval&quot; in result)
</span><del>-            return `${result.mean.toFixed(2)} ms &amp;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  &lt;sbarati@apple.com&gt;
+
+        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  &lt;benjamin@webkit.org&gt;
</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, &quot;version&quot;, functionVersion, 1);
</span><span class="cx">         addFunction(vm, &quot;run&quot;, functionRun, 1);
</span><ins>+        addFunction(vm, &quot;runString&quot;, functionRunString, 1);
</ins><span class="cx">         addFunction(vm, &quot;load&quot;, functionLoad, 1);
</span><span class="cx">         addFunction(vm, &quot;loadString&quot;, functionLoadString, 1);
</span><span class="cx">         addFunction(vm, &quot;readFile&quot;, 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-&gt;argument(0).toWTFString(exec);
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    GlobalObject* globalObject = GlobalObject::create(exec-&gt;vm(), GlobalObject::createStructure(exec-&gt;vm(), jsNull()), Vector&lt;String&gt;());
+
+    JSArray* array = constructEmptyArray(globalObject-&gt;globalExec(), 0);
+    for (unsigned i = 1; i &lt; exec-&gt;argumentCount(); ++i)
+        array-&gt;putDirectIndex(globalObject-&gt;globalExec(), i - 1, exec-&gt;uncheckedArgument(i));
+    globalObject-&gt;putDirect(
+        exec-&gt;vm(), Identifier::fromString(globalObject-&gt;globalExec(), &quot;arguments&quot;), array);
+
+    NakedPtr&lt;Exception&gt; exception;
+    evaluate(globalObject-&gt;globalExec(), makeSource(source), JSValue(), exception);
+
+    if (exception) {
+        exec-&gt;vm().throwException(globalObject-&gt;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-&gt;argument(0).toWTFString(exec);
</span></span></pre>
</div>
</div>

</body>
</html>