<!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>[194333] trunk/Source/JavaScriptCore</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/194333">194333</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2015-12-21 10:40:10 -0800 (Mon, 21 Dec 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add unary operator tests to compare JIT and LLINT results.
https://bugs.webkit.org/show_bug.cgi?id=152453
Reviewed by Benjamin Poulain.
Also fixed a few things in the binary-op-test.js.
* tests/stress/op_negate.js: Added.
(o1.valueOf):
* tests/stress/op_postdec.js: Added.
(o1.valueOf):
* tests/stress/op_postinc.js: Added.
(o1.valueOf):
* tests/stress/op_predec.js: Added.
(o1.valueOf):
* tests/stress/op_preinc.js: Added.
(o1.valueOf):
* tests/stress/resources/binary-op-test.js:
(stringifyIfNeeded):
(isIdentical):
(run):
* tests/stress/resources/unary-op-test.js: Added.
(stringifyIfNeeded):
(generateBinaryTests):
(isIdentical):
(runTest):
(run):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressresourcesbinaryoptestjs">trunk/Source/JavaScriptCore/tests/stress/resources/binary-op-test.js</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoretestsstressop_negatejs">trunk/Source/JavaScriptCore/tests/stress/op_negate.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressop_postdecjs">trunk/Source/JavaScriptCore/tests/stress/op_postdec.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressop_postincjs">trunk/Source/JavaScriptCore/tests/stress/op_postinc.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressop_predecjs">trunk/Source/JavaScriptCore/tests/stress/op_predec.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressop_preincjs">trunk/Source/JavaScriptCore/tests/stress/op_preinc.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressresourcesunaryoptestjs">trunk/Source/JavaScriptCore/tests/stress/resources/unary-op-test.js</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (194332 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-12-21 18:20:58 UTC (rev 194332)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2015-12-18 Mark Lam <mark.lam@apple.com>
+
+ Add unary operator tests to compare JIT and LLINT results.
+ https://bugs.webkit.org/show_bug.cgi?id=152453
+
+ Reviewed by Benjamin Poulain.
+
+ Also fixed a few things in the binary-op-test.js.
+
+ * tests/stress/op_negate.js: Added.
+ (o1.valueOf):
+ * tests/stress/op_postdec.js: Added.
+ (o1.valueOf):
+ * tests/stress/op_postinc.js: Added.
+ (o1.valueOf):
+ * tests/stress/op_predec.js: Added.
+ (o1.valueOf):
+ * tests/stress/op_preinc.js: Added.
+ (o1.valueOf):
+ * tests/stress/resources/binary-op-test.js:
+ (stringifyIfNeeded):
+ (isIdentical):
+ (run):
+ * tests/stress/resources/unary-op-test.js: Added.
+ (stringifyIfNeeded):
+ (generateBinaryTests):
+ (isIdentical):
+ (runTest):
+ (run):
+
</ins><span class="cx"> 2015-12-21 Ryan Haddad <ryanhaddad@apple.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed, rolling out r194328.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressop_negatejs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/op_negate.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/op_negate.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/op_negate.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//@ runFTLNoCJIT
+
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors. See unary-op-test.js for debugging options if needed.
+
+load("./resources/unary-op-test.js");
+
+//============================================================================
+// Test configuration data:
+
+var opName = "negate";
+var op = "-";
+var operatorType = "Prefix";
+
+var o1 = {
+ valueOf: function() { return 10; }
+};
+
+var posInfinity = 1 / 0;
+var negInfinity = -1 / 0;
+
+var values = [
+ 'o1',
+ 'null',
+ 'undefined',
+ 'true',
+ 'false',
+
+ 'NaN',
+ 'posInfinity',
+ 'negInfinity',
+ '100.2', // Some random small double value.
+ '-100.2',
+ '54294967296.2923', // Some random large double value.
+ '-54294967296.2923',
+
+ '0',
+ '-0',
+ '1',
+ '-1',
+ '0x3fff',
+ '-0x3fff',
+ '0x7fff',
+ '-0x7fff',
+ '0x10000',
+ '-0x10000',
+ '0x7ffffff',
+ '-0x7ffffff',
+ '0x80000000',
+ '-0x80000000',
+ '0x100000000',
+ '-0x100000000',
+
+ '"abc"',
+ '"0"',
+ '"-0"',
+ '"1"',
+ '"-1"',
+ '"0x3fff"',
+ '"-0x3fff"',
+ '"0x7fff"',
+ '"-0x7fff"',
+ '"0x10000"',
+ '"-0x10000"',
+ '"0x7ffffff"',
+ '"-0x7ffffff"',
+ '"0x100000000"',
+ '"-0x100000000"',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, "ImmediateResult", op, values);
+generateBinaryTests(tests, opName, operatorType, "PostResult", op, values);
+
+run();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressop_postdecjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/op_postdec.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/op_postdec.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/op_postdec.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//@ runFTLNoCJIT
+
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors. See unary-op-test.js for debugging options if needed.
+
+load("./resources/unary-op-test.js");
+
+//============================================================================
+// Test configuration data:
+
+var opName = "postdec";
+var op = "--";
+var operatorType = "Postfix";
+
+var o1 = {
+ valueOf: function() { return 10; }
+};
+
+var posInfinity = 1 / 0;
+var negInfinity = -1 / 0;
+
+var values = [
+ 'o1',
+ 'null',
+ 'undefined',
+ 'true',
+ 'false',
+
+ 'NaN',
+ 'posInfinity',
+ 'negInfinity',
+ '100.2', // Some random small double value.
+ '-100.2',
+ '54294967296.2923', // Some random large double value.
+ '-54294967296.2923',
+
+ '0',
+ '-0',
+ '1',
+ '-1',
+ '0x3fff',
+ '-0x3fff',
+ '0x7fff',
+ '-0x7fff',
+ '0x10000',
+ '-0x10000',
+ '0x7ffffff',
+ '-0x7ffffff',
+ '0x80000000',
+ '-0x80000000',
+ '0x100000000',
+ '-0x100000000',
+
+ '"abc"',
+ '"0"',
+ '"-0"',
+ '"1"',
+ '"-1"',
+ '"0x3fff"',
+ '"-0x3fff"',
+ '"0x7fff"',
+ '"-0x7fff"',
+ '"0x10000"',
+ '"-0x10000"',
+ '"0x7ffffff"',
+ '"-0x7ffffff"',
+ '"0x100000000"',
+ '"-0x100000000"',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, "ImmediateResult", op, values);
+generateBinaryTests(tests, opName, operatorType, "PostResult", op, values);
+
+run();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressop_postincjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/op_postinc.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/op_postinc.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/op_postinc.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//@ runFTLNoCJIT
+
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors. See unary-op-test.js for debugging options if needed.
+
+load("./resources/unary-op-test.js");
+
+//============================================================================
+// Test configuration data:
+
+var opName = "postinc";
+var op = "++";
+var operatorType = "Postfix";
+
+var o1 = {
+ valueOf: function() { return 10; }
+};
+
+var posInfinity = 1 / 0;
+var negInfinity = -1 / 0;
+
+var values = [
+ 'o1',
+ 'null',
+ 'undefined',
+ 'true',
+ 'false',
+
+ 'NaN',
+ 'posInfinity',
+ 'negInfinity',
+ '100.2', // Some random small double value.
+ '-100.2',
+ '54294967296.2923', // Some random large double value.
+ '-54294967296.2923',
+
+ '0',
+ '-0',
+ '1',
+ '-1',
+ '0x3fff',
+ '-0x3fff',
+ '0x7fff',
+ '-0x7fff',
+ '0x10000',
+ '-0x10000',
+ '0x7ffffff',
+ '-0x7ffffff',
+ '0x80000000',
+ '-0x80000000',
+ '0x100000000',
+ '-0x100000000',
+
+ '"abc"',
+ '"0"',
+ '"-0"',
+ '"1"',
+ '"-1"',
+ '"0x3fff"',
+ '"-0x3fff"',
+ '"0x7fff"',
+ '"-0x7fff"',
+ '"0x10000"',
+ '"-0x10000"',
+ '"0x7ffffff"',
+ '"-0x7ffffff"',
+ '"0x100000000"',
+ '"-0x100000000"',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, "ImmediateResult", op, values);
+generateBinaryTests(tests, opName, operatorType, "PostResult", op, values);
+
+run();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressop_predecjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/op_predec.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/op_predec.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/op_predec.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//@ runFTLNoCJIT
+
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors. See unary-op-test.js for debugging options if needed.
+
+load("./resources/unary-op-test.js");
+
+//============================================================================
+// Test configuration data:
+
+var opName = "predec";
+var op = "--";
+var operatorType = "Prefix";
+
+var o1 = {
+ valueOf: function() { return 10; }
+};
+
+var posInfinity = 1 / 0;
+var negInfinity = -1 / 0;
+
+var values = [
+ 'o1',
+ 'null',
+ 'undefined',
+ 'true',
+ 'false',
+
+ 'NaN',
+ 'posInfinity',
+ 'negInfinity',
+ '100.2', // Some random small double value.
+ '-100.2',
+ '54294967296.2923', // Some random large double value.
+ '-54294967296.2923',
+
+ '0',
+ '-0',
+ '1',
+ '-1',
+ '0x3fff',
+ '-0x3fff',
+ '0x7fff',
+ '-0x7fff',
+ '0x10000',
+ '-0x10000',
+ '0x7ffffff',
+ '-0x7ffffff',
+ '0x80000000',
+ '-0x80000000',
+ '0x100000000',
+ '-0x100000000',
+
+ '"abc"',
+ '"0"',
+ '"-0"',
+ '"1"',
+ '"-1"',
+ '"0x3fff"',
+ '"-0x3fff"',
+ '"0x7fff"',
+ '"-0x7fff"',
+ '"0x10000"',
+ '"-0x10000"',
+ '"0x7ffffff"',
+ '"-0x7ffffff"',
+ '"0x100000000"',
+ '"-0x100000000"',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, "ImmediateResult", op, values);
+generateBinaryTests(tests, opName, operatorType, "PostResult", op, values);
+
+run();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressop_preincjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/op_preinc.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/op_preinc.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/op_preinc.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//@ runFTLNoCJIT
+
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors. See unary-op-test.js for debugging options if needed.
+
+load("./resources/unary-op-test.js");
+
+//============================================================================
+// Test configuration data:
+
+var opName = "preinc";
+var op = "++";
+var operatorType = "Prefix";
+
+var o1 = {
+ valueOf: function() { return 10; }
+};
+
+var posInfinity = 1 / 0;
+var negInfinity = -1 / 0;
+
+var values = [
+ 'o1',
+ 'null',
+ 'undefined',
+ 'true',
+ 'false',
+
+ 'NaN',
+ 'posInfinity',
+ 'negInfinity',
+ '100.2', // Some random small double value.
+ '-100.2',
+ '54294967296.2923', // Some random large double value.
+ '-54294967296.2923',
+
+ '0',
+ '-0',
+ '1',
+ '-1',
+ '0x3fff',
+ '-0x3fff',
+ '0x7fff',
+ '-0x7fff',
+ '0x10000',
+ '-0x10000',
+ '0x7ffffff',
+ '-0x7ffffff',
+ '0x80000000',
+ '-0x80000000',
+ '0x100000000',
+ '-0x100000000',
+
+ '"abc"',
+ '"0"',
+ '"-0"',
+ '"1"',
+ '"-1"',
+ '"0x3fff"',
+ '"-0x3fff"',
+ '"0x7fff"',
+ '"-0x7fff"',
+ '"0x10000"',
+ '"-0x10000"',
+ '"0x7ffffff"',
+ '"-0x7ffffff"',
+ '"0x100000000"',
+ '"-0x100000000"',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, "ImmediateResult", op, values);
+generateBinaryTests(tests, opName, operatorType, "PostResult", op, values);
+
+run();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressresourcesbinaryoptestjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/tests/stress/resources/binary-op-test.js (194332 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/resources/binary-op-test.js        2015-12-21 18:20:58 UTC (rev 194332)
+++ trunk/Source/JavaScriptCore/tests/stress/resources/binary-op-test.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -30,6 +30,8 @@
</span><span class="cx"> function stringifyIfNeeded(x) {
</span><span class="cx"> if (typeof x == "string")
</span><span class="cx"> return '"' + x + '"';
</span><ins>+ if (typeof x == "object")
+ return 'objWithVal:' + x;
</ins><span class="cx"> return x;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -76,6 +78,8 @@
</span><span class="cx"> var errorReport = "";
</span><span class="cx">
</span><span class="cx"> function isIdentical(x, y) {
</span><ins>+ if (typeof x == "undefined" && typeof y == "undefined")
+ return true;
</ins><span class="cx"> if (typeof x != typeof y)
</span><span class="cx"> return false;
</span><span class="cx"> if (x == y) {
</span><span class="lines">@@ -122,8 +126,6 @@
</span><span class="cx">
</span><span class="cx"> for (var test of tests)
</span><span class="cx"> runTest(test);
</span><del>- // for (var i = 0; i < tests.length; i++)
- // runTest(tests[i]);
</del><span class="cx">
</span><span class="cx"> if (errorReport !== "")
</span><span class="cx"> throw "Found failures:\n" + errorReport;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressresourcesunaryoptestjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/resources/unary-op-test.js (0 => 194333)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/resources/unary-op-test.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/resources/unary-op-test.js        2015-12-21 18:40:10 UTC (rev 194333)
</span><span class="lines">@@ -0,0 +1,134 @@
</span><ins>+// This test module provides infrastructure for generating and running tests on a unary
+// operator.
+//
+// It works by generating test functions to exercise the specified operator on operand
+// values in a provided set. For each test, it computes the expected result by exercising
+// the test function once (using the LLINT) at test generation time.
+// The test runner later compares the result produced by the function (as it tiers up)
+// against the expected result.
+//
+// The generated tests will exercise the operator on a variable.
+//
+// If all goes well, this test module will terminate silently. If not, it will print
+// errors.
+
+//============================================================================
+// Debugging options:
+
+var verbose = false;
+var abortOnFirstFail = false;
+var testFilterStr = undefined; // Define a filter string to filter tests to run.
+
+var verboseTestGeneration = false;
+
+//============================================================================
+// Test generation:
+
+function stringifyIfNeeded(x) {
+ if (typeof x == "string")
+ return '"' + x + '"';
+ if (typeof x == "object")
+ return 'objWithVal:' + x;
+ return x;
+}
+
+// operatorTypes can be "Prefix" or "Postfix".
+// resultTypes can be "ImmediateResult" or "PostResult". PostResult is mainly for
+// checking the value of a variable on subsequent inspection, so we can confirm that the
+// postfix operator did do its job.
+var funcIndex = 0;
+function generateBinaryTests(tests, opName, operatorType, resultType, op, inValues) {
+ var funcNamePrefix = opName + resultType;
+ for (var i = 0; i < inValues.length; i++) {
+ var test = { };
+ xStr = inValues[i];
+ test.x = eval(xStr);
+
+ var funcName = funcNamePrefix + funcIndex++;
+ if (operatorType == "Prefix") {
+ if (resultType == "ImmediateResult")
+ test.signature = funcName + "(x) { return " + op + "x }";
+ else if (resultType == "PostResult")
+ test.signature = funcName + "(x) { " + op + "x; return x; }";
+ } else if (operatorType == "Postfix") {
+ if (resultType == "ImmediateResult")
+ test.signature = funcName + "(x) { return x" + op + " }";
+ else if (resultType == "PostResult")
+ test.signature = funcName + "(x) { x" + op + "; return x; }";
+ }
+
+ test.name = test.signature + " with x:" + xStr;
+
+ test.func = eval("(function " + test.signature + ")");
+ noInline(test.func);
+
+ test.expectedResult = test.func(test.x);
+ test.name += ", expected:" + stringifyIfNeeded(test.expectedResult);
+
+ tests.push(test);
+ if (verboseTestGeneration)
+ print("Generated " + test.name);
+ }
+}
+
+//============================================================================
+// Test running and reporting:
+
+var errorReport = "";
+
+function isIdentical(x, y) {
+ if (typeof x == "undefined" && typeof y == "undefined")
+ return true;
+ if (typeof x != typeof y)
+ return false;
+ if (x == y) {
+ if (x)
+ return true;
+ // Distinguish between 0 and negative 0.
+ if (1 / x == 1 / y)
+ return true;
+ } else if (Number.isNaN(x) && Number.isNaN(y))
+ return true;
+ return false;
+}
+
+function runTest(test) {
+ if (testFilterStr && !test.name.includes(testFilterStr))
+ return;
+
+ var firstFailed = -1;
+ try {
+ if (verbose)
+ print(test.name);
+ for (var i = 0; i < 10000; i++) {
+ var result = test.func(test.x);
+ if (isIdentical(result, test.expectedResult))
+ continue;
+ if (firstFailed < 0) {
+ errorReport += "FAILED: " + test.name + " started failing on iteration " + i
+ + ": actual " + stringifyIfNeeded(result) + "\n";
+ if (abortOnFirstFail)
+ throw errorReport;
+ firstFailed = i;
+ }
+ }
+ } catch(e) {
+ if (abortOnFirstFail)
+ throw e; // Negate the catch by re-throwing.
+ errorReport += "FAILED: Unexpected exception: " + e + "\n";
+ }
+}
+
+function run() {
+ if (verbose)
+ print("Start testing");
+
+ for (var test of tests)
+ runTest(test);
+
+ if (errorReport !== "")
+ throw "Found failures:\n" + errorReport;
+
+ if (verbose)
+ print("Done testing");
+}
</ins></span></pre>
</div>
</div>
</body>
</html>