<!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  &lt;mark.lam@apple.com&gt;
+
+        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  &lt;ryanhaddad@apple.com&gt;
</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(&quot;./resources/unary-op-test.js&quot;);
+
+//============================================================================
+// Test configuration data:
+
+var opName = &quot;negate&quot;;
+var op = &quot;-&quot;;
+var operatorType = &quot;Prefix&quot;;
+
+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',
+
+    '&quot;abc&quot;',
+    '&quot;0&quot;',
+    '&quot;-0&quot;',
+    '&quot;1&quot;',
+    '&quot;-1&quot;',
+    '&quot;0x3fff&quot;',
+    '&quot;-0x3fff&quot;',
+    '&quot;0x7fff&quot;',
+    '&quot;-0x7fff&quot;',
+    '&quot;0x10000&quot;',
+    '&quot;-0x10000&quot;',
+    '&quot;0x7ffffff&quot;',
+    '&quot;-0x7ffffff&quot;',
+    '&quot;0x100000000&quot;',
+    '&quot;-0x100000000&quot;',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, &quot;ImmediateResult&quot;, op, values);
+generateBinaryTests(tests, opName, operatorType, &quot;PostResult&quot;, 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(&quot;./resources/unary-op-test.js&quot;);
+
+//============================================================================
+// Test configuration data:
+
+var opName = &quot;postdec&quot;;
+var op = &quot;--&quot;;
+var operatorType = &quot;Postfix&quot;;
+
+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',
+
+    '&quot;abc&quot;',
+    '&quot;0&quot;',
+    '&quot;-0&quot;',
+    '&quot;1&quot;',
+    '&quot;-1&quot;',
+    '&quot;0x3fff&quot;',
+    '&quot;-0x3fff&quot;',
+    '&quot;0x7fff&quot;',
+    '&quot;-0x7fff&quot;',
+    '&quot;0x10000&quot;',
+    '&quot;-0x10000&quot;',
+    '&quot;0x7ffffff&quot;',
+    '&quot;-0x7ffffff&quot;',
+    '&quot;0x100000000&quot;',
+    '&quot;-0x100000000&quot;',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, &quot;ImmediateResult&quot;, op, values);
+generateBinaryTests(tests, opName, operatorType, &quot;PostResult&quot;, 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(&quot;./resources/unary-op-test.js&quot;);
+
+//============================================================================
+// Test configuration data:
+
+var opName = &quot;postinc&quot;;
+var op = &quot;++&quot;;
+var operatorType = &quot;Postfix&quot;;
+
+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',
+
+    '&quot;abc&quot;',
+    '&quot;0&quot;',
+    '&quot;-0&quot;',
+    '&quot;1&quot;',
+    '&quot;-1&quot;',
+    '&quot;0x3fff&quot;',
+    '&quot;-0x3fff&quot;',
+    '&quot;0x7fff&quot;',
+    '&quot;-0x7fff&quot;',
+    '&quot;0x10000&quot;',
+    '&quot;-0x10000&quot;',
+    '&quot;0x7ffffff&quot;',
+    '&quot;-0x7ffffff&quot;',
+    '&quot;0x100000000&quot;',
+    '&quot;-0x100000000&quot;',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, &quot;ImmediateResult&quot;, op, values);
+generateBinaryTests(tests, opName, operatorType, &quot;PostResult&quot;, 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(&quot;./resources/unary-op-test.js&quot;);
+
+//============================================================================
+// Test configuration data:
+
+var opName = &quot;predec&quot;;
+var op = &quot;--&quot;;
+var operatorType = &quot;Prefix&quot;;
+
+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',
+
+    '&quot;abc&quot;',
+    '&quot;0&quot;',
+    '&quot;-0&quot;',
+    '&quot;1&quot;',
+    '&quot;-1&quot;',
+    '&quot;0x3fff&quot;',
+    '&quot;-0x3fff&quot;',
+    '&quot;0x7fff&quot;',
+    '&quot;-0x7fff&quot;',
+    '&quot;0x10000&quot;',
+    '&quot;-0x10000&quot;',
+    '&quot;0x7ffffff&quot;',
+    '&quot;-0x7ffffff&quot;',
+    '&quot;0x100000000&quot;',
+    '&quot;-0x100000000&quot;',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, &quot;ImmediateResult&quot;, op, values);
+generateBinaryTests(tests, opName, operatorType, &quot;PostResult&quot;, 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(&quot;./resources/unary-op-test.js&quot;);
+
+//============================================================================
+// Test configuration data:
+
+var opName = &quot;preinc&quot;;
+var op = &quot;++&quot;;
+var operatorType = &quot;Prefix&quot;;
+
+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',
+
+    '&quot;abc&quot;',
+    '&quot;0&quot;',
+    '&quot;-0&quot;',
+    '&quot;1&quot;',
+    '&quot;-1&quot;',
+    '&quot;0x3fff&quot;',
+    '&quot;-0x3fff&quot;',
+    '&quot;0x7fff&quot;',
+    '&quot;-0x7fff&quot;',
+    '&quot;0x10000&quot;',
+    '&quot;-0x10000&quot;',
+    '&quot;0x7ffffff&quot;',
+    '&quot;-0x7ffffff&quot;',
+    '&quot;0x100000000&quot;',
+    '&quot;-0x100000000&quot;',
+];
+
+tests = [];
+generateBinaryTests(tests, opName, operatorType, &quot;ImmediateResult&quot;, op, values);
+generateBinaryTests(tests, opName, operatorType, &quot;PostResult&quot;, 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 == &quot;string&quot;)
</span><span class="cx">         return '&quot;' + x + '&quot;';
</span><ins>+    if (typeof x == &quot;object&quot;)
+        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 = &quot;&quot;;
</span><span class="cx"> 
</span><span class="cx"> function isIdentical(x, y) {
</span><ins>+    if (typeof x == &quot;undefined&quot; &amp;&amp; typeof y == &quot;undefined&quot;)
+        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 &lt; tests.length; i++)
-    //     runTest(tests[i]);
</del><span class="cx"> 
</span><span class="cx">     if (errorReport !== &quot;&quot;)
</span><span class="cx">         throw &quot;Found failures:\n&quot; + 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 == &quot;string&quot;)
+        return '&quot;' + x + '&quot;';
+    if (typeof x == &quot;object&quot;)
+        return 'objWithVal:' + x;
+    return x;
+}
+
+// operatorTypes can be &quot;Prefix&quot; or &quot;Postfix&quot;.
+// resultTypes can be &quot;ImmediateResult&quot; or &quot;PostResult&quot;. 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 &lt; inValues.length; i++) {
+        var test = { };
+        xStr = inValues[i];
+        test.x = eval(xStr);
+
+        var funcName = funcNamePrefix + funcIndex++;
+        if (operatorType == &quot;Prefix&quot;) {
+            if (resultType == &quot;ImmediateResult&quot;)
+                test.signature = funcName + &quot;(x) { return &quot; + op + &quot;x }&quot;;
+            else if (resultType == &quot;PostResult&quot;)
+                test.signature = funcName + &quot;(x) { &quot; + op + &quot;x; return x; }&quot;;
+        } else if (operatorType == &quot;Postfix&quot;) {
+            if (resultType == &quot;ImmediateResult&quot;)
+                test.signature = funcName + &quot;(x) { return x&quot; + op + &quot; }&quot;;
+            else if (resultType == &quot;PostResult&quot;)
+                test.signature = funcName + &quot;(x) { x&quot; + op + &quot;; return x; }&quot;;
+        }
+
+        test.name = test.signature + &quot; with x:&quot; + xStr;
+
+        test.func = eval(&quot;(function &quot; + test.signature + &quot;)&quot;);
+        noInline(test.func);
+
+        test.expectedResult = test.func(test.x);
+        test.name += &quot;, expected:&quot; + stringifyIfNeeded(test.expectedResult);
+
+        tests.push(test);
+        if (verboseTestGeneration)
+            print(&quot;Generated &quot; + test.name);
+    }
+}
+
+//============================================================================
+// Test running and reporting:
+
+var errorReport = &quot;&quot;;
+
+function isIdentical(x, y) {
+    if (typeof x == &quot;undefined&quot; &amp;&amp; typeof y == &quot;undefined&quot;)
+        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) &amp;&amp; Number.isNaN(y))
+        return true;
+    return false;
+}
+
+function runTest(test) {
+    if (testFilterStr &amp;&amp; !test.name.includes(testFilterStr))
+        return;
+
+    var firstFailed = -1;
+    try {
+        if (verbose)
+            print(test.name);
+        for (var i = 0; i &lt; 10000; i++) {
+            var result = test.func(test.x);
+            if (isIdentical(result, test.expectedResult))
+                continue;
+            if (firstFailed &lt; 0) {
+                errorReport += &quot;FAILED: &quot; + test.name + &quot; started failing on iteration &quot; + i
+                    + &quot;: actual &quot; + stringifyIfNeeded(result) + &quot;\n&quot;;
+                if (abortOnFirstFail)
+                    throw errorReport;
+                firstFailed = i;
+            }
+        }
+    } catch(e) {
+        if (abortOnFirstFail)
+            throw e; // Negate the catch by re-throwing.
+        errorReport += &quot;FAILED: Unexpected exception: &quot; + e + &quot;\n&quot;;
+    }
+}
+
+function run() {
+    if (verbose)
+        print(&quot;Start testing&quot;);
+
+    for (var test of tests)
+        runTest(test);
+
+    if (errorReport !== &quot;&quot;)
+        throw &quot;Found failures:\n&quot; + errorReport;
+
+    if (verbose)
+        print(&quot;Done testing&quot;);
+}
</ins></span></pre>
</div>
</div>

</body>
</html>