<!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>[188887] 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/188887">188887</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2015-08-24 14:51:26 -0700 (Mon, 24 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add support for setting JSC options from a file.
https://bugs.webkit.org/show_bug.cgi?id=148394

Reviewed by Saam Barati.

This is needed for environments where the JSC executable does not have access to
environmental variables.  This is only needed for debugging, and is currently
guarded under a #define USE_OPTIONS_FILE in Options.cpp, and is disabled by
default.

Also fixed Options::setOptions() to be allow for whitespace that is not a single
' '.  This makes setOptions() much more flexible and friendlier to use for loading
options in general.

For example, this current use case of loading options from a file may have '\n's
in the character stream, and this feature is easier to implement if setOptions()
just support more than 1 whitespace char between options, and recognize whitespace
characters other than ' '.

* runtime/Options.cpp:
(JSC::parse):
(JSC::Options::initialize):
(JSC::Options::setOptions):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionscpp">trunk/Source/JavaScriptCore/runtime/Options.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188886 => 188887)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-24 21:44:39 UTC (rev 188886)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-24 21:51:26 UTC (rev 188887)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2015-08-24  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Add support for setting JSC options from a file.
+        https://bugs.webkit.org/show_bug.cgi?id=148394
+
+        Reviewed by Saam Barati.
+
+        This is needed for environments where the JSC executable does not have access to
+        environmental variables.  This is only needed for debugging, and is currently
+        guarded under a #define USE_OPTIONS_FILE in Options.cpp, and is disabled by
+        default.
+
+        Also fixed Options::setOptions() to be allow for whitespace that is not a single
+        ' '.  This makes setOptions() much more flexible and friendlier to use for loading
+        options in general.
+
+        For example, this current use case of loading options from a file may have '\n's
+        in the character stream, and this feature is easier to implement if setOptions()
+        just support more than 1 whitespace char between options, and recognize whitespace
+        characters other than ' '.
+
+        * runtime/Options.cpp:
+        (JSC::parse):
+        (JSC::Options::initialize):
+        (JSC::Options::setOptions):
+
</ins><span class="cx"> 2015-08-24  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         DFG::FixupPhase should use the lambda form of m_graph.doToChildren() rather than the old macro
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.cpp (188886 => 188887)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.cpp        2015-08-24 21:44:39 UTC (rev 188886)
+++ trunk/Source/JavaScriptCore/runtime/Options.cpp        2015-08-24 21:51:26 UTC (rev 188887)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &lt;mutex&gt;
</span><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> #include &lt;string.h&gt;
</span><ins>+#include &lt;wtf/ASCIICType.h&gt;
</ins><span class="cx"> #include &lt;wtf/DataLog.h&gt;
</span><span class="cx"> #include &lt;wtf/NumberOfCores.h&gt;
</span><span class="cx"> #include &lt;wtf/PageBlock.h&gt;
</span><span class="lines">@@ -48,6 +49,9 @@
</span><span class="cx"> #include &quot;MacroAssemblerX86.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#define USE_OPTIONS_FILE 0
+#define OPTIONS_FILENAME &quot;/tmp/jsc.options&quot;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> static bool parse(const char* string, bool&amp; value)
</span><span class="lines">@@ -362,6 +366,31 @@
</span><span class="cx">     
</span><span class="cx">             recomputeDependentOptions();
</span><span class="cx"> 
</span><ins>+#if USE(OPTIONS_FILE)
+            {
+                const char* filename = OPTIONS_FILENAME;
+                FILE* optionsFile = fopen(filename, &quot;r&quot;);
+                if (!optionsFile) {
+                    dataLogF(&quot;Failed to open file %s. Did you add the file-read-data entitlement to WebProcess.sb?\n&quot;, filename);
+                    return;
+                }
+                
+                StringBuilder builder;
+                char* line;
+                char buffer[BUFSIZ];
+                while ((line = fgets(buffer, sizeof(buffer), optionsFile)))
+                    builder.append(buffer);
+                
+                const char* optionsStr = builder.toString().utf8().data();
+                dataLogF(&quot;Setting options: %s\n&quot;, optionsStr);
+                setOptions(optionsStr);
+                
+                int result = fclose(optionsFile);
+                if (result)
+                    dataLogF(&quot;Failed to close file %s: %s\n&quot;, filename, strerror(errno));
+            }
+#endif
+
</ins><span class="cx">             // Do range checks where needed and make corrections to the options:
</span><span class="cx">             ASSERT(Options::thresholdForOptimizeAfterLongWarmUp() &gt;= Options::thresholdForOptimizeAfterWarmUp());
</span><span class="cx">             ASSERT(Options::thresholdForOptimizeAfterWarmUp() &gt;= Options::thresholdForOptimizeSoon());
</span><span class="lines">@@ -410,6 +439,12 @@
</span><span class="cx">     char* p = optionsStrCopy;
</span><span class="cx"> 
</span><span class="cx">     while (p &lt; end) {
</span><ins>+        // Skip white space.
+        while (p &lt; end &amp;&amp; isASCIISpace(*p))
+            p++;
+        if (p == end)
+            break;
+
</ins><span class="cx">         char* optionStart = p;
</span><span class="cx">         p = strstr(p, &quot;=&quot;);
</span><span class="cx">         if (!p) {
</span><span class="lines">@@ -430,7 +465,9 @@
</span><span class="cx">             hasStringValue = true;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        p = strstr(p, &quot; &quot;);
</del><ins>+        // Find next white space.
+        while (p &lt; end &amp;&amp; !isASCIISpace(*p))
+            p++;
</ins><span class="cx">         if (!p)
</span><span class="cx">             p = end; // No more &quot; &quot; separator. Hence, this is the last arg.
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>