Create a more generic way for VMEntryScope to notify those interested that it will...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Aug 2014 22:04:39 +0000 (22:04 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Aug 2014 22:04:39 +0000 (22:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=135358

Patch by Saam Barati <sbarati@apple.com> on 2014-08-04
Reviewed by Geoffrey Garen.

When VMEntryScope is destroyed, and it has a flag set indicating that the
Debugger needs to recompile all functions, it calls Debugger::recompileAllJSFunctions.
This flag is only used by Debugger to have VMEntryScope notify it when the
Debugger is safe to recompile all functions. This patch will substitute this
Debugger-specific recompilation flag with a list of callbacks that are notified
when the outermost VMEntryScope dies. This creates a general purpose interface
for being notified when the VM stops executing code via the event of the outermost
VMEntryScope dying.

* debugger/Debugger.cpp:
(JSC::Debugger::recompileAllJSFunctions):
* runtime/VMEntryScope.cpp:
(JSC::VMEntryScope::VMEntryScope):
(JSC::VMEntryScope::addEntryScopeDidPopListener):
(JSC::VMEntryScope::~VMEntryScope):
* runtime/VMEntryScope.h:
(JSC::VMEntryScope::setRecompilationNeeded): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@172009 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/debugger/Debugger.cpp
Source/JavaScriptCore/runtime/VMEntryScope.cpp
Source/JavaScriptCore/runtime/VMEntryScope.h

index aa4ca5c..88940e4 100644 (file)
@@ -1,3 +1,28 @@
+2014-08-04  Saam Barati  <sbarati@apple.com>
+
+        Create a more generic way for VMEntryScope to notify those interested that it will be destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=135358
+
+        Reviewed by Geoffrey Garen.
+
+        When VMEntryScope is destroyed, and it has a flag set indicating that the
+        Debugger needs to recompile all functions, it calls Debugger::recompileAllJSFunctions. 
+        This flag is only used by Debugger to have VMEntryScope notify it when the
+        Debugger is safe to recompile all functions. This patch will substitute this
+        Debugger-specific recompilation flag with a list of callbacks that are notified 
+        when the outermost VMEntryScope dies. This creates a general purpose interface 
+        for being notified when the VM stops executing code via the event of the outermost 
+        VMEntryScope dying.
+
+        * debugger/Debugger.cpp:
+        (JSC::Debugger::recompileAllJSFunctions):
+        * runtime/VMEntryScope.cpp:
+        (JSC::VMEntryScope::VMEntryScope):
+        (JSC::VMEntryScope::addEntryScopeDidPopListener):
+        (JSC::VMEntryScope::~VMEntryScope):
+        * runtime/VMEntryScope.h:
+        (JSC::VMEntryScope::setRecompilationNeeded): Deleted.
+
 2014-08-01  Carlos Alberto Lopez Perez  <clopez@igalia.com>
 
         REGRESSION(r171942): [CMAKE] [GTK] build broken (clean build).
 2014-08-01  Carlos Alberto Lopez Perez  <clopez@igalia.com>
 
         REGRESSION(r171942): [CMAKE] [GTK] build broken (clean build).
index 168d7a3..9037d8e 100644 (file)
@@ -335,7 +335,14 @@ void Debugger::recompileAllJSFunctions(VM* vm)
     // If JavaScript is running, it's not safe to recompile, since we'll end
     // up throwing away code that is live on the stack.
     if (vm->entryScope) {
     // If JavaScript is running, it's not safe to recompile, since we'll end
     // up throwing away code that is live on the stack.
     if (vm->entryScope) {
-        vm->entryScope->setRecompilationNeeded(true);
+        auto listener = [] (VM* vm, JSGlobalObject* globalObject) 
+        {
+            Debugger* debugger = globalObject->debugger();
+            if (debugger)
+                debugger->recompileAllJSFunctions(vm);
+        };
+
+        vm->entryScope->addEntryScopeDidPopListener(this, listener);
         return;
     }
 
         return;
     }
 
index a5e259f..46bcdbc 100644 (file)
@@ -36,7 +36,6 @@ namespace JSC {
 VMEntryScope::VMEntryScope(VM& vm, JSGlobalObject* globalObject)
     : m_vm(vm)
     , m_globalObject(globalObject)
 VMEntryScope::VMEntryScope(VM& vm, JSGlobalObject* globalObject)
     : m_vm(vm)
     , m_globalObject(globalObject)
-    , m_recompilationNeeded(false)
 {
     ASSERT(wtfThreadData().stack().isGrowingDownward());
     if (!vm.entryScope) {
 {
     ASSERT(wtfThreadData().stack().isGrowingDownward());
     if (!vm.entryScope) {
@@ -55,6 +54,11 @@ VMEntryScope::VMEntryScope(VM& vm, JSGlobalObject* globalObject)
     vm.clearExceptionStack();
 }
 
     vm.clearExceptionStack();
 }
 
+void VMEntryScope::addEntryScopeDidPopListener(void* key, EntryScopeDidPopListener listener)
+{
+    m_allEntryScopeDidPopListeners.set(key, listener);
+}
+
 VMEntryScope::~VMEntryScope()
 {
     if (m_vm.entryScope != this)
 VMEntryScope::~VMEntryScope()
 {
     if (m_vm.entryScope != this)
@@ -62,9 +66,11 @@ VMEntryScope::~VMEntryScope()
 
     m_vm.entryScope = nullptr;
 
 
     m_vm.entryScope = nullptr;
 
-    if (m_recompilationNeeded) {
-        if (Debugger* debugger = m_globalObject->debugger())
-            debugger->recompileAllJSFunctions(&m_vm);
+    auto iter = m_allEntryScopeDidPopListeners.begin();
+    auto end = m_allEntryScopeDidPopListeners.end();
+    for ( ; iter != end; ++iter) {
+        EntryScopeDidPopListener listener = iter->value;
+        listener(&m_vm, m_globalObject);
     }
 }
 
     }
 }
 
index 854e797..99e9ba8 100644 (file)
@@ -27,6 +27,7 @@
 #define VMEntryScope_h
 
 #include "Interpreter.h"
 #define VMEntryScope_h
 
 #include "Interpreter.h"
+#include <wtf/HashMap.h>
 #include <wtf/StackBounds.h>
 #include <wtf/StackStats.h>
 
 #include <wtf/StackBounds.h>
 #include <wtf/StackStats.h>
 
@@ -42,12 +43,13 @@ public:
 
     JSGlobalObject* globalObject() const { return m_globalObject; }
 
 
     JSGlobalObject* globalObject() const { return m_globalObject; }
 
-    void setRecompilationNeeded(bool recompileNeeded) { m_recompilationNeeded = recompileNeeded; }
+    typedef std::function<void (VM*, JSGlobalObject*)> EntryScopeDidPopListener;
+    void addEntryScopeDidPopListener(void*, EntryScopeDidPopListener);
 
 private:
     VM& m_vm;
     JSGlobalObject* m_globalObject;
 
 private:
     VM& m_vm;
     JSGlobalObject* m_globalObject;
-    bool m_recompilationNeeded;
+    HashMap<void*, EntryScopeDidPopListener> m_allEntryScopeDidPopListeners;
 };
 
 } // namespace JSC
 };
 
 } // namespace JSC