Jelajahi Sumber

perf test script fixes

Add "WScript.Echo" definitions to all SunSpider js files to support
non-Chakra hosts.

`perftest.pl`:
- Fix dir name cases.
- Change to "-?" in test_switch ("/?" not supported on xplat).
- Add "-testfile:<file>" switch to save perf test result to a file as well,
  by default to "perftest???.txt". This is useful if we want to use the
  test numbers as baseline for subsequent perf runs.
- Add "-skipCheckSwitch" to support non-Chakra hosts. It is not meaningful
  to test for Chakra switches, and in addition may run into trouble (host
  may start command loop instead of exit).
Jianchun Xu 9 tahun lalu
induk
melakukan
11cf024081

+ 22 - 15
test/benchmarks/SunSpider/3d-cube.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -65,7 +72,7 @@ function DrawLine(From, To) {
   var x = x1;
   var y = y1;
   var IncX1, IncY1;
-  var IncX2, IncY2;  
+  var IncX2, IncY2;
   var Den;
   var Num;
   var NumAdd;
@@ -117,13 +124,13 @@ function CalcCross(V0, V1) {
 }
 
 function CalcNormal(V0, V1, V2) {
-  var A = new Array();   var B = new Array(); 
+  var A = new Array();   var B = new Array();
   for (var i = 0; i < 3; i++) {
     A[i] = V0[i] - V1[i];
     B[i] = V2[i] - V1[i];
   }
   A = CalcCross(A, B);
-  var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 
+  var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]);
   for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
   A[3] = 1;
   return A;
@@ -218,7 +225,7 @@ function RotateZ(M, Phi) {
   var R = [
   [Cos,-Sin,0,0],
   [Sin,Cos,0,0],
-  [0,0,1,0],   
+  [0,0,1,0],
   [0,0,0,1]
   ];
   return MMulti(R, M);
@@ -308,7 +315,7 @@ function Init(CubeSize) {
   [0,0,1,0],
   [0,0,0,1]
   ];
-  
+
   // position information of qube
   MQube = [
   [1,0,0,0],
@@ -316,7 +323,7 @@ function Init(CubeSize) {
   [0,0,1,0],
   [0,0,0,1]
   ];
-  
+
   // entity matrix
   I = [
   [1,0,0,0],
@@ -324,7 +331,7 @@ function Init(CubeSize) {
   [0,0,1,0],
   [0,0,0,1]
   ];
-  
+
   // create qube
   Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
   Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
@@ -334,24 +341,24 @@ function Init(CubeSize) {
   Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
   Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
   Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
-  
+
   // center of gravity
   Q[8] = new CreateP(0, 0, 0);
-  
+
   // anti-clockwise edge check
   Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
-  
+
   // calculate squad normals
   Q.Normal = new Array();
   for (var i = 0; i < Q.Edge.length; i++) Q.Normal[i] = CalcNormal(Q[Q.Edge[i][0]].V, Q[Q.Edge[i][1]].V, Q[Q.Edge[i][2]].V);
-  
+
   // line drawn ?
   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
-  
+
   // create line pixels
   Q.NumPx = 9 * 2 * CubeSize;
   for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
-  
+
   MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
   MQube = MMulti(MTrans, MQube);
 
@@ -362,7 +369,7 @@ function Init(CubeSize) {
   DrawQube();
   Testing.Init = true;
   Loop();
-  
+
   // Perform a simple sum-based verification.
   var sum = 0;
   for (var i = 0; i < Q.length; ++i) {

+ 12 - 5
test/benchmarks/SunSpider/3d-morph.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -54,7 +61,7 @@ var _sunSpiderStartDate = new Date();
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 var loops = 15
@@ -65,7 +72,7 @@ function morph(a, f) {
     var PI2nx = Math.PI * 8/nx
     var sin = Math.sin
     var f30 = -(50 * sin(f*Math.PI*2))
-    
+
     for (var i = 0; i < nz; ++i) {
         for (var j = 0; j < nx; ++j) {
             a[3*(i*nx+j)+1]    = sin((j-1) * PI2nx ) * -f30
@@ -73,9 +80,9 @@ function morph(a, f) {
     }
 }
 
-    
+
 var a = Array()
-for (var i=0; i < nx*nz*3; ++i) 
+for (var i=0; i < nx*nz*3; ++i)
     a[i] = 0
 
 for (var i = 0; i < loops; ++i) {

+ 37 - 30
test/benchmarks/SunSpider/3d-raytrace.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -54,7 +61,7 @@ var _sunSpiderStartDate = new Date();
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 function createVector(x,y,z) {
@@ -119,7 +126,7 @@ function scale(v, scale) {
 }
 
 function cross(v1, v2) {
-    return [v1[1] * v2[2] - v1[2] * v2[1], 
+    return [v1[1] * v2[2] - v1[2] * v2[1],
             v1[2] * v2[0] - v1[0] * v2[2],
             v1[0] * v2[1] - v1[1] * v2[0]];
 
@@ -143,8 +150,8 @@ function invertMatrix(self) {
     var tx = -self[3];
     var ty = -self[7];
     var tz = -self[11];
-    for (h = 0; h < 3; h++) 
-        for (v = 0; v < 3; v++) 
+    for (h = 0; h < 3; h++)
+        for (v = 0; v < 3; v++)
             temp[h + v * 4] = self[v + h * 4];
     for (i = 0; i < 11; i++)
         self[i] = temp[i];
@@ -162,19 +169,19 @@ function Triangle(p1, p2, p3) {
     var normal = cross(edge1, edge2);
     if (Math.abs(normal[0]) > Math.abs(normal[1]))
         if (Math.abs(normal[0]) > Math.abs(normal[2]))
-            this.axis = 0; 
-        else 
+            this.axis = 0;
+        else
             this.axis = 2;
     else
-        if (Math.abs(normal[1]) > Math.abs(normal[2])) 
+        if (Math.abs(normal[1]) > Math.abs(normal[2]))
             this.axis = 1;
-        else 
+        else
             this.axis = 2;
     var u = (this.axis + 1) % 3;
     var v = (this.axis + 2) % 3;
     var u1 = edge1[u];
     var v1 = edge1[v];
-    
+
     var u2 = edge2[u];
     var v2 = edge2[v];
     this.normal = normalise(normal);
@@ -183,11 +190,11 @@ function Triangle(p1, p2, p3) {
     this.nd = dot(normal, p1) / normal[this.axis];
     var det = u1 * v2 - v1 * u2;
     this.eu = p1[u];
-    this.ev = p1[v]; 
+    this.ev = p1[v];
     this.nu1 = u1 / det;
     this.nv1 = -v1 / det;
     this.nu2 = v2 / det;
-    this.nv2 = -u2 / det; 
+    this.nv2 = -u2 / det;
     this.material = [0.7, 0.7, 0.7];
 }
 
@@ -201,13 +208,13 @@ Triangle.prototype.intersect = function(orig, dir, near, far) {
     var Pu = orig[u] + t * dir[u] - this.eu;
     var Pv = orig[v] + t * dir[v] - this.ev;
     var a2 = Pv * this.nu1 + Pu * this.nv1;
-    if (a2 < 0) 
+    if (a2 < 0)
         return null;
     var a3 = Pu * this.nu2 + Pv * this.nv2;
-    if (a3 < 0) 
+    if (a3 < 0)
         return null;
 
-    if ((a2 + a3) > 1) 
+    if ((a2 + a3) > 1)
         return null;
     return t;
 }
@@ -223,29 +230,29 @@ var zero = new Array(0,0,0);
 Scene.prototype.intersect = function(origin, dir, near, far) {
     var closest = null;
     for (i = 0; i < this.triangles.length; i++) {
-        var triangle = this.triangles[i];   
+        var triangle = this.triangles[i];
         var d = triangle.intersect(origin, dir, near, far);
         if (d == null || d > far || d < near)
             continue;
         far = d;
         closest = triangle;
     }
-    
+
     if (!closest)
         return [this.background[0],this.background[1],this.background[2]];
-        
+
     var normal = closest.normal;
-    var hit = add(origin, scale(dir, far)); 
+    var hit = add(origin, scale(dir, far));
     if (dot(dir, normal) > 0)
         normal = [-normal[0], -normal[1], -normal[2]];
-    
+
     var colour = null;
     if (closest.shader) {
         colour = closest.shader(closest, hit, dir);
     } else {
         colour = closest.material;
     }
-    
+
     // do reflection
     var reflected = null;
     if (colour.reflection > 0.001) {
@@ -254,7 +261,7 @@ Scene.prototype.intersect = function(origin, dir, near, far) {
         if (colour.reflection >= 0.999999)
             return reflected;
     }
-    
+
     var l = [this.ambient[0], this.ambient[1], this.ambient[2]];
     for (var i = 0; i < this.lights.length; i++) {
         var light = this.lights[i];
@@ -279,13 +286,13 @@ Scene.prototype.blocked = function(O, D, far) {
     var near = 0.0001;
     var closest = null;
     for (i = 0; i < this.triangles.length; i++) {
-        var triangle = this.triangles[i];   
+        var triangle = this.triangles[i];
         var d = triangle.intersect(O, D, near, far);
         if (d == null || d > far || d < near)
             continue;
         return true;
     }
-    
+
     return false;
 }
 
@@ -357,11 +364,11 @@ function raytraceScene()
     var bfr = createVector( 10, -10, -10);
     var bbl = createVector(-10, -10,  10);
     var bbr = createVector( 10, -10,  10);
-    
+
     // cube!!!
     // front
     var i = 0;
-    
+
     triangles[i++] = new Triangle(tfl, tfr, bfr);
     triangles[i++] = new Triangle(tfl, bfr, bfl);
     // back
@@ -383,7 +390,7 @@ function raytraceScene()
     // bottom
     triangles[i++] = new Triangle(bbl, bbr, bfr);
     triangles[i++] = new Triangle(bbl, bfr, bfl);
-    
+
     //Floor!!!!
     var green = createVector(0.0, 0.4, 0.0);
     var grey = createVector(0.4, 0.4, 0.4);
@@ -399,7 +406,7 @@ function raytraceScene()
             // angle *= angle;
             //grey.reflection = angle;
             return grey;
-        } else 
+        } else
             return green;
     }
     var ffl = createVector(-1000, -30, -1000);
@@ -410,7 +417,7 @@ function raytraceScene()
     triangles[i-1].shader = floorShader;
     triangles[i++] = new Triangle(fbl, ffr, ffl);
     triangles[i-1].shader = floorShader;
-    
+
     var _scene = new Scene(triangles);
     _scene.lights[0] = createVector(20, 38, -22);
     _scene.lights[0].colour = createVector(0.7, 0.3, 0.3);
@@ -420,7 +427,7 @@ function raytraceScene()
     _scene.lights[2].colour = createVector(0.7, 0.7, 0.7);
     _scene.ambient = createVector(0.1, 0.1, 0.1);
     //  _scene.background = createVector(0.7, 0.7, 1.0);
-    
+
     var size = 30;
     var pixels = new Array();
     for (var y = 0; y < size; y++) {

+ 10 - 3
test/benchmarks/SunSpider/access-binary-trees.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -66,9 +73,9 @@ for ( var n = 4; n <= 7; n += 1 ) {
     var minDepth = 4;
     var maxDepth = Math.max(minDepth + 2, n);
     var stretchDepth = maxDepth + 1;
-    
+
     var check = bottomUpTree(0,stretchDepth).itemCheck();
-    
+
     var longLivedTree = bottomUpTree(0,maxDepth);
     for (var depth=minDepth; depth<=maxDepth; depth+=2){
         var iterations = 1 << (maxDepth - depth + minDepth);

+ 8 - 1
test/benchmarks/SunSpider/access-fannkuch.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 9 - 2
test/benchmarks/SunSpider/access-nbody.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -193,7 +200,7 @@ for ( var n = 3; n <= 24; n *= 2 ) {
            Sun(),Jupiter(),Saturn(),Uranus(),Neptune()
         ));
         var max = n * 100;
-        
+
         ret += bodies.energy();
         for (var i=0; i<max; i++){
             bodies.advance(0.01);

+ 8 - 1
test/benchmarks/SunSpider/access-nsieve.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 8 - 1
test/benchmarks/SunSpider/bitops-3bit-bits-in-byte.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 8 - 1
test/benchmarks/SunSpider/bitops-bits-in-byte.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 9 - 2
test/benchmarks/SunSpider/bitops-bitwise-and.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -54,7 +61,7 @@ var _sunSpiderStartDate = new Date();
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 bitwiseAndValue = 4294967296;

+ 8 - 1
test/benchmarks/SunSpider/bitops-nsieve-bits.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 8 - 1
test/benchmarks/SunSpider/controlflow-recursive.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 33 - 26
test/benchmarks/SunSpider/crypto-aes.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -84,7 +91,7 @@ function ShiftRows(s, Nb) {    // shift row r of state S left by r bytes [§5.1.
     for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];  // shift into temp copy
     for (var c=0; c<4; c++) s[r][c] = t[c];         // and copy back
   }          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
-  return s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf 
+  return s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
 }
 
 
@@ -183,12 +190,12 @@ var Rcon = [ [0x00, 0x00, 0x00, 0x00],
              [0x40, 0x00, 0x00, 0x00],
              [0x80, 0x00, 0x00, 0x00],
              [0x1b, 0x00, 0x00, 0x00],
-             [0x36, 0x00, 0x00, 0x00] ]; 
+             [0x36, 0x00, 0x00, 0x00] ];
 
 
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
 
-/* 
+/*
  * Use AES to encrypt 'plaintext' with 'password' using 'nBits' key, in 'Counter' mode of operation
  *                           - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
  *   for each block
@@ -198,7 +205,7 @@ var Rcon = [ [0x00, 0x00, 0x00, 0x00],
 function AESEncryptCtr(plaintext, password, nBits) {
   if (!(nBits==128 || nBits==192 || nBits==256)) return '';  // standard allows 128/192/256 bit keys
 
-  // for this example script, generate the key by applying Cipher to 1st 16/24/32 chars of password; 
+  // for this example script, generate the key by applying Cipher to 1st 16/24/32 chars of password;
   // for real-world applications, a more secure approach would be to hash the password e.g. with SHA-1
   var nBytes = nBits/8;  // no bytes in key
   var pwBytes = new Array(nBytes);
@@ -214,14 +221,14 @@ function AESEncryptCtr(plaintext, password, nBits) {
 
   // encode nonce in two stages to cater for JavaScript 32-bit limit on bitwise ops
   for (var i=0; i<4; i++) counterBlock[i] = (nonce >>> i*8) & 0xff;
-  for (var i=0; i<4; i++) counterBlock[i+4] = (nonce/0x100000000 >>> i*8) & 0xff; 
+  for (var i=0; i<4; i++) counterBlock[i+4] = (nonce/0x100000000 >>> i*8) & 0xff;
 
   // generate key schedule - an expansion of the key into distinct Key Rounds for each round
   var keySchedule = KeyExpansion(key);
 
   var blockCount = Math.ceil(plaintext.length/blockSize);
   var ciphertext = new Array(blockCount);  // ciphertext as array of strings
-  
+
   for (var b=0; b<blockCount; b++) {
     // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
     // again done in two stages for 32-bit ops
@@ -229,7 +236,7 @@ function AESEncryptCtr(plaintext, password, nBits) {
     for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8)
 
     var cipherCntr = Cipher(counterBlock, keySchedule);  // -- encrypt counter block --
-    
+
     // calculate length of final block:
     var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
 
@@ -254,7 +261,7 @@ function AESEncryptCtr(plaintext, password, nBits) {
 }
 
 
-/* 
+/*
  * Use AES to decrypt 'ciphertext' with 'password' using 'nBits' key, in Counter mode of operation
  *
  *   for each block
@@ -273,7 +280,7 @@ function AESDecryptCtr(ciphertext, password, nBits) {
 
   var keySchedule = KeyExpansion(key);
 
-  ciphertext = ciphertext.split('-');  // split ciphertext into array of block-length strings 
+  ciphertext = ciphertext.split('-');  // split ciphertext into array of block-length strings
 
   // recover nonce from 1st element of ciphertext
   var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
@@ -325,29 +332,29 @@ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 
 function encodeBase64(str) {  // http://tools.ietf.org/html/rfc4648
    var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
-   
+
    str = encodeUTF8(str);  // encode multi-byte chars into UTF-8 for byte-array
 
    do {  // pack three octets into four hexets
       o1 = str.charCodeAt(i++);
       o2 = str.charCodeAt(i++);
       o3 = str.charCodeAt(i++);
-      
+
       bits = o1<<16 | o2<<8 | o3;
-      
+
       h1 = bits>>18 & 0x3f;
       h2 = bits>>12 & 0x3f;
       h3 = bits>>6 & 0x3f;
       h4 = bits & 0x3f;
-      
+
       // end of string? index to '=' in b64
       if (isNaN(o3)) h4 = 64;
       if (isNaN(o2)) h3 = 64;
-      
+
       // use hexets to index into b64, and append result to encoded string
       enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < str.length);
-   
+
    return enc;
 }
 
@@ -359,13 +366,13 @@ function decodeBase64(str) {
       h2 = b64.indexOf(str.charAt(i++));
       h3 = b64.indexOf(str.charAt(i++));
       h4 = b64.indexOf(str.charAt(i++));
-      
+
       bits = h1<<18 | h2<<12 | h3<<6 | h4;
-      
+
       o1 = bits>>16 & 0xff;
       o2 = bits>>8 & 0xff;
       o3 = bits & 0xff;
-      
+
       if (h3 == 64)      enc += String.fromCharCode(o1);
       else if (h4 == 64) enc += String.fromCharCode(o1, o2);
       else               enc += String.fromCharCode(o1, o2, o3);
@@ -374,17 +381,17 @@ function decodeBase64(str) {
    return decodeUTF8(enc);  // decode UTF-8 byte-array back to Unicode
 }
 
-function encodeUTF8(str) {  // encode multi-byte string into utf-8 multiple single-byte characters 
+function encodeUTF8(str) {  // encode multi-byte string into utf-8 multiple single-byte characters
   str = str.replace(
       /[\u0080-\u07ff]/g,  // U+0080 - U+07FF = 2-byte chars
-      function(c) { 
+      function(c) {
         var cc = c.charCodeAt(0);
         return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
     );
   str = str.replace(
       /[\u0800-\uffff]/g,  // U+0800 - U+FFFF = 3-byte chars
-      function(c) { 
-        var cc = c.charCodeAt(0); 
+      function(c) {
+        var cc = c.charCodeAt(0);
         return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
     );
   return str;
@@ -393,14 +400,14 @@ function encodeUTF8(str) {  // encode multi-byte string into utf-8 multiple sing
 function decodeUTF8(str) {  // decode utf-8 encoded string back into multi-byte characters
   str = str.replace(
       /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
-      function(c) { 
+      function(c) {
         var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
         return String.fromCharCode(cc); }
     );
   str = str.replace(
       /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
-      function(c) { 
-        var cc = (c.charCodeAt(0)&0x0f)<<12 | (c.charCodeAt(1)&0x3f<<6) | c.charCodeAt(2)&0x3f; 
+      function(c) {
+        var cc = (c.charCodeAt(0)&0x0f)<<12 | (c.charCodeAt(1)&0x3f<<6) | c.charCodeAt(2)&0x3f;
         return String.fromCharCode(cc); }
     );
   return str;

+ 9 - 2
test/benchmarks/SunSpider/crypto-md5.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -325,5 +332,5 @@ if (md5Output != expected)
     throw "ERROR: bad result: expected " + expected + " but got " + md5Output;
 
 var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
-    
+
 WScript.Echo("### TIME:", _sunSpiderInterval, "ms");

+ 8 - 1
test/benchmarks/SunSpider/crypto-sha1.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 33 - 26
test/benchmarks/SunSpider/date-format-tofte.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -47,22 +54,22 @@ Date.prototype.formatDate = function (input,time) {
     // input : format string
     // time : epoch time (seconds, and optional)
     //
-    // if time is not passed, formatting is based on 
+    // if time is not passed, formatting is based on
     // the current "this" date object's set time.
     //
     // supported:
-    // a, A, B, d, D, F, g, G, h, H, i, j, l (lowercase L), L, 
+    // a, A, B, d, D, F, g, G, h, H, i, j, l (lowercase L), L,
     // m, M, n, O, r, s, S, t, U, w, W, y, Y, z
     //
     // unsupported:
-    // I (capital i), T, Z    
+    // I (capital i), T, Z
 
-    var switches =    ["a", "A", "B", "d", "D", "F", "g", "G", "h", "H", 
-                       "i", "j", "l", "L", "m", "M", "n", "O", "r", "s", 
+    var switches =    ["a", "A", "B", "d", "D", "F", "g", "G", "h", "H",
+                       "i", "j", "l", "L", "m", "M", "n", "O", "r", "s",
                        "S", "t", "U", "w", "W", "y", "Y", "z"];
-    var daysLong =    ["Sunday", "Monday", "Tuesday", "Wednesday", 
+    var daysLong =    ["Sunday", "Monday", "Tuesday", "Wednesday",
                        "Thursday", "Friday", "Saturday"];
-    var daysShort =   ["Sun", "Mon", "Tue", "Wed", 
+    var daysShort =   ["Sun", "Mon", "Tue", "Wed",
                        "Thu", "Fri", "Sat"];
     var monthsShort = ["Jan", "Feb", "Mar", "Apr",
                        "May", "Jun", "Jul", "Aug", "Sep",
@@ -90,8 +97,8 @@ Date.prototype.formatDate = function (input,time) {
         // since I was feeling lazy:
         // http://www.xs4all.nl/~ppk/js/beat.html
         var off = (self.getTimezoneOffset() + 60)*60;
-        var theSeconds = (self.getHours() * 3600) + 
-                         (self.getMinutes() * 60) + 
+        var theSeconds = (self.getHours() * 3600) +
+                         (self.getMinutes() * 60) +
                           self.getSeconds() + off;
         var beat = Math.floor(theSeconds/86.4);
         if (beat > 1000) beat -= 1000;
@@ -100,7 +107,7 @@ Date.prototype.formatDate = function (input,time) {
         if ((""+beat).length == 2) beat = "0"+beat;
         return beat;
     }
-    
+
     function d() {
         // Day of the month, 2 digits with leading zeros
         return new String(self.getDate()).length == 1?
@@ -128,11 +135,11 @@ Date.prototype.formatDate = function (input,time) {
           var s = new String(self.getHours()-12);
           return s.length == 1?
           "0"+ (self.getHours()-12) : self.getHours()-12;
-        } else { 
+        } else {
           var s = new String(self.getHours());
           return s.length == 1?
           "0"+self.getHours() : self.getHours();
-        }  
+        }
     }
     function H() {
         // 24-hour format of an hour with leading zeros
@@ -141,13 +148,13 @@ Date.prototype.formatDate = function (input,time) {
     }
     function i() {
         // Minutes with leading zeros
-        return new String(self.getMinutes()).length == 1? 
-        "0"+self.getMinutes() : self.getMinutes(); 
+        return new String(self.getMinutes()).length == 1?
+        "0"+self.getMinutes() : self.getMinutes();
     }
     function j() {
         // Day of the month without leading zeros
         return self.getDate();
-    }    
+    }
     function l() {
         // A full textual representation of the day of the week
         return daysLong[self.getDay()];
@@ -156,7 +163,7 @@ Date.prototype.formatDate = function (input,time) {
         // leap year or not. 1 if leap year, 0 if not.
         // the logic should match iso's 8601 standard.
         var y_ = Y();
-        if (         
+        if (
             (y_ % 4 == 0 && y_ % 100 != 0) ||
             (y_ % 4 == 0 && y_ % 100 == 0 && y_ % 400 == 0)
             ) {
@@ -168,7 +175,7 @@ Date.prototype.formatDate = function (input,time) {
     function m() {
         // Numeric representation of a month, with leading zeros
         return self.getMonth() < 9?
-        "0"+(self.getMonth()+1) : 
+        "0"+(self.getMonth()+1) :
         self.getMonth()+1;
     }
     function M() {
@@ -220,7 +227,7 @@ Date.prototype.formatDate = function (input,time) {
     function W() {
         // Weeknumber, as per ISO specification:
         // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
-        
+
         // if the day is three days before newyears eve,
         // there's a chance it's "week 1" of next year.
         // here we check for that.
@@ -235,8 +242,8 @@ Date.prototype.formatDate = function (input,time) {
         var ny = new Date("January 1 " + Y() + " 00:00:00");
         var nyDay = ny.getDay()!=0?ny.getDay()-1:6;
         if (
-            (afterNY <= 2) && 
-            (nyDay >=4)  && 
+            (afterNY <= 2) &&
+            (nyDay >=4)  &&
             (afterNY >= (6-nyDay))
             ) {
             // Since I'm not sure we can just always return 53,
@@ -246,7 +253,7 @@ Date.prototype.formatDate = function (input,time) {
             var prevNY = new Date("December 31 " + (Y()-1) + " 00:00:00");
             return prevNY.formatDate("W");
         }
-        
+
         // week 1, is the week that has the first thursday in it.
         // note that this value is not zero index.
         if (nyDay <= 3) {
@@ -261,7 +268,7 @@ Date.prototype.formatDate = function (input,time) {
         // Numeric representation of the day of the week
         return self.getDay();
     }
-    
+
     function Y() {
         // A full numeric representation of a year, 4 digits
 
@@ -271,7 +278,7 @@ Date.prototype.formatDate = function (input,time) {
         if (self.getFullYear) {
             var newDate = new Date("January 1 2001 00:00:00 +0000");
             var x = newDate .getFullYear();
-            if (x == 2001) {              
+            if (x == 2001) {
                 // i trust the method now
                 return self.getFullYear();
             }
@@ -295,14 +302,14 @@ Date.prototype.formatDate = function (input,time) {
         var diff = self.getTime() - t.getTime();
         return Math.floor(diff/1000/60/60/24);
     }
-        
+
     var self = this;
     if (time) {
         // save time
         var prevTime = self.getTime();
         self.setTime(time);
     }
-    
+
     var ia = input.split("");
     var ij = 0;
     while (ia[ij]) {

+ 8 - 1
test/benchmarks/SunSpider/date-format-xparb.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 11 - 4
test/benchmarks/SunSpider/math-cordic.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -54,7 +61,7 @@ var _sunSpiderStartDate = new Date();
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 /////. Start CORDIC
@@ -80,7 +87,7 @@ var Angles = [
   FIXED(45.0), FIXED(26.565), FIXED(14.0362), FIXED(7.12502),
   FIXED(3.57633), FIXED(1.78991), FIXED(0.895174), FIXED(0.447614),
   FIXED(0.223811), FIXED(0.111906), FIXED(0.055953),
-  FIXED(0.027977) 
+  FIXED(0.027977)
               ];
 
 var Target = 28.027;
@@ -91,7 +98,7 @@ function cordicsincos(Target) {
     var TargetAngle;
     var CurrAngle;
     var Step;
- 
+
     X = FIXED(AG_CONST);         /* AG_CONST * cos(0) */
     Y = 0;                       /* AG_CONST * sin(0) */
 

+ 11 - 4
test/benchmarks/SunSpider/math-partial-sums.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -41,14 +48,14 @@ function partial(n){
     var twothirds = 2.0/3.0;
     var alt = -1.0;
     var k2 = k3 = sk = ck = 0.0;
-    
+
     for (var k = 1; k <= n; k++){
         k2 = k*k;
         k3 = k2*k;
         sk = Math.sin(k);
         ck = Math.cos(k);
         alt = -alt;
-        
+
         a1 += Math.pow(twothirds,k-1);
         a2 += Math.pow(k,-0.5);
         a3 += 1.0/(k*(k+1.0));
@@ -59,7 +66,7 @@ function partial(n){
         a8 += alt/k;
         a9 += alt/(2*k -1);
     }
-    
+
     // NOTE: We don't try to validate anything from pow(),  sin() or cos() because those aren't
     // well-specified in ECMAScript.
     return a6 + a7 + a8 + a9;

+ 8 - 1
test/benchmarks/SunSpider/math-spectral-norm.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 8 - 1
test/benchmarks/SunSpider/regexp-dna.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 9 - 2
test/benchmarks/SunSpider/string-base64.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -128,7 +135,7 @@ function base64ToString(data) {
         var padding = (data.charCodeAt(i) == base64Pad.charCodeAt(0));
         // Skip illegal characters and whitespace
         if (c == -1) continue;
-        
+
         // Collect data into leftdata, update bitcount
         leftdata = (leftdata << 6) | c;
         leftbits += 6;

+ 8 - 1
test/benchmarks/SunSpider/string-fasta.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 9 - 2
test/benchmarks/SunSpider/string-tagcloud.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -55,7 +62,7 @@ var _sunSpiderStartDate = new Date();
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 /*

+ 9 - 2
test/benchmarks/SunSpider/string-unpack-code.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {
@@ -98,7 +105,7 @@ Prototype 1.5 rc0
  - By Lunarmedia, 06 August, 2006
  - Available at (and packed with) JavascriptCompressor.com
 
-Please note this version is missing the selector.js component of the full Prototype library. 
+Please note this version is missing the selector.js component of the full Prototype library.
 You can get the compressed version of selector at JavascriptCompressor.com
 
 */

+ 8 - 1
test/benchmarks/SunSpider/string-validate-input.js

@@ -20,9 +20,16 @@
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+if(typeof(WScript) === "undefined")
+{
+    var WScript = {
+        Echo: print
+    }
+}
+
 function record(time) {
     document.getElementById("console").innerHTML = time + "ms";
     if (window.parent) {

+ 50 - 30
test/benchmarks/perftest.pl

@@ -30,8 +30,10 @@ my $OFFICIAL;
 my $is_official = 0;
 my $is_baseline = 0;
 my $basefile = "perfbase.txt";
+my $testfile = "perftest.txt";
 my $binary = "";
 my $dir = "";
+my $skipCheckSwitch = 0;  # use with non-chakra hosts
 my $highprecisiondate = 1;
 my $args;
 my $parse_scores = 0;
@@ -85,7 +87,11 @@ print "Switches: $other_switches\n" unless ($other_switches eq "");
 
 $other_switches .= " -highprecisiondate" if $highprecisiondate;
 
-if(!$is_baseline)
+if($is_baseline)
+{
+    delete_file($basefile);
+}
+else
 {
     open(my $IN, '<', $basefile) or die "Couldn't open $basefile for reading.";
     while(<$IN>)
@@ -117,10 +123,8 @@ if(!$is_baseline)
         }
     }
     close($IN);
-}
-else
-{
-    delete_baseline();
+
+    delete_file($testfile);
 }
 
 # run the benchmark tests
@@ -367,10 +371,13 @@ if($is_official)
 }
 
 
-# if it's a baseline run, just output to the baseline file and exit
-if($is_baseline)
+# output to the baseline file or test result file and exit
+saveResult($is_baseline ? $basefile : $testfile);
+
+sub saveResult()
 {
-    open(my $OUT, '>', $basefile) or die "Couldn't open $basefile for writing.";
+    my $result_file = shift;
+    open(my $OUT, '>', $result_file) or die "Couldn't open $result_file for writing.";
 
     foreach my $test(@testlist)
     {
@@ -391,6 +398,7 @@ if($is_baseline)
     close($OUT);
     exit(0);
 }
+
 sub processResult()
 {
     my $test = shift;
@@ -564,8 +572,10 @@ sub usage
     print "  -baseline              Generates a baseline, updating your local baseline file.  \n";
     print "                         NOTE: use only with base binary with clean clone from the Chakracore repo\n";
     print "  -basefile:<file>       Uses <file> as your perf baseline (default: perfbase.txt)\n";
+    print "  -testfile:<file>       Uses <file> to save your perf test result (default: perftest.txt)\n";
     print "  -dir:<dirpath>         Uses the test files in the <dirpath>.\n";
     print "  -binary:<filepath>     Uses <filepath> to run the JS files.\n";
+    print "  -skipCheckSwitch       Skip checking binary command line switches (use with non-chakra hosts)";
     print "  -iterations:<iter>     Number of iterations to run tests (default: 11)\n";
     print "  -official:<name>       Generates an official report into results-<name>.xml\n";
     print "  -native                Only run -native variation (default)\n";
@@ -603,10 +613,19 @@ sub parse_args
             $basefile = $1;
             badswitch() if $is_official;
         }
+        elsif($ARGV[$i] =~ /[-\/]testfile:(.*)$/)
+        {
+            $testfile = $1;
+            badswitch() if $is_official;
+        }
         elsif($ARGV[$i] =~ /[-\/]binary:(.*)$/)
         {
             $binary = $1;
         }
+        elsif($ARGV[$i] =~ /[-\/]skipCheckSwitch/)
+        {
+            $skipCheckSwitch = 1;
+        }
         elsif($ARGV[$i] =~ /[-\/]dir:(.*)$/)
         {
             if($1)
@@ -667,8 +686,9 @@ sub parse_args
             $parse_time = 0;
             $parse_scores = 1;
             $parse_latency = 1;
-            $dir = "octane";
+            $dir = "Octane";
             $basefile = "perfbase$dir.txt";
+            $testfile = "perftest$dir.txt";
             $is_dynamicProfileRun = 0; # Currently octane dyna-pogo info is not avialable in the browser - remove this when it is.
         }
         elsif($ARGV[$i] =~ /[-\/]jetstream/)
@@ -684,6 +704,7 @@ sub parse_args
             $parse_latency = 0;
             $dir = "jetstream";
             $basefile = "perfbase$dir.txt";
+            $testfile = "perftest$dir.txt";
             $is_dynamicProfileRun = 0; # Currently  dyna-pogo info is not avialable in the browser - remove this when it is.
         }
         elsif($ARGV[$i] =~ /[-\/]kraken/i)
@@ -696,8 +717,9 @@ sub parse_args
              "imaging-desaturate", "imaging-gaussian-blur", "json-parse-financial", "json-stringify-tinderbox",
              "stanford-crypto-aes", "stanford-crypto-ccm", "stanford-crypto-pbkdf2", "stanford-crypto-sha256-iterative");
             $testDescription = "kraken benchmark";
-            $dir = "kraken";
+            $dir = "Kraken";
             $basefile = "perfbase$dir.txt";
+            $testfile = "perftest$dir.txt";
             $highprecisiondate = 0;
         }
         elsif($ARGV[$i] =~ /[-\/]sunspider/i)
@@ -708,8 +730,9 @@ sub parse_args
             "crypto-sha1", "date-format-tofte", "date-format-xparb", "math-cordic", "math-partial-sums",
             "math-spectral-norm", "regexp-dna", "string-base64", "string-fasta", "string-tagcloud",
             "string-unpack-code", "string-validate-input");
-            $dir = "sunspider";
+            $dir = "SunSpider";
             $basefile = "perfbase$dir.txt";
+            $testfile = "perftest$dir.txt";
             $is_dynamicProfileRun = 1;
         }
         elsif($ARGV[$i] =~ /[-\/]file:(.*).js$/i)
@@ -816,7 +839,14 @@ sub official_end_test
 
 sub check_switch
 {
-    system("$binary /? > _time.txt");
+    # Use -skipCheckSwitch to avoid checking command line switches with
+    # non-chakra hosts (Following "... -?" may enter host command loop.)
+    if ($skipCheckSwitch)
+    {
+        return;
+    }
+
+    system("$binary -? > _time.txt");
     open(my $IN, '<', "_time.txt") or die;
     my $dynamicProfileSupported = 0;
     my $highprecisiondateSupported = 0;
@@ -847,29 +877,19 @@ sub delete_profile
 {
     if($is_dynamicProfileRun)
     {
-        if(-e $profileFile)
-        {
-            unlink($profileFile);
-            if(-e $profileFile)
-            {
-                 print "File could not be deleted: $profileFile\n";
-                 die();
-            }
-        }
+        delete_file($profileFile);
     }
 }
-sub delete_baseline
+sub delete_file()
 {
-    if($is_baseline)
+    my $f = shift;
+    if(-e $f)
     {
-        if(-e $basefile)
+        unlink($f);
+        if(-e $f)
         {
-            unlink($basefile);
-            if(-e $basefile)
-            {
-                 print "File could not be deleted: $basefile\n";
-                 die();
-            }
+            print "File could not be deleted: $f\n";
+            die();
         }
     }
 }