<!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>[163855] trunk/Source</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/163855">163855</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2014-02-10 20:48:01 -0800 (Mon, 10 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Source/JavaScriptCore: Removing limitation on JSLock's lockDropDepth.
&lt;https://webkit.org/b/128570&gt;

Reviewed by Geoffrey Garen.

Now that we've switched to using the C stack, we no longer need to limit
the JSLock::lockDropDepth to 2.

For C loop builds which still use the separate JSStack, the JSLock will
enforce ordering for re-grabbing the lock after dropping it. Re-grabbing
must occur in the reverse order of the dropping of the locks.

Ordering is achieved by JSLock::dropAllLocks() stashing away the
JSLock:: m_lockDropDepth in its DropAllLocks instance's m_dropDepth
before unlocking the lock. Subsequently, JSLock::grabAllLocks() will
ensure that JSLocks::m_lockDropDepth equals its DropAllLocks instance's
m_dropDepth before allowing the lock to be re-grabbed. Otherwise, it
will yield execution and retry again later.

Note: because JSLocks::m_lockDropDepth is protected by the JSLock's
mutex, grabAllLocks() will optimistically lock the JSLock before doing
the check on m_lockDropDepth. If the check fails, it will unlock the
JSLock, yield, and then relock it again later before retrying the check.
This ensures that m_lockDropDepth remains under the protection of the
JSLock's mutex.

* runtime/JSLock.cpp:
(JSC::JSLock::dropAllLocks):
(JSC::JSLock::grabAllLocks):
(JSC::JSLock::DropAllLocks::DropAllLocks):
(JSC::JSLock::DropAllLocks::~DropAllLocks):
* runtime/JSLock.h:
(JSC::JSLock::DropAllLocks::setDropDepth):
(JSC::JSLock::DropAllLocks::dropDepth):

Source/WebCore: Removing limitation on JSLock’s lockDropDepth.
&lt;https://webkit.org/b/128570&gt;

Reviewed by Geoffrey Garen.

No new tests.

* bindings/js/PageScriptDebugServer.cpp:
(WebCore::PageScriptDebugServer::runEventLoopWhilePaused):
* platform/ios/wak/WebCoreThread.mm:
(SendDelegateMessage):
(WebThreadRunOnMainThread):
- No longer need to specify AlwaysDropLocks, because DropAllLocks is
  now always unconditional.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSLockcpp">trunk/Source/JavaScriptCore/runtime/JSLock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSLockh">trunk/Source/JavaScriptCore/runtime/JSLock.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsPageScriptDebugServercpp">trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformioswakWebCoreThreadmm">trunk/Source/WebCore/platform/ios/wak/WebCoreThread.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2014-02-10  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Removing limitation on JSLock's lockDropDepth.
+        &lt;https://webkit.org/b/128570&gt;
+
+        Reviewed by Geoffrey Garen.
+
+        Now that we've switched to using the C stack, we no longer need to limit
+        the JSLock::lockDropDepth to 2.
+
+        For C loop builds which still use the separate JSStack, the JSLock will
+        enforce ordering for re-grabbing the lock after dropping it. Re-grabbing
+        must occur in the reverse order of the dropping of the locks.
+
+        Ordering is achieved by JSLock::dropAllLocks() stashing away the
+        JSLock:: m_lockDropDepth in its DropAllLocks instance's m_dropDepth
+        before unlocking the lock. Subsequently, JSLock::grabAllLocks() will
+        ensure that JSLocks::m_lockDropDepth equals its DropAllLocks instance's
+        m_dropDepth before allowing the lock to be re-grabbed. Otherwise, it
+        will yield execution and retry again later.
+
+        Note: because JSLocks::m_lockDropDepth is protected by the JSLock's
+        mutex, grabAllLocks() will optimistically lock the JSLock before doing
+        the check on m_lockDropDepth. If the check fails, it will unlock the
+        JSLock, yield, and then relock it again later before retrying the check.
+        This ensures that m_lockDropDepth remains under the protection of the
+        JSLock's mutex.
+
+        * runtime/JSLock.cpp:
+        (JSC::JSLock::dropAllLocks):
+        (JSC::JSLock::grabAllLocks):
+        (JSC::JSLock::DropAllLocks::DropAllLocks):
+        (JSC::JSLock::DropAllLocks::~DropAllLocks):
+        * runtime/JSLock.h:
+        (JSC::JSLock::DropAllLocks::setDropDepth):
+        (JSC::JSLock::DropAllLocks::dropDepth):
+
</ins><span class="cx"> 2014-02-10  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         FTL should support ToThis
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSLockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSLock.cpp (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSLock.cpp        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/JavaScriptCore/runtime/JSLock.cpp        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -26,6 +26,9 @@
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#if ENABLE(LLINT_C_LOOP)
+#include &lt;thread&gt;
+#endif
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -166,97 +169,33 @@
</span><span class="cx">     return m_ownerThread == WTF::currentThread();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This is fairly nasty.  We allow multiple threads to run on the same
-// context, and we do not require any locking semantics in doing so -
-// clients of the API may simply use the context from multiple threads
-// concurently, and assume this will work.  In order to make this work,
-// We lock the context when a thread enters, and unlock it when it leaves.
-// However we do not only unlock when the thread returns from its
-// entry point (evaluate script or call function), we also unlock the
-// context if the thread leaves JSC by making a call out to an external
-// function through a callback.
-//
-// All threads using the context share the same JS stack (the JSStack).
-// Whenever a thread calls into JSC it starts using the JSStack from the
-// previous 'high water mark' - the maximum point the stack has ever grown to
-// (returned by JSStack::end()).  So if a first thread calls out to a
-// callback, and a second thread enters JSC, then also exits by calling out
-// to a callback, we can be left with stackframes from both threads in the
-// JSStack.  As such, a problem may occur should the first thread's
-// callback complete first, and attempt to return to JSC.  Were we to allow
-// this to happen, and were its stack to grow further, then it may potentially
-// write over the second thread's call frames.
-//
-// To avoid JS stack corruption we enforce a policy of only ever allowing two
-// threads to use a JS context concurrently, and only allowing the second of
-// these threads to execute until it has completed and fully returned from its
-// outermost call into JSC.  We enforce this policy using 'lockDropDepth'.  The
-// first time a thread exits it will call DropAllLocks - which will do as expected
-// and drop locks allowing another thread to enter.  Should another thread, or the
-// same thread again, enter JSC (through evaluate script or call function), and exit
-// again through a callback, then the locks will not be dropped when DropAllLocks
-// is called (since lockDropDepth is non-zero).  Since this thread is still holding
-// the locks, only it will be able to re-enter JSC (either be returning from the
-// callback, or by re-entering through another call to evaulate script or call
-// function).
-//
-// This policy is slightly more restricive than it needs to be for correctness -
-// we could validly allow futher entries into JSC from other threads, we only
-// need ensure that callbacks return in the reverse chronological order of the
-// order in which they were made - though implementing the less restrictive policy
-// would likely increase complexity and overhead.
-//
-
</del><span class="cx"> // This function returns the number of locks that were dropped.
</span><del>-unsigned JSLock::dropAllLocks()
</del><ins>+unsigned JSLock::dropAllLocks(DropAllLocks* dropper)
</ins><span class="cx"> {
</span><span class="cx">     // Check if this thread is currently holding the lock.
</span><span class="cx">     // FIXME: Maybe we want to require this, guard with an ASSERT?
</span><span class="cx">     if (!currentThreadIsHoldingLock())
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    // Don't drop the locks if they've already been dropped once.
-    // (If the prior drop came from another thread, and it resumed first,
-    // it could trash our register file).
-    if (m_lockDropDepth)
-        return 0;
-
-    WTFThreadData&amp; threadData = wtfThreadData();
-    threadData.setSavedStackPointerAtVMEntry(m_vm-&gt;stackPointerAtVMEntry);
-    threadData.setSavedLastStackTop(m_vm-&gt;lastStackTop());
-    threadData.setSavedReservedZoneSize(m_vm-&gt;reservedZoneSize());
-
-    // m_lockDropDepth is only incremented if any locks were dropped.
</del><span class="cx">     ++m_lockDropDepth;
</span><span class="cx"> 
</span><del>-    unsigned droppedLockCount = m_lockCount;
-    unlock(droppedLockCount);
</del><ins>+    UNUSED_PARAM(dropper);
+#if ENABLE(LLINT_C_LOOP)
+    dropper-&gt;setDropDepth(m_lockDropDepth);
+#endif
</ins><span class="cx"> 
</span><del>-    return droppedLockCount;
-}
-
-unsigned JSLock::dropAllLocksUnconditionally()
-{
-    // Check if this thread is currently holding the lock.
-    // FIXME: Maybe we want to require this, guard with an ASSERT?
-    if (!currentThreadIsHoldingLock())
-        return 0;
-
</del><span class="cx">     WTFThreadData&amp; threadData = wtfThreadData();
</span><span class="cx">     threadData.setSavedStackPointerAtVMEntry(m_vm-&gt;stackPointerAtVMEntry);
</span><span class="cx">     threadData.setSavedLastStackTop(m_vm-&gt;lastStackTop());
</span><span class="cx">     threadData.setSavedReservedZoneSize(m_vm-&gt;reservedZoneSize());
</span><span class="cx"> 
</span><del>-    // m_lockDropDepth is only incremented if any locks were dropped.
-    ++m_lockDropDepth;
-
</del><span class="cx">     unsigned droppedLockCount = m_lockCount;
</span><span class="cx">     unlock(droppedLockCount);
</span><span class="cx"> 
</span><span class="cx">     return droppedLockCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSLock::grabAllLocks(unsigned droppedLockCount)
</del><ins>+void JSLock::grabAllLocks(DropAllLocks* dropper, unsigned droppedLockCount)
</ins><span class="cx"> {
</span><span class="cx">     // If no locks were dropped, nothing to do!
</span><span class="cx">     if (!droppedLockCount)
</span><span class="lines">@@ -265,6 +204,15 @@
</span><span class="cx">     ASSERT(!currentThreadIsHoldingLock());
</span><span class="cx">     lock(droppedLockCount);
</span><span class="cx"> 
</span><ins>+    UNUSED_PARAM(dropper);
+#if ENABLE(LLINT_C_LOOP)
+    while (dropper-&gt;dropDepth() != m_lockDropDepth) {
+        unlock(droppedLockCount);
+        std::this_thread::yield();
+        lock(droppedLockCount);
+    }
+#endif
+
</ins><span class="cx">     --m_lockDropDepth;
</span><span class="cx"> 
</span><span class="cx">     WTFThreadData&amp; threadData = wtfThreadData();
</span><span class="lines">@@ -273,37 +221,29 @@
</span><span class="cx">     m_vm-&gt;updateStackLimitWithReservedZoneSize(threadData.savedReservedZoneSize());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSLock::DropAllLocks::DropAllLocks(ExecState* exec, AlwaysDropLocksTag alwaysDropLocks)
</del><ins>+JSLock::DropAllLocks::DropAllLocks(ExecState* exec)
</ins><span class="cx">     : m_droppedLockCount(0)
</span><span class="cx">     , m_vm(exec ? &amp;exec-&gt;vm() : nullptr)
</span><span class="cx"> {
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return;
</span><del>-
-    if (alwaysDropLocks)
-        m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocksUnconditionally();
-    else
-        m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocks();
</del><ins>+    m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocks(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSLock::DropAllLocks::DropAllLocks(VM* vm, AlwaysDropLocksTag alwaysDropLocks)
</del><ins>+JSLock::DropAllLocks::DropAllLocks(VM* vm)
</ins><span class="cx">     : m_droppedLockCount(0)
</span><span class="cx">     , m_vm(vm)
</span><span class="cx"> {
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return;
</span><del>-
-    if (alwaysDropLocks)
-        m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocksUnconditionally();
-    else
-        m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocks();
</del><ins>+    m_droppedLockCount = m_vm-&gt;apiLock().dropAllLocks(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSLock::DropAllLocks::~DropAllLocks()
</span><span class="cx"> {
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return;
</span><del>-    m_vm-&gt;apiLock().grabAllLocks(m_droppedLockCount);
</del><ins>+    m_vm-&gt;apiLock().grabAllLocks(this, m_droppedLockCount);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSLockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSLock.h (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSLock.h        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/JavaScriptCore/runtime/JSLock.h        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -99,16 +99,21 @@
</span><span class="cx">         class DropAllLocks {
</span><span class="cx">             WTF_MAKE_NONCOPYABLE(DropAllLocks);
</span><span class="cx">         public:
</span><del>-            // By default, we release all locks conditionally. Some clients, such as Mobile Safari,
-            // may require that we release all locks unconditionally.
-            enum AlwaysDropLocksTag { DontAlwaysDropLocks = 0, AlwaysDropLocks };
-            JS_EXPORT_PRIVATE DropAllLocks(ExecState*, AlwaysDropLocksTag = DontAlwaysDropLocks);
-            JS_EXPORT_PRIVATE DropAllLocks(VM*, AlwaysDropLocksTag = DontAlwaysDropLocks);
</del><ins>+            JS_EXPORT_PRIVATE DropAllLocks(ExecState*);
+            JS_EXPORT_PRIVATE DropAllLocks(VM*);
</ins><span class="cx">             JS_EXPORT_PRIVATE ~DropAllLocks();
</span><span class="cx">             
</span><ins>+#if ENABLE(LLINT_C_LOOP)
+            void setDropDepth(unsigned depth) { m_dropDepth = depth; }
+            unsigned dropDepth() const { return m_dropDepth; }
+#endif
+
</ins><span class="cx">         private:
</span><span class="cx">             intptr_t m_droppedLockCount;
</span><span class="cx">             RefPtr&lt;VM&gt; m_vm;
</span><ins>+#if ENABLE(LLINT_C_LOOP)
+            unsigned m_dropDepth;
+#endif
</ins><span class="cx">         };
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="lines">@@ -116,9 +121,8 @@
</span><span class="cx">         void unlock(intptr_t unlockCount);
</span><span class="cx">         void setOwnerThread(ThreadIdentifier owner) { m_ownerThread = owner; }
</span><span class="cx"> 
</span><del>-        unsigned dropAllLocks();
-        unsigned dropAllLocksUnconditionally();
-        void grabAllLocks(unsigned lockCount);
</del><ins>+        unsigned dropAllLocks(DropAllLocks*);
+        void grabAllLocks(DropAllLocks*, unsigned lockCount);
</ins><span class="cx"> 
</span><span class="cx">         Mutex m_lock;
</span><span class="cx">         ThreadIdentifier m_ownerThread;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/WebCore/ChangeLog        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-02-10  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Removing limitation on JSLock’s lockDropDepth.
+        &lt;https://webkit.org/b/128570&gt;
+
+        Reviewed by Geoffrey Garen.
+
+        No new tests.
+
+        * bindings/js/PageScriptDebugServer.cpp:
+        (WebCore::PageScriptDebugServer::runEventLoopWhilePaused):
+        * platform/ios/wak/WebCoreThread.mm:
+        (SendDelegateMessage):
+        (WebThreadRunOnMainThread):
+        - No longer need to specify AlwaysDropLocks, because DropAllLocks is
+          now always unconditional.
+
</ins><span class="cx"> 2014-02-10  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Clean up MarkupAccumulator::appendCharactersReplacingEntities
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsPageScriptDebugServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/WebCore/bindings/js/PageScriptDebugServer.cpp        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -190,7 +190,7 @@
</span><span class="cx">     ASSERT(WebThreadIsLockedOrDisabled());
</span><span class="cx">     {
</span><span class="cx">         if (WebThreadIsEnabled())
</span><del>-            JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM(), JSC::JSLock::DropAllLocks::AlwaysDropLocks);
</del><ins>+            JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM());
</ins><span class="cx">         WebRunLoopEnableNested();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformioswakWebCoreThreadmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/wak/WebCoreThread.mm (163854 => 163855)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/wak/WebCoreThread.mm        2014-02-11 02:47:49 UTC (rev 163854)
+++ trunk/Source/WebCore/platform/ios/wak/WebCoreThread.mm        2014-02-11 04:48:01 UTC (rev 163855)
</span><span class="lines">@@ -210,7 +210,7 @@
</span><span class="cx"> 
</span><span class="cx">         {
</span><span class="cx">             // Code block created to scope JSC::JSLock::DropAllLocks outside of WebThreadLock()
</span><del>-            JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM(), JSC::JSLock::DropAllLocks::AlwaysDropLocks);
</del><ins>+            JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM());
</ins><span class="cx">             _WebThreadUnlock();
</span><span class="cx"> 
</span><span class="cx">             CFRunLoopSourceSignal(delegateSource);
</span><span class="lines">@@ -248,7 +248,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM(), JSC::JSLock::DropAllLocks::AlwaysDropLocks);
</del><ins>+    JSC::JSLock::DropAllLocks dropAllLocks(WebCore::JSDOMWindowBase::commonVM());
</ins><span class="cx">     _WebThreadUnlock();
</span><span class="cx"> 
</span><span class="cx">     void (^delegateBlockCopy)() = Block_copy(delegateBlock);
</span></span></pre>
</div>
</div>

</body>
</html>