DebuggerScope::className() should not assert scope->isValid().
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Apr 2016 18:18:58 +0000 (18:18 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Apr 2016 18:18:58 +0000 (18:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=157143

Reviewed by Keith Miller.

DebuggerScope::className() should not assert scope->isValid() because the
TypeProfiler logs objects it encounters, and may indirectly call
JSObject::calculatedClassName() on those objects later, thereby calling
DebuggerScope::className() on an invalidated DebuggerScope.

The existing handling in DebuggerScope::className() for an invalidated scope
(that returns a null string) is sufficient.

* debugger/DebuggerScope.cpp:
(JSC::DebuggerScope::className):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/debugger/DebuggerScope.cpp

index 0929d93..5dcb312 100644 (file)
@@ -1,3 +1,21 @@
+2016-04-28  Mark Lam  <mark.lam@apple.com>
+
+        DebuggerScope::className() should not assert scope->isValid().
+        https://bugs.webkit.org/show_bug.cgi?id=157143
+
+        Reviewed by Keith Miller.
+
+        DebuggerScope::className() should not assert scope->isValid() because the
+        TypeProfiler logs objects it encounters, and may indirectly call
+        JSObject::calculatedClassName() on those objects later, thereby calling
+        DebuggerScope::className() on an invalidated DebuggerScope.
+
+        The existing handling in DebuggerScope::className() for an invalidated scope
+        (that returns a null string) is sufficient.
+
+        * debugger/DebuggerScope.cpp:
+        (JSC::DebuggerScope::className):
+
 2016-04-28  Caitlin Potter  <caitp@igalia.com>
 
         [JSC] implement spec changes for String#padStart and String#padEnd
index 18549e8..0051db7 100644 (file)
@@ -60,7 +60,8 @@ void DebuggerScope::visitChildren(JSCell* cell, SlotVisitor& visitor)
 String DebuggerScope::className(const JSObject* object)
 {
     const DebuggerScope* scope = jsCast<const DebuggerScope*>(object);
-    ASSERT(scope->isValid());
+    // We cannot assert that scope->isValid() because the TypeProfiler may encounter an invalidated
+    // DebuggerScope in its log entries. We just need to handle it appropriately as below.
     if (!scope->isValid())
         return String();
     JSObject* thisObject = JSScope::objectAtScope(scope->jsScope());