<!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>[192273] 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/192273">192273</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2015-11-10 14:50:55 -0800 (Tue, 10 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Create an FTLExceptionHandlerManager abstraction
https://bugs.webkit.org/show_bug.cgi?id=151079

Reviewed by Mark Lam.

Before, we used to manage the {stackmapRecordIndex =&gt; OSRExit} relationship
for exception handlers with a locally allocated HashMap and a few different
lambdas and random checks. It's cleaner and more manageable to just create 
a class that handles this abstraction for us. This class provides nice helper 
functions for everything we need. This abstraction makes reading the code easier.
And it will also makes hacking on the code in the future easier.

* CMakeLists.txt:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* dfg/DFGOSRExitBase.h:
(JSC::DFG::OSRExitBase::OSRExitBase):
* ftl/FTLCompile.cpp:
(JSC::FTL::mmAllocateDataSection):
* ftl/FTLExceptionHandlerManager.cpp: Added.
(JSC::FTL::ExceptionHandlerManager::ExceptionHandlerManager):
(JSC::FTL::ExceptionHandlerManager::addNewExit):
(JSC::FTL::ExceptionHandlerManager::getOrPutByIdCallOperationExceptionTarget):
(JSC::FTL::ExceptionHandlerManager::lazySlowPathExceptionTarget):
(JSC::FTL::ExceptionHandlerManager::getByIdOSRExit):
(JSC::FTL::ExceptionHandlerManager::getCallOSRExitCommon):
(JSC::FTL::ExceptionHandlerManager::getCallOSRExit):
(JSC::FTL::ExceptionHandlerManager::procureCallSiteIndex):
* ftl/FTLExceptionHandlerManager.h: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOSRExitBaseh">trunk/Source/JavaScriptCore/dfg/DFGOSRExitBase.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLCompilecpp">trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreftlFTLExceptionHandlerManagercpp">trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLExceptionHandlerManagerh">trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -985,6 +985,7 @@
</span><span class="cx">         ftl/FTLDWARFDebugLineInfo.cpp
</span><span class="cx">         ftl/FTLDWARFRegister.cpp
</span><span class="cx">         ftl/FTLDataSection.cpp
</span><ins>+        ftl/FTLExceptionHandlerManager.cpp
</ins><span class="cx">         ftl/FTLExitArgument.cpp
</span><span class="cx">         ftl/FTLExitArgumentForOperand.cpp
</span><span class="cx">         ftl/FTLExitPropertyValue.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2015-11-10  Saam barati  &lt;sbarati@apple.com&gt;
+
+        Create an FTLExceptionHandlerManager abstraction
+        https://bugs.webkit.org/show_bug.cgi?id=151079
+
+        Reviewed by Mark Lam.
+
+        Before, we used to manage the {stackmapRecordIndex =&gt; OSRExit} relationship
+        for exception handlers with a locally allocated HashMap and a few different
+        lambdas and random checks. It's cleaner and more manageable to just create 
+        a class that handles this abstraction for us. This class provides nice helper 
+        functions for everything we need. This abstraction makes reading the code easier.
+        And it will also makes hacking on the code in the future easier.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * dfg/DFGOSRExitBase.h:
+        (JSC::DFG::OSRExitBase::OSRExitBase):
+        * ftl/FTLCompile.cpp:
+        (JSC::FTL::mmAllocateDataSection):
+        * ftl/FTLExceptionHandlerManager.cpp: Added.
+        (JSC::FTL::ExceptionHandlerManager::ExceptionHandlerManager):
+        (JSC::FTL::ExceptionHandlerManager::addNewExit):
+        (JSC::FTL::ExceptionHandlerManager::getOrPutByIdCallOperationExceptionTarget):
+        (JSC::FTL::ExceptionHandlerManager::lazySlowPathExceptionTarget):
+        (JSC::FTL::ExceptionHandlerManager::getByIdOSRExit):
+        (JSC::FTL::ExceptionHandlerManager::getCallOSRExitCommon):
+        (JSC::FTL::ExceptionHandlerManager::getCallOSRExit):
+        (JSC::FTL::ExceptionHandlerManager::procureCallSiteIndex):
+        * ftl/FTLExceptionHandlerManager.h: Added.
+
</ins><span class="cx"> 2015-11-10  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         X86_64 support for compareDouble(DoubleCondition, FPRegisterID left, FPRegisterID right, RegisterID dest)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -525,6 +525,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLDataSection.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLDWARFDebugLineInfo.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLDWARFRegister.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\ftl\FTLExceptionHandlerManager.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLExitArgument.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLExitArgumentForOperand.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLExitPropertyValue.cpp&quot; /&gt;
</span><span class="lines">@@ -1290,6 +1291,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLDataSection.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLDWARFDebugLineInfo.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLDWARFRegister.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ftl\FTLExceptionHandlerManager.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLExitArgument.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLExitArgumentForOperand.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLStackmapArgumentList.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -1563,6 +1563,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLDWARFRegister.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ftl&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\ftl\FTLExceptionHandlerManager.cpp&quot;&gt;
+      &lt;Filter&gt;ftl&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLExitArgument.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ftl&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -4120,6 +4123,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLDWARFRegister.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ftl&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ftl\FTLExceptionHandlerManager.h&quot;&gt;
+      &lt;Filter&gt;ftl&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLExitArgument.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ftl&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -1206,6 +1206,8 @@
</span><span class="cx">                 797E07AA1B8FCFB9008400BA /* JSGlobalLexicalEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = 797E07A81B8FCFB9008400BA /* JSGlobalLexicalEnvironment.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 79C4B15D1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79C4B15B1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.cpp */; };
</span><span class="cx">                 79C4B15E1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 79C4B15C1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                79DF66B01BF26A570001CF11 /* FTLExceptionHandlerManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79DF66AE1BF26A570001CF11 /* FTLExceptionHandlerManager.cpp */; };
+                79DF66B11BF26A570001CF11 /* FTLExceptionHandlerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 79DF66AF1BF26A570001CF11 /* FTLExceptionHandlerManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 79EE0BFF1B4AFB85000385C9 /* VariableEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79EE0BFD1B4AFB85000385C9 /* VariableEnvironment.cpp */; };
</span><span class="cx">                 79EE0C001B4AFB85000385C9 /* VariableEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = 79EE0BFE1B4AFB85000385C9 /* VariableEnvironment.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 79F8FC1E1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79F8FC1C1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp */; };
</span><span class="lines">@@ -3252,6 +3254,8 @@
</span><span class="cx">                 797E07A81B8FCFB9008400BA /* JSGlobalLexicalEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalLexicalEnvironment.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 79C4B15B1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGLiveCatchVariablePreservationPhase.cpp; path = dfg/DFGLiveCatchVariablePreservationPhase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 79C4B15C1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGLiveCatchVariablePreservationPhase.h; path = dfg/DFGLiveCatchVariablePreservationPhase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                79DF66AE1BF26A570001CF11 /* FTLExceptionHandlerManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLExceptionHandlerManager.cpp; path = ftl/FTLExceptionHandlerManager.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                79DF66AF1BF26A570001CF11 /* FTLExceptionHandlerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLExceptionHandlerManager.h; path = ftl/FTLExceptionHandlerManager.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 79EE0BFD1B4AFB85000385C9 /* VariableEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableEnvironment.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 79EE0BFE1B4AFB85000385C9 /* VariableEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableEnvironment.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 79F8FC1C1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGMaximalFlushInsertionPhase.cpp; path = dfg/DFGMaximalFlushInsertionPhase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4338,6 +4342,8 @@
</span><span class="cx">                                 2AC922BA18A16182003CE0FB /* FTLDWARFDebugLineInfo.h */,
</span><span class="cx">                                 0F9C5E5C18E35F5E00D431C3 /* FTLDWARFRegister.cpp */,
</span><span class="cx">                                 0F9C5E5D18E35F5E00D431C3 /* FTLDWARFRegister.h */,
</span><ins>+                                79DF66AE1BF26A570001CF11 /* FTLExceptionHandlerManager.cpp */,
+                                79DF66AF1BF26A570001CF11 /* FTLExceptionHandlerManager.h */,
</ins><span class="cx">                                 0F235BBD17178E1C00690C7F /* FTLExitArgument.cpp */,
</span><span class="cx">                                 0F235BBE17178E1C00690C7F /* FTLExitArgument.h */,
</span><span class="cx">                                 0F235BBF17178E1C00690C7F /* FTLExitArgumentForOperand.cpp */,
</span><span class="lines">@@ -6582,6 +6588,7 @@
</span><span class="cx">                                 0F4570391BE44C910062A629 /* AirEliminateDeadCode.h in Headers */,
</span><span class="cx">                                 0FEC85771BDACDC70080FF74 /* AirFrequentedBlock.h in Headers */,
</span><span class="cx">                                 0FEC85791BDACDC70080FF74 /* AirGenerate.h in Headers */,
</span><ins>+                                79DF66B11BF26A570001CF11 /* FTLExceptionHandlerManager.h in Headers */,
</ins><span class="cx">                                 0FEC857A1BDACDC70080FF74 /* AirGenerationContext.h in Headers */,
</span><span class="cx">                                 0FEC857C1BDACDC70080FF74 /* AirHandleCalleeSaves.h in Headers */,
</span><span class="cx">                                 0FEC857E1BDACDC70080FF74 /* AirInsertionSet.h in Headers */,
</span><span class="lines">@@ -8700,6 +8707,7 @@
</span><span class="cx">                                 0F2B66FE17B6B5AB00A7AE3F /* JSTypedArrays.cpp in Sources */,
</span><span class="cx">                                 534C457E1BC72549007476A7 /* JSTypedArrayViewConstructor.cpp in Sources */,
</span><span class="cx">                                 DEA7E2441BBC677200D78440 /* JSTypedArrayViewPrototype.cpp in Sources */,
</span><ins>+                                79DF66B01BF26A570001CF11 /* FTLExceptionHandlerManager.cpp in Sources */,
</ins><span class="cx">                                 86E3C61A167BABEE006D760A /* JSValue.mm in Sources */,
</span><span class="cx">                                 14BD5A320A3E91F600BAF59C /* JSValueRef.cpp in Sources */,
</span><span class="cx">                                 86E3C61C167BABEE006D760A /* JSVirtualMachine.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOSRExitBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOSRExitBase.h (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOSRExitBase.h        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/dfg/DFGOSRExitBase.h        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -45,7 +45,6 @@
</span><span class="cx">         , m_count(0)
</span><span class="cx">         , m_codeOrigin(origin)
</span><span class="cx">         , m_codeOriginForExitProfile(originForProfile)
</span><del>-        , m_exceptionHandlerCallSiteIndex(std::numeric_limits&lt;unsigned&gt;::max())
</del><span class="cx">         , m_isExceptionHandler(false)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_codeOrigin.isSet());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLCompilecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp (192272 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-11-10 22:31:21 UTC (rev 192272)
+++ trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;DFGOperations.h&quot;
</span><span class="cx"> #include &quot;DataView.h&quot;
</span><span class="cx"> #include &quot;Disassembler.h&quot;
</span><ins>+#include &quot;FTLExceptionHandlerManager.h&quot;
</ins><span class="cx"> #include &quot;FTLExitThunkGenerator.h&quot;
</span><span class="cx"> #include &quot;FTLInlineCacheSize.h&quot;
</span><span class="cx"> #include &quot;FTLJITCode.h&quot;
</span><span class="lines">@@ -466,7 +467,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename CallType&gt;
</span><del>-void adjustCallICsForStackmaps(Vector&lt;CallType&gt;&amp; calls, StackMaps::RecordMap&amp; recordMap, std::function&lt;CallSiteIndex (uint32_t recordIndex, CodeOrigin origin)&gt; generateCallSiteIndexFunction, std::function&lt;OSRExit* (uint32_t recordIndex)&gt; getCorrespondingOSRExit)
</del><ins>+void adjustCallICsForStackmaps(Vector&lt;CallType&gt;&amp; calls, StackMaps::RecordMap&amp; recordMap, ExceptionHandlerManager&amp; exceptionHandlerManager)
</ins><span class="cx"> {
</span><span class="cx">     // Handling JS calls is weird: we need to ensure that we sort them by the PC in LLVM
</span><span class="cx">     // generated code. That implies first pruning the ones that LLVM didn't generate.
</span><span class="lines">@@ -484,8 +485,8 @@
</span><span class="cx">         for (unsigned j = 0; j &lt; iter-&gt;value.size(); ++j) {
</span><span class="cx">             CallType copy = call;
</span><span class="cx">             copy.m_instructionOffset = iter-&gt;value[j].record.instructionOffset;
</span><del>-            copy.setCallSiteIndex(generateCallSiteIndexFunction(iter-&gt;value[j].index, copy.callSiteDescriptionOrigin()));
-            copy.setCorrespondingGenericUnwindOSRExit(getCorrespondingOSRExit(iter-&gt;value[j].index));
</del><ins>+            copy.setCallSiteIndex(exceptionHandlerManager.procureCallSiteIndex(iter-&gt;value[j].index, copy));
+            copy.setCorrespondingGenericUnwindOSRExit(exceptionHandlerManager.getCallOSRExit(iter-&gt;value[j].index, copy));
</ins><span class="cx"> 
</span><span class="cx">             calls.append(copy);
</span><span class="cx">         }
</span><span class="lines">@@ -502,29 +503,7 @@
</span><span class="cx">     VM&amp; vm = graph.m_vm;
</span><span class="cx">     StackMaps&amp; stackmaps = jitCode-&gt;stackmaps;
</span><span class="cx"> 
</span><del>-    // We fill this when generating OSR exits that will be executed via genericUnwind()
-    // or lazy slow path exception checks.
-    // That way, when we assign a CallSiteIndex to the Call/GetById/PutById/LazySlowPath, we assign
-    // it the proper CallSiteIndex that corresponds to the OSRExit exception handler.
-    HashMap&lt;uint32_t, size_t, WTF::IntHash&lt;uint32_t&gt;, WTF::UnsignedWithZeroKeyHashTraits&lt;uint32_t&gt;&gt; recordIndexToGenericUnwindOrLazySlowPathOSRExit;
-    auto generateOrGetAlreadyGeneratedCallSiteIndex = [&amp;] (uint32_t recordIndex, CodeOrigin origin) -&gt; CallSiteIndex {
-        auto findResult = recordIndexToGenericUnwindOrLazySlowPathOSRExit.find(recordIndex);
-        if (findResult == recordIndexToGenericUnwindOrLazySlowPathOSRExit.end())
-            return state.jitCode-&gt;common.addUniqueCallSiteIndex(origin);
-        size_t osrExitIndex = findResult-&gt;value;
-        return state.jitCode-&gt;osrExit[osrExitIndex].m_exceptionHandlerCallSiteIndex;
-    };
-    auto jsCallOSRExitForRecordIndex = [&amp;] (uint32_t recordIndex) -&gt; OSRExit* {
-        auto findResult = recordIndexToGenericUnwindOrLazySlowPathOSRExit.find(recordIndex);
-        if (findResult == recordIndexToGenericUnwindOrLazySlowPathOSRExit.end())
-            return nullptr;
-
-        size_t osrExitIndex = findResult-&gt;value;
-        OSRExit&amp; exit = state.jitCode-&gt;osrExit[osrExitIndex];
-        if (!exit.m_descriptor.m_isExceptionFromJSCall)
-            return nullptr;
-        return &amp;exit;
-    };
</del><ins>+    ExceptionHandlerManager exceptionHandlerManager(state);
</ins><span class="cx">     
</span><span class="cx">     int localsOffset = offsetOfStackRegion(recordMap, state.capturedStackmapID) + graph.m_nextMachineLocal;
</span><span class="cx">     int varargsSpillSlotsOffset = offsetOfStackRegion(recordMap, state.varargsSpillSlotsStackmapID);
</span><span class="lines">@@ -610,7 +589,7 @@
</span><span class="cx">                 RELEASE_ASSERT(exit.m_descriptor.m_semanticCodeOriginForCallFrameHeader.isSet());
</span><span class="cx">                 CallSiteIndex callSiteIndex = state.jitCode-&gt;common.addUniqueCallSiteIndex(exit.m_descriptor.m_semanticCodeOriginForCallFrameHeader);
</span><span class="cx">                 exit.m_exceptionHandlerCallSiteIndex = callSiteIndex;
</span><del>-                recordIndexToGenericUnwindOrLazySlowPathOSRExit.add(iter-&gt;value[j].index, state.jitCode-&gt;osrExit.size() - 1);
</del><ins>+                exceptionHandlerManager.addNewExit(iter-&gt;value[j].index, state.jitCode-&gt;osrExit.size() - 1);
</ins><span class="cx"> 
</span><span class="cx">                 if (exitDescriptor.m_isExceptionFromJSCall)
</span><span class="cx">                     exit.gatherRegistersToSpillForCallIfException(stackmaps, record);
</span><span class="lines">@@ -683,16 +662,11 @@
</span><span class="cx"> 
</span><span class="cx">         Vector&lt;std::pair&lt;CCallHelpers::JumpList, CodeLocationLabel&gt;&gt; exceptionJumpsToLink;
</span><span class="cx">         auto addNewExceptionJumpIfNecessary = [&amp;] (uint32_t recordIndex) {
</span><del>-            auto findResult = recordIndexToGenericUnwindOrLazySlowPathOSRExit.find(recordIndex);
-            if (findResult == recordIndexToGenericUnwindOrLazySlowPathOSRExit.end())
</del><ins>+            CodeLocationLabel exceptionTarget = exceptionHandlerManager.getOrPutByIdCallOperationExceptionTarget(recordIndex);
+            if (!exceptionTarget)
</ins><span class="cx">                 return false;
</span><del>-
-            size_t osrExitIndex = findResult-&gt;value;
-            RELEASE_ASSERT(state.jitCode-&gt;osrExit[osrExitIndex].m_descriptor.m_willArriveAtOSRExitFromGenericUnwind);
-            OSRExitCompilationInfo&amp; info = state.finalizer-&gt;osrExit[osrExitIndex];
-            RELEASE_ASSERT(info.m_getAndPutByIdCallOperationExceptionOSRExitEntrance.isSet());
</del><span class="cx">             exceptionJumpsToLink.append(
</span><del>-                std::make_pair(CCallHelpers::JumpList(), state.finalizer-&gt;exitThunksLinkBuffer-&gt;locationOf(info.m_getAndPutByIdCallOperationExceptionOSRExitEntrance)));
</del><ins>+                std::make_pair(CCallHelpers::JumpList(), exceptionTarget));
</ins><span class="cx">             return true;
</span><span class="cx">         };
</span><span class="cx">         
</span><span class="lines">@@ -718,7 +692,7 @@
</span><span class="cx">                 GPRReg base = record.locations[1].directGPR();
</span><span class="cx">                 
</span><span class="cx">                 JITGetByIdGenerator gen(
</span><del>-                    codeBlock, codeOrigin, generateOrGetAlreadyGeneratedCallSiteIndex(iter-&gt;value[i].index, codeOrigin), usedRegisters, JSValueRegs(base),
</del><ins>+                    codeBlock, codeOrigin, exceptionHandlerManager.procureCallSiteIndex(iter-&gt;value[i].index, codeOrigin), usedRegisters, JSValueRegs(base),
</ins><span class="cx">                     JSValueRegs(result));
</span><span class="cx">                 
</span><span class="cx">                 bool addedUniqueExceptionJump = addNewExceptionJumpIfNecessary(iter-&gt;value[i].index);
</span><span class="lines">@@ -733,13 +707,8 @@
</span><span class="cx">                     // register that we would like to do value recovery on. We combat this situation from ever
</span><span class="cx">                     // taking place by ensuring we spill the original base value and then recover it from
</span><span class="cx">                     // the spill slot as the first step in OSR exit.
</span><del>-                    auto findResult = recordIndexToGenericUnwindOrLazySlowPathOSRExit.find(iter-&gt;value[i].index);
-                    if (findResult != recordIndexToGenericUnwindOrLazySlowPathOSRExit.end()) {
-                        size_t osrExitIndex = findResult-&gt;value;
-                        OSRExit&amp; exit = state.jitCode-&gt;osrExit[osrExitIndex];
-                        RELEASE_ASSERT(exit.m_descriptor.m_isExceptionFromGetById);
-                        exit.spillRegistersToSpillSlot(slowPathJIT, jsCallThatMightThrowSpillOffset);
-                    }
</del><ins>+                    if (OSRExit* exit = exceptionHandlerManager.getByIdOSRExit(iter-&gt;value[i].index))
+                        exit-&gt;spillRegistersToSpillSlot(slowPathJIT, jsCallThatMightThrowSpillOffset);
</ins><span class="cx">                 }
</span><span class="cx">                 MacroAssembler::Call call = callOperation(
</span><span class="cx">                     state, usedRegisters, slowPathJIT, codeOrigin, addedUniqueExceptionJump ? &amp;exceptionJumpsToLink.last().first : &amp;exceptionTarget,
</span><span class="lines">@@ -775,7 +744,7 @@
</span><span class="cx">                 GPRReg value = record.locations[1].directGPR();
</span><span class="cx">                 
</span><span class="cx">                 JITPutByIdGenerator gen(
</span><del>-                    codeBlock, codeOrigin, generateOrGetAlreadyGeneratedCallSiteIndex(iter-&gt;value[i].index, codeOrigin), usedRegisters, JSValueRegs(base),
</del><ins>+                    codeBlock, codeOrigin, exceptionHandlerManager.procureCallSiteIndex(iter-&gt;value[i].index, codeOrigin), usedRegisters, JSValueRegs(base),
</ins><span class="cx">                     JSValueRegs(value), GPRInfo::patchpointScratchRegister, putById.ecmaMode(), putById.putKind());
</span><span class="cx">                 
</span><span class="cx">                 bool addedUniqueExceptionJump = addNewExceptionJumpIfNecessary(iter-&gt;value[i].index);
</span><span class="lines">@@ -883,18 +852,12 @@
</span><span class="cx">                 char* startOfIC =
</span><span class="cx">                     bitwise_cast&lt;char*&gt;(generatedFunction) + record.instructionOffset;
</span><span class="cx">                 CodeLocationLabel patchpoint((MacroAssemblerCodePtr(startOfIC)));
</span><del>-                CodeLocationLabel exceptionTarget;
-                auto findResult = recordIndexToGenericUnwindOrLazySlowPathOSRExit.find(iter-&gt;value[i].index);
-                if (findResult != recordIndexToGenericUnwindOrLazySlowPathOSRExit.end()) {
-                    size_t osrExitIndex = findResult-&gt;value;
-                    OSRExitCompilationInfo&amp; info = state.finalizer-&gt;osrExit[osrExitIndex];
-                    RELEASE_ASSERT(state.jitCode-&gt;osrExit[osrExitIndex].m_descriptor.m_isExceptionFromLazySlowPath);
-                    exceptionTarget = state.finalizer-&gt;exitThunksLinkBuffer-&gt;locationOf(info.m_thunkLabel);
-                } else
</del><ins>+                CodeLocationLabel exceptionTarget = exceptionHandlerManager.lazySlowPathExceptionTarget(iter-&gt;value[i].index);
+                if (!exceptionTarget)
</ins><span class="cx">                     exceptionTarget = state.finalizer-&gt;handleExceptionsLinkBuffer-&gt;entrypoint();
</span><span class="cx"> 
</span><span class="cx">                 std::unique_ptr&lt;LazySlowPath&gt; lazySlowPath = std::make_unique&lt;LazySlowPath&gt;(
</span><del>-                    patchpoint, exceptionTarget, usedRegisters, generateOrGetAlreadyGeneratedCallSiteIndex(iter-&gt;value[i].index, codeOrigin),
</del><ins>+                    patchpoint, exceptionTarget, usedRegisters, exceptionHandlerManager.procureCallSiteIndex(iter-&gt;value[i].index, codeOrigin),
</ins><span class="cx">                     descriptor.m_linker-&gt;run(locations));
</span><span class="cx"> 
</span><span class="cx">                 CCallHelpers::Label begin = slowPathJIT.label();
</span><span class="lines">@@ -952,7 +915,7 @@
</span><span class="cx">             state.finalizer-&gt;sideCodeLinkBuffer-&gt;link(pair.first, pair.second);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    adjustCallICsForStackmaps(state.jsCalls, recordMap, generateOrGetAlreadyGeneratedCallSiteIndex, jsCallOSRExitForRecordIndex);
</del><ins>+    adjustCallICsForStackmaps(state.jsCalls, recordMap, exceptionHandlerManager);
</ins><span class="cx">     
</span><span class="cx">     for (unsigned i = state.jsCalls.size(); i--;) {
</span><span class="cx">         JSCall&amp; call = state.jsCalls[i];
</span><span class="lines">@@ -967,7 +930,7 @@
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    adjustCallICsForStackmaps(state.jsCallVarargses, recordMap, generateOrGetAlreadyGeneratedCallSiteIndex, jsCallOSRExitForRecordIndex);
</del><ins>+    adjustCallICsForStackmaps(state.jsCallVarargses, recordMap, exceptionHandlerManager);
</ins><span class="cx">     
</span><span class="cx">     for (unsigned i = state.jsCallVarargses.size(); i--;) {
</span><span class="cx">         JSCallVarargs&amp; call = state.jsCallVarargses[i];
</span><span class="lines">@@ -983,9 +946,7 @@
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // FIXME: We shouldn't generate CallSite indices for tail calls.
-    // https://bugs.webkit.org/show_bug.cgi?id=151079
-    adjustCallICsForStackmaps(state.jsTailCalls, recordMap, generateOrGetAlreadyGeneratedCallSiteIndex, jsCallOSRExitForRecordIndex);
</del><ins>+    adjustCallICsForStackmaps(state.jsTailCalls, recordMap, exceptionHandlerManager);
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = state.jsTailCalls.size(); i--;) {
</span><span class="cx">         JSTailCall&amp; call = state.jsTailCalls[i];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLExceptionHandlerManagercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.cpp (0 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.cpp        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -0,0 +1,146 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * 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. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;FTLExceptionHandlerManager.h&quot;
+
+#if ENABLE(FTL_JIT)
+
+#include &quot;FTLState.h&quot;
+
+namespace JSC { namespace FTL {
+
+ExceptionHandlerManager::ExceptionHandlerManager(State&amp; state)
+    : m_state(state)
+{
+}
+
+void ExceptionHandlerManager::addNewExit(uint32_t stackmapRecordIndex, size_t osrExitIndex)
+{
+    m_map.add(stackmapRecordIndex, osrExitIndex);
+    OSRExit&amp; exit = m_state.jitCode-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(exit.m_descriptor.m_willArriveAtOSRExitFromGenericUnwind || exit.m_descriptor.m_isExceptionFromLazySlowPath);
+}
+
+CodeLocationLabel ExceptionHandlerManager::getOrPutByIdCallOperationExceptionTarget(uint32_t stackmapRecordIndex)
+{
+    auto findResult = m_map.find(stackmapRecordIndex);
+    if (findResult == m_map.end())
+        return CodeLocationLabel();
+
+    size_t osrExitIndex = findResult-&gt;value;
+    RELEASE_ASSERT(m_state.jitCode-&gt;osrExit[osrExitIndex].m_descriptor.m_willArriveAtOSRExitFromGenericUnwind);
+    OSRExitCompilationInfo&amp; info = m_state.finalizer-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(info.m_getAndPutByIdCallOperationExceptionOSRExitEntrance.isSet());
+    return m_state.finalizer-&gt;exitThunksLinkBuffer-&gt;locationOf(info.m_getAndPutByIdCallOperationExceptionOSRExitEntrance);
+}
+
+CodeLocationLabel ExceptionHandlerManager::lazySlowPathExceptionTarget(uint32_t stackmapRecordIndex)
+{
+    auto findResult = m_map.find(stackmapRecordIndex);
+    if (findResult == m_map.end())
+        return CodeLocationLabel();
+
+    size_t osrExitIndex = findResult-&gt;value;
+    RELEASE_ASSERT(m_state.jitCode-&gt;osrExit[osrExitIndex].m_descriptor.m_isExceptionFromLazySlowPath);
+    OSRExitCompilationInfo&amp; info = m_state.finalizer-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(info.m_thunkLabel.isSet());
+    return m_state.finalizer-&gt;exitThunksLinkBuffer-&gt;locationOf(info.m_thunkLabel);
+}
+
+OSRExit* ExceptionHandlerManager::getByIdOSRExit(uint32_t stackmapRecordIndex)
+{
+    auto findResult = m_map.find(stackmapRecordIndex);
+    if (findResult == m_map.end())
+        return nullptr;
+    size_t osrExitIndex = findResult-&gt;value;
+    OSRExit* exit = &amp;m_state.jitCode-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(exit-&gt;m_descriptor.m_isExceptionFromGetById);
+    return exit; 
+}
+
+OSRExit* ExceptionHandlerManager::getCallOSRExitCommon(uint32_t stackmapRecordIndex)
+{
+    auto findResult = m_map.find(stackmapRecordIndex);
+    if (findResult == m_map.end())
+        return nullptr;
+    size_t osrExitIndex = findResult-&gt;value;
+    OSRExit* exit = &amp;m_state.jitCode-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(exit-&gt;m_descriptor.m_isExceptionFromJSCall);
+    return exit; 
+}
+
+OSRExit* ExceptionHandlerManager::getCallOSRExit(uint32_t stackmapRecordIndex, const JSCall&amp;)
+{
+    return getCallOSRExitCommon(stackmapRecordIndex);
+}
+
+OSRExit* ExceptionHandlerManager::getCallOSRExit(uint32_t stackmapRecordIndex, const JSCallVarargs&amp;)
+{
+    return getCallOSRExitCommon(stackmapRecordIndex);
+}
+
+OSRExit* ExceptionHandlerManager::getCallOSRExit(uint32_t stackmapRecordIndex, const JSTailCall&amp; call)
+{
+    UNUSED_PARAM(stackmapRecordIndex);
+    UNUSED_PARAM(call);
+    // A call can't be in tail position inside a try block.
+    ASSERT(m_map.find(stackmapRecordIndex) == m_map.end());
+    return nullptr;
+}
+
+CallSiteIndex ExceptionHandlerManager::procureCallSiteIndex(uint32_t stackmapRecordIndex, CodeOrigin origin)
+{
+    auto findResult = m_map.find(stackmapRecordIndex);
+    if (findResult == m_map.end())
+        return m_state.jitCode-&gt;common.addUniqueCallSiteIndex(origin);
+    size_t osrExitIndex = findResult-&gt;value;
+    OSRExit&amp; exit = m_state.jitCode-&gt;osrExit[osrExitIndex];
+    RELEASE_ASSERT(exit.m_exceptionHandlerCallSiteIndex);
+    return exit.m_exceptionHandlerCallSiteIndex;
+}
+
+CallSiteIndex ExceptionHandlerManager::procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSCall&amp; call)
+{
+    return procureCallSiteIndex(stackmapRecordIndex, call.callSiteDescriptionOrigin());
+}
+
+CallSiteIndex ExceptionHandlerManager::procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSCallVarargs&amp; call)
+{
+    return procureCallSiteIndex(stackmapRecordIndex, call.callSiteDescriptionOrigin());
+}
+
+CallSiteIndex ExceptionHandlerManager::procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSTailCall&amp; call)
+{
+    UNUSED_PARAM(stackmapRecordIndex);
+    UNUSED_PARAM(call);
+    // We don't need to generate a call site index for tail calls
+    // because they don't store a CallSiteIndex on the call frame.
+    return CallSiteIndex();
+}
+
+} } // namespace JSC::FTL
+
+#endif // ENABLE(FTL_JIT)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLExceptionHandlerManagerh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.h (0 => 192273)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/ftl/FTLExceptionHandlerManager.h        2015-11-10 22:50:55 UTC (rev 192273)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * 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. 
+ */
+
+#ifndef FTLExceptionHandlerManager_h
+#define FTLExceptionHandlerManager_h
+
+#if ENABLE(FTL_JIT)
+
+#include &quot;CallFrame.h&quot;
+#include &quot;FTLJSCall.h&quot;
+#include &quot;FTLJSCallVarargs.h&quot;
+#include &quot;FTLJSTailCall.h&quot;
+
+namespace JSC { namespace FTL {
+
+// This class is intented to be used during FTLCompile to manage some common tasks
+// needed to query the correspondence between stackmap records and OSR exits that are
+// exception handlers. The only kind of OSR exits we keep are those OSR exits that
+// correspond to exceptions from patchpoints. That means exits from lazy slow paths,
+// JS calls, Get/Put ById, etc. Note: this means we don't keep track of exception checks
+// after C calls because those are modeled explictly in LLVM IR as a branch to a stackmap
+// intrinsic. These patchpoint OSR exits that this class keeps track of are not branched to
+// directly within LLVM IR.  We jump to these OSR exits from generated patchpoint code,
+// from genericUnwind(), or from FTL::callOperation().
+    
+class State;
+
+class ExceptionHandlerManager {
+    WTF_MAKE_NONCOPYABLE(ExceptionHandlerManager);
+
+public:
+    ExceptionHandlerManager(State&amp; state);
+
+    void addNewExit(uint32_t stackmapRecordIndex, size_t osrExitIndex);
+
+    // These functions only make sense to be called after we've generated the OSR
+    // exit thunks and allocated the OSR exit thunks' link buffer.
+    CodeLocationLabel getOrPutByIdCallOperationExceptionTarget(uint32_t stackmapRecordIndex);
+    CodeLocationLabel lazySlowPathExceptionTarget(uint32_t stackmapRecordIndex);
+
+    OSRExit* getByIdOSRExit(uint32_t stackmapRecordIndex);
+    OSRExit* getCallOSRExit(uint32_t stackmapRecordIndex, const JSCall&amp;);
+    OSRExit* getCallOSRExit(uint32_t stackmapRecordIndex, const JSTailCall&amp;);
+    OSRExit* getCallOSRExit(uint32_t stackmapRecordIndex, const JSCallVarargs&amp;);
+
+    CallSiteIndex procureCallSiteIndex(uint32_t stackmapRecordIndex, CodeOrigin);
+    CallSiteIndex procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSCall&amp;);
+    CallSiteIndex procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSTailCall&amp;);
+    CallSiteIndex procureCallSiteIndex(uint32_t stackmapRecordIndex, const JSCallVarargs&amp;);
+    OSRExit* jsCallOSRExit(uint32_t stackmapRecordIndex);
+
+private:
+    OSRExit* getCallOSRExitCommon(uint32_t stackmapRecordIndex);
+
+    State&amp; m_state;
+    typedef HashMap&lt;uint32_t, size_t, WTF::IntHash&lt;uint32_t&gt;, WTF::UnsignedWithZeroKeyHashTraits&lt;uint32_t&gt;&gt; RecordIndexToOSRExitIndexMap;
+    RecordIndexToOSRExitIndexMap m_map;
+};
+
+} } // namespace JSC::FTL
+
+#endif // ENABLE(FTL_JIT)
+
+#endif // FTLExceptionHandlerManager_h
</ins></span></pre>
</div>
</div>

</body>
</html>