<!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>[185022] 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/185022">185022</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2015-05-29 17:19:01 -0700 (Fri, 29 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refactoring HandlerInfo and UnlinkedHandlerInfo.
https://bugs.webkit.org/show_bug.cgi?id=145480

Reviewed by Benjamin Poulain.

HandlerInfo and UnlinkedHandlerInfo have common parts, but are not currently
expressed as 2 unrelated structs that happen to have near identical fields.
We can refactor them to better express their relationship.  We can also add
some convenience functions to make the code that uses them a little more
readable.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):
(JSC::CodeBlock::handlerForBytecodeOffset):
* bytecode/HandlerInfo.h:
(JSC::UnlinkedHandlerInfo::UnlinkedHandlerInfo):
(JSC::HandlerInfo::initialize):
- I chose to include CodeLocationLabel arg even though it is unused by
  by non-JIT builds.  This makes the call site cleaner to read.

* bytecode/UnlinkedCodeBlock.h:
(JSC::UnlinkedSimpleJumpTable::add):
(JSC::UnlinkedInstruction::UnlinkedInstruction):
(JSC::UnlinkedCodeBlock::numberOfExceptionHandlers):
(JSC::UnlinkedCodeBlock::addExceptionHandler):
(JSC::UnlinkedCodeBlock::exceptionHandler):
(JSC::UnlinkedCodeBlock::symbolTable):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::generate):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeHandlerInfoh">trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (185021 => 185022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-05-30 00:11:48 UTC (rev 185021)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-05-30 00:19:01 UTC (rev 185022)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2015-05-29  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Refactoring HandlerInfo and UnlinkedHandlerInfo.
+        https://bugs.webkit.org/show_bug.cgi?id=145480
+
+        Reviewed by Benjamin Poulain.
+
+        HandlerInfo and UnlinkedHandlerInfo have common parts, but are not currently
+        expressed as 2 unrelated structs that happen to have near identical fields.
+        We can refactor them to better express their relationship.  We can also add
+        some convenience functions to make the code that uses them a little more
+        readable.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::dumpBytecode):
+        (JSC::CodeBlock::CodeBlock):
+        (JSC::CodeBlock::handlerForBytecodeOffset):
+        * bytecode/HandlerInfo.h:
+        (JSC::UnlinkedHandlerInfo::UnlinkedHandlerInfo):
+        (JSC::HandlerInfo::initialize):
+        - I chose to include CodeLocationLabel arg even though it is unused by
+          by non-JIT builds.  This makes the call site cleaner to read.
+
+        * bytecode/UnlinkedCodeBlock.h:
+        (JSC::UnlinkedSimpleJumpTable::add):
+        (JSC::UnlinkedInstruction::UnlinkedInstruction):
+        (JSC::UnlinkedCodeBlock::numberOfExceptionHandlers):
+        (JSC::UnlinkedCodeBlock::addExceptionHandler):
+        (JSC::UnlinkedCodeBlock::exceptionHandler):
+        (JSC::UnlinkedCodeBlock::symbolTable):
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::generate):
+
</ins><span class="cx"> 2015-05-28  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Non-speculative Branch should be fast in the FTL
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (185021 => 185022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-05-30 00:11:48 UTC (rev 185021)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-05-30 00:19:01 UTC (rev 185022)
</span><span class="lines">@@ -654,7 +654,9 @@
</span><span class="cx">         out.printf(&quot;\nException Handlers:\n&quot;);
</span><span class="cx">         unsigned i = 0;
</span><span class="cx">         do {
</span><del>-            out.printf(&quot;\t %d: { start: [%4d] end: [%4d] target: [%4d] depth: [%4d] }\n&quot;, i + 1, m_rareData-&gt;m_exceptionHandlers[i].start, m_rareData-&gt;m_exceptionHandlers[i].end, m_rareData-&gt;m_exceptionHandlers[i].target, m_rareData-&gt;m_exceptionHandlers[i].scopeDepth);
</del><ins>+            HandlerInfo&amp; handler = m_rareData-&gt;m_exceptionHandlers[i];
+            out.printf(&quot;\t %d: { start: [%4d] end: [%4d] target: [%4d] depth: [%4d] }\n&quot;,
+                i + 1, handler.start, handler.end, handler.target, handler.scopeDepth);
</ins><span class="cx">             ++i;
</span><span class="cx">         } while (i &lt; m_rareData-&gt;m_exceptionHandlers.size());
</span><span class="cx">     }
</span><span class="lines">@@ -1819,14 +1821,10 @@
</span><span class="cx">             m_rareData-&gt;m_exceptionHandlers.resizeToFit(count);
</span><span class="cx">             size_t nonLocalScopeDepth = scope-&gt;depth();
</span><span class="cx">             for (size_t i = 0; i &lt; count; i++) {
</span><del>-                const UnlinkedHandlerInfo&amp; handler = unlinkedCodeBlock-&gt;exceptionHandler(i);
-                m_rareData-&gt;m_exceptionHandlers[i].start = handler.start;
-                m_rareData-&gt;m_exceptionHandlers[i].end = handler.end;
-                m_rareData-&gt;m_exceptionHandlers[i].target = handler.target;
-                m_rareData-&gt;m_exceptionHandlers[i].scopeDepth = nonLocalScopeDepth + handler.scopeDepth;
-#if ENABLE(JIT)
-                m_rareData-&gt;m_exceptionHandlers[i].nativeCode = CodeLocationLabel(MacroAssemblerCodePtr::createFromExecutableAddress(LLInt::getCodePtr(op_catch)));
-#endif
</del><ins>+                const UnlinkedHandlerInfo&amp; unlinkedHandler = unlinkedCodeBlock-&gt;exceptionHandler(i);
+                HandlerInfo&amp; handler = m_rareData-&gt;m_exceptionHandlers[i];
+                handler.initialize(unlinkedHandler, nonLocalScopeDepth,
+                    CodeLocationLabel(MacroAssemblerCodePtr::createFromExecutableAddress(LLInt::getCodePtr(op_catch))));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2885,10 +2883,11 @@
</span><span class="cx">     
</span><span class="cx">     Vector&lt;HandlerInfo&gt;&amp; exceptionHandlers = m_rareData-&gt;m_exceptionHandlers;
</span><span class="cx">     for (size_t i = 0; i &lt; exceptionHandlers.size(); ++i) {
</span><ins>+        HandlerInfo&amp; handler = exceptionHandlers[i];
</ins><span class="cx">         // Handlers are ordered innermost first, so the first handler we encounter
</span><span class="cx">         // that contains the source address is the correct handler to use.
</span><del>-        if (exceptionHandlers[i].start &lt;= bytecodeOffset &amp;&amp; exceptionHandlers[i].end &gt; bytecodeOffset)
-            return &amp;exceptionHandlers[i];
</del><ins>+        if (handler.start &lt;= bytecodeOffset &amp;&amp; handler.end &gt; bytecodeOffset)
+            return &amp;handler;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return 0;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeHandlerInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h (185021 => 185022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h        2015-05-30 00:11:48 UTC (rev 185021)
+++ trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h        2015-05-30 00:19:01 UTC (rev 185022)
</span><span class="lines">@@ -30,12 +30,38 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-struct HandlerInfo {
</del><ins>+struct HandlerInfoBase {
</ins><span class="cx">     uint32_t start;
</span><span class="cx">     uint32_t end;
</span><span class="cx">     uint32_t target;
</span><span class="cx">     uint32_t scopeDepth;
</span><ins>+};
+
+struct UnlinkedHandlerInfo : public HandlerInfoBase {
+    UnlinkedHandlerInfo(uint32_t start, uint32_t end, uint32_t target, uint32_t scopeDepth)
+    {
+        this-&gt;start = start;
+        this-&gt;end = end;
+        this-&gt;target = target;
+        this-&gt;scopeDepth = scopeDepth;
+    }
+};
+
+struct HandlerInfo : public HandlerInfoBase {
+    void initialize(const UnlinkedHandlerInfo&amp; unlinkedInfo, size_t nonLocalScopeDepth, CodeLocationLabel label)
+    {
+        start = unlinkedInfo.start;
+        end = unlinkedInfo.end;
+        target = unlinkedInfo.target;
+        scopeDepth = unlinkedInfo.scopeDepth + nonLocalScopeDepth;
</ins><span class="cx"> #if ENABLE(JIT)
</span><ins>+        nativeCode = label;
+#else
+        UNUSED_PARAM(label);
+#endif
+    }
+
+#if ENABLE(JIT)
</ins><span class="cx">     CodeLocationLabel nativeCode;
</span><span class="cx"> #endif
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (185021 => 185022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-05-30 00:11:48 UTC (rev 185021)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-05-30 00:19:01 UTC (rev 185022)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;CodeSpecializationKind.h&quot;
</span><span class="cx"> #include &quot;CodeType.h&quot;
</span><span class="cx"> #include &quot;ExpressionRangeInfo.h&quot;
</span><ins>+#include &quot;HandlerInfo.h&quot;
</ins><span class="cx"> #include &quot;Identifier.h&quot;
</span><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><span class="lines">@@ -246,13 +247,6 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct UnlinkedHandlerInfo {
-    uint32_t start;
-    uint32_t end;
-    uint32_t target;
-    uint32_t scopeDepth;
-};
-
</del><span class="cx"> struct UnlinkedInstruction {
</span><span class="cx">     UnlinkedInstruction() { u.operand = 0; }
</span><span class="cx">     UnlinkedInstruction(OpcodeID opcode) { u.opcode = opcode; }
</span><span class="lines">@@ -427,7 +421,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Exception handling support
</span><span class="cx">     size_t numberOfExceptionHandlers() const { return m_rareData ? m_rareData-&gt;m_exceptionHandlers.size() : 0; }
</span><del>-    void addExceptionHandler(const UnlinkedHandlerInfo&amp; hanler) { createRareDataIfNecessary(); return m_rareData-&gt;m_exceptionHandlers.append(hanler); }
</del><ins>+    void addExceptionHandler(const UnlinkedHandlerInfo&amp; handler) { createRareDataIfNecessary(); return m_rareData-&gt;m_exceptionHandlers.append(handler); }
</ins><span class="cx">     UnlinkedHandlerInfo&amp; exceptionHandler(int index) { ASSERT(m_rareData); return m_rareData-&gt;m_exceptionHandlers[index]; }
</span><span class="cx"> 
</span><span class="cx">     SymbolTable* symbolTable() const { return m_symbolTable.get(); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (185021 => 185022)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-05-30 00:11:48 UTC (rev 185021)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-05-30 00:19:01 UTC (rev 185022)
</span><span class="lines">@@ -129,11 +129,8 @@
</span><span class="cx">             continue;
</span><span class="cx">         
</span><span class="cx">         ASSERT(range.tryData-&gt;targetScopeDepth != UINT_MAX);
</span><del>-        UnlinkedHandlerInfo info = {
-            static_cast&lt;uint32_t&gt;(start), static_cast&lt;uint32_t&gt;(end),
-            static_cast&lt;uint32_t&gt;(range.tryData-&gt;target-&gt;bind()),
-            range.tryData-&gt;targetScopeDepth
-        };
</del><ins>+        UnlinkedHandlerInfo info(static_cast&lt;uint32_t&gt;(start), static_cast&lt;uint32_t&gt;(end),
+            static_cast&lt;uint32_t&gt;(range.tryData-&gt;target-&gt;bind()), range.tryData-&gt;targetScopeDepth);
</ins><span class="cx">         m_codeBlock-&gt;addExceptionHandler(info);
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre>
</div>
</div>

</body>
</html>