<!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>[190004] 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/190004">190004</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2015-09-18 18:26:32 -0700 (Fri, 18 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refactor common code between GetCatchHandlerFunctor and UnwindFunctor
https://bugs.webkit.org/show_bug.cgi?id=149276

Reviewed by Mark Lam.

There is currently code copy-pasted between these
two functors. Lets not do that. It's better to write
a function, even if the function is small.

I also did a bit of renaming to make the intent of the
unwindCallFrame function clear. The name of the function
didn't really indicate what it did. It decided if it was
okay to unwind further, and it also notified the debugger.
I've renamed the function to notifyDebuggerOfUnwinding.
And I've inlined the logic of deciding if it's okay
to unwind further into UnwindFunctor itself.

* interpreter/Interpreter.cpp:
(JSC::Interpreter::isOpcode):
(JSC::getStackFrameCodeType):
(JSC::Interpreter::stackTraceAsString):
(JSC::findExceptionHandler):
(JSC::GetCatchHandlerFunctor::GetCatchHandlerFunctor):
(JSC::GetCatchHandlerFunctor::operator()):
(JSC::notifyDebuggerOfUnwinding):
(JSC::UnwindFunctor::UnwindFunctor):
(JSC::UnwindFunctor::operator()):
(JSC::Interpreter::notifyDebuggerOfExceptionToBeThrown):
(JSC::unwindCallFrame): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterInterpretercpp">trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (190003 => 190004)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-09-19 01:25:35 UTC (rev 190003)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-09-19 01:26:32 UTC (rev 190004)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2015-09-18  Saam barati  &lt;sbarati@apple.com&gt;
+
+        Refactor common code between GetCatchHandlerFunctor and UnwindFunctor
+        https://bugs.webkit.org/show_bug.cgi?id=149276
+
+        Reviewed by Mark Lam.
+
+        There is currently code copy-pasted between these
+        two functors. Lets not do that. It's better to write
+        a function, even if the function is small.
+
+        I also did a bit of renaming to make the intent of the
+        unwindCallFrame function clear. The name of the function
+        didn't really indicate what it did. It decided if it was
+        okay to unwind further, and it also notified the debugger.
+        I've renamed the function to notifyDebuggerOfUnwinding.
+        And I've inlined the logic of deciding if it's okay
+        to unwind further into UnwindFunctor itself.
+
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::isOpcode):
+        (JSC::getStackFrameCodeType):
+        (JSC::Interpreter::stackTraceAsString):
+        (JSC::findExceptionHandler):
+        (JSC::GetCatchHandlerFunctor::GetCatchHandlerFunctor):
+        (JSC::GetCatchHandlerFunctor::operator()):
+        (JSC::notifyDebuggerOfUnwinding):
+        (JSC::UnwindFunctor::UnwindFunctor):
+        (JSC::UnwindFunctor::operator()):
+        (JSC::Interpreter::notifyDebuggerOfExceptionToBeThrown):
+        (JSC::unwindCallFrame): Deleted.
+
</ins><span class="cx"> 2015-09-18  Sukolsak Sakshuwong  &lt;sukolsak@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement the arithmetic instructions for doubles in WebAssembly
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp (190003 => 190004)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-09-19 01:25:35 UTC (rev 190003)
+++ trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-09-19 01:26:32 UTC (rev 190004)
</span><span class="lines">@@ -436,22 +436,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool unwindCallFrame(StackVisitor&amp; visitor)
-{
-    CallFrame* callFrame = visitor-&gt;callFrame();
-    if (Debugger* debugger = callFrame-&gt;vmEntryGlobalObject()-&gt;debugger()) {
-        SuspendExceptionScope scope(&amp;callFrame-&gt;vm());
-        if (jsDynamicCast&lt;JSFunction*&gt;(callFrame-&gt;callee()))
-            debugger-&gt;returnEvent(callFrame);
-        else
-            debugger-&gt;didExecuteProgram(callFrame);
-        ASSERT(!callFrame-&gt;hadException());
-    }
-
-    bool shouldContinueUnwinding = !visitor-&gt;callerIsVMEntryFrame();
-    return shouldContinueUnwinding;
-}
-
</del><span class="cx"> static StackFrameCodeType getStackFrameCodeType(StackVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     switch (visitor-&gt;codeType()) {
</span><span class="lines">@@ -603,6 +587,23 @@
</span><span class="cx">     return jsString(&amp;exec-&gt;vm(), builder.toString());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ALWAYS_INLINE static HandlerInfo* findExceptionHandler(StackVisitor&amp; visitor, CodeBlock* codeBlock, CodeBlock::RequiredHandler requiredHandler)
+{
+    ASSERT(codeBlock);
+#if ENABLE(DFG_JIT)
+    ASSERT(!visitor-&gt;isInlinedFrame());
+#endif
+
+    CallFrame* callFrame = visitor-&gt;callFrame();
+    unsigned exceptionHandlerIndex;
+    if (codeBlock-&gt;jitType() != JITCode::DFGJIT)
+        exceptionHandlerIndex = callFrame-&gt;bytecodeOffset();
+    else
+        exceptionHandlerIndex = callFrame-&gt;callSiteIndex().bits();
+
+    return codeBlock-&gt;handlerForIndex(exceptionHandlerIndex, requiredHandler);
+}
+
</ins><span class="cx"> class GetCatchHandlerFunctor {
</span><span class="cx"> public:
</span><span class="cx">     GetCatchHandlerFunctor()
</span><span class="lines">@@ -620,13 +621,7 @@
</span><span class="cx">         if (!codeBlock)
</span><span class="cx">             return StackVisitor::Continue;
</span><span class="cx"> 
</span><del>-        unsigned exceptionHandlerIndex;
-        if (codeBlock-&gt;jitType() != JITCode::DFGJIT)
-            exceptionHandlerIndex = visitor-&gt;callFrame()-&gt;bytecodeOffset();
-        else
-            exceptionHandlerIndex = visitor-&gt;callFrame()-&gt;callSiteIndex().bits();
-
-        m_handler = codeBlock-&gt;handlerForIndex(exceptionHandlerIndex, CodeBlock::RequiredHandler::CatchHandler);
</del><ins>+        m_handler = findExceptionHandler(visitor, codeBlock, CodeBlock::RequiredHandler::CatchHandler);
</ins><span class="cx">         if (m_handler)
</span><span class="cx">             return StackVisitor::Done;
</span><span class="cx"> 
</span><span class="lines">@@ -637,6 +632,18 @@
</span><span class="cx">     HandlerInfo* m_handler;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+ALWAYS_INLINE static void notifyDebuggerOfUnwinding(CallFrame* callFrame)
+{
+    if (Debugger* debugger = callFrame-&gt;vmEntryGlobalObject()-&gt;debugger()) {
+        SuspendExceptionScope scope(&amp;callFrame-&gt;vm());
+        if (jsDynamicCast&lt;JSFunction*&gt;(callFrame-&gt;callee()))
+            debugger-&gt;returnEvent(callFrame);
+        else
+            debugger-&gt;didExecuteProgram(callFrame);
+        ASSERT(!callFrame-&gt;hadException());
+    }
+}
+
</ins><span class="cx"> class UnwindFunctor {
</span><span class="cx"> public:
</span><span class="cx">     UnwindFunctor(CallFrame*&amp; callFrame, bool isTermination, CodeBlock*&amp; codeBlock, HandlerInfo*&amp; handler)
</span><span class="lines">@@ -654,22 +661,19 @@
</span><span class="cx">         m_callFrame = visitor-&gt;callFrame();
</span><span class="cx">         m_codeBlock = visitor-&gt;codeBlock();
</span><span class="cx"> 
</span><del>-        unsigned exceptionHandlerIndex;
-        if (m_codeBlock-&gt;jitType() != JITCode::DFGJIT)
-            exceptionHandlerIndex = m_callFrame-&gt;bytecodeOffset();
-        else
-            exceptionHandlerIndex = m_callFrame-&gt;callSiteIndex().bits();
</del><span class="cx">         m_handler = nullptr;
</span><span class="cx">         if (!m_isTermination) {
</span><span class="cx">             if (m_codeBlock &amp;&amp; !isWebAssemblyExecutable(m_codeBlock-&gt;ownerExecutable()))
</span><del>-                m_handler = m_codeBlock-&gt;handlerForIndex(exceptionHandlerIndex);
</del><ins>+                m_handler = findExceptionHandler(visitor, m_codeBlock, CodeBlock::RequiredHandler::AnyHandler);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (m_handler)
</span><span class="cx">             return StackVisitor::Done;
</span><span class="cx"> 
</span><del>-        bool shouldContinueUnwinding = unwindCallFrame(visitor);
-        if (!shouldContinueUnwinding) {
</del><ins>+        notifyDebuggerOfUnwinding(m_callFrame);
+
+        bool shouldStopUnwinding = visitor-&gt;callerIsVMEntryFrame();
+        if (shouldStopUnwinding) {
</ins><span class="cx">             if (LegacyProfiler* profiler = vm.enabledProfiler())
</span><span class="cx">                 profiler-&gt;exceptionUnwind(m_callFrame);
</span><span class="cx"> 
</span><span class="lines">@@ -759,7 +763,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Interpreter::notifyDebuggerOfExceptionToBeThrown(CallFrame* callFrame, Exception* exception)
</span><span class="cx"> {
</span><del>-    bool isTermination = isTerminatedExecutionException(exception);
</del><span class="cx">     Debugger* debugger = callFrame-&gt;vmEntryGlobalObject()-&gt;debugger();
</span><span class="cx">     if (debugger &amp;&amp; debugger-&gt;needsExceptionCallbacks() &amp;&amp; !exception-&gt;didNotifyInspectorOfThrow()) {
</span><span class="cx">         // This code assumes that if the debugger is enabled then there is no inlining.
</span><span class="lines">@@ -768,6 +771,7 @@
</span><span class="cx">         // https://bugs.webkit.org/show_bug.cgi?id=121754
</span><span class="cx"> 
</span><span class="cx">         bool hasCatchHandler;
</span><ins>+        bool isTermination = isTerminatedExecutionException(exception);
</ins><span class="cx">         if (isTermination)
</span><span class="cx">             hasCatchHandler = false;
</span><span class="cx">         else {
</span></span></pre>
</div>
</div>

</body>
</html>